httrack-3.49.14/0000755000175000017500000000000015230604720007074 5httrack-3.49.14/fuzz/0000755000175000017500000000000015230604720010072 5httrack-3.49.14/fuzz/run-fuzzers.sh0000755000175000017500000000262315230602340012662 #!/bin/bash # Drive every built harness against its seed corpus. # run-fuzzers.sh check deterministic replay (CI smoke) # run-fuzzers.sh [seconds] timed mutation run (discovery) # Replay is crash/leak-only and never mutates; the per-unit -timeout guards # both modes against pathological slowdowns (e.g. pre-#501 strjoker). set -euo pipefail srcdir=$(cd "$(dirname "$0")" && pwd) bld=${1:?usage: run-fuzzers.sh [check|seconds]} mode=${2:-20} status=0 for f in "$bld"/fuzz-*; do if [ ! -f "$f" ] || [ ! -r "$f" ]; then continue; fi case "$f" in *.o | *.c | *.dSYM) continue ;; esac name=$(basename "$f") corpus="$srcdir/corpus/${name#fuzz-}" if [ "$mode" = "check" ]; then echo "=== $name (replay) ===" [ -d "$corpus" ] || continue if ! "$f" -runs=0 -timeout=25 -rss_limit_mb=2048 "$corpus"; then echo "*** $name FAILED on its corpus" >&2 status=1 fi continue fi work=$(mktemp -d) args=("$work") [ -d "$corpus" ] && args+=("$corpus") echo "=== $name (${mode}s) ===" if ! "$f" -max_total_time="$mode" -timeout=25 -rss_limit_mb=2048 \ -artifact_prefix="$work/" -print_final_stats=1 "${args[@]}"; then echo "*** $name FAILED; artifacts:" >&2 ls -l "$work" >&2 status=1 else rm -rf "$work" fi done exit $status httrack-3.49.14/fuzz/fuzz-url.c0000644000175000017500000000332215230602340011750 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the URL splitter and path normalizer (htslib.c): ident_url_absolute is the first parser to touch a raw URL; fil_simplifie collapses ./ and ../ in place. */ #include "fuzz.h" #include "htscore.h" #include "htslib.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *s = fuzz_strdup(data, size); lien_adrfil *af = calloct(1, sizeof(*af)); /* fil_simplifie rewrites in place and may grow an empty path to "./" */ char *path = malloct(size + 3); (void) ident_url_absolute(s, af); memcpy(path, s, size + 1); fil_simplifie(path); freet(path); freet(af); freet(s); return 0; } httrack-3.49.14/fuzz/fuzz-unescape.c0000644000175000017500000000347415230602340012761 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the URL percent-decoders (htslib.c). First input byte picks the output buffer size, so the bounded-copy contract is exercised. */ #include "fuzz.h" #include "httrack-library.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { static const size_t bsizes[] = {1, 2, 16, 256, 8192}; size_t bsize; char *s, *catbuff; if (size == 0) return 0; bsize = bsizes[data[0] % (sizeof(bsizes) / sizeof(bsizes[0]))]; data++, size--; s = fuzz_strdup(data, size); catbuff = malloct(bsize); (void) unescape_http(catbuff, bsize, s); (void) unescape_http_unharm(catbuff, bsize, s, 0); (void) unescape_http_unharm(catbuff, bsize, s, 1); unescape_amp(s); freet(catbuff); freet(s); return 0; } httrack-3.49.14/fuzz/fuzz-meta.c0000644000175000017500000000270515230602340012100 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz hts_getCharsetFromMeta (htscharset.c): scans raw attacker HTML for a charset declaration. */ #include "fuzz.h" #include "htscharset.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *html = fuzz_strdup(data, size); char *charset = hts_getCharsetFromMeta(html, size); freet(charset); freet(html); return 0; } httrack-3.49.14/fuzz/fuzz-idna.c0000644000175000017500000000302315230602340012057 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the IDNA/punycode codec (htscharset.c, CVE-prone lineage). */ #include "fuzz.h" #include "htscharset.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *s = fuzz_strdup(data, size); { char *idna = hts_convertStringUTF8ToIDNA(s, size); freet(idna); } { char *utf8 = hts_convertStringIDNAToUTF8(s, size); freet(utf8); } (void) hts_isStringIDNA(s, size); freet(s); return 0; } httrack-3.49.14/fuzz/fuzz-htsparse.c0000644000175000017500000001206215230602340013000 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Please visit our Website: http://www.httrack.com */ /* Fuzz the real htsparse() over a mocked engine: the minimal crawl state httpmirror() builds, then a page walked through the parser and discarded. The str/stre wiring below mirrors htsparse()'s call site in htscore.c; update it in lockstep if those structs gain a field the parser reads. */ #include "fuzz.h" #include "httrack-library.h" #include "htscore.h" #include "htsback.h" #include "htshash.h" #include "htsrobots.h" #include "htsparse.h" #include "htsmodules.h" #include "coucal.h" /* htsparse ignores str.addLink on the internal parse; stub it. */ static int fuzz_addlink(htsmoduleStruct *str, char *link) { (void) str; (void) link; return 0; } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { static int inited = 0; httrackp *opt; cache_back cache; hash_struct hash; robots_wizard robots; struct_back *sback; char **filters = NULL; int filptr = 0; htsblk r; htsmoduleStruct str; htsmoduleStructExtended stre; int ptr, error = 0, store_errpage = 0; int makeindex_done = 0, makeindex_links = 0; FILE *makeindex_fp = NULL; char makeindex_firstlink[HTS_URLMAXSIZE * 2] = ""; LLint stat_fragment = 0, makestat_total = 0; int makestat_lnk = 0; char base[HTS_URLMAXSIZE * 2] = ""; char codebase[HTS_URLMAXSIZE * 2] = ""; char err_msg[1024] = ""; if (!inited) { hts_init(); inited = 1; } opt = hts_create_opt(); opt->log = opt->errlog = NULL; opt->robots = 0; memset(&cache, 0, sizeof(cache)); cache.type = 0; /* no on-disk cache */ cache.hashtable = coucal_new(0); cache.cached_tests = coucal_new(0); coucal_value_is_malloc(cache.cached_tests, 1); memset(&robots, 0, sizeof(robots)); strcpybuff(robots.adr, "!"); opt->robotsptr = &robots; opt->maxfilter = maximum(opt->maxfilter, 128); filters_init(&filters, opt->maxfilter, 0); opt->filters.filters = &filters; opt->filters.filptr = &filptr; opt->hash = &hash; hts_record_init(opt); hash_init(opt, &hash, opt->urlhack); hash.liens = (const lien_url *const *const *) &opt->liens; sback = back_new(opt, opt->maxsoc * 32 + 1024); /* ptr=1 (index 1 is the parsed page) selects full HTML parsing + the rewriter; urladr()/urlfil()/savename() alias heap(ptr), save=/dev/null. */ hts_record_link(opt, "example.com", "/", "/dev/null", "", "", NULL); hts_record_link(opt, "example.com", "/index.html", "/dev/null", "", "", NULL); ptr = 1; /* NUL-terminated in a size+1 alloc: htsparse one-past-reads onto the NUL. */ hts_init_htsblk(&r); r.statuscode = 200; r.size = (LLint) size; r.adr = malloct(size + 1); if (size) memcpy(r.adr, data, size); r.adr[size] = '\0'; strcpybuff(r.contenttype, "text/html"); memset(&str, 0, sizeof(str)); memset(&stre, 0, sizeof(stre)); str.err_msg = err_msg; str.filename = heap(ptr)->sav; str.mime = r.contenttype; str.url_host = heap(ptr)->adr; str.url_file = heap(ptr)->fil; str.size = (int) r.size; str.addLink = fuzz_addlink; str.opt = opt; str.sback = sback; str.cache = &cache; str.hashptr = &hash; str.numero_passe = 0; str.ptr_ = &ptr; str.page_charset_ = NULL; stre.r_ = &r; stre.error_ = &error; stre.exit_xh_ = &opt->state.exit_xh; stre.store_errpage_ = &store_errpage; stre.base = base; stre.codebase = codebase; stre.filters_ = &filters; stre.filptr_ = &filptr; stre.robots_ = &robots; stre.hash_ = &hash; stre.makeindex_done_ = &makeindex_done; stre.makeindex_fp_ = &makeindex_fp; stre.makeindex_links_ = &makeindex_links; stre.makeindex_firstlink_ = makeindex_firstlink; stre.template_header_ = ""; stre.template_body_ = ""; stre.template_footer_ = ""; stre.stat_fragment_ = &stat_fragment; stre.makestat_time = 0; stre.makestat_fp = NULL; stre.makestat_total_ = &makestat_total; stre.makestat_lnk_ = &makestat_lnk; stre.maketrack_fp = NULL; (void) htsparse(&str, &stre); freet(r.adr); back_delete_all(opt, &cache, sback); back_free(&sback); hash_free(&hash); coucal_delete(&cache.hashtable); coucal_delete(&cache.cached_tests); checkrobots_free(&robots); if (filters != NULL) { if (filters[0] != NULL) freet(filters[0]); freet(filters); } hts_record_free(opt); hts_free_opt(opt); return 0; } httrack-3.49.14/fuzz/fuzz-header.c0000644000175000017500000000466415230602340012410 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the HTTP response-header parser (htslib.c): treatfirstline on the status line, treathead on each following header. Both consume raw bytes off the wire and copy fields into fixed htsblk buffers; treathead also mutates its line in place and drives cookie parsing. */ #include "fuzz.h" #include "htslib.h" #include "htsbauth.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *buf = fuzz_strdup(data, size); htsblk r; t_cookie *cookie = calloct(1, sizeof(*cookie)); char *line = malloct(size + 1); char *p = buf; int first = 1; memset(&r, 0, sizeof(r)); cookie->max_len = (int) sizeof(cookie->data); r.location = malloct(HTS_URLMAXSIZE * 2); r.location[0] = '\0'; /* feed one header line at a time, as the receive loop does */ while (p != NULL && *p != '\0') { char *nl = strchr(p, '\n'); size_t n = (nl != NULL) ? (size_t) (nl - p) : strlen(p); size_t i, len = 0; /* binput drops every '\r' on the wire; mirror it */ for (i = 0; i < n; i++) if (p[i] != '\r') line[len++] = p[i]; line[len] = '\0'; if (first) { treatfirstline(&r, line); first = 0; } else { treathead(cookie, "www.example.com", "/", &r, line); } p = (nl != NULL) ? nl + 1 : NULL; } freet(r.location); freet(line); freet(cookie); freet(buf); return 0; } httrack-3.49.14/fuzz/fuzz-filters.c0000644000175000017500000000432515230602340012622 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the wildcard filter matcher (htsfilters.c; #148 bracket-range OOB was here). Input splits on the first NUL: pattern, then subject string. */ #include "fuzz.h" #include "htsfilters.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *buf = fuzz_strdup(data, size); const char *joker = buf; const uint8_t *sep = memchr(data, '\0', size); /* subject in its own allocation so ASan bounds it apart from the pattern */ char *nom = sep != NULL ? fuzz_strdup(sep + 1, (data + size) - (sep + 1)) : fuzz_strdup(data + size, 0); (void) strjoker(nom, joker, NULL, NULL); { LLint sz = (LLint) size; int size_flag = 0; (void) strjoker(nom, joker, &sz, &size_flag); } (void) strjokerfind(nom, joker); { char *filter = malloct(strlen(joker) + 2); char *filters[1]; LLint sz = (LLint) size; int size_flag = 0, depth = 0; filter[0] = '-'; memcpy(filter + 1, joker, strlen(joker) + 1); filters[0] = filter; (void) fa_strjoker(0, filters, 1, nom, &sz, &size_flag, &depth); freet(filter); } freet(nom); freet(buf); return 0; } httrack-3.49.14/fuzz/fuzz-entities.c0000644000175000017500000000340515230602340012774 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the HTML entity decoder (htsencoding.c). First input byte picks the destination size, so truncation bounds get exercised too. */ #include "fuzz.h" #include "htsencoding.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { static const size_t dsizes[] = {1, 2, 8, 64, 4096}; size_t dsize; char *src, *dest; if (size == 0) return 0; dsize = dsizes[data[0] % (sizeof(dsizes) / sizeof(dsizes[0]))]; data++, size--; src = fuzz_strdup(data, size); dest = malloct(dsize); (void) hts_unescapeEntities(src, dest, dsize); (void) hts_unescapeEntitiesWithCharset(src, dest, dsize, "iso-8859-1"); freet(dest); freet(src); return 0; } httrack-3.49.14/fuzz/fuzz-charset.c0000644000175000017500000000470715230602340012607 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the charset codecs: hts_convertStringToUTF8/FromUTF8 and the UTF-8/UCS4 primitives (htscharset.c). First input byte picks the charset. */ #include "fuzz.h" #include "htscharset.h" static const char *const charsets[] = { "utf-8", "iso-8859-1", "iso-8859-2", "iso-8859-15", "windows-1252", "us-ascii", "shift_jis", "euc-jp", "iso-2022-jp", "gb2312", "big5", "euc-kr", "koi8-r", "utf-16", "unknown-charset", }; int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { const char *charset; char *s; if (size == 0) return 0; charset = charsets[data[0] % (sizeof(charsets) / sizeof(charsets[0]))]; data++, size--; s = fuzz_strdup(data, size); { char *utf8 = hts_convertStringToUTF8(s, size, charset); freet(utf8); } { char *enc = hts_convertStringFromUTF8(s, size, charset); freet(enc); } { size_t nChars = 0; hts_UCS4 *ucs = hts_convertUTF8StringToUCS4(s, size, &nChars); if (ucs != NULL) { char *back = hts_convertUCS4StringToUTF8(ucs, nChars); freet(back); freet(ucs); } } { size_t i = 0; while (i < size) { hts_UCS4 uc = 0; const size_t nr = hts_readUTF8(s + i, size - i, &uc); char out[8]; if (nr == 0) break; hts_writeUTF8(uc, out, sizeof(out)); i += nr; } } freet(s); return 0; } httrack-3.49.14/fuzz/fuzz.h0000644000175000017500000000311515230602340011155 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Shared helpers for the libFuzzer harnesses. */ #ifndef FUZZ_H #define FUZZ_H #define HTS_INTERNAL_BYTECODE #include #include #include #include "htsbase.h" /* Heap NUL-terminated copy of the fuzzer input, so ASan bounds every read. */ static char *fuzz_strdup(const uint8_t *data, size_t size) { char *s = malloct(size + 1); memcpy(s, data, size); s[size] = '\0'; return s; } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); #endif httrack-3.49.14/fuzz/fuzz-cachendx.c0000644000175000017500000000436515230602340012733 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* Fuzz the cache-index (.ndx) parser: a corrupt or truncated index must not walk the length-prefixed cache_brstr/cache_binput scan past the buffer. Mirrors the -#C cache-listing scan (htscoremain.c). */ #include "fuzz.h" #include "htscache.h" #include "htslib.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *buf = fuzz_strdup(data, size); const char *const end = buf + size; char firstline[256]; char *a = buf; /* header: two length-prefixed fields (version, last-modified) */ a += cache_brstr(a, firstline, sizeof(firstline)); a += cache_brstr(a, firstline, sizeof(firstline)); /* body: newline-delimited host/file/position triples; the length-prefixed scan must stay inside the buffer */ while (a != NULL && a < end) { char BIGSTK line[HTS_URLMAXSIZE * 2]; char linepos[256]; int pos; a = strchr(a + 1, '\n'); if (a == NULL) break; a++; a += cache_binput(a, end, line, HTS_URLMAXSIZE); a += cache_binput(a, end, line + strlen(line), HTS_URLMAXSIZE); a += cache_binput(a, end, linepos, 200); sscanf(linepos, "%d", &pos); (void) pos; } freet(buf); return 0; } httrack-3.49.14/fuzz/README.md0000644000175000017500000000132415230602340011265 # Fuzzing httrack libFuzzer harnesses for the pure hostile-input parsers (charset/UTF-8/IDNA codecs, entity and percent decoders, wildcard filters, URL splitter). Off by default; needs clang. ```sh ./bootstrap mkdir /var/tmp/bld-fuzz && cd /var/tmp/bld-fuzz CC=clang CFLAGS="-fsanitize=address,undefined -fno-sanitize-recover=all -g -O1" \ LDFLAGS="-fsanitize=address,undefined" \ bash /path/to/httrack/configure --enable-fuzzers --disable-shared make bash /path/to/httrack/fuzz/run-fuzzers.sh fuzz 60 # 60s per target ``` Run one target by hand: `fuzz/fuzz-url -max_total_time=300 corpusdir fuzz/corpus/url`. Seed corpora live in `corpus//`; a crash reproducer is replayed with `fuzz/fuzz-url crash-file`. httrack-3.49.14/fuzz/Makefile.in0000644000175000017500000006521115230604702012064 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @FUZZERS_TRUE@noinst_PROGRAMS = fuzz-charset$(EXEEXT) \ @FUZZERS_TRUE@ fuzz-meta$(EXEEXT) fuzz-idna$(EXEEXT) \ @FUZZERS_TRUE@ fuzz-entities$(EXEEXT) fuzz-unescape$(EXEEXT) \ @FUZZERS_TRUE@ fuzz-filters$(EXEEXT) fuzz-url$(EXEEXT) \ @FUZZERS_TRUE@ fuzz-header$(EXEEXT) fuzz-cachendx$(EXEEXT) \ @FUZZERS_TRUE@ fuzz-htsparse$(EXEEXT) subdir = fuzz ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ $(top_srcdir)/m4/check_codecs.m4 \ $(top_srcdir)/m4/check_zlib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/visibility.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_fuzz_cachendx_OBJECTS = fuzz-cachendx.$(OBJEXT) fuzz_cachendx_OBJECTS = $(am_fuzz_cachendx_OBJECTS) fuzz_cachendx_LDADD = $(LDADD) am__DEPENDENCIES_1 = fuzz_cachendx_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_fuzz_charset_OBJECTS = fuzz-charset.$(OBJEXT) fuzz_charset_OBJECTS = $(am_fuzz_charset_OBJECTS) fuzz_charset_LDADD = $(LDADD) fuzz_charset_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_entities_OBJECTS = fuzz-entities.$(OBJEXT) fuzz_entities_OBJECTS = $(am_fuzz_entities_OBJECTS) fuzz_entities_LDADD = $(LDADD) fuzz_entities_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_filters_OBJECTS = fuzz-filters.$(OBJEXT) fuzz_filters_OBJECTS = $(am_fuzz_filters_OBJECTS) fuzz_filters_LDADD = $(LDADD) fuzz_filters_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_header_OBJECTS = fuzz-header.$(OBJEXT) fuzz_header_OBJECTS = $(am_fuzz_header_OBJECTS) fuzz_header_LDADD = $(LDADD) fuzz_header_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_htsparse_OBJECTS = fuzz-htsparse.$(OBJEXT) fuzz_htsparse_OBJECTS = $(am_fuzz_htsparse_OBJECTS) fuzz_htsparse_LDADD = $(LDADD) fuzz_htsparse_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_idna_OBJECTS = fuzz-idna.$(OBJEXT) fuzz_idna_OBJECTS = $(am_fuzz_idna_OBJECTS) fuzz_idna_LDADD = $(LDADD) fuzz_idna_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_meta_OBJECTS = fuzz-meta.$(OBJEXT) fuzz_meta_OBJECTS = $(am_fuzz_meta_OBJECTS) fuzz_meta_LDADD = $(LDADD) fuzz_meta_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_unescape_OBJECTS = fuzz-unescape.$(OBJEXT) fuzz_unescape_OBJECTS = $(am_fuzz_unescape_OBJECTS) fuzz_unescape_LDADD = $(LDADD) fuzz_unescape_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) am_fuzz_url_OBJECTS = fuzz-url.$(OBJEXT) fuzz_url_OBJECTS = $(am_fuzz_url_OBJECTS) fuzz_url_LDADD = $(LDADD) fuzz_url_DEPENDENCIES = $(top_builddir)/src/libhttrack.la \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/fuzz-cachendx.Po \ ./$(DEPDIR)/fuzz-charset.Po ./$(DEPDIR)/fuzz-entities.Po \ ./$(DEPDIR)/fuzz-filters.Po ./$(DEPDIR)/fuzz-header.Po \ ./$(DEPDIR)/fuzz-htsparse.Po ./$(DEPDIR)/fuzz-idna.Po \ ./$(DEPDIR)/fuzz-meta.Po ./$(DEPDIR)/fuzz-unescape.Po \ ./$(DEPDIR)/fuzz-url.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(fuzz_cachendx_SOURCES) $(fuzz_charset_SOURCES) \ $(fuzz_entities_SOURCES) $(fuzz_filters_SOURCES) \ $(fuzz_header_SOURCES) $(fuzz_htsparse_SOURCES) \ $(fuzz_idna_SOURCES) $(fuzz_meta_SOURCES) \ $(fuzz_unescape_SOURCES) $(fuzz_url_SOURCES) DIST_SOURCES = $(fuzz_cachendx_SOURCES) $(fuzz_charset_SOURCES) \ $(fuzz_entities_SOURCES) $(fuzz_filters_SOURCES) \ $(fuzz_header_SOURCES) $(fuzz_htsparse_SOURCES) \ $(fuzz_idna_SOURCES) $(fuzz_meta_SOURCES) \ $(fuzz_unescape_SOURCES) $(fuzz_url_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ README.md DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BROTLI_ENABLED = @BROTLI_ENABLED@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGS_PIE = @CFLAGS_PIE@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CFLAGS = @DEFAULT_CFLAGS@ DEFAULT_LDFLAGS = @DEFAULT_LDFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HTTPS_SUPPORT = @HTTPS_SUPPORT@ ICONV_LIBS = @ICONV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_PIE = @LDFLAGS_PIE@ LFS_FLAG = @LFS_FLAG@ LIBC_FORCE_LINK = @LIBC_FORCE_LINK@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CV_OBJDIR = @LT_CV_OBJDIR@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ONLINE_UNIT_TESTS = @ONLINE_UNIT_TESTS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHLIBPATH_VAR = @SHLIBPATH_VAR@ SOCKET_LIBS = @SOCKET_LIBS@ STRIP = @STRIP@ THREADS_CFLAGS = @THREADS_CFLAGS@ THREADS_LIBS = @THREADS_LIBS@ V6_FLAG = @V6_FLAG@ V6_SUPPORT = @V6_SUPPORT@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ ZSTD_ENABLED = @ZSTD_ENABLED@ ZSTD_LIBS = @ZSTD_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = \ @DEFAULT_CFLAGS@ \ @THREADS_CFLAGS@ \ @V6_FLAG@ \ @LFS_FLAG@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/coucal # Static-link libhttrack.la: the internal symbols are hidden in the .so. AM_LDFLAGS = @DEFAULT_LDFLAGS@ -fsanitize=fuzzer -static-libtool-libs LDADD = $(top_builddir)/src/libhttrack.la $(THREADS_LIBS) fuzz_charset_SOURCES = fuzz-charset.c fuzz.h fuzz_meta_SOURCES = fuzz-meta.c fuzz.h fuzz_idna_SOURCES = fuzz-idna.c fuzz.h fuzz_entities_SOURCES = fuzz-entities.c fuzz.h fuzz_unescape_SOURCES = fuzz-unescape.c fuzz.h fuzz_filters_SOURCES = fuzz-filters.c fuzz.h fuzz_url_SOURCES = fuzz-url.c fuzz.h fuzz_header_SOURCES = fuzz-header.c fuzz.h fuzz_cachendx_SOURCES = fuzz-cachendx.c fuzz.h fuzz_htsparse_SOURCES = fuzz-htsparse.c fuzz.h # List corpus files explicitly: automake does not expand EXTRA_DIST globs. EXTRA_DIST = README.md run-fuzzers.sh \ corpus/charset/utf8.txt corpus/charset/latin1.txt corpus/charset/sjis.txt \ corpus/meta/meta-charset.html corpus/meta/meta-http-equiv.html \ corpus/idna/idna.txt corpus/idna/unicode.txt \ corpus/idna/regress-multilabel-leak.txt \ corpus/entities/entities.txt \ corpus/unescape/percent.txt \ corpus/filters/filter.bin corpus/filters/filter-size.bin \ corpus/filters/regress-empty-subject-unique.bin \ corpus/filters/redos-star-classes.bin \ corpus/filters/regress-classdepth-timeout.bin \ corpus/url/http-url.txt corpus/url/relative-path.txt \ corpus/url/regress-file-empty-path.txt corpus/url/regress-long-path-abort.txt \ corpus/header/full-response.txt corpus/header/redirect.txt \ corpus/cachendx/new-format.txt corpus/cachendx/old-format.txt \ corpus/cachendx/regress-overadvance.bin \ corpus/cachendx/regress-truncated-entry.bin \ corpus/htsparse/basic.html corpus/htsparse/script-inscript.html \ corpus/htsparse/meta-usemap.html corpus/htsparse/malformed.html all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu fuzz/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu fuzz/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) fuzz-cachendx$(EXEEXT): $(fuzz_cachendx_OBJECTS) $(fuzz_cachendx_DEPENDENCIES) $(EXTRA_fuzz_cachendx_DEPENDENCIES) @rm -f fuzz-cachendx$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_cachendx_OBJECTS) $(fuzz_cachendx_LDADD) $(LIBS) fuzz-charset$(EXEEXT): $(fuzz_charset_OBJECTS) $(fuzz_charset_DEPENDENCIES) $(EXTRA_fuzz_charset_DEPENDENCIES) @rm -f fuzz-charset$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_charset_OBJECTS) $(fuzz_charset_LDADD) $(LIBS) fuzz-entities$(EXEEXT): $(fuzz_entities_OBJECTS) $(fuzz_entities_DEPENDENCIES) $(EXTRA_fuzz_entities_DEPENDENCIES) @rm -f fuzz-entities$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_entities_OBJECTS) $(fuzz_entities_LDADD) $(LIBS) fuzz-filters$(EXEEXT): $(fuzz_filters_OBJECTS) $(fuzz_filters_DEPENDENCIES) $(EXTRA_fuzz_filters_DEPENDENCIES) @rm -f fuzz-filters$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_filters_OBJECTS) $(fuzz_filters_LDADD) $(LIBS) fuzz-header$(EXEEXT): $(fuzz_header_OBJECTS) $(fuzz_header_DEPENDENCIES) $(EXTRA_fuzz_header_DEPENDENCIES) @rm -f fuzz-header$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_header_OBJECTS) $(fuzz_header_LDADD) $(LIBS) fuzz-htsparse$(EXEEXT): $(fuzz_htsparse_OBJECTS) $(fuzz_htsparse_DEPENDENCIES) $(EXTRA_fuzz_htsparse_DEPENDENCIES) @rm -f fuzz-htsparse$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_htsparse_OBJECTS) $(fuzz_htsparse_LDADD) $(LIBS) fuzz-idna$(EXEEXT): $(fuzz_idna_OBJECTS) $(fuzz_idna_DEPENDENCIES) $(EXTRA_fuzz_idna_DEPENDENCIES) @rm -f fuzz-idna$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_idna_OBJECTS) $(fuzz_idna_LDADD) $(LIBS) fuzz-meta$(EXEEXT): $(fuzz_meta_OBJECTS) $(fuzz_meta_DEPENDENCIES) $(EXTRA_fuzz_meta_DEPENDENCIES) @rm -f fuzz-meta$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_meta_OBJECTS) $(fuzz_meta_LDADD) $(LIBS) fuzz-unescape$(EXEEXT): $(fuzz_unescape_OBJECTS) $(fuzz_unescape_DEPENDENCIES) $(EXTRA_fuzz_unescape_DEPENDENCIES) @rm -f fuzz-unescape$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_unescape_OBJECTS) $(fuzz_unescape_LDADD) $(LIBS) fuzz-url$(EXEEXT): $(fuzz_url_OBJECTS) $(fuzz_url_DEPENDENCIES) $(EXTRA_fuzz_url_DEPENDENCIES) @rm -f fuzz-url$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fuzz_url_OBJECTS) $(fuzz_url_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-cachendx.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-charset.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-entities.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-filters.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-header.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-htsparse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-idna.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-meta.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-unescape.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzz-url.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/fuzz-cachendx.Po -rm -f ./$(DEPDIR)/fuzz-charset.Po -rm -f ./$(DEPDIR)/fuzz-entities.Po -rm -f ./$(DEPDIR)/fuzz-filters.Po -rm -f ./$(DEPDIR)/fuzz-header.Po -rm -f ./$(DEPDIR)/fuzz-htsparse.Po -rm -f ./$(DEPDIR)/fuzz-idna.Po -rm -f ./$(DEPDIR)/fuzz-meta.Po -rm -f ./$(DEPDIR)/fuzz-unescape.Po -rm -f ./$(DEPDIR)/fuzz-url.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/fuzz-cachendx.Po -rm -f ./$(DEPDIR)/fuzz-charset.Po -rm -f ./$(DEPDIR)/fuzz-entities.Po -rm -f ./$(DEPDIR)/fuzz-filters.Po -rm -f ./$(DEPDIR)/fuzz-header.Po -rm -f ./$(DEPDIR)/fuzz-htsparse.Po -rm -f ./$(DEPDIR)/fuzz-idna.Po -rm -f ./$(DEPDIR)/fuzz-meta.Po -rm -f ./$(DEPDIR)/fuzz-unescape.Po -rm -f ./$(DEPDIR)/fuzz-url.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% httrack-3.49.14/fuzz/Makefile.am0000644000175000017500000000410015230602340012035 # libFuzzer harnesses; built only with --enable-fuzzers (requires clang). if FUZZERS noinst_PROGRAMS = fuzz-charset fuzz-meta fuzz-idna fuzz-entities \ fuzz-unescape fuzz-filters fuzz-url fuzz-header fuzz-cachendx \ fuzz-htsparse endif AM_CPPFLAGS = \ @DEFAULT_CFLAGS@ \ @THREADS_CFLAGS@ \ @V6_FLAG@ \ @LFS_FLAG@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/coucal # Static-link libhttrack.la: the internal symbols are hidden in the .so. AM_LDFLAGS = @DEFAULT_LDFLAGS@ -fsanitize=fuzzer -static-libtool-libs LDADD = $(top_builddir)/src/libhttrack.la $(THREADS_LIBS) fuzz_charset_SOURCES = fuzz-charset.c fuzz.h fuzz_meta_SOURCES = fuzz-meta.c fuzz.h fuzz_idna_SOURCES = fuzz-idna.c fuzz.h fuzz_entities_SOURCES = fuzz-entities.c fuzz.h fuzz_unescape_SOURCES = fuzz-unescape.c fuzz.h fuzz_filters_SOURCES = fuzz-filters.c fuzz.h fuzz_url_SOURCES = fuzz-url.c fuzz.h fuzz_header_SOURCES = fuzz-header.c fuzz.h fuzz_cachendx_SOURCES = fuzz-cachendx.c fuzz.h fuzz_htsparse_SOURCES = fuzz-htsparse.c fuzz.h # List corpus files explicitly: automake does not expand EXTRA_DIST globs. EXTRA_DIST = README.md run-fuzzers.sh \ corpus/charset/utf8.txt corpus/charset/latin1.txt corpus/charset/sjis.txt \ corpus/meta/meta-charset.html corpus/meta/meta-http-equiv.html \ corpus/idna/idna.txt corpus/idna/unicode.txt \ corpus/idna/regress-multilabel-leak.txt \ corpus/entities/entities.txt \ corpus/unescape/percent.txt \ corpus/filters/filter.bin corpus/filters/filter-size.bin \ corpus/filters/regress-empty-subject-unique.bin \ corpus/filters/redos-star-classes.bin \ corpus/filters/regress-classdepth-timeout.bin \ corpus/url/http-url.txt corpus/url/relative-path.txt \ corpus/url/regress-file-empty-path.txt corpus/url/regress-long-path-abort.txt \ corpus/header/full-response.txt corpus/header/redirect.txt \ corpus/cachendx/new-format.txt corpus/cachendx/old-format.txt \ corpus/cachendx/regress-overadvance.bin \ corpus/cachendx/regress-truncated-entry.bin \ corpus/htsparse/basic.html corpus/htsparse/script-inscript.html \ corpus/htsparse/meta-usemap.html corpus/htsparse/malformed.html httrack-3.49.14/fuzz/corpus/0000755000175000017500000000000015230604720011405 5httrack-3.49.14/fuzz/corpus/url/0000755000175000017500000000000015230604720012207 5httrack-3.49.14/fuzz/corpus/url/regress-long-path-abort.txt0000644000175000017500000000563315230602340017341 ftpumŠ[/../e0O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/.../e0O/../itpumÙŠ[/../O/../f9O_iW/.¿ù../O/../9O_imÙŠW/../_/../../e0O/../f9O_./f9O_iW/../O/../90O/./e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/../f9O_imÙŠW/../O/.._iW/../O/../9O_imÙŠW/../O/../../e0O/../f9O_i/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e0O/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW//O/../f9O_i../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/.../e0O/../itpumÙŠ[/../O/../f9O_iW/.¿ù../O/../9O_imÙŠW/../_/../../e0O/../f9O_./f9O_iW/../O/../90O/./e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/../f9O_imÙŠW/../O/.._iW/../O/../9O_imÙŠW/../O/../../e0O/../f9O_i/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e0O/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW//O/../f9O_iW/.¿ù../O/../9O_imÙŠW/../_/../../e0O/../f9O_./f9O_iW/../O/../90O/./e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/../f9O_imÙŠW/../O/.._f9O_i../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/.../e0O/../itpumÙŠ[/../O/../f9O_iW/.¿ù../O/../9O_imÙŠW/../_/../../e0O/../f9O_./f9O_iW/../O/../90O/./e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/../f9O_imÙŠW/../O/.._iW/../O/../9O_imÙŠW/../O/../../e0O/../f9O_i/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e0O/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW//O/../f9O_iW/.¿ù../O/../9O_imÙŠW/../_/../../e0O/../f9O_./f9O_iW/../O/../90O/./e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/../f9O_imÙŠW/../O/.._iW/../O/../9O_imÙŠW/../O/../../e0O/../f9O_i/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/iW/../O/../9O_imÙŠW/../O/../../e0O/../f9O_i/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e0O/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imW/.¿ù../O/../9O_imÙŠW/../_/../../e0O/../f9O_./f9O_iW/../O/../90O/./e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/../f9O_imÙŠW/../O/.._iW/../O/../9O_imÙŠW/../O/../../e0O/../f9O_i/../O/../f9O_iW/../O/../90O/../itpumÙ/ftpumŠ[/../e0O/../itpumÙŠ[/../O/../f9O_iW/../O/../9O_imÙŠW/../O/../../e0O/../f9OmÙŠW/../O/../9O_imÙŠW/../O/..O_imÙŠW/../O/../../e0O/9O_imÙŠW/../O/../httrack-3.49.14/fuzz/corpus/url/regress-file-empty-path.txt0000644000175000017500000000000715230602340017336 file://httrack-3.49.14/fuzz/corpus/url/relative-path.txt0000644000175000017500000000004515230602340015430 ftp://ftp.example.com/pub/../file.txthttrack-3.49.14/fuzz/corpus/url/http-url.txt0000644000175000017500000000010015230602340014432 http://user:pass@www.example.com:8080/a/b/../c/./d.html?q=1#fraghttrack-3.49.14/fuzz/corpus/unescape/0000755000175000017500000000000015230604720013210 5httrack-3.49.14/fuzz/corpus/unescape/percent.txt0000644000175000017500000000003315230602340015321 %41%zz%%20%c3%a9+%2e%2e%2fhttrack-3.49.14/fuzz/corpus/meta/0000755000175000017500000000000015230604720012333 5httrack-3.49.14/fuzz/corpus/meta/meta-http-equiv.html0000644000175000017500000000011015230602340016157 httrack-3.49.14/fuzz/corpus/meta/meta-charset.html0000644000175000017500000000007615230602340015515 xhttrack-3.49.14/fuzz/corpus/idna/0000755000175000017500000000000015230604720012320 5httrack-3.49.14/fuzz/corpus/idna/regress-multilabel-leak.txt0000644000175000017500000000002615230602340017507 büchev.例å­bücheplehttrack-3.49.14/fuzz/corpus/idna/unicode.txt0000644000175000017500000000002615230602340014421 bücher.例å­.examplehttrack-3.49.14/fuzz/corpus/idna/idna.txt0000644000175000017500000000003115230602340013702 xn--bcher-kva.example.comhttrack-3.49.14/fuzz/corpus/htsparse/0000755000175000017500000000000015230604720013236 5httrack-3.49.14/fuzz/corpus/htsparse/malformed.html0000644000175000017500000000031615230602340016006 bare wsp x
z
httrack-3.49.14/fuzz/corpus/htsparse/basic.html0000644000175000017500000000075015230602340015123 Seed

Hi

next abs
httrack-3.49.14/fuzz/corpus/header/0000755000175000017500000000000015230604720012635 5httrack-3.49.14/fuzz/corpus/header/redirect.txt0000644000175000017500000000013215230602340015107 HTTP/1.0 301 Moved Location: /elsewhere Content-Disposition: attachment; filename="a.pdf" httrack-3.49.14/fuzz/corpus/header/full-response.txt0000644000175000017500000000044315230602340016111 HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 1234 Content-Encoding: gzip Last-Modified: Mon, 01 Jan 2024 00:00:00 GMT Etag: "abc" Location: http://example.com/x Set-Cookie: ID=42; path=/; domain=.example.com Content-Range: bytes 0-99/100 Transfer-Encoding: chunked httrack-3.49.14/fuzz/corpus/filters/0000755000175000017500000000000015230604720013055 5httrack-3.49.14/fuzz/corpus/filters/regress-classdepth-timeout.bin0000644000175000017500000000771215230602340020760 *[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahttrack-3.49.14/fuzz/corpus/filters/redos-star-classes.bin0000644000175000017500000000037215230602340017203 *[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]*[a]baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahttrack-3.49.14/fuzz/corpus/filters/regress-empty-subject-unique.bin0000644000175000017500000000000615230602340021226 **((httrack-3.49.14/fuzz/corpus/filters/filter-size.bin0000644000175000017500000000006215230602340015716 -*[A-Z,a-z]*[>10,<50].zipwww.example.com/File.ziphttrack-3.49.14/fuzz/corpus/filters/filter.bin0000644000175000017500000000005215230602340014745 +*.gif*[<100]http://example.com/image.gifhttrack-3.49.14/fuzz/corpus/entities/0000755000175000017500000000000015230604720013231 5httrack-3.49.14/fuzz/corpus/entities/entities.txt0000644000175000017500000000007715230602340015536 &<>A☃é¬arealentity;�httrack-3.49.14/fuzz/corpus/charset/0000755000175000017500000000000015230604720013036 5httrack-3.49.14/fuzz/corpus/charset/sjis.txt0000644000175000017500000000001515230602340014457 ƒRƒ“ƒsƒ…[ƒ^httrack-3.49.14/fuzz/corpus/charset/latin1.txt0000644000175000017500000000001515230602340014677 café naïve ¤httrack-3.49.14/fuzz/corpus/charset/utf8.txt0000644000175000017500000000002615230602340014377 café € 🎠naïvehttrack-3.49.14/fuzz/corpus/cachendx/0000755000175000017500000000000015230604720013162 5httrack-3.49.14/fuzz/corpus/cachendx/regress-truncated-entry.bin0000644000175000017500000000003715230602340020370 8 CACHE-1.1 1 x www.example.comhttrack-3.49.14/fuzz/corpus/cachendx/regress-overadvance.bin0000644000175000017500000000001715230602340017533 32768 CACHE-1.1httrack-3.49.14/fuzz/corpus/cachendx/old-format.txt0000644000175000017500000000003615230602340015702 3 1.0 www.example.com /page 5 httrack-3.49.14/fuzz/corpus/cachendx/new-format.txt0000644000175000017500000000011515230602340015713 8 CACHE-1.1 28 Mon, 01 Jan 2024 00:00:00 GMT www.example.com /index.html 123 httrack-3.49.14/test-driver0000755000175000017500000001213715230604702011216 #! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2024-06-19.01; # UTC # Copyright (C) 2011-2024 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <. GNU Automake home page: . General help using GNU software: . END } test_name= # Used for reporting. log_file= # Where to save the output of the test script. trs_file= # Where to save the metadata of the test run. expect_failure=no color_tests=no collect_skipped_logs=yes enable_hard_errors=yes while test $# -gt 0; do case $1 in --help) print_usage; exit $?;; --version) echo "test-driver (GNU Automake) $scriptversion"; exit $?;; --test-name) test_name=$2; shift;; --log-file) log_file=$2; shift;; --trs-file) trs_file=$2; shift;; --color-tests) color_tests=$2; shift;; --collect-skipped-logs) collect_skipped_logs=$2; shift;; --expect-failure) expect_failure=$2; shift;; --enable-hard-errors) enable_hard_errors=$2; shift;; --) shift; break;; -*) usage_error "invalid option: '$1'";; *) break;; esac shift done missing_opts= test x"$test_name" = x && missing_opts="$missing_opts --test-name" test x"$log_file" = x && missing_opts="$missing_opts --log-file" test x"$trs_file" = x && missing_opts="$missing_opts --trs-file" if test x"$missing_opts" != x; then usage_error "the following mandatory options are missing:$missing_opts" fi if test $# -eq 0; then usage_error "missing argument" fi if test $color_tests = yes; then # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. red='' # Red. grn='' # Green. lgn='' # Light green. blu='' # Blue. mgn='' # Magenta. std='' # No color. else red= grn= lgn= blu= mgn= std= fi do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' trap "st=129; $do_exit" 1 trap "st=130; $do_exit" 2 trap "st=141; $do_exit" 13 trap "st=143; $do_exit" 15 # Test script is run here. We create the file first, then append to it, # to ameliorate tests themselves also writing to the log file. Our tests # don't, but others can (automake bug#35762). : >"$log_file" "$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=$collect_skipped_logs;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: httrack-3.49.14/tests/0000755000175000017500000000000015230604720010236 5httrack-3.49.14/tests/server.key0000644000175000017500000000325015230602340012172 -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDx78mogNhTnoWw Ra51NeGtapQ1PfTYLlIMUzuloFXOsR1/ozRkFucqHNftF22wf0gg4VQJSBSf3rwj 79vsnt3nyaD03bTAafpHXkd+IJxQowiG8TfOJF0R/Qg9g7DCE66R9agQpMJCSGxI in9p/4ld4Hn6869d4hNq4fHxNf/qkj2cnf8DYxrldz2FGsi6yMed4tzz2Am4ZbPg wep+fy843ZdYrVIms9vJluNa9E+6Vpw9FwdjzQ/IBBMLvGaC2pDkc95YelaEnQrA lTO/0l5vjc8XuTQFlo3DbUg+WEld/pxvCqsd/q1mqjL0WbxtXl2zCwGzAoJxrjVE PfA8QSbtAgMBAAECggEACgNK4klq1T3IpKdNoBY5yoE7CbUQZBNkBpSPRxHgBezj SVFfgrZGnOySrIJSt4JHtuynG2Hl+0ku74HRep/ck+eOsh5W3mZvGvMLnGxhwR3u Or99osTIgU0VQTkpC0SLQ16FCnih0uJycNIikdLR7uuya1tt1OyIBzK7XlNGIywT p85zJc7/6TfTC9eM7lqh7JGR7KplBxSvgZL1pUr7y4rNpKms6uzOvPND79CcKnbU BBA9Tu4qdOkoOljsZKkvh3pihxyG9X6d8QTZ/uX3pkvliwSFBc+Sz9EootA3/4r5 gVWpQ2t/AY7fY4hqzLIX/HivVaPj3cWk1G+SHm0XNQKBgQD5I9rijqFvV/p6FmUl FbnjJFFHHgZLivlGxAC5vOyJNQQaqdeDzg7yMotNmQTggVGjT6sjdosQb3n+ctuk EhQnZSU5VkNKv1+PTR35WrRkaECCaqz3Pv79pV9GVcX3it7UuYjNiOeSPqINWe+X 49JwnJFz+qQ1BchAwOis4zkENwKBgQD4mShDaYLOO97VpgZj4cGxHHWyEK9CRQvp I7HxRmfaWS3JHwb88lOmALEU6pAj5cYJPAznv8BnUWcVHalZbkQ1JWYtUJRqj6OI Ym7rw/nm4Ay5ijbdEism173dSk3IjOe+PdAlxzsOuVzYdBTqElmeQWtBzhY9aHvX r+A02C2j+wKBgHHDo6Gsi57yR5gUPd9vSlCkNtEIrss0DJv5yHMIB+KnaNZcE+NF 5qFF30Jxyz5RDtxJ9tXcvaeln8lG3XDQKI/MqfDCqTuqo5ImHrfMaW8oA70JxS2p gHqGVzkg1aMxsIrmpcdk6olnPExocvWivGdbtzeEjhMALu8Sp6y6nUCFAoGBAK5h KLgYw/OMVaQCIMthaa+l6f0s7PMMYe1453H6VBD6qz4/8HPwO7LfG1gzrUYxADgs ElVh0UHn/On383nS+i9Ze5Hfyyvwc+LQQURKJPrJQMPJavCptPE7NmiKnYNHK6vr yh0l4oxShAklbCJBGvICq4zuVfVfXDeQnDIVTfaPAoGBAMCrZqYdOUhUu+aUqxZq qO/TTQxrxftU63jGUg+o042TdgI4KWLn07wvHJ8/E2OqF35eXenvcuKbNLI1l72J 4cp+3cUv8iAXThTRYEztr5CS/wta4o4CNN8zfjn5dV9AI4Hmt4V7EaGWpBcViGbj n0Mhag+dO8DHuenqi1yfMrAt -----END PRIVATE KEY----- httrack-3.49.14/tests/server.crt0000644000175000017500000000234515230602340012176 -----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIUdWkDDomnY3WW95UqJ+UOASuR/i0wDQYJKoZIhvcNAQEL BQAwODESMBAGA1UEAwwJMTI3LjAuMC4xMSIwIAYDVQQKDBlIVFRyYWNrIGxvY2Fs IHRlc3Qgc2VydmVyMCAXDTI2MDYxNTE0NDQxMFoYDzIwNTYwNjA3MTQ0NDEwWjA4 MRIwEAYDVQQDDAkxMjcuMC4wLjExIjAgBgNVBAoMGUhUVHJhY2sgbG9jYWwgdGVz dCBzZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDx78mogNhT noWwRa51NeGtapQ1PfTYLlIMUzuloFXOsR1/ozRkFucqHNftF22wf0gg4VQJSBSf 3rwj79vsnt3nyaD03bTAafpHXkd+IJxQowiG8TfOJF0R/Qg9g7DCE66R9agQpMJC SGxIin9p/4ld4Hn6869d4hNq4fHxNf/qkj2cnf8DYxrldz2FGsi6yMed4tzz2Am4 ZbPgwep+fy843ZdYrVIms9vJluNa9E+6Vpw9FwdjzQ/IBBMLvGaC2pDkc95YelaE nQrAlTO/0l5vjc8XuTQFlo3DbUg+WEld/pxvCqsd/q1mqjL0WbxtXl2zCwGzAoJx rjVEPfA8QSbtAgMBAAGjbzBtMB0GA1UdDgQWBBTHE0KKW8REV4HxajzVsIBxz3iL 9zAfBgNVHSMEGDAWgBTHE0KKW8REV4HxajzVsIBxz3iL9zAPBgNVHRMBAf8EBTAD AQH/MBoGA1UdEQQTMBGHBH8AAAGCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOC AQEAYlTEftrwGJBXuPmtxhmtw2HO/VTC4TGnq67hH5H+ptwgZJuuxCQ5KW6flTyp FTyMhha33WD4EBL3wqqJsWr9Y4BXqi4G0lRqXBcC1oIUa2VYIDMER7kaY1qTSqE8 ARpwdB2BhvngAzDLc+4Jt4jQMRGr8fHAwxpDBoIZ1knbyzYNP73Bajse6/8YtxUu nB2BsldjZnLvyHvRxUpWp92OyQih4jYSrlN6olDFlKDg7++kMhkHtJQW9a1t54VN 0ZXrB1ZRuHUUvGBq26x71riTWor7HNOSQaGeCMQjZNQkh5tfshNygUGSZVXTEwhG xSrOL7NqBt2+EkVwf7LjGzjmBw== -----END CERTIFICATE----- httrack-3.49.14/tests/testlib.sh0000644000175000017500000001036615230602340012162 #!/bin/bash # # Helpers shared by the crawl tests. Sourced, not run. # Python 3 interpreter, or empty: Windows only installs python.exe, and a bare # "python" may be 2.x or the Store stub. find_python() { local py for py in "${PYTHON:-}" python3 python; do test -n "$py" || continue "$py" -c 'import sys; sys.exit(sys.version_info[0] != 3)' 2>/dev/null || continue printf '%s\n' "$py" return 0 done return 1 } # Native form of a path: a non-MSYS binary cannot resolve Git Bash's /d/a/... ones. nativepath() { if is_windows && command -v cygpath >/dev/null 2>&1; then cygpath -m "$1" else printf '%s\n' "$1" fi } is_windows() { case "$(uname -s)" in MINGW* | MSYS* | CYGWIN*) return 0 ;; *) return 1 ;; esac } # On Windows MSYS can't signal a native python.exe, so kill_tree ends the whole # tree (a bare kill -9 leaves children). "|| true" throughout: callers run under # set -e and the reap makes wait return 143. stop_server() { test -n "${1:-}" || return 0 kill "$1" 2>/dev/null || true if is_windows; then kill_tree "$1"; fi wait "$1" 2>/dev/null || true return 0 } # Dump and clear the crawl logs a hard-killed test leaves in TMPDIR (its cleanup # trap never ran): hts-log.txt alone records "More than N seconds passed.. giving # up", so a wedge past --max-time is undiagnosable without it (#605). dump_crawl_logs() { local d f for d in "${TMPDIR:-/tmp}"/httrack_local.*; do test -d "$d" || continue for f in "$d/crawl/hts-log.txt" "$d/log" "$d/log.2"; do test -f "$f" || continue # Leading newline: the killed test's last line has no terminator. printf '\n--- %s (last 200 lines)\n' "$f" tail -n 200 "$f" done # so a later test's dump cannot re-report this one; never fatal, the # caller is already handling a failure and Windows may still hold a file rm -rf "$d" || true done } # Kill a backgrounded job and its whole descendant tree. POSIX: the caller must # have put the job in its own process group (run_with_timeout does) so we signal # the group; a bare kill would orphan the grandchildren. Windows: the tree is # native processes MSYS can't signal, so taskkill /T ends it by Windows PID. # Single-slash switches: the workflow sets MSYS_NO_PATHCONV/MSYS2_ARG_CONV_EXCL, # so args pass verbatim and a //T would reach taskkill unfolded and be rejected. kill_tree() { local pid=$1 if is_windows; then local winpid= test -r "/proc/$pid/winpid" && winpid=$(cat "/proc/$pid/winpid" 2>/dev/null) if test -n "$winpid"; then taskkill /F /T /PID "$winpid" >/dev/null 2>&1 || true else # The offline suite runs serially, so no wanted process races this. taskkill /F /IM httrack.exe >/dev/null 2>&1 || true taskkill /F /IM python.exe >/dev/null 2>&1 || true fi fi kill -9 -"$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null || true } # Run "$@" under a wall-clock deadline of $1 seconds; return its exit status, or # 124 if it overran and was killed. timeout(1) is unusable here: it's absent on # macOS and its signals can't reap httrack.exe on Windows. We poll and kill_tree. run_with_timeout() { local secs=$1 shift local had_m= case "$-" in *m*) had_m=1 ;; esac is_windows || set -m # own process group, so kill_tree can signal the group "$@" & local pid=$! test -n "$had_m" || is_windows || set +m local waited=0 while kill -0 "$pid" 2>/dev/null; do if test "$waited" -ge "$secs"; then kill_tree "$pid" wait "$pid" 2>/dev/null || true return 124 fi sleep 1 waited=$((waited + 1)) done wait "$pid" } # Bound an already-backgrounded crawl (pid $1) at $2s, reaping it and returning 124 # on overrun: a wedge past --max-time would else block wait() forever and hang the CI step. wait_bounded() { local pid=$1 secs=$2 waited=0 while kill -0 "$pid" 2>/dev/null; do if test "$waited" -ge "$secs"; then kill_tree "$pid" wait "$pid" 2>/dev/null || true return 124 fi sleep 1 waited=$((waited + 1)) done wait "$pid" } httrack-3.49.14/tests/local-server.py0000755000175000017500000022623015230602340013132 #!/usr/bin/env python3 """Self-contained local web server for httrack's crawl tests. Serves static fixtures from a docroot plus a handful of dynamic endpoints (cookies, ...) so httrack can be exercised over loopback, deterministically and offline, instead of crawling the live ut.httrack.com. Binds to an ephemeral port (port 0) and prints the chosen port to stdout as "PORT \n" so a launcher can discover it. Pass --tls to wrap the socket with the shipped self-signed test cert; httrack does not verify certs, so no CA trust plumbing is needed. stdlib only (http.server + ssl) -- no new build or runtime dependency. """ import argparse import base64 import gzip import hashlib import os import sys import time from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from urllib.parse import quote, unquote, urlsplit # Cookie chain replicated from the old ut/cookies/*.php fixtures. COOKIE_PATH = "/cookies/" COOKIES = { "cat": "dog", "cake": "is a lie!", "badger": "mushroom, with 'ants'", } PAGE = """ \t \tSample test {body} """ # --- /big/ seeded pseudo-site (36_local-bigcrawl) --------------------------- # Deterministic ~360-file tree; bodies derive from sha256(BIG_SEED, name) so # every run serves identical content and the test pins exact counts. BIG_SEED = "bigcrawl-lite-1" BIG_PAGES = 96 BIG_FANOUT = 4 # Fixed validator: a matching If-Modified-Since gets 304, so the update pass # revalidates instead of re-downloading. BIG_LASTMOD = "Mon, 01 Jan 2024 00:00:00 GMT" BIG_CTYPES = { "html": "text/html", "css": "text/css", "js": "application/x-javascript", "png": "image/png", "gif": "image/gif", "jpg": "image/jpeg", "webp": "image/webp", "pdf": "application/pdf", "woff2": "font/woff2", "mp4": "video/mp4", "webm": "video/webm", "mp3": "audio/mpeg", "vtt": "text/vtt", "xml": "text/xml", "svg": "image/svg+xml", "jar": "application/java-archive", "bin": "application/octet-stream", } # Honest magic bytes per claimed type so the #478 sniff never contests. BIG_MAGIC = { "png": b"\x89PNG\r\n\x1a\n", "gif": b"GIF89a", "jpg": b"\xff\xd8\xff\xe0", "webp": b"RIFF\x10\x27\x00\x00WEBPVP8 ", "pdf": b"%PDF-1.4\n", "woff2": b"wOF2", "mp4": b"\x00\x00\x00\x18ftypmp42", "webm": b"\x1a\x45\xdf\xa3", "mp3": b"ID3\x04\x00\x00\x00\x00\x00\x00", "jar": b"PK\x03\x04", } def big_blob(name, size): out = b"" n = 0 while len(out) < size: out += hashlib.sha256(f"{BIG_SEED}/{name}/{n}".encode()).digest() n += 1 return out[:size] def big_asset(name): ext = name.rsplit(".", 1)[-1] size = 200 + int(hashlib.sha256(name.encode()).hexdigest(), 16) % 3800 raw = big_blob(name, size) if ext in ("css", "js", "txt"): return b"/* " + raw.hex().encode() + b" */" return BIG_MAGIC.get(ext, b"") + raw def big_html(title, inner): page = ( "%s\n%s\n" % ( title, inner, ) ) return page.encode() def _hexfill(name): return big_blob(name, 160).hex() HOME = 'home' BIG_TEXT_ASSETS = { "site.css": ( "body { background: url(bg.png); } /* %s */" % _hexfill("site.css"), "text/css", ), "print.css": ("p { margin: 0; } /* %s */" % _hexfill("print.css"), "text/css"), "blk.css": ( '@import "blk2.css";\n' '@font-face { font-family: big; src: local("Nope Sans"), ' 'url(font.woff2) format("woff2"); }\n' "/* %s */" % _hexfill("blk.css"), "text/css", ), # Absolute url() must come back relative after the rewrite (test greps it); # the \/ escapes collapse to an already-linked URL if taken literally. "blk2.css": ( "body { background: url(/big/a/blk2-bg.png); }\n" "i { background: url(/big\\/a\\/bg.png); }\n" "/* %s */" % _hexfill("blk2.css"), "text/css", ), # .open() grabs its first arg only (a method there is rejected, #218), so # the window.open single-URL form is the token-detected shape. "app.js": ( 'var im = new Image(); im.src = "/big/a/js-img.png";\n' 'function pop() { window.open("/big/a/js-data.bin"); }\n' "// %s\n" % _hexfill("app.js"), "application/x-javascript", ), "heavy.js": ( 'var h = new Image(); h.src = "/big/a/js1.png";\n' 'function nav() { location.href = "/big/p/1.html"; }\n' 'function pop() { window.open("/big/a/js2.bin"); }\n' "// %s\n" % _hexfill("heavy.js"), "application/x-javascript", ), # text/javascript is fetched but never scanned: the URL inside must stay # out of the mirror. "decoy.js": ( 'var d = new Image(); d.src = "/big/x/never-scanned.png";\n', "text/javascript", ), "subs.vtt": ("WEBVTT\n\n00:00.000 --> 00:01.000\nbig\n", "text/vtt"), "logo.svg": ( '' '', "image/svg+xml", ), } def _fam_feeds(port): return ( '' 'atom' 'sitemap' ) def _fam_plain(port): return ( 'one' 'two' 'tri' 'abs' 'list' 'p2' 'p3' 'dir' 'selffrag' 'mail' 'tel' 'data' ) def _fam_srcset(port): return ( '' '' '' '' '' ) def _fam_media(port): return ( '" '' ) def _fam_css(port): # image-set with descriptors is a proven-safe decoy (engine-surface §6). return ( '' '
styled
' '" ) def _fam_js(port): # The concatenated string is rejected by the scanner (no single literal). return ( '' '' "' ) def _fam_meta(port): # Extensionless decoy targets stay unfetchable even if the aggressive # parser fires (no known extension, no scheme: rejected in every state). return ( '' 'based' '' '' '' ) def _fam_legacy(port): # Comma-valued applet archive is rejected whole by the engine (decoy). return ( 'frames' '' '' '' '' '' '' ) def _fam_svg(port): return ( '' '' '' '' ) def _fam_i18n(port): return ( 'cafe' 'latin1' 'meta' 'bom' ) def _fam_http(port): return ( 'chain' 'get42' 'd01' 'd02' 'empty' 'dl' ) def _fam_forms(port): # GET form action is rewritten but never fetched; formaction/ping are # outside the attribute tables (decoys). return ( '
' '' '
' 'bare' 'utm' 'sess' '' 'ping' ) BIG_FAMILIES = [ _fam_feeds, _fam_plain, _fam_srcset, _fam_media, _fam_css, _fam_js, _fam_meta, _fam_legacy, _fam_svg, _fam_i18n, _fam_http, _fam_forms, ] def big_link(m, style): return ["%d.html" % m, "../p/%d.html" % m, "/big/p/%d.html" % m][style] def big_page(n, port): style = n % 3 home = ["../index.html", "/big/index.html", "../index.html"][style] parts = ['home' % home] if n > 0: parts.append('up' % big_link((n - 1) // BIG_FANOUT, style)) for c in range(n * BIG_FANOUT + 1, n * BIG_FANOUT + BIG_FANOUT + 1): if c < BIG_PAGES: parts.append('p%d' % (big_link(c, style), c)) parts.append('') parts.append('') exts = ["png", "gif", "jpg"] ia = "/big/a/i%da.%s" % (n, exts[n % 3]) ib = "/big/a/i%db.%s" % (n, exts[(n + 1) % 3]) # Rotate the second-image construct across deterministic table attributes. con = n % 4 if con == 0: parts.append('' % (ia, ib)) elif con == 1: parts.append( '
t
' % (ia, ib) ) elif con == 2: parts.append('' % (ia, ia, ib)) else: parts.append( '' % (ia, ib) ) parts.append(BIG_FAMILIES[n % 12](port)) return big_html("p%d" % n, "\n".join(parts)) def big_index(port): return big_html( "big index", '' '' 'root' '' 'long' 'gzok' 'gzid' 'protorel' 'abshost' 'e404' 'e410' 'e500' 'gzt' 'query' % ("a" * 900, port, port), ) BIG_REDIRECTS = { "/big/r/hop1": (301, "/big/r/hop2"), "/big/r/hop2": (302, "/big/f10/land.html"), "/big/r/get42": (301, "/big/a/doc.pdf"), "/big/f1/dir": (301, "/big/f1/dir/"), } BIG_SIMPLE_PAGES = { "/big/p/two.html": "dot-slash target", "/big/f1/one.html": "one", "/big/f1/tri.html": "tri", "/big/f1/abs.html": "abs", "/big/f1/dir/": "dir index", "/big/f1/long.html": "long", "/big/f1/gzok.html": "gzok", "/big/f1/gzid.html": "gzid", "/big/f1/protorel.html": "protorel", "/big/f1/abshost.html": "abshost", "/big/f5/dw.html": "dw target", "/big/f6/refreshed.html": "refreshed", "/big/f6/sub/leaf.html": "leaf", "/big/f7/fa.html": "frame a", "/big/f7/fb.html": "frame b", "/big/f7/fn.html": "noframes", "/big/f7/area.html": "area", "/big/f10/land.html": "landed", "/big/f11/page.html": "the page", "/big/f11/sess.html": "the sess page", } # Extensionless downloads: name resolution is wire-type driven (#478 contract). BIG_DOWNLOADS = { "/big/d/01": ("pdf", None), "/big/d/02": ("png", None), "/big/d/dl": ("pdf", 'attachment; filename="named.pdf"'), } def _big_rss(port): # purl.org marker makes the feed parse; item URLs are already-linked pages. return ( '\n' '\n' "bighttp://127.0.0.1:%d/big/index.html\n" "i1http://127.0.0.1:%d/big/p/1.html\n" '\n' "\n" % (port, port, port) ).encode() def _big_atom(port): # No purl marker: emitted verbatim, its URL must never be fetched. return ( '\n' 'big\n' "e1" '' "\n" % port ).encode() def _big_sitemap(port): return ( '\n' '\n' "http://127.0.0.1:%d/big/x/sitemap-only.html\n" "\n" % port ).encode() class Handler(SimpleHTTPRequestHandler): # Quieter logging; the launcher captures httrack's own log anyway. def log_message(self, fmt, *args): if os.environ.get("LOCAL_SERVER_VERBOSE"): super().log_message(fmt, *args) # --- helpers ----------------------------------------------------------- def request_cookies(self): """Parse the Cookie header into {name: decoded-value}. Mirrors PHP's $_COOKIE: values are url-decoded, matching the encoding applied when the cookie was set (see set_cookie).""" jar = {} raw = self.headers.get("Cookie", "") for pair in raw.split(";"): pair = pair.strip() if "=" in pair: name, value = pair.split("=", 1) jar[name.strip()] = unquote(value.strip()) return jar def set_cookie(self, name, value): """Queue a Set-Cookie header, url-encoding the value like PHP's setcookie() so spaces/quotes/commas stay a single token that httrack can store and replay verbatim.""" self._set_cookies.append(f"{name}={quote(value)}; Path={COOKIE_PATH}") def send_html(self, body, status=200, extra_status=None): encoded = PAGE.format(body=body).encode("utf-8") self.send_response(status, extra_status) self.send_header("Content-Type", "text/html; charset=utf-8") self.send_header("Content-Length", str(len(encoded))) for cookie in self._set_cookies: self.send_header("Set-Cookie", cookie) self.end_headers() if self.command != "HEAD": self.wfile.write(encoded) def fail_cookie(self, what): # The old PHPs answered 500 with the reason in the status line. self.send_html("", status=500, extra_status=f"The {what} is missing or invalid") # --- dynamic routes ---------------------------------------------------- def route_entrance(self): self.set_cookie("cat", COOKIES["cat"]) self.set_cookie("cake", COOKIES["cake"]) self.send_html('\tThis is a link') def route_second(self): jar = self.request_cookies() if jar.get("cat") != COOKIES["cat"]: return self.fail_cookie("cat") if jar.get("cake") != COOKIES["cake"]: return self.fail_cookie("cake") self.set_cookie("badger", COOKIES["badger"]) self.send_html('\tThis is a link') def route_third(self): jar = self.request_cookies() if jar.get("cat") != COOKIES["cat"]: return self.fail_cookie("cat") if jar.get("cake") != COOKIES["cake"]: return self.fail_cookie("cake") if jar.get("badger") != COOKIES["badger"]: return self.fail_cookie("badger") self.send_html("\tThis is a test.") # --cookies-file (#215): the secret page needs a cookie no page ever sets, # so it is reachable only when --cookies-file preloads it. GATE_COOKIE = ("session", "opensesame") def route_gated_index(self): self.send_html('\tThis is a link') def route_gated_secret(self): name, value = self.GATE_COOKIE if self.request_cookies().get(name) != value: return self.fail_cookie(name) self.send_html("\tThis is the secret.") def route_robots(self): body = b"User-agent: *\nDisallow:\n" self.send_response(200) self.send_header("Content-Type", "text/plain") self.send_header("Content-Length", str(len(body))) self.end_headers() if self.command != "HEAD": self.wfile.write(body) # --- type/extension matrix (issue #267 family) ------------------------- def send_raw(self, body, content_type, extra_headers=()): """Send a raw body with an explicit Content-Type, or none at all when content_type is None (to observe httrack's typeless-file naming).""" self.send_response(200) if content_type is not None: self.send_header("Content-Type", content_type) for name, value in extra_headers: self.send_header(name, value) self.send_header("Content-Length", str(len(body))) self.end_headers() if self.command != "HEAD": self.wfile.write(body) # Fake-binary blobs for the image/pdf/typeless cases. FAKE_PNG = b"\x89PNG\r\n\x1a\n" + b"\x00" * 64 FAKE_PDF = b"%PDF-1.4\n" + b"\x00" * 64 FAKE_JPEG = b"\xff\xd8\xff\xe0" + b"\x00" * 64 BIG_JPEG = b"\xff\xd8\xff\xe0" + bytes(range(256)) * 64 # > sniff window # path -> (body, content_type); None sends no header, "" sends an empty # Content-Type value (no usable type, must be treated like None). TYPE_MATRIX = { "/types/control.php": (b"control", "text/html"), "/types/photo.png": (FAKE_PNG, "image/png"), "/types/doc.pdf": (FAKE_PDF, "application/pdf"), "/types/notype.png": (FAKE_PNG, None), "/types/notype.pdf": (FAKE_PDF, None), "/types/emptyct.png": (FAKE_PNG, ""), "/types/lie.png": (FAKE_PNG, "text/html"), "/types/wrongtype.jpg": (FAKE_JPEG, "image/png"), "/types/bigtype.jpg": (BIG_JPEG, "image/png"), "/types/report.pdf": (b"real page", "text/html"), "/types/page.htm": (b"htm page", "text/html"), "/types/script.js": (b"var x = 1;\n", "application/javascript"), "/types/style.css": (b"body { color: red; }\n", "text/css"), "/types/data.json": (b'{"k": "v"}\n', "application/json"), "/types/gen.php": (FAKE_PNG, "image/png"), } def route_types_index(self): body = ( '\tcontrol\n' '\t\n' '\tdoc\n' '\t\n' '\tnotypepdf\n' '\t\n' '\t\n' '\t\n' '\t\n' '\t\n' '\t\n' '\treport\n' '\thtm\n' '\t\n' '\t\n' '\tjson\n' '\t\n' ) self.send_html(body) def route_types(self): path = urlsplit(self.path).path body, ctype = self.TYPE_MATRIX[path] self.send_raw(body, ctype) # content changes between crawls: run 1 sniffs JPEG, the update pass must # keep the run-1 name (recorded verdict) even though the body is now PNG MUTANT_SEEN = set() def route_types_mutant(self): path = urlsplit(self.path).path body = self.FAKE_PNG if path in self.MUTANT_SEEN else self.FAKE_JPEG if self.command != "HEAD": self.MUTANT_SEEN.add(path) self.send_raw(body, "image/png") # gzip on the wire: the sniff must see the decoded body, not the stream def route_types_packed(self): self.send_raw( gzip.compress(self.FAKE_JPEG), "image/png", extra_headers=[("Content-Encoding", "gzip")], ) # A gzip-coded HTML page whose decoded body is known, for the verbatim-WARC # differential (stored compressed bytes must inflate to this). WARCGZ_BODY = b"verbatim gzip page for WARC strategy A\n" # A NON-html gzip-coded asset: HTTrack streams it straight to disk, so the # verbatim spool adoption runs on the is_write (direct-to-disk) branch of # back_finalize, not the in-memory branch route_warcgz_page exercises. WARCGZ_BIN_BODY = b"verbatim gzip octet-stream body for the WARC is_write path\n" def route_warcgz_index(self): self.send_html( '\tpage\n' '\tdata\n' ) def route_warcgz_page(self): self.send_raw( gzip.compress(self.WARCGZ_BODY), "text/html", extra_headers=[("Content-Encoding", "gzip")], ) def route_warcgz_data(self): self.send_raw( gzip.compress(self.WARCGZ_BIN_BODY), "application/octet-stream", extra_headers=[("Content-Encoding", "gzip")], ) # --- content codings --------------------------------------------------- # Canned br/zstd bodies (no brotli/zstd module in the stdlib): both decode # to CODEC_BODY. Regenerate with the brotli/zstd CLIs over that string. CODEC_BODY = ( b"codec" b"

coded body

" ) CODEC_BR = base64.b64decode( "G0sAAAQccqSBBfJlUvOccsDeitqC9CbHwENWiptQj5aExP0mBjjVgy2DF17olLzLo2T2Eg==" ) CODEC_ZSTD = base64.b64decode( "KLUv/SBMFQIAFAM8aHRtbD48aGVhZD48dGl0bGU+Y29kZWM8LzwvYm9keT48" "cGQgPC9wPjwvL2h0bWw+BQA7p8QMDNQ1PgcWhjkG" ) def route_codec_index(self): self.send_html( '\tbr\n' '\tzstd\n' '\tjunk\n' '\tbad\n' '\tbin\n' '\tae\n' ) def route_codec_br(self): self.send_raw( self.CODEC_BR, "text/html", extra_headers=[("Content-Encoding", "br")] ) def route_codec_zstd(self): self.send_raw( self.CODEC_ZSTD, "text/html", extra_headers=[("Content-Encoding", "zstd")] ) # Junk token on a plain body: the page must survive (broken servers do this) def route_codec_junk(self): self.send_raw( b"

junk coding

", "text/html", extra_headers=[("Content-Encoding", "utf-8")], ) # A real coding we have no decoder for: the fetch must fail rather than # save the coded bytes as the page. def route_codec_bad(self): self.send_raw( b"

never decoded

", "text/html", extra_headers=[("Content-Encoding", "compress")], ) # Same, on a non-HTML body: this takes the direct-to-disk (is_write) branch, # a different discard path than the in-memory bad.html above. def route_codec_bin(self): self.send_raw( b"\x00\x01\x02 CODED-BINARY-MUST-NOT-LAND \xff\xfe" * 8, "application/octet-stream", extra_headers=[("Content-Encoding", "compress")], ) # --- coded re-fetch that fails to decode (#557) ------------------------- # Pass 1 mirrors each file from a valid gzip body; pass 2 (--update) serves # a body that cannot be decoded. The previously-mirrored copy must survive. # fresh.html is the control: its pass-2 body decodes, so it must be updated. # Per-path body-fetch counter shared by the update-refetch routes; paths are # distinct so one dict serves all of them. REFETCH_SEEN = {} def refetch_pass(self): """1 on the first body fetch of this path, N on the Nth. HEADs don't count, so a stray one can't shift which pass gets the special body.""" if self.command == "HEAD": return 1 seen = Handler.REFETCH_SEEN.get(self.path, 0) + 1 Handler.REFETCH_SEEN[self.path] = seen return seen @staticmethod def gzipped(body): return gzip.compress(body) @staticmethod def bad_gzip(body): """A gzip stream whose deflate payload is mangled: inflate fails partway through, after some plausible output has already been produced.""" raw = bytearray(gzip.compress(body)) raw[20:40] = b"\xff" * 20 return bytes(raw[:-4]) def send_coded(self, body, content_type, coding="gzip"): self.send_raw(body, content_type, extra_headers=[("Content-Encoding", coding)]) def route_upcodec_index(self): self.send_html( '\tmem\n' '\tdisk\n' '\tunsup\n' '\tfresh\n' '\tfreshdisk\n' ) MEM_V1 = b"

MIRRORED-MEM-V1

" DISK_V1 = b"MIRRORED-DISK-V1\n" + b"\x00\x01\x02\xff" * 8192 UNSUP_V1 = b"

MIRRORED-UNSUP-V1

" def route_upcodec_mem(self): if self.refetch_pass() == 1: self.send_coded(self.gzipped(self.MEM_V1), "text/html") else: self.send_coded(self.bad_gzip(self.MEM_V1), "text/html") def route_upcodec_disk(self): if self.refetch_pass() == 1: self.send_coded(self.gzipped(self.DISK_V1), "application/octet-stream") else: self.send_coded(self.bad_gzip(self.DISK_V1), "application/octet-stream") # Pass 2 switches to a coding we have no decoder for. def route_upcodec_unsup(self): if self.refetch_pass() == 1: self.send_coded(self.gzipped(self.UNSUP_V1), "text/html") else: self.send_coded(self.UNSUP_V1, "text/html", coding="compress") def route_upcodec_fresh(self): pass1 = self.refetch_pass() == 1 body = b"

FRESH-V%d

" % (1 if pass1 else 2) self.send_coded(self.gzipped(body), "text/html") # Same, direct-to-disk: the update pass decodes, so the temp is renamed over # an existing mirror file. def route_upcodec_freshdisk(self): pass1 = self.refetch_pass() == 1 body = b"FRESHDISK-V%d\n" % (1 if pass1 else 2) + b"\x03\x02\x01\xfe" * 8192 self.send_coded(self.gzipped(body), "application/octet-stream") # #562: pass 1 mirrors fully; pass 2 (--update) declares the full # Content-Length but delivers half then closes, so httrack refuses the partial. PAGE_V1 = b"

MIRRORED-PAGE-V1

" BIN_V1 = b"MIRRORED-BIN-V1\n" + b"\x00\x01\x02\xff" * 8192 def route_uptrunc_index(self): self.send_html( '\tpage\n' '\tfile\n' '\tstay\n' ) def send_truncated(self, body, content_type): self.send_response(200) self.send_header("Content-Type", content_type) self.send_header("Content-Length", str(len(body))) self.end_headers() if self.command == "HEAD": return try: self.wfile.write(body[: len(body) // 2]) # short, then close self.wfile.flush() except OSError: pass def route_uptrunc_page(self): if self.refetch_pass() == 1: self.send_raw(self.PAGE_V1, "text/html") else: self.send_truncated(self.PAGE_V1, "text/html") def route_uptrunc_file(self): if self.refetch_pass() == 1: self.send_raw(self.BIN_V1, "application/octet-stream") else: self.send_truncated(self.BIN_V1, "application/octet-stream") # Control: fully served both passes, so a normal --update still lands. def route_uptrunc_stay(self): v = 1 if self.refetch_pass() == 1 else 2 self.send_raw(b"

STAY-V%d

" % v, "text/html") # Echo what httrack advertised, so a crawl can assert the header. def route_codec_ae(self): self.send_raw( b"

AE=%s

" % self.headers.get("Accept-Encoding", "").encode(), "text/html", ) # --- MIME-type exclusion abort (issue #58) ----------------------------- # A -mime:application/pdf filter must abort the transfer once the header # arrives, not download the whole body and discard it. def route_mimex_index(self): self.send_html( '\tpdf\n' '\treal\n' ) # 1 MB body: the fix aborts after the header, so httrack's "bytes received" # stays tiny; without it the engine reads the body and the count jumps. MIMEX_BLOB = b"%PDF-1.4\n" + b"\x00" * (1024 * 1024) def route_mimex_blob(self): self.send_raw(self.MIMEX_BLOB, "application/pdf") def route_mimex_real(self): self.send_raw(b"real", "text/html") # --- special chars in URLs across an update (issue #157) --------------- # A dotless, accented basename served as text/html (MediaWiki style). The # name the first crawl picks (.html) must survive the update pass. INTL_NAME = "Instalação_CVS_no_Ubuntu" def route_intl_index(self): self.send_html('\taccented\n' % self.INTL_NAME) def route_intl_page(self): self.send_raw(b"accented page\n", "text/html") # Raw non-ASCII href matrix (#180): each variant declares the page charset # differently; the PDF exists only at its exact UTF-8 path, so a # mis-decoded link 404s. CHARSET_CJK = "ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf" # variant -> (index Content-Type, bytes, href bytes, pdf name) CHARSET_VARIANTS = { "header": ("text/html; charset=utf-8", b"", CHARSET_CJK.encode(), CHARSET_CJK), "meta5": ( "text/html", b'', CHARSET_CJK.encode(), CHARSET_CJK, ), "metaeq": ( "text/html", b'', CHARSET_CJK.encode(), CHARSET_CJK, ), "none": ("text/html", b"", CHARSET_CJK.encode(), CHARSET_CJK), "latin1hdr": ( "text/html; charset=iso-8859-1", b"", CHARSET_CJK.encode(), CHARSET_CJK, ), # genuine latin-1 href: the charset conversion must still apply "latin1real": ( "text/html; charset=iso-8859-1", b"", "café.pdf".encode("latin-1"), "café.pdf", ), # latin-1 declared by META only: the meta parser is load-bearing "metalatin1": ( "text/html", b'', "déjà.pdf".encode("latin-1"), "déjà.pdf", ), # latin-1 bytes that form an overlong UTF-8 shape: strict validation # must still convert them "latin1ovl": ( "text/html; charset=iso-8859-1", b"", "À¡x.pdf".encode("latin-1"), "À¡x.pdf", ), # header wins over meta: latin-1 href only resolves if iso-8859-1 is kept "priority": ( "text/html; charset=iso-8859-1", b'', "nuée.pdf".encode("latin-1"), "nuée.pdf", ), "preenc": ("text/html", b"", quote(CHARSET_CJK).encode(), CHARSET_CJK), "bom": ("text/html", b"", CHARSET_CJK.encode(), CHARSET_CJK), } def route_charset(self): path = unquote(urlsplit(self.path).path) parts = path.split("/") if path == "/charset/index.html": self.send_html( "".join( '\t%s\n' % (v, v) for v in self.CHARSET_VARIANTS ) ) return if len(parts) == 4 and parts[2] in self.CHARSET_VARIANTS: ctype, head, href, pdf = self.CHARSET_VARIANTS[parts[2]] if parts[3] == "index.html": body = ( b"" + head + b'doc' ) if parts[2] == "bom": body = b"\xef\xbb\xbf" + body self.send_raw(body, ctype) return if parts[3] == pdf: self.send_raw(self.FAKE_PDF, "application/pdf") return self.send_response(404) self.send_header("Content-Length", "0") self.end_headers() # resume / 416 loop (#206): the first GET stalls after a prefix so the crawl # can be interrupted (partial + temp-ref); every later request is 416. RESUME_PREFIX = b"PARTIAL-" + b"x" * 4096 # flushed before the stall RESUME_LEN = len(RESUME_PREFIX) + 4096 # declared length never delivered _resume_started = False def route_resume_index(self): self.send_html('\tblob') def route_resume(self): counter = os.environ.get("RESUME_COUNTER") if counter: with open(counter, "a") as fp: fp.write("x") # First GET: stall mid-body so the crawl can be interrupted with a partial. if not Handler._resume_started: Handler._resume_started = True self.send_response(200) self.send_header("Content-Type", "image/png") self.send_header("Content-Length", str(self.RESUME_LEN)) self.send_header("Accept-Ranges", "bytes") self.end_headers() if self.command != "HEAD": self.wfile.write(self.RESUME_PREFIX) self.wfile.flush() try: while True: time.sleep(3600) except OSError: pass return self.send_response(416, "Requested Range Not Satisfiable") self.send_header("Content-Type", "image/png") self.send_header("Content-Range", "bytes */%d" % self.RESUME_LEN) self.send_header("Content-Length", "0") self.end_headers() # Always-stall endpoint for 72_watchdog-crawl: never finishes, so the harness # watchdog must reap it. def route_watchdog_stall(self): self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", "1000000") # never delivered self.end_headers() if self.command != "HEAD": self.wfile.write(b"STALL") self.wfile.flush() try: while True: time.sleep(3600) except OSError: pass # C7: stall the first GET (partial + temp-ref), then answer the resume's # Range with a bogus 304; httrack must drop the partial and refetch. RESUME304_BODY = b"C7DATA--" + bytes((i * 7 + 3) % 256 for i in range(8192)) _resume304_started = False def route_resume304_index(self): self.send_html('\tblob') def route_resume304(self): counter = os.environ.get("RESUME304_COUNTER") if counter: with open(counter, "a") as fp: fp.write("x") rng = self.headers.get("Range") if not Handler._resume304_started: Handler._resume304_started = True self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.RESUME304_BODY))) self.send_header("Accept-Ranges", "bytes") self.send_header("Last-Modified", BIG_LASTMOD) self.send_header("ETag", '"c7"') self.end_headers() if self.command != "HEAD": self.wfile.write(self.RESUME304_BODY[:4096]) self.wfile.flush() try: while True: time.sleep(3600) except OSError: pass return if rng is not None: # resume request: bogus out-of-protocol 304 mark = os.environ.get("RESUME304_MARK") if mark: with open(mark, "a") as fp: fp.write("z") self.send_response(304) self.send_header("ETag", '"c7"') self.send_header("Content-Length", "0") self.end_headers() return # Range-less refetch after the partial is dropped: whole file. self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.RESUME304_BODY))) self.end_headers() if self.command != "HEAD": self.wfile.write(self.RESUME304_BODY) # 206 resume must honor the server's Content-Range, not the offset we asked # for (#198): a server resuming a few bytes *before* the request must not # leave httrack duplicating the overlap onto the partial. flaky.bin # interrupts once then resumes OVERLAP_EARLY bytes early; full.bin serves # the identical bytes in one shot, so the test can compare the two. OVERLAP_BLOB = b"%PDF-1.4\n" + bytes((i * 37 + 11) % 256 for i in range(8000)) OVERLAP_EARLY = 8 OVERLAP_PREFIX_LEN = 4000 # flushed before the stall _overlap_started = False def route_overlap_index(self): self.send_html('\tflaky\n\tfull') def route_overlap_full(self): self.send_raw(self.OVERLAP_BLOB, "application/octet-stream") def route_overlap(self): counter = os.environ.get("OVERLAP_COUNTER") if counter: with open(counter, "a") as fp: fp.write("x") blob = self.OVERLAP_BLOB rng = self.headers.get("Range") # First GET: stream a prefix then stall, so the crawl can be interrupted # mid-body (partial + temp-ref on disk). if rng is None and not Handler._overlap_started: Handler._overlap_started = True self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(blob))) self.send_header("Accept-Ranges", "bytes") self.end_headers() if self.command != "HEAD": self.wfile.write(blob[: self.OVERLAP_PREFIX_LEN]) self.wfile.flush() try: while True: time.sleep(3600) except OSError: pass return if rng is None: # no resume request: serve the whole file return self.route_overlap_full() # Resume: honor the Range, but back up OVERLAP_EARLY bytes. start = ( int(rng[len("bytes=") :].split("-")[0]) if rng.startswith("bytes=") else 0 ) start = max(0, start - self.OVERLAP_EARLY) # Signal that the resume Range -> 206 path actually fired, so the test # can prove it was exercised (not a silent full re-download). resumed = os.environ.get("OVERLAP_RESUMED") if resumed: with open(resumed, "a") as fp: fp.write("x") part = blob[start:] self.send_response(206, "Partial Content") self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(part))) self.send_header( "Content-Range", "bytes %d-%d/%d" % (start, len(blob) - 1, len(blob)) ) self.end_headers() if self.command != "HEAD": self.wfile.write(part) # C2: a resume answered with a 206 whose Content-Range end is INT64_MAX would # sign-overflow the crange+1 range check (UBSan abort). Stall first (partial + # ref), then answer the resume Range with that hostile 206; httrack must reject # the range and refetch, never overflow. CRANGE206_BODY = b"CR206DAT" + bytes((i * 5 + 1) % 256 for i in range(6000)) _crange206_started = False def route_crange206_index(self): self.send_html('\tblob') def route_crange206(self): rng = self.headers.get("Range") if not Handler._crange206_started: Handler._crange206_started = True self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.CRANGE206_BODY))) self.send_header("Accept-Ranges", "bytes") self.end_headers() if self.command != "HEAD": self.wfile.write(self.CRANGE206_BODY[:3000]) self.wfile.flush() try: while True: time.sleep(3600) except OSError: pass return if rng is not None: # resume: hostile 206, Content-Range end = INT64_MAX self.send_response(206, "Partial Content") self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.CRANGE206_BODY))) self.send_header("Content-Range", "bytes 0-9223372036854775807/1") self.end_headers() if self.command != "HEAD": self.wfile.write(self.CRANGE206_BODY) return # range-less refetch after the bad range is rejected: whole file. self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.CRANGE206_BODY))) self.end_headers() if self.command != "HEAD": self.wfile.write(self.CRANGE206_BODY) # C2 memory branch: a resume answered with a 206 that lies text/html (so the # resume buffers in memory) plus a matching INT64_MAX Content-Length would # overflow the buffer-size add. Stall first, then send that hostile 206. _crange206mem_started = False def route_crange206mem_index(self): self.send_html('\tblob') def route_crange206mem(self): rng = self.headers.get("Range") if not Handler._crange206mem_started: Handler._crange206mem_started = True self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.CRANGE206_BODY))) self.send_header("Accept-Ranges", "bytes") self.end_headers() if self.command != "HEAD": self.wfile.write(self.CRANGE206_BODY[:3000]) self.wfile.flush() try: while True: time.sleep(3600) except OSError: pass return if rng is not None: # resume: text/html + matching INT64_MAX Content-Length self.send_response(206, "Partial Content") self.send_header("Content-Type", "text/html") self.send_header("Content-Length", "9223372036854775807") self.send_header( "Content-Range", "bytes 0-9223372036854775806/9223372036854775807" ) self.end_headers() return # the overflow is computed before any body read # range-less refetch after the resume is rejected: whole file. self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(self.CRANGE206_BODY))) self.end_headers() if self.command != "HEAD": self.wfile.write(self.CRANGE206_BODY) # error pages / 0-byte files (#17): -o0 ("no error pages") must keep 4xx/5xx # bodies off disk; a genuine 0-byte 200 is a valid file and stays. def route_errpage_index(self): self.send_html( '\tgood\n' '\tmissing\n' '\tempty\n' ) def route_errpage_good(self): self.send_raw(b"good page\n", "text/html") def route_errpage_missing(self): self.send_html("\t404 error body", status=404, extra_status="Not Found") def route_errpage_empty(self): self.send_raw(b"", "text/html") # broken Content-Length (#32/#41): declared size != bytes sent. httrack # warns "incomplete transfer" and skips the cache unless -%B. def route_size_index(self): self.send_html('\tover\n') def route_size_oversize(self): body = b"A" * 100 self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(body) - 2)) # lie: too short self.send_header("Connection", "close") self.end_headers() if self.command != "HEAD": self.wfile.write(body) def route_chunked_index(self): self.send_html('\tchunked\n') def route_chunked_page(self): # Transfer-Encoding: chunked over many small chunks: drives the engine's # chunk automaton (htsback.c). The mirrored file must equal the joined # chunk bodies, so the 2GB in-RAM cap doesn't fire on ordinary traffic. blob = big_html("chunked", "

" + "chunk-body " * 300 + "

") self.protocol_version = "HTTP/1.1" self.send_response(200) self.send_header("Content-Type", "text/html; charset=utf-8") self.send_header("Transfer-Encoding", "chunked") self.send_header("Connection", "close") self.end_headers() if self.command == "HEAD": return step = 64 for off in range(0, len(blob), step): piece = blob[off : off + step] self.wfile.write(b"%X\r\n" % len(piece) + piece + b"\r\n") self.wfile.write(b"0\r\n\r\n") # Content-Disposition naming: the attachment filename replaces the # URL-derived name; path components in it are stripped (RFC 2616). CDISPO_NAMES = { "/cdispo/fetch.php": "report.pdf", "/cdispo/evil.php": "../../evil.pdf", } def route_cdispo_index(self): self.send_html( '\treport\n' '\tevil\n' ) def route_cdispo(self): filename = self.CDISPO_NAMES[urlsplit(self.path).path] cdispo = 'attachment; filename="%s"' % filename self.send_raw( self.FAKE_PDF, "application/pdf", extra_headers=[("Content-Disposition", cdispo)], ) # 302 whose Location carries a #fragment (#204): the fragment is a UA anchor # that must be dropped before the target is fetched. A leaked '#' reaches the # strict-server guard below and 400s. def route_redir_index(self): self.send_html('\tgo') def route_redir_go(self): self.send_response(302, "Found") self.send_header("Location", "target.html#section") self.send_header("Content-Length", "0") self.end_headers() def route_redir_target(self): self.send_raw(b"redirect target\n", "text/html") # --- /mini304/: tiny fully-cacheable site (an update gets only 304s) --- def route_mini304_index(self): self.big_send( b'\n\tpage\n\n', "text/html", ) def route_mini304_page(self): self.big_send(b"tiny cacheable page\n", "text/html") # --- /errmask/: issue #176 — a page that 200'd on the first crawl but 403s # on the update fetch must keep its good copy, not be overwritten nor purged. ERRMASK_GOOD = b"KEEP" + b"." * 1020 # 1024 B distinctive non-HTML body ERRMASK_ERR = b"error 403\n" def route_errmask_index(self): self.send_html('\tkeep\n') def route_errmask_keep(self): # First crawl (no validator) gets the 1024 B body + Last-Modified; the # update sends a conditional and gets a 403 error page. if self.headers.get("If-Modified-Since") or self.headers.get("If-None-Match"): self.send_response(403, "Forbidden") self.send_header("Content-Type", "text/html") self.send_header("Content-Length", str(len(self.ERRMASK_ERR))) self.end_headers() if self.command != "HEAD": self.wfile.write(self.ERRMASK_ERR) return self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Last-Modified", BIG_LASTMOD) self.send_header("Content-Length", str(len(self.ERRMASK_GOOD))) self.end_headers() if self.command != "HEAD": self.wfile.write(self.ERRMASK_GOOD) # --- delayed-type degenerate paths (issues #5/#107) -------------------- def route_delayed_index(self): self.send_html( '\tnoloc\n' '\tselfloop\n' '\tchain\n' '\tredir\n' '\tnotype\n' '\tempty\n' ) def send_redirect(self, location): self.send_response(302, "Found") if location is not None: self.send_header("Location", location) self.send_header("Content-Length", "0") self.end_headers() def route_delayed_noloc(self): self.send_redirect(None) # 302 without Location: name never resolves def route_delayed_selfloop(self): self.send_redirect("selfloop.php") def route_delayed_chain(self): # chain1..chain9: one more hop than the type-check redirect budget n = int(urlsplit(self.path).path.rsplit("chain", 1)[1].split(".")[0]) if n < 9: self.send_redirect("chain%d.php" % (n + 1)) else: self.send_raw(self.FAKE_PDF, "application/pdf") def route_delayed_redir(self): self.send_redirect("real.pdf") def route_delayed_realpdf(self): self.send_raw(self.FAKE_PDF, "application/pdf") def route_delayed_notype(self): self.send_raw(self.FAKE_PDF, None) def route_delayed_empty(self): self.send_raw(b"", "text/html") # 200 + Content-Length: 0 # --- /cookiewall/ (#15): a self-redirect that only sets a cookie is a # consent wall; httrack must replay the cookie and fetch the real page. WALL_MARK = b"REAL-CONTENT-BEHIND-COOKIE-WALL" def route_cookiewall_index(self): self.send_html('\twall') def route_cookiewall_wall(self): self._cookiewall_reply("wall.php") # Known-extension twin: .html so the type is not delayed-resolved. def route_cookiewall2_index(self): self.send_html('\twall') def route_cookiewall2_wall(self): self._cookiewall_reply("wall.html") def _cookiewall_reply(self, location): if self.request_cookies().get("gate") == "1": self.send_raw( b"" + self.WALL_MARK + b"\n", "text/html" ) else: self._wall_redirect(location, "gate=1; Path=/") # No-cookie self-redirect: the jar never changes, so httrack must give up at # once rather than re-fetch (proves the cookie-wall retry stays gated on #15). def route_cookiewall3_index(self): self.send_html('\twall') def route_cookiewall3_wall(self): self._wall_redirect("wall.php", None) # Ever-changing cookie: every hit sets a fresh value, so the jar keeps # changing; httrack must stop at the loops<7 cap, not spin forever. def route_cookiewall4_index(self): self.send_html('\twall') def route_cookiewall4_wall(self): nonce = int(self.request_cookies().get("gate", "0")) + 1 self._wall_redirect("wall.php", f"gate={nonce}; Path=/") def _wall_redirect(self, location, set_cookie): self.send_response(302, "Found") self.send_header("Location", location) if set_cookie is not None: self.send_header("Set-Cookie", set_cookie) self.send_header("Content-Length", "0") self.end_headers() # -E time-limit (#481): pages that trickle far longer than any -E budget, # so only an engine-side abort can end the crawl. TRICKLE_SECONDS = 60 def send_bin_index(self): """Index page linking p0.bin..p7.bin (shared by trickle and bigfiles).""" self.send_html( "".join('\tp%d\n' % (i, i) for i in range(8)) ) def route_trickle_index(self): self.send_bin_index() def route_trickle_page(self): self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(2 * self.TRICKLE_SECONDS)) self.end_headers() if self.command == "HEAD": return try: for _ in range(self.TRICKLE_SECONDS): self.wfile.write(b"xy") self.wfile.flush() time.sleep(1.0) except OSError: pass # #483: trickled .bin pages so the -E stop lands in the type waiter's # unlock-to-patch window with body bytes pending. def route_dcancel_index(self): self.send_bin_index() def route_dcancel_page(self): self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", "4096") self.end_headers() if self.command == "HEAD": return try: for _ in range(32): self.wfile.write(b"z" * 128) self.wfile.flush() time.sleep(0.05) except OSError: pass # -M byte cap (#77): large fast files so a crawl overruns -M immediately. BIGFILE_BYTES = 640 * 1024 def route_bigfiles_index(self): self.send_bin_index() def route_bigfile(self): self.send_raw(b"x" * self.BIGFILE_BYTES, "application/octet-stream") # -M under a slow server (#77): p0 is a fast 640KB file that alone overruns # -M; p1..p3 trickle for a minute. The cap must abort those in-flight # transfers, not wait them out. def route_bigtrickle_index(self): self.send_html( "".join('\tp%d\n' % (i, i) for i in range(4)) ) # -M hard-abort must not destroy an already-complete file (#77 follow-up). # "fast.bin" alone overruns -M and completes; "slow.bin" transfers fully on # its first fetch (initial mirror) but stalls on every later fetch (the # --update re-fetch), so the -M abort tears it down mid-body. An engine that # truncates the good local copy on the aborted re-fetch loses data. slow_seen = 0 def route_bigtrunc_index(self): self.send_html('\tfast\n\tslow\n') def route_bigtrunc_slow(self): self.send_response(200) self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(self.BIGFILE_BYTES)) self.end_headers() if self.command == "HEAD": return # Count body fetches only, so a stray HEAD can't shift which pass stalls. Handler.slow_seen += 1 first = Handler.slow_seen == 1 try: if first: self.wfile.write(b"x" * self.BIGFILE_BYTES) self.wfile.flush() else: self.wfile.write(b"x" * 4096) self.wfile.flush() for _ in range(120): self.wfile.write(b"x") self.wfile.flush() time.sleep(1.0) except OSError: pass # -M received-volume cap (#520): links to large 404 bodies. httrack receives # each (HTS_TOTAL_RECV climbs) but saves none, so saved stays far below -M. def route_maxrecv_index(self): self.send_html( "".join('\tr%d\n' % (i, i) for i in range(16)) ) def route_maxrecv_404(self): body = b"x" * self.BIGFILE_BYTES self.send_response(404, "Not Found") self.send_header("Content-Type", "application/octet-stream") self.send_header("Content-Length", str(len(body))) self.end_headers() if self.command != "HEAD": self.wfile.write(body) ROUTES = { "/cookies/entrance.php": route_entrance, "/cookies/second.php": route_second, "/cookies/third.php": route_third, "/gated/index.php": route_gated_index, "/gated/secret.php": route_gated_secret, "/robots.txt": route_robots, "/warcgz/index.html": route_warcgz_index, "/warcgz/page.html": route_warcgz_page, "/warcgz/data.bin": route_warcgz_data, "/codec/index.html": route_codec_index, "/codec/br.html": route_codec_br, "/codec/zstd.html": route_codec_zstd, "/codec/junk.html": route_codec_junk, "/codec/bad.html": route_codec_bad, "/codec/bin.dat": route_codec_bin, "/codec/ae.html": route_codec_ae, "/upcodec/index.html": route_upcodec_index, "/upcodec/mem.html": route_upcodec_mem, "/upcodec/disk.bin": route_upcodec_disk, "/upcodec/unsup.html": route_upcodec_unsup, "/upcodec/fresh.html": route_upcodec_fresh, "/upcodec/freshdisk.bin": route_upcodec_freshdisk, "/uptrunc/index.html": route_uptrunc_index, "/uptrunc/page.html": route_uptrunc_page, "/uptrunc/file.bin": route_uptrunc_file, "/uptrunc/stay.html": route_uptrunc_stay, "/types/index.html": route_types_index, "/types/control.php": route_types, "/types/photo.png": route_types, "/types/doc.pdf": route_types, "/types/notype.png": route_types, "/types/notype.pdf": route_types, "/types/emptyct.png": route_types, "/types/lie.png": route_types, "/types/wrongtype.jpg": route_types, "/types/bigtype.jpg": route_types, "/types/mutant.jpg": route_types_mutant, "/types/packed.jpg": route_types_packed, "/types/report.pdf": route_types, "/types/page.htm": route_types, "/types/script.js": route_types, "/types/style.css": route_types, "/types/data.json": route_types, "/types/gen.php": route_types, "/intl/index.html": route_intl_index, "/intl/" + INTL_NAME: route_intl_page, "/watchdog/stall": route_watchdog_stall, "/resume/index.html": route_resume_index, "/resume/blob.txt": route_resume, "/resume304/index.html": route_resume304_index, "/resume304/blob.bin": route_resume304, "/overlap/index.html": route_overlap_index, "/overlap/flaky.bin": route_overlap, "/overlap/full.bin": route_overlap_full, "/crange206/index.html": route_crange206_index, "/crange206/blob.bin": route_crange206, "/crange206mem/index.html": route_crange206mem_index, "/crange206mem/blob.bin": route_crange206mem, "/size/index.html": route_size_index, "/size/oversize.bin": route_size_oversize, "/chunked/index.html": route_chunked_index, "/chunked/page.html": route_chunked_page, "/errpage/index.html": route_errpage_index, "/errpage/good.html": route_errpage_good, "/errpage/missing.html": route_errpage_missing, "/errpage/empty.html": route_errpage_empty, "/mimex/index.html": route_mimex_index, "/mimex/blob.pdf": route_mimex_blob, "/mimex/real.html": route_mimex_real, "/cdispo/index.html": route_cdispo_index, "/cdispo/fetch.php": route_cdispo, "/cdispo/evil.php": route_cdispo, "/delayed/index.html": route_delayed_index, "/trickle/index.html": route_trickle_index, "/trickle/p0.bin": route_trickle_page, "/trickle/p1.bin": route_trickle_page, "/trickle/p2.bin": route_trickle_page, "/trickle/p3.bin": route_trickle_page, "/trickle/p4.bin": route_trickle_page, "/trickle/p5.bin": route_trickle_page, "/trickle/p6.bin": route_trickle_page, "/trickle/p7.bin": route_trickle_page, "/dcancel/index.html": route_dcancel_index, "/dcancel/p0.bin": route_dcancel_page, "/dcancel/p1.bin": route_dcancel_page, "/dcancel/p2.bin": route_dcancel_page, "/dcancel/p3.bin": route_dcancel_page, "/dcancel/p4.bin": route_dcancel_page, "/dcancel/p5.bin": route_dcancel_page, "/dcancel/p6.bin": route_dcancel_page, "/dcancel/p7.bin": route_dcancel_page, "/bigfiles/index.html": route_bigfiles_index, "/bigfiles/p0.bin": route_bigfile, "/bigfiles/p1.bin": route_bigfile, "/bigfiles/p2.bin": route_bigfile, "/bigfiles/p3.bin": route_bigfile, "/bigfiles/p4.bin": route_bigfile, "/bigfiles/p5.bin": route_bigfile, "/bigfiles/p6.bin": route_bigfile, "/bigfiles/p7.bin": route_bigfile, "/bigtrickle/index.html": route_bigtrickle_index, "/bigtrickle/p0.bin": route_bigfile, "/bigtrickle/p1.bin": route_trickle_page, "/bigtrickle/p2.bin": route_trickle_page, "/bigtrickle/p3.bin": route_trickle_page, "/bigtrunc/index.html": route_bigtrunc_index, "/bigtrunc/fast.bin": route_bigfile, "/bigtrunc/slow.bin": route_bigtrunc_slow, "/delayed/noloc.php": route_delayed_noloc, "/delayed/selfloop.php": route_delayed_selfloop, "/delayed/redir.php": route_delayed_redir, "/delayed/real.pdf": route_delayed_realpdf, "/delayed/notype.bin": route_delayed_notype, "/delayed/empty.php": route_delayed_empty, "/delayed/chain1.php": route_delayed_chain, "/delayed/chain2.php": route_delayed_chain, "/delayed/chain3.php": route_delayed_chain, "/delayed/chain4.php": route_delayed_chain, "/delayed/chain5.php": route_delayed_chain, "/delayed/chain6.php": route_delayed_chain, "/delayed/chain7.php": route_delayed_chain, "/delayed/chain8.php": route_delayed_chain, "/delayed/chain9.php": route_delayed_chain, "/cookiewall/index.html": route_cookiewall_index, "/cookiewall/wall.php": route_cookiewall_wall, "/cookiewall2/index.html": route_cookiewall2_index, "/cookiewall2/wall.html": route_cookiewall2_wall, "/cookiewall3/index.html": route_cookiewall3_index, "/cookiewall3/wall.php": route_cookiewall3_wall, "/cookiewall4/index.html": route_cookiewall4_index, "/cookiewall4/wall.php": route_cookiewall4_wall, "/redir/index.html": route_redir_index, "/redir/go.php": route_redir_go, "/redir/target.html": route_redir_target, "/mini304/index.html": route_mini304_index, "/mini304/page.html": route_mini304_page, "/errmask/index.html": route_errmask_index, "/errmask/keep.dat": route_errmask_keep, "/maxrecv/index.html": route_maxrecv_index, "/maxrecv/r0.bin": route_maxrecv_404, "/maxrecv/r1.bin": route_maxrecv_404, "/maxrecv/r2.bin": route_maxrecv_404, "/maxrecv/r3.bin": route_maxrecv_404, "/maxrecv/r4.bin": route_maxrecv_404, "/maxrecv/r5.bin": route_maxrecv_404, "/maxrecv/r6.bin": route_maxrecv_404, "/maxrecv/r7.bin": route_maxrecv_404, "/maxrecv/r8.bin": route_maxrecv_404, "/maxrecv/r9.bin": route_maxrecv_404, "/maxrecv/r10.bin": route_maxrecv_404, "/maxrecv/r11.bin": route_maxrecv_404, "/maxrecv/r12.bin": route_maxrecv_404, "/maxrecv/r13.bin": route_maxrecv_404, "/maxrecv/r14.bin": route_maxrecv_404, "/maxrecv/r15.bin": route_maxrecv_404, } # --- /big/ seeded pseudo-site ------------------------------------------ def big_send(self, body, ctype, code=200, extra=()): if code == 200 and self.headers.get("If-Modified-Since") == BIG_LASTMOD: self.send_response(304) self.send_header("Content-Length", "0") self.end_headers() return self.send_response(code) if code == 200: self.send_header("Last-Modified", BIG_LASTMOD) self.send_header("Content-Type", ctype) self.send_header("Content-Length", str(len(body))) for name, value in extra: self.send_header(name, value) self.end_headers() if self.command != "HEAD": self.wfile.write(body) def big_error(self, code, reason): body = big_html("error", "

%d

%s" % (code, HOME)) self.big_send(body, "text/html", code=code, extra=[("X-Reason", reason)]) def route_big(self): split = urlsplit(self.path) path = unquote(split.path) port = self.server.server_address[1] if path in BIG_REDIRECTS: code, location = BIG_REDIRECTS[path] self.send_response(code) self.send_header("Location", location) self.send_header("Content-Length", "0") self.end_headers() elif path == "/big/index.html": self.big_send(big_index(port), "text/html") elif path in BIG_SIMPLE_PAGES: body = big_html(path, "

%s

%s" % (BIG_SIMPLE_PAGES[path], HOME)) if path == "/big/f1/gzok.html": self.big_send( gzip.compress(body, mtime=0), "text/html", extra=[("Content-Encoding", "gzip")], ) elif path == "/big/f1/gzid.html": # Plain body mislabeled as gzip: identity fallback keeps it (#47) self.big_send( body, "text/html", extra=[("Content-Encoding", "gzip")], ) else: self.big_send(body, "text/html") elif path == "/big/f1/list.html": # Pagination: distinct content per query string. body = big_html("list", "

listing %s

%s" % (split.query or "1", HOME)) self.big_send(body, "text/html") elif path == "/big/f6/based.html": self.big_send( big_html( "based", '' 'leaf' % port, ), "text/html", ) elif path == "/big/f7/frames.html": self.big_send( b'' b'<body><a href="fn.html">fn</a>' b"</body>", "text/html", ) elif path == "/big/f9/café.html": self.big_send(big_html("cafe", "

cafe

%s" % HOME), "text/html") elif path == "/big/f9/latin1.html": self.big_send( b"

caf\xe9 latin

", "text/html; charset=ISO-8859-1", ) elif path == "/big/f9/metaonly.html": self.big_send( '' "

café meta

".encode(), "text/html", ) elif path == "/big/f9/bom.html": self.big_send( b"\xef\xbb\xbf" + big_html("bom", "

bom

%s" % HOME), "text/html" ) elif path == "/big/f10/empty.html": self.big_send(b"", "text/html") elif path == "/big/f12/rss.xml": self.big_send(_big_rss(port), "text/xml") elif path == "/big/f12/atom.xml": self.big_send(_big_atom(port), "application/xml") elif path == "/big/f12/sitemap.xml": self.big_send(_big_sitemap(port), "text/xml") elif path.startswith("/big/p/"): try: n = int(path[len("/big/p/") : -len(".html")]) except ValueError: n = -1 if 0 <= n < BIG_PAGES and path.endswith(".html"): self.big_send(big_page(n, port), "text/html") else: self.big_error(404, "no such page") elif path.startswith("/big/a/") or path.startswith("/big/x/"): name = path[len("/big/a/") :] if path.startswith("/big/a/") and name in BIG_TEXT_ASSETS: text, ctype = BIG_TEXT_ASSETS[name] self.big_send(text.encode(), ctype) elif name.endswith(".html"): # Decoy targets 200 so a parser leak becomes a mirror file. self.big_send(big_html(name, "

%s

" % name), "text/html") else: ext = name.rsplit(".", 1)[-1] ctype = BIG_CTYPES.get(ext, "application/octet-stream") self.big_send(big_asset(name), ctype) elif path in BIG_DOWNLOADS: ext, cdispo = BIG_DOWNLOADS[path] extra = [("Content-Disposition", cdispo)] if cdispo else [] self.big_send( big_asset(path[len("/big/") :] + "." + ext), BIG_CTYPES[ext], extra=extra, ) elif path == "/big/e/404.html": self.big_error(404, "Not Found") elif path == "/big/e/410.html": self.big_error(410, "Gone") elif path == "/big/e/500.html": self.big_error(500, "Server Error") elif path == "/big/e/gztrunc.html": # Half a gzip stream, honest Content-Length: decode fails, and the # missing Last-Modified keeps it the one uncacheable resource. full = gzip.compress(big_html("gz", "x" * 3000), mtime=0) body = full[: len(full) // 2] self.send_response(200) self.send_header("Content-Type", "text/html") self.send_header("Content-Encoding", "gzip") self.send_header("Content-Length", str(len(body))) self.end_headers() if self.command != "HEAD": self.wfile.write(body) else: self.big_error(404, "no such big path") # --- dispatch ---------------------------------------------------------- def reject_fragment(self): # Strict server: a '#' in the request-target is the client failing to # drop a fragment (#204). RFC 3986 forbids it on the wire; answer 400. if "#" in self.path: self.send_response(400, "Bad Request") self.send_header("Content-Length", "0") self.end_headers() return True return False def dispatch(self): self._set_cookies = [] path = urlsplit(self.path).path if path.startswith("/big/"): self.route_big() return True if path.startswith("/charset/"): self.route_charset() return True # Match percent-encoded paths (accented #157 route) by their decoded form. handler = self.ROUTES.get(path) or self.ROUTES.get(unquote(path)) if handler is not None: handler(self) return True return False def do_GET(self): if self.reject_fragment(): return if not self.dispatch(): super().do_GET() def do_HEAD(self): if self.reject_fragment(): return if not self.dispatch(): super().do_HEAD() def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--root", required=True, help="docroot for static files") parser.add_argument("--bind", default="127.0.0.1", help="bind address") parser.add_argument("--tls", action="store_true", help="serve HTTPS") parser.add_argument("--cert", help="TLS certificate (PEM)") parser.add_argument("--key", help="TLS private key (PEM)") args = parser.parse_args() root = os.path.abspath(args.root) def factory(*a, **kw): return Handler(*a, directory=root, **kw) # macOS/BSD drop SYNs when the listen backlog overflows (Linux is lenient); # raise it from Python's default 5 so a busy -c8 crawl can't lose fetches. class BacklogHTTPServer(ThreadingHTTPServer): request_queue_size = 128 httpd = BacklogHTTPServer((args.bind, 0), factory) if args.tls: import ssl ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_cert_chain(certfile=args.cert, keyfile=args.key) httpd.socket = ctx.wrap_socket(httpd.socket, server_side=True) port = httpd.socket.getsockname()[1] # Keep the port line the launcher parses LF: Windows would emit \r\n. sys.stdout.reconfigure(newline="\n") print(f"PORT {port}", flush=True) try: httpd.serve_forever() except KeyboardInterrupt: pass if __name__ == "__main__": main() httrack-3.49.14/tests/local-crawl.sh0000755000175000017500000005213015230602340012712 #!/bin/bash # # Launcher for httrack crawl tests against the local Python test server. # # Starts tests/local-server.py on an ephemeral port, discovers the port from # the server's stdout, then runs httrack against http(s)://127.0.0.1:$PORT and # audits the mirror. The server is always killed and the tmpdir removed on exit. # # The token BASEURL in any httrack argument is replaced with the discovered # http(s)://127.0.0.1:$PORT base. --found/--directory paths are relative to the # discovered host root (127.0.0.1_/), since the random port leaks into # the mirror directory name. # # Usage: # bash local-crawl.sh [--tls] [--root DIR] [--cookie NAME=VALUE ...] \ # [--rerun-args 'ARGS'] \ # --errors N --errors-content N --files N --found PATH ... --directory PATH ... \ # --log-found REGEX ... --log-not-found REGEX ... \ # --file-matches PATH REGEX ... --file-not-matches PATH REGEX ... \ # --file-min-bytes PATH N --file-mode PATH OCTAL --max-mirror-bytes N \ # httrack BASEURL/some/path [httrack-args...] # --errors counts every "Error:" log line; --errors-content drops transient # network failures (codes -2..-6) that flake on busy loopback under -c8. # --log-found/--log-not-found grep (ERE) the crawl's hts-log.txt. # --max/--min-mirror-bytes bound the mirrored content bytes (host root). # --file-matches/--file-not-matches grep (ERE) a mirrored file (PATH under the # host root), to assert rewritten link/content survived the crawl. # --file-min-bytes asserts a mirrored file (PATH) is at least N bytes. # --file-mode asserts its octal permissions (e.g. 644); POSIX hosts only. # --rerun-args runs a second pass (same server and mirror dir) with the given # extra httrack args appended, e.g. an --update run under a cap. # --cookie writes a Netscape cookies.txt (scoped to the discovered host:port, # which the ephemeral port forces into the cookie domain) and passes it to # httrack via --cookies-file, to exercise preloaded cookies. # --rerun-dead re-runs with the server stopped: the no-data rollback must # restore the previous hts-cache generation byte-identical. set -u testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server="${testdir}/local-server.py" root="${LOCAL_SERVER_ROOT:-${testdir}/server-root}" cert="${testdir}/server.crt" key="${testdir}/server.key" tls= verbose= warc_validate= wacz_validate= html_subdir= outdir_intl= rerun= rerun_args= rerun_dead= tmpdir= serverpid= crawlpid= function warning { echo "** $*" >&2 return 0 } function die { warning "$*" exit 1 } function debug { test -n "$verbose" && echo "$*" >&2 return 0 } function info { printf "[%s] ..\t" "$*" >&2; } function result { echo "$*" >&2; } function cleanup { if test -n "$crawlpid"; then kill -9 "$crawlpid" 2>/dev/null crawlpid= fi stop_server "$serverpid" serverpid= if test -n "$tmpdir" && test -d "$tmpdir"; then test -n "$nopurge" || rm -rf "$tmpdir" fi } function assert_equals { info "$1" if test ! "$2" == "$3"; then result "expected '$2', got '$3'" exit 1 fi result "OK ($2)" } nopurge= trap cleanup EXIT HUP INT QUIT PIPE TERM # python3 is required; mirror check-network.sh's skip-with-77 convention. python=$(find_python) || ! echo "python3 not found; skipping local crawl tests" >&2 || exit 77 tmptopdir=${TMPDIR:-/tmp} test -d "$tmptopdir" || mkdir -p "$tmptopdir" || die "no temporary directory; set TMPDIR" tmpdir=$(mktemp -d "${tmptopdir}/httrack_local.XXXXXX") || die "could not create tmpdir" # --- parse leading control flags -------------------------------------------- declare -a audit=() declare -a cookies=() scheme=http pos=0 args=("$@") nargs=$# while test "$pos" -lt "$nargs"; do case "${args[$pos]}" in --debug) verbose=1 ;; --rerun) rerun=1 ;; # run httrack a second time (update pass) before auditing --rerun-dead) rerun_dead=1 ;; # re-run with the server stopped (cache rollback) # validate the produced .warc.gz (see the validation block near the end) --warc-validate) warc_validate=1 ;; # validate the produced .wacz package (stdlib, plus py-wacz/pywb if present) --wacz-validate) wacz_validate=1 ;; --no-purge) nopurge=1 audit+=("--no-purge") ;; --cache-under-logroot) audit+=("--cache-under-logroot") ;; --tls) tls=1 scheme=https ;; --root) pos=$((pos + 1)) root="${args[$pos]}" ;; --cookie) pos=$((pos + 1)) cookies+=("${args[$pos]}") ;; --rerun-args) pos=$((pos + 1)) rerun_args="${args[$pos]}" ;; --html-subdir) # Mirror into "$out/NAME" (path_html) but keep logs/cache in "$out" # (path_log): a non-ASCII NAME exercises the -O path encoding (#621) # without routing the harness-read hts-log.txt through a non-ASCII path. pos=$((pos + 1)) html_subdir="${args[$pos]}" ;; --outdir-intl) # Single non-ASCII -O "$out/NAME": path_html AND path_log are NAME, so # the logs (and the harness reads of them) go through the non-ASCII path # (#630). Distinct from --html-subdir, which keeps path_log ASCII. pos=$((pos + 1)) outdir_intl="${args[$pos]}" ;; --errors | --errors-content | --files) audit+=("${args[$pos]}" "${args[$((pos + 1))]}") pos=$((pos + 1)) ;; --found | --not-found | --directory | --log-found | --log-not-found | --max-mirror-bytes | --min-mirror-bytes) audit+=("${args[$pos]}" "${args[$((pos + 1))]}") pos=$((pos + 1)) ;; --file-matches | --file-not-matches | --file-min-bytes | --file-mode) audit+=("${args[$pos]}" "${args[$((pos + 1))]}" "${args[$((pos + 2))]}") pos=$((pos + 2)) ;; httrack) pos=$((pos + 1)) break ;; *) die "unrecognized option ${args[$pos]}" ;; esac pos=$((pos + 1)) done # --- start the server -------------------------------------------------------- test -r "$server" || die "cannot read $server" serverlog="${tmpdir}/server.log" serverargs=(--root "$(nativepath "$root")") if test -n "$tls"; then serverargs+=(--tls --cert "$(nativepath "$cert")" --key "$(nativepath "$key")") fi debug "starting $python $server ${serverargs[*]}" "$python" "$(nativepath "$server")" "${serverargs[@]}" >"$serverlog" 2>&1 & serverpid=$! # Wait for the "PORT " line (server prints it once bound). A cold Python # start under a parallel `make check -jN` can lag past a second on a loaded Windows runner. port= for _ in $(seq 1 300); do # Match anywhere: a startup warning merged via 2>&1 could precede the PORT line. line=$(grep -m1 '^PORT ' "$serverlog" 2>/dev/null) && port="${line#PORT }" && break kill -0 "$serverpid" 2>/dev/null || die "server exited early: $(cat "$serverlog")" sleep 0.1 done test -n "$port" || die "could not discover server port: $(cat "$serverlog")" debug "server listening on ${scheme}://127.0.0.1:${port}" baseurl="${scheme}://127.0.0.1:${port}" # --- substitute BASEURL in the remaining (httrack) args ---------------------- declare -a hts=() while test "$pos" -lt "$nargs"; do hts+=("${args[$pos]//BASEURL/$baseurl}") pos=$((pos + 1)) done # --- materialize any --cookie entries into a cookies.txt --------------------- if test "${#cookies[@]}" -gt 0; then jar="${tmpdir}/cookies.txt" : >"$jar" for spec in "${cookies[@]}"; do printf '127.0.0.1:%s\tTRUE\t/\tFALSE\t1999999999\t%s\t%s\n' \ "$port" "${spec%%=*}" "${spec#*=}" >>"$jar" done hts+=(--cookies-file "$jar") fi # --- run httrack ------------------------------------------------------------- command -v httrack >/dev/null || die "could not find httrack" ver=$(httrack -O /dev/null --version | sed -e 's/HTTrack version //') test -n "$ver" || die "could not run httrack" out="${tmpdir}/crawl" mkdir "$out" || die "could not create $out" # path_html holds the mirror + index; path_log holds hts-cache/hts-log.txt. # Default: both are "$out". --html-subdir moves path_html to "$out/NAME" while # path_log (logroot) stays "$out"; --outdir-intl moves both to "$out/NAME". mirrorroot="$out" logroot="$out" odir="$out" if test -n "$html_subdir"; then mirrorroot="${out}/${html_subdir}" odir="${mirrorroot},${out}" elif test -n "$outdir_intl"; then mirrorroot="${out}/${outdir_intl}" logroot="$mirrorroot" odir="$mirrorroot" fi # Localhost is fast; disable the rate/bandwidth safety limits but keep a # max-time backstop so a hang cannot wedge the suite. declare -a moreargs=(--quiet --max-time=120 --timeout=30 --disable-security-limits --robots=0) # Watchdog above --max-time so the engine limit fires first when healthy; only a # genuine wedge trips it. CRAWL_DEADLINE lets 72_watchdog-crawl drive it low. crawl_deadline=${CRAWL_DEADLINE:-180} log="${tmpdir}/log" info "running httrack ${hts[*]}" httrack -O "$odir" --user-agent="httrack $ver local ($(uname -mrs))" "${moreargs[@]}" "${hts[@]}" >"$log" 2>&1 & crawlpid=$! wait_bounded "$crawlpid" "$crawl_deadline" crawlres=$? crawlpid= test "$crawlres" -ne 124 || warning "crawl watchdog fired after ${crawl_deadline}s" # httrack exits 0 even on hard connect/DNS errors, so this is a backstop only; # the real guard is the audit below (--errors 0 plus the host-root existence check). test "$crawlres" -eq 0 || ! result "httrack exited $crawlres" || { cat "$log" >&2 exit 1 } result "OK" grep -iE "^[0-9:]*[[:space:]]Error:" "${logroot}/hts-log.txt" >&2 # Snapshot the first-pass WARC before an update pass overwrites it: the fresh # crawl carries the full response bodies, the update pass only revisits. if test -n "$warc_validate"; then w1=$(find "$mirrorroot" -maxdepth 2 -name '*.warc.gz' 2>/dev/null | sort | tail -n1) test -z "$w1" || cp "$w1" "${tmpdir}/warc-pass1.gz" fi # --- optional second pass: re-mirror into the same dir (cache/update path) ---- if test -n "$rerun"; then info "re-running httrack (update pass)" httrack -O "$odir" --user-agent="httrack $ver local ($(uname -mrs))" \ "${moreargs[@]}" "${hts[@]}" >"${log}.2" 2>&1 & crawlpid=$! wait_bounded "$crawlpid" "$crawl_deadline" crawlres=$? crawlpid= test "$crawlres" -eq 0 || ! result "update pass exited $crawlres" || { cat "${log}.2" >&2 exit 1 } result "OK (update)" # The update summary reports "files updated"; a fresh crawl never does. Assert # it so a regression that bypasses the cache (re-crawls fresh) can't pass. info "checking update used the cache" if grep -aqE "mirror complete in .*files updated" "${logroot}/hts-log.txt"; then result "OK" else result "update pass did not report cache activity" exit 1 fi fi # --- optional second pass with extra args (e.g. an --update run under a cap) --- # Same server and mirror dir as the first pass, so the second pass sees the # cache the first pass wrote. Used to exercise re-fetch/update behaviour. if test -n "$rerun_args"; then read -ra extra <<<"$rerun_args" info "re-running httrack with ${rerun_args}" httrack -O "$odir" --user-agent="httrack $ver local ($(uname -mrs))" \ "${moreargs[@]}" "${hts[@]}" "${extra[@]}" >"${log}.2" 2>&1 & crawlpid=$! wait_bounded "$crawlpid" "$crawl_deadline" crawlres=$? crawlpid= test "$crawlres" -eq 0 || ! result "second pass exited $crawlres" || { cat "${log}.2" >&2 exit 1 } result "OK (second pass)" fi # --- optional dead pass: server stopped, the cache must survive the rollback -- if test -n "$rerun_dead"; then zip="${out}/hts-cache/new.zip" test -s "$zip" || die "no cache was written by the first pass" cp "$zip" "${tmpdir}/cache-before.zip" cp "${logroot}/hts-log.txt" "${tmpdir}/log-before.txt" stop_server "$serverpid" serverpid= info "re-running httrack against the stopped server" httrack -O "$odir" --user-agent="httrack $ver local ($(uname -mrs))" \ "${moreargs[@]}" "${hts[@]}" >"${log}.dead" 2>&1 & crawlpid=$! wait_bounded "$crawlpid" "$crawl_deadline" || true crawlpid= result "OK (dead pass ran)" # The dead pass must have gone through the no-data rollback, not bailed out # before the mirror loop (which would leave the cache trivially untouched). info "checking the dead pass hit the rollback" if grep -aq "No data seems to have been transferred" "${logroot}/hts-log.txt"; then result "OK" else result "rollback notice not found in hts-log.txt" exit 1 fi info "checking the previous cache generation was restored" if cmp -s "$zip" "${tmpdir}/cache-before.zip" && test ! -e "${out}/hts-cache/old.zip"; then result "OK" else result "new.zip differs from the pre-outage cache (or old.zip left behind)" exit 1 fi # Audits below describe the healthy crawl, not the dead pass. cp "${tmpdir}/log-before.txt" "${logroot}/hts-log.txt" fi # --- discover the single host root (127.0.0.1_ or 127.0.0.1) ----------- hostroot= for cand in "${mirrorroot}/127.0.0.1_${port}" "${mirrorroot}/127.0.0.1"; do if test -d "$cand"; then hostroot="$cand" break fi done test -n "$hostroot" || die "could not find host root under $out" debug "host root: $hostroot" # --- optional WARC validation (stdlib validator, no warcio) ------------------ # WARC_VALIDATE_BODY="URLSUB=HEX" byte-checks a fresh-crawl response body; # WARC_VALIDATE_NORESP="URLSUB..." asserts those assets are revisits post-update. if test -n "$warc_validate"; then validator=$(nativepath "${testdir}/warc-validate.py") warc=$(find "$mirrorroot" -maxdepth 2 \( -name '*.warc.gz' -o -name '*.warc' \) 2>/dev/null | sort | tail -n1) test -n "$warc" || die "no WARC file produced under $mirrorroot" # Fresh-crawl file (snapshot if an update pass overwrote it): full responses. fresh="${tmpdir}/warc-pass1.gz" test -f "$fresh" || fresh="$warc" declare -a bodyargs=() # WARC_VALIDATE_BODY holds one or more whitespace-separated SUB=HEX specs. for spec in ${WARC_VALIDATE_BODY:-}; do bodyargs+=(--expect-body-hex "$spec") done # compressed asset: assert the stored (verbatim) body inflates to the served # body and keeps Content-Encoding, instead of expecting a decoded body. test -n "${WARC_VALIDATE_VERBATIM:-}" && bodyargs+=(--verbatim) info "validating fresh WARC (response bodies)" "$python" "$validator" "$(nativepath "$fresh")" "${bodyargs[@]}" >&2 || die "fresh WARC validation failed" result "OK" # Final file: after an update pass the unchanged assets must be revisits. if test -n "$rerun"; then declare -a revargs=(--expect-revisit) for sub in ${WARC_VALIDATE_NORESP:-}; do revargs+=(--no-response-for "$sub") done info "validating update WARC (revisits)" "$python" "$validator" "$(nativepath "$warc")" "${revargs[@]}" >&2 || die "update WARC validation failed" result "OK" fi if command -v warcio >/dev/null 2>&1; then info "warcio check (optional)" if warcio check -v "$warc" >&2; then result "OK"; else die "warcio check failed"; fi fi fi # --- optional WACZ validation (--wacz) -------------------------------------- if test -n "$wacz_validate"; then wacz=$(find "$mirrorroot" -maxdepth 2 -name '*.wacz' 2>/dev/null | sort | tail -n1) if test -z "$wacz"; then # No package: only acceptable when the build lacks OpenSSL (SHA-256). if grep -aqi "WACZ requires an OpenSSL" "${logroot}/hts-log.txt"; then info "no .wacz produced (build without OpenSSL); skipping" exit 77 fi die "no .wacz file produced under $mirrorroot" fi validator=$(nativepath "${testdir}/wacz-validate.py") info "validating WACZ package" "$python" "$validator" "$(nativepath "$wacz")" >&2 || die "WACZ validation failed" result "OK" fi # No crawl, even a cancelled one, may leave engine temporaries: .delayed (#107, # #483), or the .z/.u content-coding temps (#557). info "checking for leftover engine temporaries" leftovers=$(find "$out" \( -name '*.delayed' -o -name '*.z' -o -name '*.u' \) 2>/dev/null | head -5) if test -z "$leftovers"; then result "OK"; else result "leftover: $leftovers" exit 1 fi # --- audit ------------------------------------------------------------------- i=0 while test "$i" -lt "${#audit[@]}"; do case "${audit[$i]}" in --errors) i=$((i + 1)) assert_equals "checking errors" "${audit[$i]}" \ "$(grep -iEc "^[0-9:]*[[:space:]]Error:" "${logroot}/hts-log.txt")" ;; --errors-content) i=$((i + 1)) total=$(grep -icE "^[0-9:]*[[:space:]]Error:" "${logroot}/hts-log.txt") # transient network failures (statuscode -2..-6) flake on busy loopback; # the code parens are followed by " at link" or " after N retries at link" transient=$(grep -cE '\(-[2-6]\) (at link|after )' "${logroot}/hts-log.txt" || true) assert_equals "checking content errors" "${audit[$i]}" "$((total - transient))" ;; --files) i=$((i + 1)) nFiles=$(grep -E "^HTTrack Website Copier/[^ ]* mirror complete in " "${logroot}/hts-log.txt" | sed -e 's/.*[[:space:]]\([^ ]*\)[[:space:]]files written.*/\1/g') assert_equals "checking files" "${audit[$i]}" "$nFiles" ;; --cache-under-logroot) # The cache must sit under path_log (logroot), not an ANSI-mangled twin # of a non-ASCII -O dir (#630 cache half). Bites only on the Windows leg. info "checking cache under logroot" if test -e "${logroot}/hts-cache/new.zip"; then result "OK"; else result "cache not under logroot (mangled twin?)" exit 1 fi ;; --found) i=$((i + 1)) info "checking for ${audit[$i]}" if test -f "${hostroot}/${audit[$i]}"; then result "OK"; else result "not found" exit 1 fi ;; --not-found) i=$((i + 1)) info "checking absence of ${audit[$i]}" if test ! -f "${hostroot}/${audit[$i]}"; then result "OK"; else result "present" exit 1 fi ;; --directory) i=$((i + 1)) info "checking for dir ${audit[$i]}" if test -d "${hostroot}/${audit[$i]}"; then result "OK"; else result "not found" exit 1 fi ;; --log-found) i=$((i + 1)) info "checking log matches ${audit[$i]}" if grep -aqE "${audit[$i]}" "${logroot}/hts-log.txt"; then result "OK"; else result "not in log" exit 1 fi ;; --log-not-found) i=$((i + 1)) info "checking log lacks ${audit[$i]}" if grep -aqE "${audit[$i]}" "${logroot}/hts-log.txt"; then result "present in log" exit 1 else result "OK"; fi ;; --max-mirror-bytes) i=$((i + 1)) sz=$(find "$hostroot" -type f -exec cat {} + | wc -c | tr -d '[:space:]') info "checking mirror size ${sz} <= ${audit[$i]} bytes" if test "$sz" -le "${audit[$i]}"; then result "OK"; else result "mirror too big" exit 1 fi ;; --min-mirror-bytes) i=$((i + 1)) sz=$(find "$hostroot" -type f -exec cat {} + | wc -c | tr -d '[:space:]') info "checking mirror size ${sz} >= ${audit[$i]} bytes" if test "$sz" -ge "${audit[$i]}"; then result "OK"; else result "mirror too small" exit 1 fi ;; --file-matches) path="${audit[$((i + 1))]}" i=$((i + 2)) info "checking ${path} matches ${audit[$i]}" if grep -aqE "${audit[$i]}" "${hostroot}/${path}"; then result "OK"; else result "no match" exit 1 fi ;; --file-not-matches) path="${audit[$((i + 1))]}" i=$((i + 2)) info "checking ${path} lacks ${audit[$i]}" if grep -aqE "${audit[$i]}" "${hostroot}/${path}"; then result "matched" exit 1 else result "OK"; fi ;; --file-min-bytes) path="${audit[$((i + 1))]}" i=$((i + 2)) sz=$(wc -c <"${hostroot}/${path}" 2>/dev/null | tr -d '[:space:]') info "checking ${path} size ${sz:-0} >= ${audit[$i]} bytes" if test -n "$sz" && test "$sz" -ge "${audit[$i]}"; then result "OK"; else result "file too small (or missing)" exit 1 fi ;; --file-mode) path="${audit[$((i + 1))]}" i=$((i + 2)) if is_windows; then # No POSIX modes, and the engine only chmods #ifndef _WIN32. info "checking ${path} mode" result "SKIP (no POSIX modes)" else mode=$(stat -c '%a' "${hostroot}/${path}" 2>/dev/null || stat -f '%Lp' "${hostroot}/${path}" 2>/dev/null) info "checking ${path} mode ${mode:-none} is ${audit[$i]}" if test "$mode" = "${audit[$i]}"; then result "OK"; else result "wrong mode" exit 1 fi fi ;; esac i=$((i + 1)) done httrack-3.49.14/tests/wacz-validate.py0000755000175000017500000000660015230602340013264 #!/usr/bin/env python3 # Validate a WACZ package with the stdlib only (no py-wacz needed): every entry # is ZIP STORE, the fixed layout is present, each datapackage resource hash and # size recomputes, the digest chains datapackage.json, and pages.jsonl carries # the json-pages-1.0 header. If py-wacz (`wacz validate`) is importable it runs # too; both gates must pass. Exit 0 = valid, nonzero = invalid. import sys import json import zipfile import hashlib def fail(msg): print("wacz-validate: FAIL: %s" % msg, file=sys.stderr) sys.exit(1) def main(): if len(sys.argv) < 2: fail("usage: wacz-validate.py FILE.wacz") path = sys.argv[1] z = zipfile.ZipFile(path) names = z.namelist() for info in z.infolist(): if info.compress_type != zipfile.ZIP_STORED: fail("%s is not STORE mode (%d)" % (info.filename, info.compress_type)) need_arc = any( n.startswith("archive/") and n.endswith((".warc.gz", ".warc")) for n in names ) for req, ok in ( ("archive/*.warc.gz", need_arc), ("indexes/index.cdx", "indexes/index.cdx" in names), ("pages/pages.jsonl", "pages/pages.jsonl" in names), ("datapackage.json", "datapackage.json" in names), ("datapackage-digest.json", "datapackage-digest.json" in names), ): if not ok: fail("missing %s (entries: %s)" % (req, names)) lines = [ln for ln in z.read("pages/pages.jsonl").split(b"\n") if ln.strip()] if not lines or json.loads(lines[0]).get("format") != "json-pages-1.0": fail("pages.jsonl header is not json-pages-1.0: %r" % lines[:1]) body = [json.loads(ln) for ln in lines[1:]] if not body: fail("pages.jsonl has no page rows after the header") for row in body: if "url" not in row or "ts" not in row: fail("pages.jsonl row missing url/ts: %r" % row) dp = json.loads(z.read("datapackage.json")) if dp.get("profile") != "data-package": fail("profile != data-package: %r" % dp.get("profile")) if dp.get("wacz_version") != "1.1.1": fail("wacz_version != 1.1.1: %r" % dp.get("wacz_version")) resources = dp.get("resources", []) if not resources: fail("datapackage has no resources") for r in resources: data = z.read(r["path"]) h = "sha256:" + hashlib.sha256(data).hexdigest() if h != r["hash"]: fail("%s hash %s != %s" % (r["path"], h, r["hash"])) if len(data) != r["bytes"]: fail("%s bytes %d != %d" % (r["path"], len(data), r["bytes"])) dig = json.loads(z.read("datapackage-digest.json")) want = "sha256:" + hashlib.sha256(z.read("datapackage.json")).hexdigest() if dig.get("path") != "datapackage.json" or dig.get("hash") != want: fail("digest chain broken: %r" % dig) print( "wacz-validate: OK (%d entries, %d resources, stdlib)" % (len(names), len(resources)) ) # Optional stricter gate when py-wacz is present. try: import wacz # noqa: F401 except Exception: return try: from wacz.main import main as wacz_main # type: ignore except Exception: return print("wacz-validate: running py-wacz validate") rc = wacz_main(["validate", "-f", path]) if rc not in (0, None): fail("py-wacz validate returned %r" % rc) print("wacz-validate: py-wacz OK") if __name__ == "__main__": main() httrack-3.49.14/tests/warc-validate.py0000755000175000017500000001747215230602340013265 #!/usr/bin/env python3 # Structural + semantic WARC/1.1 validator, Python stdlib only (no warcio): # walks the concatenated gzip members with zlib (gzip.decompress would fuse them # and lose per-record boundaries) and checks each record against the spec. # # Options: # --expect-revisit at least one revisit record must be present # --expect-body-hex SUB=HEX a response whose WARC-Target-URI contains SUB must # have an entity body byte-equal to bytes.fromhex(HEX), # no Content-Encoding/Transfer-Encoding header, and a # WARC-Payload-Digest matching sha1(body) when present # --no-response-for SUB the asset containing SUB must be a revisit: no # response may target it, and a revisit must # --verbatim compressed asset: --expect-body-hex instead keeps # Content-Encoding, checks the HTTP Content-Length is # the stored (compressed) length, asserts the stored # body inflates to HEX (the served plaintext), and # requires the payload digest when the file emits any import base64 import hashlib import sys import zlib def records(data): """Yield each record's decompressed bytes (one gzip member per record).""" if data[:2] != b"\x1f\x8b": # uncompressed .warc: split on the record magic parts = data.split(b"WARC/1.") for p in parts[1:]: yield b"WARC/1." + p return while data: d = zlib.decompressobj(zlib.MAX_WBITS | 16) block = d.decompress(data) + d.flush() yield block data = d.unused_data def field(header, name): for line in header.split(b"\r\n"): if line.lower().startswith(name.lower() + b":"): return line.split(b":", 1)[1].strip() return None def opt_values(argv, name): out = [] for i, a in enumerate(argv): if a == name and i + 1 < len(argv): out.append(argv[i + 1]) return out def check_body(rec, http_hdr, body, sub, want): if b"Content-Encoding" in http_hdr or b"Transfer-Encoding" in http_hdr: sys.exit("record for %s kept a content/transfer-encoding header" % sub) if body != want: sys.exit( "body mismatch for %s: got %d bytes, expected %d" % (sub, len(body), len(want)) ) pd = field(rec[: rec.find(b"\r\n\r\n")], b"WARC-Payload-Digest") if pd is not None and pd.startswith(b"sha1:"): want_b32 = base64.b32encode(hashlib.sha1(want).digest()).decode("ascii") if pd[5:].decode("ascii") != want_b32: sys.exit("WARC-Payload-Digest mismatch for %s" % sub) def check_body_verbatim(rec, http_hdr, body, sub, want, digests_emitted): """Verbatim: the stored body is the coded octets, Content-Encoding is kept, the HTTP Content-Length equals the stored (compressed) length, inflating the body yields the served plaintext, and the payload digest is over the coded body. The differential: inflate(stored) == the body the server compressed.""" if b"Content-Encoding" not in http_hdr: sys.exit("verbatim record for %s dropped Content-Encoding" % sub) if b"Transfer-Encoding" in http_hdr: sys.exit("verbatim record for %s kept Transfer-Encoding" % sub) hcl = field(http_hdr, b"Content-Length") if hcl is None or int(hcl) != len(body): sys.exit("verbatim record for %s: HTTP Content-Length != stored body" % sub) try: decoded = zlib.decompress(body, zlib.MAX_WBITS | 16) except Exception as exc: sys.exit("verbatim record for %s: body did not inflate: %s" % (sub, exc)) if decoded != want: sys.exit( "verbatim decoded mismatch for %s: got %d bytes, expected %d" % (sub, len(decoded), len(want)) ) pd = field(rec[: rec.find(b"\r\n\r\n")], b"WARC-Payload-Digest") # Catch a regression that drops the digest on the verbatim path, but only # when this file emits digests at all (an OpenSSL build; none otherwise). if digests_emitted and pd is None: sys.exit("verbatim record for %s: missing WARC-Payload-Digest" % sub) if pd is not None and pd.startswith(b"sha1:"): want_b32 = base64.b32encode(hashlib.sha1(body).digest()).decode("ascii") if pd[5:].decode("ascii") != want_b32: sys.exit("WARC-Payload-Digest (compressed) mismatch for %s" % sub) def main(): argv = sys.argv[1:] expect_revisit = "--expect-revisit" in argv verbatim = "--verbatim" in argv body_specs = [s.split("=", 1) for s in opt_values(argv, "--expect-body-hex")] no_resp = opt_values(argv, "--no-response-for") path = [a for a in argv if not a.startswith("--") and "=" not in a][0] data = open(path, "rb").read() # digests are emitted only on an OpenSSL build; detect it once so --verbatim # can require the payload digest exactly when the file carries any. digests_emitted = any( b"WARC-Payload-Digest" in r[: r.find(b"\r\n\r\n")] for r in records(data) ) total = revisits = responses = infos = 0 body_hits = {sub: False for sub, _ in body_specs} revisit_hits = {sub: False for sub in no_resp} for rec in records(data): total += 1 if not rec.startswith(b"WARC/1."): sys.exit("record %d: bad magic %r" % (total, rec[:16])) sep = rec.find(b"\r\n\r\n") if sep < 0: sys.exit("record %d: no header terminator" % total) hdr_end = sep + 4 header = rec[:sep] cl = field(header, b"Content-Length") if cl is None: sys.exit("record %d: no Content-Length" % total) block_len = int(cl) if hdr_end + block_len + 4 != len(rec): sys.exit( "record %d: Content-Length %d != block length %d" % (total, block_len, len(rec) - hdr_end - 4) ) if rec[hdr_end + block_len :] != b"\r\n\r\n": sys.exit("record %d: missing \\r\\n\\r\\n trailer" % total) wtype = field(header, b"WARC-Type") uri = field(header, b"WARC-Target-URI") or b"" if wtype == b"warcinfo": infos += 1 elif wtype == b"response": responses += 1 for sub in no_resp: if sub.encode() in uri: sys.exit("unexpected full response for %s (want revisit)" % sub) block = rec[hdr_end : hdr_end + block_len] bsep = block.find(b"\r\n\r\n") http_hdr, body = block[:bsep], block[bsep + 4 :] for sub, hexval in body_specs: if sub.encode() in uri: want = bytes.fromhex(hexval) if verbatim: check_body_verbatim( rec, http_hdr, body, sub, want, digests_emitted ) else: check_body(rec, http_hdr, body, sub, want) body_hits[sub] = True elif wtype == b"revisit": revisits += 1 for sub in no_resp: if sub.encode() in uri: revisit_hits[sub] = True if total < 1: sys.exit("no records found") if infos != 1: sys.exit("expected exactly one warcinfo record, got %d" % infos) if expect_revisit and revisits < 1: sys.exit("expected at least one revisit record, found none") for sub, hit in body_hits.items(): if not hit: sys.exit("no response record found for --expect-body-hex %s" % sub) for sub, hit in revisit_hits.items(): if not hit: sys.exit("no revisit record found for unchanged asset %s" % sub) print( "warc-validate: %d records OK (%d response, %d revisit)" % (total, responses, revisits) ) if __name__ == "__main__": main() httrack-3.49.14/tests/tls-stall-server.py0000644000175000017500000000254315230602340013753 #!/usr/bin/env python3 """Peers that accept a connection and never speak TLS (#607). Modes: "direct" stalls the handshake straight away; "proxy " answers a CONNECT after before stalling, so the handshake starts on a clock the connect has already eaten into. Prints "PORT " once listening. Usage: tls-stall-server.py [direct | proxy ] """ import os import sys import threading import time # python3 -P (PYTHONSAFEPATH) drops the script's own directory from sys.path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from proxytestlib import bind_ephemeral # noqa: E402 held = [] # keep every socket open: a close would fail the handshake outright def stall(conn, delay): if delay is not None: rfile = conn.makefile("rb") while rfile.readline() not in (b"\r\n", b"\n", b""): pass time.sleep(delay) conn.sendall(b"HTTP/1.0 200 Connection established\r\n\r\n") held.append(conn) def main(): mode = sys.argv[1] if len(sys.argv) > 1 else "direct" delay = float(sys.argv[2]) if mode == "proxy" else None srv, port = bind_ephemeral() sys.stdout.reconfigure(newline="\n") # Windows would emit \r\n print("PORT %d" % port, flush=True) while True: conn, _ = srv.accept() threading.Thread(target=stall, args=(conn, delay), daemon=True).start() main() httrack-3.49.14/tests/proxytestlib.py0000644000175000017500000001220715230602340013276 #!/usr/bin/env python3 """Shared helpers for the local proxy test servers. A CONNECT proxy in front of an origin, as used by proxy-https-server.py (TLS origin, #85) and proxy-connect-server.py (plain origin, #564). socks5-server.py reuses the relay only; its origin is specialised for keep-alive reuse. Importable because Python puts the running script's directory on sys.path. """ import http.server import os import socket import socketserver import ssl import sys import threading PROXY_LOG = "proxy.log" ORIGIN_LOG = "origin-headers.log" def bind_ephemeral(): """Listening socket on a free loopback port, and that port.""" srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srv.bind(("127.0.0.1", 0)) srv.listen(16) return srv, srv.getsockname()[1] def pipe(src, dst): """Relay bytes one way until EOF, then tear both ends down.""" try: while True: data = src.recv(65536) if not data: break dst.sendall(data) except OSError: pass finally: for sock in (src, dst): try: sock.shutdown(socket.SHUT_RDWR) except OSError: pass def make_origin(logdir, body): class Origin(http.server.BaseHTTPRequestHandler): def do_GET(self): # the request line proves origin-form vs absolute-URI (#564) with open(os.path.join(logdir, ORIGIN_LOG), "a") as handle: handle.write(self.requestline + "\n") for key in self.headers.keys(): handle.write(key + "\n") self.send_response(200) self.send_header("Content-Type", "text/html") self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) def log_message(self, *args): pass return Origin def start_origin(logdir, body, certfile=None): """Serve body on an ephemeral port, over TLS when certfile is given.""" httpd = socketserver.TCPServer(("127.0.0.1", 0), make_origin(logdir, body)) if certfile is not None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_cert_chain(certfile) httpd.socket = ctx.wrap_socket(httpd.socket, server_side=True) port = httpd.socket.getsockname()[1] threading.Thread(target=httpd.serve_forever, daemon=True).start() return port def handle_client(conn, logdir, mode, default_port): rfile = conn.makefile("rb") request_line = rfile.readline().decode("latin-1").strip() auth = None while True: line = rfile.readline().decode("latin-1") if line in ("\r\n", "\n", ""): break key, _, value = line.partition(":") if key.strip().lower() == "proxy-authorization": auth = value.strip() with open(os.path.join(logdir, PROXY_LOG), "a") as handle: handle.write(request_line + "\n") if auth is not None: handle.write("AUTH " + auth + "\n") parts = request_line.split() # CONNECT-only: reject the classic absolute-URI form a normal proxy accepts if not (len(parts) >= 2 and parts[0] == "CONNECT"): conn.sendall(b"HTTP/1.0 501 Not Implemented\r\n\r\n") conn.close() return if mode == "flood": # 200, then endless headers with no blank line: the client must not hang try: conn.sendall(b"HTTP/1.0 200 Connection established\r\n") while True: conn.sendall(b"X-Pad: 0123456789\r\n") except OSError: pass conn.close() return host, _, port = parts[1].partition(":") try: # default_port only backstops a portless CONNECT; httrack sends host:port upstream = socket.create_connection((host, int(port or default_port))) except OSError: conn.sendall(b"HTTP/1.0 502 Bad Gateway\r\n\r\n") conn.close() return conn.sendall(b"HTTP/1.0 200 Connection established\r\n\r\n") threading.Thread(target=pipe, args=(conn, upstream), daemon=True).start() pipe(upstream, conn) def start_proxy(logdir, mode, default_port): srv, port = bind_ephemeral() def accept_loop(): while True: conn, _ = srv.accept() threading.Thread( target=handle_client, args=(conn, logdir, mode, default_port), daemon=True, ).start() threading.Thread(target=accept_loop, daemon=True).start() return port def serve(logdir, origin_body, default_port, mode="ok", certfile=None): """Start the origin+proxy pair, announce both ports, then block forever.""" for name in (PROXY_LOG, ORIGIN_LOG): open(os.path.join(logdir, name), "w").close() origin_port = start_origin(logdir, origin_body, certfile) proxy_port = start_proxy(logdir, mode, default_port) # Keep the port lines the caller parses LF: Windows would emit \r\n. sys.stdout.reconfigure(newline="\n") print("ORIGIN %d" % origin_port, flush=True) print("PROXY %d" % proxy_port, flush=True) print("ready", flush=True) threading.Event().wait() httrack-3.49.14/tests/proxy-connect-server.py0000644000175000017500000000255115230602340014643 #!/usr/bin/env python3 """Local CONNECT-only proxy + plain-HTTP origin for the issue #564 test. Models a tor HTTPTunnelPort: an HTTP proxy that honours CONNECT and rejects every other method with 501 (the classic absolute-URI form a normal HTTP proxy accepts). Fronting it is a plain-HTTP origin. The proxy logs each request line (and any Proxy-Authorization); the origin logs its request line and headers. That lets the test assert a plain-http crawl tunneled through CONNECT, arrived origin-form (not "GET http://host/..."), and never leaked proxy credentials. Proxy modes (argv[2], default "ok"): ok - honour CONNECT and tunnel to the origin flood - answer 200 then stream headers forever with no blank line, to exercise the client's bound on the proxy response (must not hang the crawl) Usage: proxy-connect-server.py [mode] Prints "ORIGIN ", "PROXY ", then "ready" (one per line) on stdout. """ import os import sys # python3 -P (PYTHONSAFEPATH) drops the script's own directory from sys.path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import proxytestlib # noqa: E402 ORIGIN_BODY = b"ORIGIN-PAGE-564" def main(): logdir = sys.argv[1] mode = sys.argv[2] if len(sys.argv) > 2 else "ok" proxytestlib.serve(logdir, ORIGIN_BODY, 80, mode) if __name__ == "__main__": main() httrack-3.49.14/tests/socks5-server.py0000644000175000017500000001660515230602340013247 #!/usr/bin/env python3 """Local SOCKS5 proxy (RFC 1928/1929) + TLS and plain HTTP origins for #563. Logs the auth method, any user/pass, and the CONNECT ATYP + literal domain, so the test proves httrack sent a hostname (remote DNS) and negotiated auth. Modes (argv[3]): ok | refuse (REP=5) | truncate (partial reply, must not hang). Usage: socks5-server.py [mode] Prints "TLS ", "HTTP ", "SOCKS ", "ready" on stdout. """ import http.server import os import socket import socketserver import ssl import struct import sys import threading # python3 -P (PYTHONSAFEPATH) drops the script's own directory from sys.path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from proxytestlib import bind_ephemeral, pipe # noqa: E402 # The one name the proxy answers for; a .invalid TLD never resolves (RFC 6761), # so a locally-resolving client could not reach us -- success proves remote DNS. REMOTE_HOST = b"socks-origin.invalid" AUTH_VERSION = 0x01 # RFC 1929 sub-negotiation version # index links the subpages so an -r3 crawl reuses one keep-alive socket LINKS = "".join('%d' % (i, i) for i in range(1, 6)) ORIGIN_BODY = ("ORIGIN-PAGE-563 " + LINKS + "").encode() SOCKS_LOG = "socks.log" ORIGIN_LOG = "origin-headers.log" def make_origin(logdir): class Origin(http.server.BaseHTTPRequestHandler): # HTTP/1.1 + a max>1 advertisement lets httrack keep the socket alive protocol_version = "HTTP/1.1" def do_GET(self): with open(os.path.join(logdir, ORIGIN_LOG), "a") as handle: handle.write( "REQUEST %s %s %s\n" % (self.command, self.path, self.request_version) ) for key in self.headers.keys(): handle.write(key + ": " + self.headers[key] + "\n") if "p" in self.path and ".html" in self.path: body = ( b"SUBPAGE-563 " + self.path.encode() + b"" ) else: body = ORIGIN_BODY self.send_response(200) self.send_header("Content-Type", "text/html") self.send_header("Content-Length", str(len(body))) self.send_header("Keep-Alive", "timeout=15, max=100") self.send_header("Connection", "keep-alive") self.end_headers() self.wfile.write(body) def log_message(self, *args): pass return Origin class ThreadingTCPServer(socketserver.ThreadingTCPServer): allow_reuse_address = True daemon_threads = True def start_origin(logdir, certfile=None): httpd = ThreadingTCPServer(("127.0.0.1", 0), make_origin(logdir)) if certfile is not None: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_cert_chain(certfile) httpd.socket = ctx.wrap_socket(httpd.socket, server_side=True) port = httpd.socket.getsockname()[1] threading.Thread(target=httpd.serve_forever, daemon=True).start() return port def recvn(conn, n): buf = b"" while len(buf) < n: chunk = conn.recv(n - len(buf)) if not chunk: raise OSError("short read") buf += chunk return buf def log(logdir, line): with open(os.path.join(logdir, SOCKS_LOG), "a") as handle: handle.write(line + "\n") def negotiate_auth(conn, logdir): """RFC 1928 greeting + RFC 1929 sub-negotiation. Returns True to proceed.""" ver, nmethods = recvn(conn, 2) if ver != 0x05: return False methods = recvn(conn, nmethods) if 0x02 in methods: # prefer user/pass so the auth test exercises RFC 1929 conn.sendall(b"\x05\x02") (subver,) = recvn(conn, 1) # RFC 1929's version byte is 0x01, not SOCKS5's 0x05: a real proxy # rejects a mismatch instead of tunnelling anyway if subver != AUTH_VERSION: log(logdir, "AUTHVER-BAD %d" % subver) conn.sendall(bytes([AUTH_VERSION, 0x01])) # sub-negotiation failure return False (ulen,) = recvn(conn, 1) uname = recvn(conn, ulen) (plen,) = recvn(conn, 1) passwd = recvn(conn, plen) log(logdir, "METHOD userpass") log(logdir, "AUTH %s %s" % (uname.decode(), passwd.decode())) conn.sendall(b"\x01\x00") # RFC 1929 success elif 0x00 in methods: conn.sendall(b"\x05\x00") log(logdir, "METHOD noauth") else: conn.sendall(b"\x05\xff") # no acceptable method return False return True def read_request(conn, logdir): """RFC 1928 CONNECT. Logs CMD, ATYP, domain/addr, port. Returns dest port.""" ver, cmd, _rsv, atyp = recvn(conn, 4) log(logdir, "CMD %d" % cmd) if atyp == 0x01: addr = socket.inet_ntoa(recvn(conn, 4)) log(logdir, "ATYP ipv4 %s" % addr) elif atyp == 0x03: (dlen,) = recvn(conn, 1) domain = recvn(conn, dlen) log(logdir, "ATYP domain %s" % domain.decode()) elif atyp == 0x04: recvn(conn, 16) log(logdir, "ATYP ipv6") domain = b"" else: return None, None (port,) = struct.unpack(">H", recvn(conn, 2)) log(logdir, "PORT %d" % port) name = domain if atyp == 0x03 else b"" return name, port def reply(conn, rep): conn.sendall(bytes([0x05, rep, 0x00, 0x01]) + b"\x00\x00\x00\x00" + b"\x00\x00") def handle_socks(conn, logdir, mode): try: if not negotiate_auth(conn, logdir): conn.close() return if mode == "truncate": # one byte of the 10-byte reply, then hold the socket: the client # must bound this handshake read and give up, not hang. conn.sendall(b"\x05") threading.Event().wait() return name, port = read_request(conn, logdir) if mode == "refuse" or name != REMOTE_HOST or port is None: reply(conn, 0x05) # connection refused conn.close() return try: upstream = socket.create_connection(("127.0.0.1", port)) except OSError: reply(conn, 0x05) conn.close() return reply(conn, 0x00) # succeeded threading.Thread(target=pipe, args=(conn, upstream), daemon=True).start() pipe(upstream, conn) except OSError: try: conn.close() except OSError: pass def start_socks(logdir, mode): srv, port = bind_ephemeral() def serve(): while True: conn, _ = srv.accept() threading.Thread( target=handle_socks, args=(conn, logdir, mode), daemon=True ).start() threading.Thread(target=serve, daemon=True).start() return port def main(): certfile, logdir = sys.argv[1], sys.argv[2] mode = sys.argv[3] if len(sys.argv) > 3 else "ok" for name in (SOCKS_LOG, ORIGIN_LOG): open(os.path.join(logdir, name), "w").close() tls_port = start_origin(logdir, certfile) http_port = start_origin(logdir, None) socks_port = start_socks(logdir, mode) # Keep the port lines the caller parses LF: Windows would emit \r\n. sys.stdout.reconfigure(newline="\n") print("TLS %d" % tls_port, flush=True) print("HTTP %d" % http_port, flush=True) print("SOCKS %d" % socks_port, flush=True) print("ready", flush=True) threading.Event().wait() if __name__ == "__main__": main() httrack-3.49.14/tests/proxy-https-server.py0000644000175000017500000000253015230602340014351 #!/usr/bin/env python3 """Local CONNECT proxy + self-signed HTTPS origin for the issue #85 test. Starts a TLS origin server and an HTTP proxy that honours CONNECT, on ephemeral ports. Every request line the proxy receives (and any Proxy-Authorization) is appended to the proxy log; every header the origin receives over the tunnel is appended to the origin log. That lets the test assert both that an https crawl tunneled through the proxy and that proxy credentials never leaked to the origin. Proxy modes (argv[3], default "ok"): ok - honour CONNECT and tunnel to the origin flood - answer 200 then stream headers forever with no blank line, to exercise the client's bound on the proxy response (must not hang the crawl) Usage: proxy-https-server.py [mode] Prints "ORIGIN ", "PROXY ", then "ready" (one per line) on stdout. """ import os import sys # python3 -P (PYTHONSAFEPATH) drops the script's own directory from sys.path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import proxytestlib # noqa: E402 ORIGIN_BODY = b"ORIGIN-PAGE-85" def main(): certfile, logdir = sys.argv[1], sys.argv[2] mode = sys.argv[3] if len(sys.argv) > 3 else "ok" proxytestlib.serve(logdir, ORIGIN_BODY, 443, mode, certfile=certfile) if __name__ == "__main__": main() httrack-3.49.14/tests/check-network.sh0000755000175000017500000000204715230602340013260 #!/bin/bash # # ensure the httrack unit tests are available so that ut will not break # the build in case of network outage # do not enable online tests (./configure --disable-online-unit-tests) if test "$ONLINE_UNIT_TESTS" == "no"; then echo "online tests are disabled" >&2 exit 1 # enable online tests (--enable-online-unit-tests) elif test "$ONLINE_UNIT_TESTS" == "yes"; then exit 0 # check if online tests are reachable else # test url url=http://ut.httrack.com/enabled # cache file name cache=check-network_sh.cache # cached result ? if test -f $cache; then if grep -q "ok" $cache; then exit 0 else echo "online tests are disabled (cached)" >&2 exit 1 fi # fetch single file elif bash crawl-test.sh --errors 0 --files 1 httrack --timeout=3 --max-time=3 "$url" 2>/dev/null >/dev/null; then echo "ok" >$cache exit 0 else echo "error" >$cache echo "online tests are disabled (auto)" >&2 exit 1 fi fi httrack-3.49.14/tests/run-all-tests.sh0000755000175000017500000000045115230602340013223 #!/bin/bash # error=0 for i in *.test; do if bash "$i"; then echo "$i: passed" >&2 else echo "$i: ERROR" >&2 error=$((error + 1)) fi done if test "$error" -eq 0; then echo "all tests passed" >&2 else echo "${error} test(s) failed" >&2 fi exit $error httrack-3.49.14/tests/crawl-test.sh0000755000175000017500000001154615230602340012605 #!/bin/bash # function warning { echo "** $*" >&2 return 0 } function die { warning "$*" exit 1 } function debug { if test -n "$verbose"; then echo "$*" >&2 fi } function info { printf '[%s] ..\t' "$*" >&2 } function result { echo "$*" >&2 } function cleanup { debug "cleaning function called" if test -n "$tmpdir"; then if test -d "$tmpdir"; then if test -z "$nopurge"; then debug "cleaning up $tmpdir" rm -rf "$tmpdir" fi fi fi if test -n "$crawlpid"; then debug "killing $crawlpid" kill -9 "$crawlpid" crawlpid= fi } function usage { cat </dev/null || ! warning "could not find httrack" || return 1 ver=$(httrack -O /dev/null --version | sed -e 's/HTTrack version //') test -n "$ver" || ! warning "could not run httrack" || return 1 # start crawl log="${tmp}/log" debug starting httrack -O "${tmp}" "${moreargs[@]}" "${@:pos}" info "running httrack ${*:pos}" httrack -O "${tmp}" --user-agent="httrack $ver ut ($(uname -mrs))" "${moreargs[@]}" "${@:pos}" >"${log}" 2>&1 & crawlpid="$!" debug "started cralwer on pid $crawlpid" wait "$crawlpid" result="$?" crawlpid= test "$result" -eq 0 || ! result "error code $result" || return 1 result "OK" grep -iE "^[0-9\:]*[[:space:]]Error:" "${tmp}/hts-log.txt" >&2 # now audit while test "$#" -gt 0; do case "$1" in --no-purge) nopurge=1 ;; --summary) grep -E "^HTTrack Website Copier/[^ ]* mirror complete in " "${tmp}/hts-log.txt" ;; --print-files) find "${tmp}" -mindepth 1 -type f ;; --errors) shift assert_equals "checking errors" "$1" "$(grep -iEc "^[0-9\:]*[[:space:]]Error:" "${tmp}/hts-log.txt")" ;; --found) shift info "checking for $1" if test -f "${tmp}/$1"; then result "OK" else result "not found" exit 1 fi ;; --not-found) shift info "checking for $1" if test -f "${tmp}/$1"; then result "OK" else result "not found" exit 1 fi ;; --directory) shift info "checking for $1" if test -d "${tmp}/$1"; then result "OK" else result "not found" exit 1 fi ;; --files) shift nFiles=$(grep -E "^HTTrack Website Copier/[^ ]* mirror complete in " "${tmp}/hts-log.txt" | sed -e 's/.*[[:space:]]\([^ ]*\)[[:space:]]files written.*/\1/g') assert_equals "checking files" "$1" "$nFiles" ;; httrack) break ;; esac shift done # cleanup if test -z "$nopurge"; then rm -rf "$tmp" else tmpdir= fi } # check args test "$#" -le 0 && usage && exit 0 # tmptopdir=${TMPDIR:-/tmp} test -d "$tmptopdir" || mkdir -p "${tmptopdir}" || die "can not find a temporary directory ; please set TMPDIR" # final cleanup tmpdir= crawlpid= nopurge= verbose= trap cleanup EXIT HUP INT QUIT ILL TRAP ABRT BUS FPE SEGV PIPE ALRM TERM STKFLT XCPU XFSZ # working directory tmpdir="${tmptopdir}/httrack_ut.$$" mkdir "${tmpdir}" # rock'in start-crawl "${@}" # that's all, folks! httrack-3.49.14/tests/75_engine-longpath-posix.test0000755000175000017500000000411415230602340015610 #!/bin/bash # set -euo pipefail # #133: the save-path ceiling used to be the Windows MAX_PATH (236 usable) on # every platform, needlessly hashing long names on Linux/macOS/Android. Off # Windows a name well under the platform PATH_MAX must now be kept whole. httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT cd "$scratch" # ~300 chars: over the old 236 ceiling, well under any POSIX PATH_MAX. The # distinctive 90-char last segment lets us tell "kept whole" from "hashed". seg="$(printf 'Z%.0s' {1..90})" deep="/a/$(printf 'b%.0s' {1..100})/c/$(printf 'd%.0s' {1..100})" out="$("$httrack_bin" -O /dev/null -#test=savename "$deep/$seg.html" text/html | sed -n 's/^savename: //p')" case "$(uname -s 2>/dev/null)" in MINGW* | MSYS* | CYGWIN*) # Windows still caps at MAX_PATH: the distinctive tail is cut case "$out" in *"$seg"*) echo "FAIL: Windows should have shortened the long name: '$out'" exit 1 ;; esac ;; *) # POSIX: the full name survives, no hashing case "$out" in *"$seg"*) ;; *) echo "FAIL: long POSIX name was truncated: '$out'" exit 1 ;; esac test "${#out}" -gt 236 || { echo "FAIL: POSIX name not longer than the old ceiling: '$out'" exit 1 } # byte-safety: a multibyte name whose codepoint count is under the ceiling # but whose bytes plus a long -O dir overflow the save buffer must be cut to # fit, not abort the crawl (SIGABRT before the byte-cut guard). bigdir="/x/$(printf 'D%.0s' $(seq 1 1015))" # ~1020 bytes cjk="/$(printf '\xe4\xb8\xad%.0s' $(seq 1 339))" # 1018 bytes, 339 codepoints if ! mb="$("$httrack_bin" -O "$bigdir" -#test=savename "$cjk" text/html 2>/dev/null)"; then echo "FAIL: aborted on a multibyte over-buffer name" exit 1 fi mb="${mb#savename: }" if [ -z "$mb" ] || [ "${#mb}" -ge 2048 ]; then echo "FAIL: multibyte name not bounded (len=${#mb})" exit 1 fi ;; esac echo "longpath-posix OK" httrack-3.49.14/tests/74_local-warc-verbatim.test0000755000175000017500000000231015230602340015217 #!/bin/bash # # A --warc crawl stores compressed bodies verbatim (the default): the response # record keeps Content-Encoding: gzip and its stored bytes inflate back to the # served page. The validator's --verbatim mode is the differential gate: # inflate(stored) must equal the decoded body the server compressed. # # Two fixtures cover both adoption branches of back_finalize: page.html (text/html) # takes the in-memory branch; data.bin (application/octet-stream) is streamed to # disk, so it exercises the is_write direct-to-disk spool adoption. set -eu : "${top_srcdir:=..}" # decoded bodies served (gzip-coded) by route_warcgz_page and route_warcgz_data. export WARC_VALIDATE_BODY="warcgz/page.html=3c68746d6c3e3c626f64793e766572626174696d20677a6970207061676520666f72205741524320737472617465677920413c2f626f64793e3c2f68746d6c3e0a warcgz/data.bin=766572626174696d20677a6970206f637465742d73747265616d20626f647920666f722074686520574152432069735f777269746520706174680a" export WARC_VALIDATE_VERBATIM=1 bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --warc-validate \ --found 'warcgz/index.html' --found 'warcgz/page.html' --found 'warcgz/data.bin' \ httrack 'BASEURL/warcgz/index.html' --warc-file warc-out httrack-3.49.14/tests/74_local-warc-wacz.test0000755000175000017500000000120415230602340014353 #!/bin/bash # # A --wacz crawl packages the WARC archive, its CDXJ index and a generated # pages.jsonl into a single WACZ file at crawl end. The stdlib validator is the # real gate: STORE-mode entries, the fixed layout, recomputed sha256 digests and # the datapackage-digest chain (plus py-wacz/pywb when importable). The crawl # skips cleanly on a build without OpenSSL (no conformant SHA-256 -> no package). set -eu : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --wacz-validate \ --found 'mini304/index.html' --found 'mini304/page.html' \ httrack 'BASEURL/mini304/index.html' --warc-file warc-out --wacz httrack-3.49.14/tests/73_local-warc.test0000755000175000017500000000174115230602340013416 #!/bin/bash # # A --warc crawl writes a standards-conformant WARC/1.1 archive, and an # --update re-crawl of an unchanged (all-304) site emits revisit records. # The stdlib validator (no warcio) is the real gate: it byte-compares the # fresh page.html response body against what the server served, asserts the # encoding headers were stripped and the payload digest matches, then checks # the update pass turned the unchanged assets into revisits (no full response). set -eu : "${top_srcdir:=..}" # page.html body served by tests/local-server.py (route_mini304_page). export WARC_VALIDATE_BODY="page.html=3c68746d6c3e3c626f64793e74696e7920636163686561626c6520706167653c2f626f64793e3c2f68746d6c3e0a" export WARC_VALIDATE_NORESP="index.html page.html" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --rerun --warc-validate \ --log-found 'no files updated' \ --found 'mini304/index.html' --found 'mini304/page.html' \ httrack 'BASEURL/mini304/index.html' --warc-file warc-out httrack-3.49.14/tests/72_watchdog-crawl.test0000755000175000017500000000222515230602340014275 #!/bin/bash # # Control for wait_bounded: a wedged fetch must be reaped at the harness deadline, # not hang the CI step to its 45-min cap. : "${top_srcdir:=..}" fail() { echo "FAIL: $*" >&2 exit 1 } start=$SECONDS out=$(CRAWL_DEADLINE=3 bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ httrack 'BASEURL/watchdog/stall' 2>&1) && rc=0 || rc=$? elapsed=$((SECONDS - start)) # Skip (not fail) on causes unrelated to the watchdog: no python3/server, or a # port-announce race (flaky-13). test "$rc" -ne 77 || { echo "SKIP: local crawl prerequisites missing" >&2 exit 77 } if printf '%s\n' "$out" | grep -q "could not discover server port"; then echo "SKIP: server port announce raced" >&2 exit 77 fi # The message prints only on the 124 reap, and 25s < the engine's --timeout=30, so # together they pin the fast exit on the 3s watchdog, not httrack giving up. test "$rc" -ne 0 || fail "stalled crawl reported success" test "$elapsed" -lt 25 || fail "watchdog fired late (${elapsed}s)" printf '%s\n' "$out" | grep -q "watchdog fired" || fail "crawl failed but not via the watchdog: $out" echo "crawl watchdog OK (reaped in ${elapsed}s)" httrack-3.49.14/tests/71_local-crange-repaircache.test0000755000175000017500000001034415230602340016162 #!/bin/bash # #581: an interrupted mirror can leave a truncated new.zip that pass 2 must # repair before resuming. The repaired-cache resume then hits the same hostile # 206 as test 48, so restart-whole must still drop the partial and refetch the # whole file. Pass 1 leaves a partial + temp-ref; we truncate new.zip past its # last local entry (dropping the central directory) so unzOpen fails and the # repair path runs; pass 2 resumes, rejects the range, and refetches whole. set -u : "${top_srcdir:=..}" testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server=$(nativepath "${testdir}/local-server.py") root=$(nativepath "${testdir}/server-root") python=$(find_python) || ! echo "python3 not found; skipping" >&2 || exit 77 # Windows-only repro of #581 (a hard-killed pass 1 + repaired cache loses the # file). The engine now forces a no-Range whole refetch on the restart, but that # fix is unverified on Windows CI, and this test's pass-1 interrupt/port-race # behavior there is unconfirmed; lift this skip on a Windows runner to verify. if is_windows; then echo "Windows: #581 fix unverified on CI, skipping" exit 77 fi tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_crangerep.XXXXXX") || exit 1 serverpid= crawlpid= cleanup() { test -n "$crawlpid" && kill -9 "$crawlpid" 2>/dev/null stop_server "$serverpid" rm -rf "$tmpdir" } trap cleanup EXIT HUP INT QUIT PIPE TERM serverlog="${tmpdir}/server.log" : >"$serverlog" "$python" "$server" --root "$root" >"$serverlog" 2>&1 & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$serverlog" 2>/dev/null) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$serverlog")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } base="http://127.0.0.1:${port}" which httrack >/dev/null || { echo "could not find httrack" exit 1 } out="${tmpdir}/crawl" mkdir "$out" common=(-O "$out" --quiet --disable-security-limits --robots=0 --timeout=30 --retries=1 -c1) refdir="${out}/hts-cache/ref" newzip="${out}/hts-cache/new.zip" # --- pass 1: crawl, interrupt once the blob download is underway ------------- printf '[pass 1: interrupt mid-download] ..\t' httrack "${common[@]}" "${base}/crange206mem/index.html" >"${tmpdir}/log1" 2>&1 & crawlpid=$! for _ in $(seq 1 300); do test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" && break kill -0 "$crawlpid" 2>/dev/null || break sleep 0.1 done sleep 0.3 kill -TERM "$crawlpid" 2>/dev/null wait "$crawlpid" 2>/dev/null crawlpid= test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" || { echo "FAIL: no temp-ref survived pass 1; cannot drive the resume" exit 1 } echo "OK (temp-ref present)" # --- damage the cache: drop the central directory a hard kill never wrote ---- printf '[damage new.zip -> forces repair] ..\t' "$python" - "$newzip" <<'PY' || exit 1 import os, sys path = sys.argv[1] data = open(path, "rb").read() cut = data.find(b"PK\x01\x02") # first central-directory header if cut <= 0: sys.exit("no central directory to drop in %s" % path) os.truncate(path, cut) PY echo "OK" # --- pass 2: --continue -> repair -> resume -> hostile 206 -> refetch whole --- printf '[pass 2: repair, reject range, refetch] ..\t' rc=0 httrack "${common[@]}" --continue "${base}/crange206mem/index.html" >"${tmpdir}/log2" 2>&1 || rc=$? test "$rc" -eq 0 || { echo "FAIL: httrack exited $rc" cat "${tmpdir}/log2" >&2 exit 1 } echo "OK (terminated)" # The repair path must actually have run, else this is just a copy of test 48. printf '[cache repair fired] ..\t' grep -q 'damaged cache' "${out}/hts-log.txt" 2>/dev/null || { echo "FAIL: repair path did not run; damage was ineffective" exit 1 } echo "OK" blob=$(find "$out" -name blob.bin 2>/dev/null | head -1) full=6008 # len(CRANGE206_BODY) = len("CR206DAT") + 6000 printf '[file recovered whole] ..\t' test -s "$blob" || { echo "FAIL: blob.bin missing after the repaired-cache resume" exit 1 } got=$(wc -c <"$blob") test "$got" -eq "$full" || { echo "FAIL: blob.bin is ${got} bytes, expected ${full}" exit 1 } echo "OK (${got} bytes)" httrack-3.49.14/tests/69_local-intl-logdir.test0000755000175000017500000000143115230602340014707 #!/bin/bash # # A single non-ASCII -O sets both path_html and path_log to "café" (#630). The # logs (hts-log.txt/hts-err.txt) and the hts-cache must land there, not in an # ANSI-mangled twin: on Windows path_log holds UTF-8 bytes the raw file calls # read as the codepage. The --log-found audit greps logroot=café/hts-log.txt and # --cache-under-logroot checks café/hts-cache/new.zip, so anything written to the # twin fails them. POSIX has no twin, so this bites on the Windows CI leg (test # 64), exercising only the code path elsewhere. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --outdir-intl 'café' --errors 0 --files 5 \ --found 'simple/basic.html' \ --log-found 'mirror complete in' \ --cache-under-logroot \ httrack 'BASEURL/simple/basic.html' httrack-3.49.14/tests/68_webhttrack-outdir-charset.test0000755000175000017500000000630215230602340016465 #!/bin/bash # # webhttrack's POST body arrives in the form's declared charset, not UTF-8, yet # the engine now assumes UTF-8 argv. A non-ASCII -O output dir submitted through # the web UI must land under the UTF-8 directory, not an ISO-8859-1 twin (#629). # Drives the real htsserver over HTTP; the default (English) form is served # ISO-8859-1, so 'café' travels as the single byte 0xE9. The crawl target is a # dead port: only the -O directory name is under test, and htsserver creates it # from the decoded path before any fetch. set -euo pipefail testdir=$(cd "$(dirname "$0")" && pwd) distdir=${top_srcdir:-$(cd "${testdir}/.." && pwd)} distdir=$(cd "${distdir}" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" fail() { echo "FAIL: $*" >&2 exit 1 } command -v htsserver >/dev/null || fail "no htsserver in PATH" python=$(find_python) || { echo "python3 not found; skipping" >&2 exit 77 } work=$(mktemp -d "${TMPDIR:-/tmp}/webhttrack_charset.XXXXXX") || fail "no tmpdir" srvlog=$(mktemp) srv= cleanup() { # htsserver keeps SIGTERM ignored across its exec, so only -9 reaps it. test -z "${srv}" || kill -9 "${srv}" 2>/dev/null || true wait "${srv}" 2>/dev/null || true # absorb bash's async "Killed" notice rm -rf "${work}" "${srvlog}" } trap cleanup EXIT HUP INT QUIT PIPE TERM # webhttrack server on a pre-picked port; an isolated HOME keeps a stray # ~/.httrack.ini out of it. sport=$("${python}" -c 'import socket s = socket.socket() s.bind(("127.0.0.1", 0)) print(s.getsockname()[1]) s.close()') ( trap '' TERM TTOU export HOME="${work}" exec htsserver "${distdir}/" --port "${sport}" >"${srvlog}" 2>&1 ) & srv=$! for _ in $(seq 1 40); do url=$(sed -n 's/^URL=//p' "${srvlog}") && test -n "${url}" && break kill -0 "${srv}" 2>/dev/null || break sleep 0.25 done test -n "${url:-}" || fail "htsserver did not start: $(cat "${srvlog}")" # Post a "start" whose -O dir is 'café' in the form's ISO-8859-1 charset. "${python}" - "${url}" "${work}" <<'PY' import sys, urllib.parse, urllib.request url, work = sys.argv[1], sys.argv[2] outdir = work + "/caf\xe9" # 'café' as the single byte the browser would send # Port 1 refuses at once: only the decoded -O dir matters, not the fetch. cmd = "httrack --quiet --robots=0 http://127.0.0.1:1/x.html -O " + outdir fields = [("path", work), ("projname", "proj"), ("command_do", "start"), ("winprofile", "x"), ("command", cmd)] body = "&".join("%s=%s" % (k, urllib.parse.quote(v, safe="", encoding="latin-1")) for k, v in fields) req = urllib.request.Request(url + "step4.html", data=body.encode("latin-1"), method="POST") urllib.request.urlopen(req, timeout=20).read() PY # The crawl runs inside htsserver; wait for the -O dir, then check it chose the # UTF-8 name and not the ISO-8859-1 twin. utf8dir="${work}/café" latin1dir="${work}/caf"$'\xe9' for _ in $(seq 1 80); do test -e "${utf8dir}" && break kill -0 "${srv}" 2>/dev/null || break sleep 0.25 done test -e "${utf8dir}" || fail "-O dir never landed as UTF-8 café/: $(find "${work}" -maxdepth 2 2>/dev/null)" test ! -e "${latin1dir}" || fail "-O dir created as the ISO-8859-1 twin instead" echo "PASS" httrack-3.49.14/tests/67_engine-delayed-truncate.test0000755000175000017500000000621415230602340016072 #!/bin/bash # set -euo pipefail # #623: url_savename shortens an over-ceiling path by cutting the tail of the # last segment, where the mandatory "..delayed" placeholder lives. A cut # marker fails IS_DELAYED_EXT, so back_delayed_rename never renames the file and # the download is lost. The marker must survive the cut. # # The ceiling is the Windows MAX_PATH on Windows but the (far larger) save # buffer elsewhere (#133). Each CLI arg is capped at HTS_CDLMAXSIZE (1024), so # on POSIX we lengthen the output dir as well to overrun the ceiling. httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT cd "$scratch" hexseg=$(printf 'a1b2c3d4e5f60718%.0s' {1..8}) # 128 hex chars # engine ceiling is the Windows MAX_PATH on Windows, the save buffer elsewhere case "$(uname -s 2>/dev/null)" in MINGW* | MSYS* | CYGWIN*) ceil=236 outdir=/dev/null deep="/d1$(printf 'a%.0s' {1..40})/d2$(printf 'b%.0s' {1..40})" deep="$deep/d3$(printf 'c%.0s' {1..40})/d4$(printf 'd%.0s' {1..40})" long="$deep/$(printf 'z%.0s' {1..90})" hexpath="$deep/$hexseg" ;; *) # overrun the save-buffer ceiling with a long dir + long name ceil=$((1024 * 2 - 64)) # HTS_URLMAXSIZE*2 - HTS_PATH_TAIL_RESERVE outdir="$scratch/$(printf 'D%.0s' $(seq 1 $((1000 - ${#scratch}))))" long="/d1/$(printf 'z%.0s' $(seq 1 985))" hexpath="/d1/$(printf 'y%.0s' $(seq 1 850))/$hexseg" ;; esac run() { "$httrack_bin" -O "$outdir" -#test=savename "$@" | sed -n 's/^savename: //p' } # untruncated "outdir/host/name" is longer than the ceiling, so truncation must # fire; out then sits at or under it. Together these keep the marker check below # non-vacuous. check_truncated() { local out=$1 fil=$2 local untrunc=$((${#outdir} + 1 + 15 + ${#fil})) # host = www.example.com test "$untrunc" -gt "$ceil" || { echo "FAIL: input too short to truncate ($untrunc <= $ceil)" exit 1 } test "${#out}" -le "$ceil" || { echo "FAIL: truncated name ${#out} > $ceil ceiling: '$out'" exit 1 } } # statuscode=302 status=-1 = a redirect still downloading: no type is resolved, # so the name gets a "..delayed" placeholder (see 01_engine-savename). long_delayed="$long.ext" out="$(run "$long_delayed" text/html statuscode=302 status=-1)" check_truncated "$out" "$long_delayed" case "$out" in *.delayed) ;; *) echo "FAIL: delayed marker cut by truncation: '$out'" exit 1 ;; esac # #133-style hashed name: an all-hex last segment must keep the marker too (the # ".." tag is not mistaken for part of the hash). out="$(run "$hexpath" text/html statuscode=302 status=-1)" check_truncated "$out" "$hexpath" case "$out" in *.delayed) ;; *) echo "FAIL: hashed-name marker cut by truncation: '$out'" exit 1 ;; esac # A non-delayed name of the same shape still truncates, with no marker to keep. out="$(run "$long_delayed.html" text/html)" check_truncated "$out" "$long_delayed.html" case "$out" in *.delayed) echo "FAIL: non-delayed name grew a .delayed marker: '$out'" exit 1 ;; esac echo "delayed-truncate OK" httrack-3.49.14/tests/66_engine-port80-strip.test0000755000175000017500000000104515230602340015127 #!/bin/bash # set -euo pipefail # Stripping a default :80 from a crawled link used to skip a hardcoded 3 chars # (#627): ":080"/":0080" lost only ":80" and glued the rest onto the host # (127.0.0.1:080/x -> 127.0.0.10/x), and a value wrapping to 80 as a 32-bit int # (#614) was stripped as if it were the default. The default is scheme-aware # (#638): an explicit :80 on https/ftp stays, :443/:21 strip under their own # scheme. All assertions live in the engine self-test. httrack -O /dev/null -#test=stripport | grep -q "stripport self-test OK" httrack-3.49.14/tests/65_port-siblings.test0000644000175000017500000001144715230602340014170 #!/bin/bash # # Port parsing outside the crawled-URL path (#614): the htsserver --port listen # port, proxytrack's host:port listen arguments, and an ftp:// URL port. All # three took the port from sscanf("%d"), which range-checks nothing and wraps # past INT_MAX, so a value naming no real port silently became a plausible one. set -euo pipefail testdir=$(cd "$(dirname "$0")" && pwd) # run_with_timeout: timeout(1) is absent on macOS, and the listen servers block. # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" tmp=$(mktemp -d "${TMPDIR:-/tmp}/httrack_portsib.XXXXXX") || exit 1 trap 'rm -rf "$tmp"' EXIT HUP INT QUIT PIPE TERM # A port the old code accepted only by wrapping: 4295009395 = 2^32 + 42099 and # 4294967376 = 2^32 + 80 both fold to a plausible listen port. They are the # load-bearing cases, since a value that merely exceeds 65535 while still # fitting an int (65616) was already caught by the htsserver range check. overflowing="4295009395" # Values sscanf("%d") took as a port that no operator meant: a trailing # character, a sign, leading whitespace, a decimal point. Each silently listened # on the prefix it managed to scan. malformed=("80x" "+80" " 80" "8.0" "") # --- htsserver --port ------------------------------------------------------ # Its argv[1] is the html root; the option pairs follow. It blocks serving once # a port is accepted, so bound it; we assert on the output, not the exit status. websrv() { run_with_timeout 3 htsserver "$tmp" --port "$1" >"$tmp/web.log" 2>&1 || true } web_refused() { websrv "$1" grep -q "couldn't set the port number" "$tmp/web.log" || ! echo "FAIL: #614: htsserver --port '$1' not refused" || exit 1 # it must not have reached the listen socket on some other port ! grep -q "^URL=" "$tmp/web.log" || ! echo "FAIL: #614: htsserver --port '$1' listened anyway" || exit 1 } web_accepted() { local port=$1 : >"$tmp/web.log" # A bound server blocks, so stop it once it announces, not on a fixed # deadline: the announce trails a local-hostname resolve that stalls on macOS, # where a 3s kill landed mid-resolve, before the URL= line ever printed. local had_m= case "$-" in *m*) had_m=1 ;; esac is_windows || set -m htsserver "$tmp" --port "$port" >"$tmp/web.log" 2>&1 & local pid=$! test -n "$had_m" || is_windows || set +m local waited=0 until grep -qE "^URL=http://.*:$port/|couldn't set the port number|Unable to initialize a temporary server" "$tmp/web.log"; do test "$waited" -lt 20 || break sleep 1 waited=$((waited + 1)) done kill_tree "$pid" wait "$pid" 2>/dev/null || true ! grep -q "couldn't set the port number" "$tmp/web.log" || ! echo "FAIL: #614: htsserver --port '$port' wrongly refused" || exit 1 grep -qE "^URL=http://.*:$port/|Unable to initialize a temporary server" "$tmp/web.log" || ! echo "FAIL: #614: htsserver --port '$port' never reached the listener" || exit 1 } # this used to listen on 42099 web_refused "$overflowing" for p in "${malformed[@]}" 0 65536 99999 -1; do web_refused "$p" done # 65535 is a valid port the old "< 65535" bound refused web_accepted 65535 # --- proxytrack -------------------------- # A bad argument falls through to the usage screen; it had no range check at # all, so 65616 quietly listened on port 80. A valid one binds and blocks. proxy_refused() { run_with_timeout 3 proxytrack "127.0.0.1:$1" 127.0.0.1:3130 >"$tmp/pt.log" 2>&1 || true grep -q "^usage:" "$tmp/pt.log" || ! echo "FAIL: #614: proxytrack port '$1' not refused" || exit 1 } proxy_accepted() { run_with_timeout 3 proxytrack "127.0.0.1:$1" 127.0.0.1:3130 >"$tmp/pt.log" 2>&1 || true ! grep -q "^usage:" "$tmp/pt.log" || ! echo "FAIL: #614: proxytrack port '$1' wrongly refused" || exit 1 } for p in "${malformed[@]}" 65616 4294967376 "$overflowing" 0 -1; do proxy_refused "$p" done proxy_accepted 45678 # --- ftp:// URL port ------------------------------------------------------- # A URL port, so it follows the crawled-URL policy: refuse the link rather than # fold it into range. An ftp:// link in scanned HTML is not followed, so the # seed has to come from the command line. ftp_port() { local out="$tmp/ftp" rm -rf "$out" run_with_timeout 30 httrack "ftp://127.0.0.1:$1/x" -O "$out" --quiet -n \ >/dev/null 2>&1 || true grep -c "Invalid port: $1" "$out/hts-log.txt" 2>/dev/null || true } # 65616 truncated to 80 and really did connect there for p in 65616 99999; do test "$(ftp_port "$p")" -gt 0 || ! echo "FAIL: #614: ftp:// port $p not refused" || exit 1 done # a valid port still reaches the connect attempt test "$(ftp_port 65535)" -eq 0 || ! echo "FAIL: #614: ftp:// port 65535 wrongly refused" || exit 1 exit 0 httrack-3.49.14/tests/64_local-intl-outdir.test0000755000175000017500000000111215230602340014724 #!/bin/bash # # A non-ASCII -O output dir must receive the mirror, not a double-encoded twin # (#621). argv is UTF-8 on Windows, so path_html was re-encoded as if it were # the ANSI codepage, prefixing every saved file with a mangled directory. Only # path_html is the non-ASCII "café"; path_log stays ASCII so the harness reads # hts-log.txt/hts-cache normally and this isolates the -O encoding path. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --html-subdir 'café' --errors 0 --files 5 \ --found 'simple/basic.html' \ httrack 'BASEURL/simple/basic.html' httrack-3.49.14/tests/63_webhttrack-home.test0000644000175000017500000000530715230602340014454 #!/bin/bash # # htsserver's $HOME lookup, through the web UI it actually renders. An exported # but empty $HOME must not resolve the default base path against the root. set -euo pipefail testdir=$(cd "$(dirname "$0")" && pwd) distdir=${top_srcdir:-$(cd "${testdir}/.." && pwd)} distdir=$(cd "${distdir}" && pwd) fail() { echo "FAIL: $*" >&2 exit 1 } command -v htsserver >/dev/null || fail "no htsserver in PATH" # Mirror local-crawl.sh's skip-with-77: the Debian buildd chroot has no python3. command -v python3 >/dev/null || { echo "python3 not found; skipping" >&2 exit 77 } srv= cleanup() { test -z "${srv}" || kill -9 "${srv}" 2>/dev/null || true } trap cleanup EXIT HUP INT QUIT PIPE TERM log=$(mktemp) trap 'cleanup; rm -f "${log}"' EXIT # Ask htsserver for its rendered default base path, under the given $HOME # ("-" = leave $HOME unset). pathfor() { local homeval=$1 port url got port=$(python3 -c 'import socket s = socket.socket() s.bind(("127.0.0.1", 0)) print(s.getsockname()[1]) s.close()') : >"${log}" ( # htsserver ignores SIGTERM/SIGTTOU handling from the harness shell trap '' TERM TTOU if test "${homeval}" = -; then unset HOME; else export HOME="${homeval}"; fi exec htsserver "${distdir}/" --port "${port}" >"${log}" 2>&1 ) & srv=$! for _ in $(seq 1 40); do url=$(sed -n 's/^URL=//p' "${log}" 2>/dev/null) && test -n "${url}" && break kill -0 "${srv}" 2>/dev/null || break sleep 0.25 done test -n "${url:-}" || fail "htsserver did not come up: $(cat "${log}")" # The UI is served ISO-8859-1, so keep python out of text mode. got=$(python3 -c 'import re, sys, urllib.request body = urllib.request.urlopen(sys.argv[1] + "server/step2.html", timeout=20).read() m = re.search(br"name=\"path\" value=\"([^\"]*)\"", body) print(m.group(1).decode("latin-1") if m else "")' "${url}") kill -9 "${srv}" 2>/dev/null || true wait "${srv}" 2>/dev/null || true srv= test -n "${got}" || fail "no path field in the rendered step2.html" echo "${got}" } check() { local desc=$1 homeval=$2 want=$3 got got=$(pathfor "${homeval}") test "${got}" = "${want}" || fail "${desc}: want ${want}, got ${got}" echo "ok: ${desc} -> ${got}" } # A real HOME must reach the page, or the two cases below are vacuous: they # also pass when gethomedir() ignores the environment and always answers ".". check 'a set HOME is used' /nonexistent/hts-home /nonexistent/hts-home/websites # Exported but empty is the regression: getenv() returns "", not NULL, so a # bare NULL check let the base path collapse onto /websites. check 'an empty HOME' '' ./websites check 'an unset HOME' - ./websites echo "PASS" httrack-3.49.14/tests/62_lang-integrity.test0000644000175000017500000000522015230602340014316 #!/bin/bash # # lang/*.txt are line pairs: an English msgid, then its translation. A stray # blank or a drifted msgid silently unhooks every translation that follows, # rather than failing, so assert the pairing and the join against English.txt. # Pairs are physical lines here; a msgid ending in \ continues onto the next one # for the engine (linput_cpp) but not for us. None do today. set -euo pipefail langdir="${top_srcdir:-..}/lang" def="${top_srcdir:-..}/lang.def" eng="$langdir/English.txt" for f in "$eng" "$def"; do [ -f "$f" ] || { echo "cannot find $f" exit 1 } done tmp=$(mktemp -d) trap 'rm -rf "$tmp"' EXIT keys="$tmp/english.keys" # Byte-wise: each file is in its own declared legacy charset, lang.def is CRLF. LC_ALL=C awk 'NR%2==1 { sub(/\r$/, ""); print }' "$eng" >"$keys" # An empty parse would make every check below pass vacuously. nkeys=$(wc -l <"$keys") if [ "$nkeys" -lt 400 ]; then echo "only $nkeys msgids parsed from $eng; the parse is broken" exit 1 fi nfiles=0 fail=0 for f in "$langdir"/*.txt; do nfiles=$((nfiles + 1)) LC_ALL=C awk -v keys="$keys" -v name="${f##*/}" ' BEGIN { while ((getline k < keys) > 0) known[k] = 1 } { sub(/\r$/, "") } NR % 2 == 1 { if ($0 == "") printf "%s:%d: blank line where an English msgid belongs\n", name, NR else if (!($0 in known)) printf "%s:%d: msgid absent from English.txt: %s\n", name, NR, $0 else next bad++ } END { if (NR % 2) { printf "%s: odd line count (%d): msgid/translation pairing is broken\n", name, NR bad++ } exit(bad > 0) } ' "$f" || fail=1 done if [ "$nfiles" -lt 25 ]; then echo "only $nfiles language files found in $langdir" exit 1 fi # lang.def maps each LANG_* macro to the English string the GUI compiles in, # which is the lookup key into every lang/*.txt: no msgid, no translations. LC_ALL=C awk -v keys="$keys" ' BEGIN { while ((getline k < keys) > 0) known[k] = 1 } { sub(/\r$/, "") } NR % 2 == 1 { macro = $0; next } macro ~ /^(LANG_|LISTDEF_)/ { n++ if (!($0 in known)) { printf "lang.def:%d: %s maps to \"%s\", which is not a msgid in English.txt\n", NR, macro, $0 bad++ } } END { if (n < 400) { printf "lang.def: only %d LANG_ entries parsed; the parse is broken\n", n bad++ } exit(bad > 0) } ' "$def" || fail=1 [ "$fail" -eq 0 ] || exit 1 echo "$nfiles language files consistent with $nkeys English msgids" httrack-3.49.14/tests/61_webhttrack-locale.test0000644000175000017500000000736715230602340014771 #!/bin/bash # # webhttrack must map the caller's locale to the right lang.indexes number. # Guards: LC_ALL/LC_MESSAGES were ignored, and zh_tw/pt_br were unreachable. set -euo pipefail testdir=$(cd "$(dirname "$0")" && pwd) distdir=$(cd "${testdir}/.." && pwd) script="${distdir}/src/webhttrack" fail() { echo "FAIL: $*" >&2 exit 1 } test -r "${script}" || fail "no ${script}" test -r "${distdir}/lang.indexes" || fail "no ${distdir}/lang.indexes" # Lift the locale code out of the launcher, so this tests the shipped logic itself. funcs=$(sed -n '/^function lang_index/,/^}/p' "${script}") # End on the next section, not a blank line: a blank line grown inside the block # would truncate the lift and silently stop testing everything below it. grep -q '^# Find the browser' "${script}" || fail "locale block terminator moved in ${script}" block=$(sed -n '/^# Locale/,/^# Find the browser/p' "${script}" | sed '$d') echo "${block}" | grep -q 'LANGN=.*lang_index' || fail "could not lift the whole locale block from ${script}" # Run the lifted block against whatever locale vars the caller exported. run_block() { # shellcheck disable=SC2034 # read by the eval'd locale block DISTPATH="${distdir}" # the launcher runs under neither -e ("! test -n x && y" returns 1) nor -u set +eu eval "${funcs}" eval "${block}" # shellcheck disable=SC2153 # LANGN is set by the eval'd block, not a LANG typo echo "${LANGN}" } # Resolve LANG/LC_ALL/LC_MESSAGES (empty = unset) to the language number. lang_of() { ( unset LANG LC_ALL LC_MESSAGES # only the value matters here; hide bash's setlocale gripe when the locale is not installed # shellcheck disable=SC2030 # confining the locale to this subshell is the point { if test -n "$1"; then export LANG="$1"; fi if test -n "$2"; then export LC_ALL="$2"; fi if test -n "$3"; then export LC_MESSAGES="$3"; fi } 2>/dev/null run_block ) } check() { local want=$1 got desc shift desc="LANG='$1' LC_ALL='$2' LC_MESSAGES='$3'" got=$(lang_of "$1" "$2" "$3") test "${got}" = "${want}" || fail "${desc}: want ${want}, got ${got}" echo "ok: ${desc} -> ${got}" } # want LANG LC_ALL LC_MESSAGES check 2 "fr_FR.UTF-8" "" "" check 14 "zh_TW.UTF-8" "" "" # region-qualified: Chinese-BIG5, not Simplified (13) check 12 "pt_BR.UTF-8" "" "" # region-qualified: Portugues-Brasil, not Portugues (7) check 13 "zh_CN.UTF-8" "" "" # unlisted region falls back to the bare language check 24 "sl_SI.UTF-8" "" "" # Slovenian is ISO 639-1 "sl" check 4 "" "de_DE.UTF-8" "" # LC_ALL alone check 4 "" "" "de_DE.UTF-8" # LC_MESSAGES alone check 4 "fr_FR.UTF-8" "de_DE.UTF-8" "" # LC_ALL wins over LANG check 4 "fr_FR.UTF-8" "" "de_DE.UTF-8" # LC_MESSAGES wins over LANG check 2 "de_DE.UTF-8" "fr_FR.UTF-8" "de_DE.UTF-8" # LC_ALL wins over LC_MESSAGES check 2 "fr_FR@euro" "" "" # @modifier without a charset check 1 "C" "" "" # C, unknown and unset all mean English check 1 "xx_YY.UTF-8" "" "" check 1 "" "" "" # Exported but empty is unset (POSIX), so it must not mask LANG. lang_of cannot # express this: it exports nothing for an empty argument. got=$( unset LANG LC_ALL LC_MESSAGES # shellcheck disable=SC2031 # confining the locale to this subshell is the point { export LANG="fr_FR.UTF-8" LC_ALL="" LC_MESSAGES=""; } 2>/dev/null run_block ) test "${got}" = 2 || fail "empty LC_ALL/LC_MESSAGES must not mask LANG: want 2, got ${got}" echo "ok: LANG='fr_FR.UTF-8' with LC_ALL='' exported -> ${got}" echo "PASS" httrack-3.49.14/tests/60_crawl-log-salvage.test0000644000175000017500000000275515230602340014700 #!/bin/bash # # Unit-tests dump_crawl_logs (testlib.sh): the killed test's hts-log.txt must # reach the uploaded logs, or a Windows wedge past --max-time stays # undiagnosable (#605). set -euo pipefail testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" TMPDIR=$(mktemp -d "${TMPDIR:-/tmp}/httrack_salv.XXXXXX") export TMPDIR trap 'rm -rf "$TMPDIR"' EXIT fail() { echo "FAIL: $*" >&2 exit 1 } verdict="More than 120 seconds passed.. giving up" # Vacuity control: with nothing left behind the assertions below cannot pass on # ambient output. test -z "$(dump_crawl_logs)" || fail "dumped something with no crawl tmpdir" # A killed local-crawl.sh leaves exactly this shape. d="${TMPDIR}/httrack_local.probe" mkdir -p "$d/crawl" echo "$verdict" >"$d/crawl/hts-log.txt" echo "httrack stdout marker" >"$d/log" # Append to an unterminated line, as a killed test's own log always ends. art="${TMPDIR}/artifact.log" printf '[running httrack ...] ..\t' >"$art" dump_crawl_logs >>"$art" grep -qF "$verdict" "$art" || fail "hts-log.txt verdict not salvaged" grep -qF "httrack stdout marker" "$art" || fail "httrack stdout not salvaged" grep -q '^--- .*hts-log.txt' "$art" || fail "dump glued its header onto the unterminated line" # Cleared, so the next timing-out test cannot re-report this crawl as its own. test ! -d "$d" || fail "salvaged tmpdir left behind" test -z "$(dump_crawl_logs)" || fail "salvaged crawl reported twice" echo "crawl log salvage OK" httrack-3.49.14/tests/59_local-tls-stall.test0000644000175000017500000000574015230602340014405 #!/bin/bash # # Issue #607: a peer that accepts the TCP connect but never speaks TLS leaves the # slot stuck in the handshake. The per-slot --timeout must reap it; before the # fix only --max-time did, so these crawls ran until the kill guard. set -euo pipefail : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" if test "${HTTPS_SUPPORT:-}" == "no"; then echo "no https support compiled, skipping" exit 77 fi python=$(find_python) || { echo "python3 missing, skipping" exit 77 } server=$(nativepath "$top_srcdir/tests/tls-stall-server.py") tmpdir=$(mktemp -d) serverpid= cleanup() { stop_server "$serverpid" rm -rf "$tmpdir" return 0 } trap cleanup EXIT # start_stall_server : sets $port from the announced one. start_stall_server() { local tag="$1" shift "$python" "$server" "$@" >"$tmpdir/$tag.out" 2>"$tmpdir/$tag.err" & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$tmpdir/$tag.out" 2>/dev/null || true) if test "${line%% *}" == "PORT"; then port="${line#PORT }" return 0 fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$tmpdir/$tag.err")" exit 1 } sleep 0.1 done echo "could not discover server port" exit 1 } # no -E/--max-time on purpose: --timeout is the only thing that can end these. # The kill guard stands in for the hang, so a wall time near it means no reap. crawl_wall() { local out="$tmpdir/$1" shift local start start=$(date +%s) run_with_timeout 60 httrack -O "$out" -c1 --robots=0 --retries=0 --quiet -Z \ "$@" >>"$tmpdir/log" 2>&1 || true echo $(($(date +%s) - start)) } # 1. handshake stalled from the first byte: reaped at --timeout, not before. start_stall_server direct direct wall=$(crawl_wall crawl1 "https://127.0.0.1:$port/" --timeout=5) if test "$wall" -ge 30 || test "$wall" -lt 3; then echo "FAIL: stalled handshake reaped after ${wall}s, expected about 5s" >&2 cat "$tmpdir/log" >&2 exit 1 fi grep -q 'Handshake Time Out' "$tmpdir/crawl1/hts-log.txt" || { echo "FAIL: crawl ended in ${wall}s but not on a handshake timeout" >&2 cat "$tmpdir/crawl1/hts-log.txt" >&2 exit 1 } echo "OK: stalled TLS handshake reaped by --timeout after ${wall}s" # 2. the handshake window is its own, not what the connect left over: a proxy # that takes 4s to answer CONNECT must still leave the full --timeout=5 for the # handshake (~9s total). Sharing the connect's clock would reap at ~5s. stop_server "$serverpid" start_stall_server proxy proxy 4 wall=$(crawl_wall crawl2 "https://127.0.0.1:443/" -P "127.0.0.1:$port" --timeout=5) if test "$wall" -ge 20 || test "$wall" -lt 7; then echo "FAIL: handshake after a slow connect reaped at ${wall}s, expected about 9s" >&2 cat "$tmpdir/log" >&2 exit 1 fi echo "OK: handshake keeps its own timeout window after a slow connect (${wall}s)" httrack-3.49.14/tests/58_watchdog.test0000644000175000017500000000642115230602340013172 #!/bin/bash # # Unit-tests the suite watchdog (run_with_timeout/kill_tree in testlib.sh): a # hung child must be killed tree-and-all and reported 124, never left to orphan # a spinning httrack.exe. Regression guard for the Windows x64 hangs that read as # "the hosted runner lost communication with the server". set -euo pipefail testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" tmp=$(mktemp -d "${TMPDIR:-/tmp}/httrack_wd.XXXXXX") trap 'rm -rf "$tmp"' EXIT fail() { echo "FAIL: $*" >&2 exit 1 } # Exit status passes through when the command finishes in time. rc=0 && run_with_timeout 30 sh -c 'exit 0' || rc=$? test "$rc" -eq 0 || fail "clean exit reported $rc" rc=0 && run_with_timeout 30 sh -c 'exit 7' || rc=$? test "$rc" -eq 7 || fail "exit 7 reported $rc" # An overrunning command is reported 124, near the deadline not the child's end. start=$SECONDS rc=0 if is_windows; then run_with_timeout 2 ping -n 30 127.0.0.1 || rc=$? else run_with_timeout 2 sleep 30 || rc=$? fi test "$rc" -eq 124 || fail "hang reported $rc, want 124" test "$((SECONDS - start))" -lt 15 || fail "watchdog fired late" # The native descendant tree is really dead, not orphaned. On Windows an outer # MSYS bash with a native ping grandchild is the exact case signals can't reap; # on POSIX a surviving grandchild would touch the marker after we stop waiting. rc=0 if is_windows; then # Existence by exact Windows PID, not a global ping.exe count: the timing # sub-test above leaves a still-dying ping that a count would race. Plain # tasklist, no switches (the workflow's MSYS2_ARG_CONV_EXCL='*' mangles a # //FI filter arg into a silent no-match); $2 is the PID column. alive() { tasklist 2>/dev/null | awk -v p="$1" '$2 == p {f = 1} END {exit !f}'; } # The grandchild ping records its own Windows PID: non-empty proves it ran # (positive control, so the reap check can't pass vacuously), then it must go. gw="$tmp/gcwinpid" # `wait` keeps the bash alive on the ping past the deadline; without it the # bash exits at once and run_with_timeout returns 0 instead of timing out. # shellcheck disable=SC2016 # $1 expands in the bash -c child, by design run_with_timeout 2 bash -c 'ping -n 30 127.0.0.1 >/dev/null 2>&1 & cat /proc/$!/winpid >"$1"; wait' _ "$gw" || rc=$? test "$rc" -eq 124 || fail "grandchild hang reported $rc" w=$(cat "$gw" 2>/dev/null) test -n "$w" || fail "positive control: grandchild ping never started" sleep 1 ! alive "$w" || fail "native ping grandchild (pid $w) survived the watchdog" else started="$tmp/started" marker="$tmp/alive" # The grandchild (backgrounded subshell) marks that it ran, then would touch # the marker after the deadline; killing only the direct child orphans it, so # the marker still appears. started present + marker absent = ran and reaped. # shellcheck disable=SC2016 # $1/$2 expand in the sh -c child, by design run_with_timeout 2 sh -c '{ : >"$1"; sleep 10; : >"$2"; } & wait' _ "$started" "$marker" || rc=$? test "$rc" -eq 124 || fail "grandchild hang reported $rc" test -e "$started" || fail "positive control: grandchild never ran" sleep 12 test ! -e "$marker" || fail "watchdog left a grandchild running" fi echo "watchdog OK" httrack-3.49.14/tests/57_local-proxy-connect.test0000644000175000017500000001361615230602340015275 #!/bin/bash # # Issue #564: plain http through a CONNECT-only proxy (tor HTTPTunnelPort). With # a "connect://" proxy httrack must open a CONNECT tunnel to the origin and send # the request origin-form, like https already does, instead of the absolute-URI # form a CONNECT-only proxy rejects. Fully local: a plain-http origin behind a # proxy that answers CONNECT and 501s everything else. set -euo pipefail : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" python=$(find_python) || python= if test -z "$python"; then echo "python3 missing, skipping" exit 77 fi server=$(nativepath "$top_srcdir/tests/proxy-connect-server.py") tmpdir=$(mktemp -d) pids= cleanup() { for pid in $pids; do stop_server "$pid" done rm -rf "$tmpdir" } trap cleanup EXIT # start_server : launches a proxy+origin pair, sets $origin_port # and $proxy_port from its announced ephemeral ports. start_server() { local dir="$1" mode="$2" ports mkdir -p "$dir" ports="$dir/ports.txt" dir_native=$(nativepath "$dir") : >"$ports" "$python" "$server" "$dir_native" "$mode" \ >"$ports" 2>"$dir/server.err" & pids="$pids $!" for _ in $(seq 1 100); do grep -q "^ready" "$ports" 2>/dev/null && break sleep 0.1 done grep -q "^ready" "$ports" 2>/dev/null || { echo "server ($mode) did not start" >&2 cat "$dir/server.err" >&2 exit 1 } origin_port=$(awk '/^ORIGIN/{print $2}' "$ports") proxy_port=$(awk '/^PROXY/{print $2}' "$ports") } # Kill httrack after a deadline so a hang surfaces as $HANG_RC, not a stalled job # (a portable stand-in for `timeout`, which macOS lacks). HANG_RC=137 # 128 + SIGKILL run_crawl() { local out="$1" proxy="$2" url="${4:-http://127.0.0.1:${3}/}" rm -rf "$out" httrack "$url" --proxy "$proxy" \ -O "$out" -r1 -s0 --timeout=10 >"$out.log" 2>&1 & local pid=$! (sleep 60 && kill -9 "$pid" 2>/dev/null) & local guard=$! local rc=0 wait "$pid" 2>/dev/null || rc=$? kill "$guard" 2>/dev/null || true wait "$guard" 2>/dev/null || true return "$rc" } # --- working proxy ---------------------------------------------------------- ok="$tmpdir/ok" start_server "$ok" ok # 1. page fetched through a CONNECT tunnel, request delivered origin-form run_crawl "$ok/out" "connect://127.0.0.1:${proxy_port}" "$origin_port" grep -rq "ORIGIN-PAGE-564" "$ok/out" || { echo "FAIL: origin page not downloaded through the CONNECT tunnel" >&2 cat "$ok/out.log" >&2 exit 1 } grep -q "^CONNECT 127.0.0.1:${origin_port} " "$ok/proxy.log" || { echo "FAIL: proxy never received a CONNECT for the plain-http origin" >&2 cat "$ok/proxy.log" >&2 exit 1 } grep -q "^GET / HTTP/1" "$ok/origin-headers.log" || { echo "FAIL: origin did not see an origin-form request line" >&2 cat "$ok/origin-headers.log" >&2 exit 1 } if grep -q "^GET http://" "$ok/origin-headers.log"; then echo "FAIL: absolute-URI request leaked through the tunnel to the origin" >&2 exit 1 fi echo "OK: plain http tunneled origin-form through CONNECT" # 2. default CONNECT port follows the origin scheme: a portless http origin # tunnels to :80 (not the https :443). Nothing serves :80 here so the fetch # fails; only the CONNECT target port is asserted. Reverting to a hardcoded 443 # makes this log ":443" and fail. : >"$ok/proxy.log" run_crawl "$ok/out_port" "connect://127.0.0.1:${proxy_port}" "" "http://127.0.0.1/" || true grep -q "^CONNECT 127.0.0.1:80 " "$ok/proxy.log" || { echo "FAIL: portless http origin did not CONNECT to the default port 80" >&2 cat "$ok/proxy.log" >&2 exit 1 } echo "OK: portless http origin tunnels to the default port 80" # 3. teeth: without connect://, httrack sends the absolute-URI form, which the # CONNECT-only proxy rejects (501) -> nothing fetched. Proves the scheme is what # flips the behavior and that the proxy really is CONNECT-only. : >"$ok/proxy.log" : >"$ok/origin-headers.log" run_crawl "$ok/out_plain" "127.0.0.1:${proxy_port}" "$origin_port" || true grep -rq "ORIGIN-PAGE-564" "$ok/out_plain" && { echo "FAIL: absolute-URI form unexpectedly fetched through a CONNECT-only proxy" >&2 exit 1 } grep -q "^GET http://127.0.0.1:${origin_port}/" "$ok/proxy.log" || { echo "FAIL: a plain proxy should have received an absolute-URI GET" >&2 cat "$ok/proxy.log" >&2 exit 1 } echo "OK: absolute-URI form (no connect://) rejected by the CONNECT-only proxy" # 4. authenticated proxy: creds ride the CONNECT, never reach the origin : >"$ok/proxy.log" : >"$ok/origin-headers.log" run_crawl "$ok/out2" "connect://user:secret@127.0.0.1:${proxy_port}" "$origin_port" grep -rq "ORIGIN-PAGE-564" "$ok/out2" || { echo "FAIL: origin page not downloaded through the authenticated proxy" >&2 exit 1 } got=$(awk '/^AUTH Basic /{print $3}' "$ok/proxy.log" | head -1) # base64("user:secret"); compared literally to stay portable (no base64 -d) test "$got" == "dXNlcjpzZWNyZXQ=" || { echo "FAIL: Proxy-Authorization not carried on CONNECT (got '$got')" >&2 cat "$ok/proxy.log" >&2 exit 1 } if grep -qi "proxy-authorization" "$ok/origin-headers.log"; then echo "FAIL: proxy credentials leaked to the origin through the tunnel" >&2 exit 1 fi echo "OK: proxy credentials carried on CONNECT, not leaked to origin" # --- hostile proxy ---------------------------------------------------------- # A proxy that answers 200 then streams headers forever must not hang the crawl. flood="$tmpdir/flood" start_server "$flood" flood rc=0 run_crawl "$flood/out" "connect://127.0.0.1:${proxy_port}" "$origin_port" || rc=$? test "$rc" -ne "$HANG_RC" || { echo "FAIL: crawl hung on a flooding proxy (bounded read missing)" >&2 exit 1 } grep -rq "ORIGIN-PAGE-564" "$flood/out" 2>/dev/null && { echo "FAIL: flooding proxy unexpectedly served the page" >&2 exit 1 } echo "OK: bounded proxy response, no hang on a flooding proxy" httrack-3.49.14/tests/56_local-proxy-noleak.test0000644000175000017500000000535615230602340015116 #!/bin/bash # # A crawl through a proxy must never resolve or dial the origin itself: the proxy # does that. A dead proxy + a multi-address origin used to fall back to dialing # the origin direct (bypassing the proxy, leaking its DNS and IP). The decoy # origin here must therefore receive nothing. set -euo pipefail : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" if test "${V6_SUPPORT:-}" == "no"; then echo "no IPv6 support (resolver override compiled out), skipping" exit 77 fi python=$(find_python) || { echo "python3 missing, skipping" exit 77 } server=$(nativepath "$top_srcdir/tests/local-server.py") root=$(nativepath "$top_srcdir/tests/server-root") tmpdir=$(mktemp -d) serverpid= cleanup() { stop_server "$serverpid" rm -rf "$tmpdir" return 0 } trap cleanup EXIT # decoy origin: it must stay silent. LOCAL_SERVER_VERBOSE logs any request it gets. LOCAL_SERVER_VERBOSE=1 "$python" "$server" --root "$root" --bind 127.0.0.1 \ >"$tmpdir/srv.out" 2>"$tmpdir/srv.err" & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$tmpdir/srv.out" 2>/dev/null || true) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$tmpdir/srv.err")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } # a proxy port nothing listens on: grab a free one and let it close (refuses). deadproxy=$("$python" -c \ 'import socket; s=socket.socket(); s.bind(("127.0.0.1",0)); print(s.getsockname()[1]); s.close()') # origin resolves to two addresses so a fallback would have a second to dial; # 127.0.0.1 (the decoy) is the one the old bypass reached. out="$tmpdir/crawl" HTTRACK_DEBUG_RESOLVE="decoyhost:127.0.0.2,127.0.0.1" \ httrack "http://decoyhost:$port/simple/basic.html" -O "$out" \ -P "127.0.0.1:$deadproxy" -c1 --robots=0 --timeout=5 --retries=0 --quiet -Z \ >"$tmpdir/log" 2>&1 log="$out/hts-log.txt" # the origin must have seen no connection (no leak/bypass) if grep -qE '"(GET|POST|HEAD|CONNECT) ' "$tmpdir/srv.err"; then echo "FAIL: origin was contacted directly, bypassing the proxy" cat "$tmpdir/srv.err" exit 1 fi # the crawl must fail at the proxy (proves it really tried the proxy, not a no-op) grep -q 'Connect Error' "$log" || { echo "FAIL: expected a proxy connect error" cat "$log" exit 1 } # and it must not have tried an origin-address fallback under the proxy if grep -q "trying next address" "$log"; then echo "FAIL: fell back to an origin address under a proxy" cat "$log" exit 1 fi echo "OK: a dead proxy fails cleanly without dialing the origin" httrack-3.49.14/tests/55_local-chunked.test0000755000175000017500000000136315230602340014103 #!/bin/bash # A well-formed Transfer-Encoding: chunked response mirrors intact: the chunk # automaton (htsback.c) joins the bodies and the 2GB in-RAM cap stays quiet. # The 76-char run spans a 64-byte chunk boundary (only contiguous once joined); # a CR anywhere would be leftover framing; '' proves no truncation. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'chunked/page.html' \ --file-matches 'chunked/page.html' \ 'chunk-body chunk-body chunk-body chunk-body chunk-body chunk-body chunk-body' \ --file-matches 'chunked/page.html' '' \ --file-not-matches 'chunked/page.html' $'\r' \ --log-not-found 'too large' \ httrack 'BASEURL/chunked/index.html' httrack-3.49.14/tests/54_local-update-truncate-purge.test0000644000175000017500000000202015230602340016672 #!/bin/bash # # An --update re-fetch that comes in short must not delete the mirrored file (#562). # Pass 1 mirrors page.html (in-memory) and file.bin (direct-to-disk); pass 2 serves # both with the full declared Content-Length but half the body, then closes. httrack # refuses the partial ("will be retried") — and unfixed, the end-of-update purge then # deletes the good pass-1 copy, which was never overwritten. stay.html is the control: # fully served both passes, it must update to V2. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" \ --rerun-args '--update' \ --log-found 'incomplete transfer.*uptrunc/page\.html' \ --log-found 'incomplete transfer.*uptrunc/file\.bin' \ --file-matches 'uptrunc/page.html' 'MIRRORED-PAGE-V1' \ --file-matches 'uptrunc/file.bin' 'MIRRORED-BIN-V1' \ --file-min-bytes 'uptrunc/file.bin' 32768 \ --file-matches 'uptrunc/stay.html' 'STAY-V2' \ --file-not-matches 'uptrunc/stay.html' 'STAY-V1' \ httrack 'BASEURL/uptrunc/index.html' httrack-3.49.14/tests/53_local-proxytrack-cache-corrupt.test0000644000175000017500000000127415230602340017421 #!/bin/bash # A corrupt proxytrack .ndx must not overflow the fixed cache-read buffers. The # sanitizer CI build turns any regression here into a hard stack/heap overflow. set -euo pipefail dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT # The first length-prefixed field declares far more than firstline[256] holds; # cache_brstr must clamp the copy to the destination, not the declared length. { printf '4000\n' head -c 4000 /dev/zero | tr '\0' 'A' } >"$dir/foo.ndx" : >"$dir/foo.dat" # cache_brstr runs only when the sibling .dat opens proxytrack --convert "$dir/out.arc" "$dir/foo.ndx" >/dev/null 2>&1 || { echo "FAIL: proxytrack crashed/errored on a corrupt cache index" exit 1 } httrack-3.49.14/tests/52_local-socks5.test0000644000175000017500000001727715230602340013676 #!/bin/bash # # Issue #563: a SOCKS5 proxy must carry both http and https, resolve the origin # name REMOTELY (ATYP=domain, never a local lookup), and authenticate per RFC # 1929 without leaking the credentials to the origin. set -euo pipefail : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" if test "${HTTPS_SUPPORT:-}" == "no"; then echo "no https support compiled, skipping" exit 77 fi python=$(find_python) || python= if test -z "$python" || ! command -v openssl >/dev/null 2>&1; then echo "python3/openssl missing, skipping" exit 77 fi # a .invalid name never resolves (RFC 6761): reaching the page at all proves the # proxy did the DNS host="socks-origin.invalid" server=$(nativepath "$top_srcdir/tests/socks5-server.py") tmpdir=$(mktemp -d) pids= cleanup() { for pid in $pids; do stop_server "$pid" done rm -rf "$tmpdir" } trap cleanup EXIT openssl req -x509 -newkey rsa:2048 -keyout "$tmpdir/key.pem" \ -out "$tmpdir/cert.pem" -days 2 -nodes -subj "/CN=127.0.0.1" \ >/dev/null 2>&1 cat "$tmpdir/key.pem" "$tmpdir/cert.pem" >"$tmpdir/both.pem" # start_server : sets $tls_port/$http_port/$socks_port start_server() { local dir="$1" mode="$2" ports pem mkdir -p "$dir" ports="$dir/ports.txt" pem=$(nativepath "$tmpdir/both.pem") dir_native=$(nativepath "$dir") : >"$ports" "$python" "$server" "$pem" "$dir_native" "$mode" \ >"$ports" 2>"$dir/server.err" & pids="$pids $!" for _ in $(seq 1 100); do grep -q "^ready" "$ports" 2>/dev/null && break sleep 0.1 done grep -q "^ready" "$ports" 2>/dev/null || { echo "server ($mode) did not start" >&2 cat "$dir/server.err" >&2 exit 1 } tls_port=$(awk '/^TLS/{print $2}' "$ports") http_port=$(awk '/^HTTP/{print $2}' "$ports") socks_port=$(awk '/^SOCKS/{print $2}' "$ports") } # kill a hung httrack so a missing read bound surfaces as $HANG_RC instead of # stalling the job (macOS has no `timeout`) HANG_RC=137 # 128 + SIGKILL run_crawl() { local out="$1" url="$2" proxy="$3" shift 3 local extra="$*" test -n "$extra" || extra="-r1 -s0" rm -rf "$out" # shellcheck disable=SC2086 httrack "$url" --proxy "$proxy" \ -O "$out" $extra --timeout=10 >"$out.log" 2>&1 & local pid=$! (sleep 60 && kill -9 "$pid" 2>/dev/null) & local guard=$! local rc=0 wait "$pid" 2>/dev/null || rc=$? kill "$guard" 2>/dev/null || true wait "$guard" 2>/dev/null || true return "$rc" } # --- https over socks, remote DNS ------------------------------------------- ok="$tmpdir/ok" start_server "$ok" ok run_crawl "$ok/out" "https://${host}:${tls_port}/" "socks5://127.0.0.1:${socks_port}" grep -rq "ORIGIN-PAGE-563" "$ok/out" || { echo "FAIL: origin page not downloaded through the socks proxy" >&2 cat "$ok/out.log" "$ok/server.err" >&2 exit 1 } grep -q "^ATYP domain ${host}\$" "$ok/socks.log" || { echo "FAIL: proxy did not receive ATYP=domain ${host} (no remote DNS)" >&2 cat "$ok/socks.log" >&2 exit 1 } # a client that resolved locally would have sent an address, not a name grep -q "^ATYP ipv4" "$ok/socks.log" && { echo "FAIL: httrack resolved locally and sent an IPv4 to the proxy" >&2 cat "$ok/socks.log" >&2 exit 1 } echo "OK: https tunneled through socks5 with remote DNS" # --- plain http over socks -------------------------------------------------- : >"$ok/origin-headers.log" # the https crawl above also logged a request line run_crawl "$ok/outh" "http://${host}:${http_port}/" "socks5://127.0.0.1:${socks_port}" grep -rq "ORIGIN-PAGE-563" "$ok/outh" || { echo "FAIL: plain http not tunneled through the socks proxy" >&2 cat "$ok/outh.log" "$ok/socks.log" >&2 exit 1 } # the tunneled request is origin-form, as on a direct connection: the http-proxy # absolute URI would reach the origin as "GET http://host/" grep -q "^REQUEST GET / " "$ok/origin-headers.log" || { echo "FAIL: tunneled request is not origin-form" >&2 cat "$ok/origin-headers.log" >&2 exit 1 } grep -q "^REQUEST GET http" "$ok/origin-headers.log" && { echo "FAIL: absolute-URI request sent through the socks tunnel" >&2 cat "$ok/origin-headers.log" >&2 exit 1 } echo "OK: plain http tunneled through socks5" # --- keep-alive socket reuse must NOT re-run the handshake ------------------ # A reused keep-alive socket is already tunneled; re-injecting the SOCKS # greeting corrupts the origin stream. -c1 + the origin's max>1 advert makes # httrack serve the whole plain-http crawl over one tunnel: exactly one # handshake, every subpage intact. ka="$tmpdir/ka" start_server "$ka" ok run_crawl "$ka/out" "http://${host}:${http_port}/" "socks5://127.0.0.1:${socks_port}" -r3 -c1 missing=0 for i in 1 2 3 4 5; do grep -rq "SUBPAGE-563 /p${i}.html" "$ka/out" || missing=1 done test "$missing" -eq 0 || { echo "FAIL: a keep-alive subpage was lost (re-handshake corrupted the reused socket)" >&2 cat "$ka/out.log" "$ka/socks.log" >&2 exit 1 } handshakes=$(grep -c "^CMD " "$ka/socks.log" || true) test "$handshakes" -eq 1 || { echo "FAIL: expected 1 SOCKS handshake for the reused socket, got $handshakes" >&2 cat "$ka/socks.log" >&2 exit 1 } echo "OK: keep-alive socket reused over one socks tunnel, no re-handshake" # --- authenticated socks (RFC 1929) ----------------------------------------- # over plain http: that is the request an http proxy would decorate with # Proxy-Authorization, so the no-leak check below has teeth auth="$tmpdir/auth" start_server "$auth" ok run_crawl "$auth/out" "http://${host}:${http_port}/" \ "socks5://user:secret@127.0.0.1:${socks_port}" # name a rejected version byte here: the crawl check below only knows the # handshake failed, not why grep -q "^AUTHVER-BAD" "$auth/socks.log" && { echo "FAIL: sub-negotiation version was not RFC 1929's 0x01" >&2 cat "$auth/socks.log" >&2 exit 1 } grep -rq "ORIGIN-PAGE-563" "$auth/out" || { echo "FAIL: origin not downloaded through the authenticated socks proxy" >&2 cat "$auth/out.log" "$auth/socks.log" >&2 exit 1 } grep -q "^METHOD userpass\$" "$auth/socks.log" || { echo "FAIL: user/pass method not negotiated (auth ignored)" >&2 cat "$auth/socks.log" >&2 exit 1 } grep -q "^AUTH user secret\$" "$auth/socks.log" || { echo "FAIL: wrong socks credentials sent" >&2 cat "$auth/socks.log" >&2 exit 1 } grep -qi "secret\|proxy-authorization" "$auth/origin-headers.log" && { echo "FAIL: socks credentials leaked into the origin request" >&2 cat "$auth/origin-headers.log" >&2 exit 1 } echo "OK: socks5 user/pass negotiated, creds not leaked to origin" # --- hostile: refusing proxy ------------------------------------------------ ref="$tmpdir/refuse" start_server "$ref" refuse rc=0 run_crawl "$ref/out" "https://${host}:${tls_port}/" "socks5://127.0.0.1:${socks_port}" || rc=$? test "$rc" -ne "$HANG_RC" || { echo "FAIL: crawl hung on a refusing socks proxy" >&2 exit 1 } grep -rq "ORIGIN-PAGE-563" "$ref/out" 2>/dev/null && { echo "FAIL: refusing proxy unexpectedly served the page" >&2 exit 1 } echo "OK: refusing socks proxy fails cleanly, no hang" # --- hostile: truncated handshake reply ------------------------------------- trunc="$tmpdir/trunc" start_server "$trunc" truncate rc=0 run_crawl "$trunc/out" "https://${host}:${tls_port}/" "socks5://127.0.0.1:${socks_port}" || rc=$? test "$rc" -ne "$HANG_RC" || { echo "FAIL: crawl hung on a truncated socks reply (bounded read missing)" >&2 exit 1 } grep -rq "ORIGIN-PAGE-563" "$trunc/out" 2>/dev/null && { echo "FAIL: truncated-reply proxy unexpectedly served the page" >&2 exit 1 } echo "OK: bounded socks handshake, no hang on a truncated reply" httrack-3.49.14/tests/51_local-update-codec.test0000644000175000017500000000335115230602340015007 #!/bin/bash # # A coded re-fetch that fails to decode must not destroy the mirrored file (#557). # Pass 1 mirrors from valid gzip; pass 2 (--update) serves an undecodable body for # mem.html (in-memory), disk.bin (direct-to-disk) and unsup.html (a coding we have # no decoder for). All three must keep their pass-1 content. fresh.html and # freshdisk.bin decode on both passes: they are the controls that a good update # still lands, in memory and direct-to-disk (the latter renaming the decoded temp # over an existing file). Unfixed, the decode target is the mirror itself, so the # first three are lost. set -euo pipefail : "${top_srcdir:=..}" # A restrictive umask makes the decoded direct-to-disk file's mode observable: # it is committed by renaming a temp, so it needs the chmod filecreate() does. umask 077 bash "$top_srcdir/tests/local-crawl.sh" \ --rerun-args '--update' \ --errors 3 \ --log-found 'decompressing.*upcodec/mem\.html' \ --log-found 'decompressing.*upcodec/disk\.bin' \ --log-found 'Unsupported Content-Encoding.*upcodec/unsup\.html' \ --file-matches 'upcodec/mem.html' 'MIRRORED-MEM-V1' \ --file-matches 'upcodec/disk.bin' 'MIRRORED-DISK-V1' \ --file-min-bytes 'upcodec/disk.bin' 32768 \ --file-mode 'upcodec/disk.bin' 644 \ --file-matches 'upcodec/unsup.html' 'MIRRORED-UNSUP-V1' \ --file-matches 'upcodec/fresh.html' 'FRESH-V2' \ --file-not-matches 'upcodec/fresh.html' 'FRESH-V1' \ --file-mode 'upcodec/fresh.html' 644 \ --file-matches 'upcodec/freshdisk.bin' 'FRESHDISK-V2' \ --file-not-matches 'upcodec/freshdisk.bin' 'FRESHDISK-V1' \ --file-min-bytes 'upcodec/freshdisk.bin' 32768 \ --file-mode 'upcodec/freshdisk.bin' 644 \ httrack 'BASEURL/upcodec/index.html' httrack-3.49.14/tests/50_local-contentcodings.test0000755000175000017500000000267115230602340015501 #!/bin/bash # # br and zstd on the wire: both decode, a junk coding leaves the body alone, an # undecodable one fails the fetch, and br/zstd are advertised over TLS only. set -euo pipefail : "${top_srcdir:=..}" # Both decoders are needed for the wire fixtures; the codec-off matrix is # covered by the fenced 01_zlib-contentcodings self-test. if test "${BROTLI_ENABLED:-yes}" != "yes" || test "${ZSTD_ENABLED:-yes}" != "yes"; then echo "brotli/zstd not both compiled, skipping" exit 77 fi # bad.html (in memory) and bin.dat (direct-to-disk) both carry an undecodable # coding: the fetch fails and neither leaves coded bytes on disk. bash "$top_srcdir/tests/local-crawl.sh" --errors 2 --files 5 \ --file-matches 'codec/br.html' 'coded body' \ --file-matches 'codec/zstd.html' 'coded body' \ --file-matches 'codec/junk.html' 'junk coding' \ --file-matches 'codec/ae.html' 'AE=gzip, deflate,' \ --file-not-matches 'codec/ae.html' ' br' \ --file-not-matches 'codec/ae.html' 'zstd' \ --not-found 'codec/bad.html' \ --not-found 'codec/bin.dat' \ --log-found 'Unsupported Content-Encoding' \ httrack 'BASEURL/codec/index.html' if test "${HTTPS_SUPPORT:-}" == "no"; then echo "no https support compiled, skipping the TLS leg" exit 0 fi bash "$top_srcdir/tests/local-crawl.sh" --tls --errors 2 --files 5 \ --file-matches 'codec/ae.html' 'AE=gzip, deflate, br, zstd,' \ httrack 'BASEURL/codec/index.html' httrack-3.49.14/tests/49_local-cookiewall.test0000755000175000017500000000267315230602340014623 #!/bin/bash # # Cookie-wall self-redirect (#15): httrack replays a Set-Cookie to mirror the # real page, gives up when nothing changes, and stays bounded when it never does. set -euo pipefail : "${top_srcdir:=..}" # Unknown-ext (wall.php) and known-ext (wall.html): the wall sets the cookie once, # then serves real content; httrack must replay it and mirror that content. bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'cookiewall/wall.html' \ --file-matches 'cookiewall/wall.html' 'REAL-CONTENT-BEHIND-COOKIE-WALL' \ httrack 'BASEURL/cookiewall/index.html' bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'cookiewall2/wall.html' \ --file-matches 'cookiewall2/wall.html' 'REAL-CONTENT-BEHIND-COOKIE-WALL' \ httrack 'BASEURL/cookiewall2/index.html' # No Set-Cookie: the jar never changes, so httrack must give up at once (retry # stays gated) and not mirror the wall. A dropped gate would skip this log line. bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --not-found 'cookiewall3/wall.html' \ --log-found 'loop to same filename' \ httrack 'BASEURL/cookiewall3/index.html' # Ever-changing cookie never satisfies the wall: httrack must stop at the retry # cap (bounded, no early give-up) and not mirror it. bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --not-found 'cookiewall4/wall.html' \ --log-not-found 'loop to same filename' \ httrack 'BASEURL/cookiewall4/index.html' httrack-3.49.14/tests/48_local-crange-memresume.test0000755000175000017500000000666015230602340015725 #!/bin/bash # C2 (memory branch): a resume whose 206 lies text/html with a matching # INT64_MAX Content-Length must not overflow the resume buffer-size add # (UBSan aborts on the pre-fix binary at alloc_mem += totalsize). Pass 1 leaves # a partial + temp-ref; pass 2 resumes and must reject and refetch the whole # file. Teeth are UBSan-only: a normal build wraps to the same reject+restart. set -u : "${top_srcdir:=..}" testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server=$(nativepath "${testdir}/local-server.py") root=$(nativepath "${testdir}/server-root") python=$(find_python) || ! echo "python3 not found; skipping" >&2 || exit 77 # The resume needs a graceful pass-1 interrupt (a clean cache), which MSYS can't # deliver to a native exe, and the restart-whole path fails on a repaired cache # (#581); TODO: drop once that lands. if is_windows; then echo "Windows: interrupted-resume restart fails on a repaired cache (#581), skipping" exit 77 fi tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_crangemem.XXXXXX") || exit 1 serverpid= crawlpid= cleanup() { test -n "$crawlpid" && kill -9 "$crawlpid" 2>/dev/null stop_server "$serverpid" rm -rf "$tmpdir" } trap cleanup EXIT HUP INT QUIT PIPE TERM serverlog="${tmpdir}/server.log" : >"$serverlog" "$python" "$server" --root "$root" >"$serverlog" 2>&1 & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$serverlog" 2>/dev/null) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$serverlog")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } base="http://127.0.0.1:${port}" which httrack >/dev/null || { echo "could not find httrack" exit 1 } out="${tmpdir}/crawl" mkdir "$out" common=(-O "$out" --quiet --disable-security-limits --robots=0 --timeout=30 --retries=1 -c1) refdir="${out}/hts-cache/ref" # --- pass 1: crawl, interrupt once the blob download is underway ------------- printf '[pass 1: interrupt mid-download] ..\t' httrack "${common[@]}" "${base}/crange206mem/index.html" >"${tmpdir}/log1" 2>&1 & crawlpid=$! for _ in $(seq 1 300); do test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" && break kill -0 "$crawlpid" 2>/dev/null || break sleep 0.1 done sleep 0.3 kill -TERM "$crawlpid" 2>/dev/null wait "$crawlpid" 2>/dev/null crawlpid= test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" || { echo "FAIL: no temp-ref survived pass 1; cannot drive the resume" exit 1 } echo "OK (temp-ref present)" # --- pass 2: --continue -> resume -> hostile INT64_MAX Content-Range ---------- printf '[pass 2: hostile 206, no overflow, refetch] ..\t' rc=0 httrack "${common[@]}" --continue "${base}/crange206mem/index.html" >"${tmpdir}/log2" 2>&1 || rc=$? # a crash here would otherwise read as a clean "terminated" test "$rc" -eq 0 || { echo "FAIL: httrack exited $rc" cat "${tmpdir}/log2" >&2 exit 1 } echo "OK (terminated)" blob=$(find "$out" -name blob.bin 2>/dev/null | head -1) full=6008 # len(CRANGE206_BODY) = len("CR206DAT") + 6000 printf '[file recovered whole] ..\t' test -s "$blob" || { echo "FAIL: blob.bin missing after the hostile 206" exit 1 } got=$(wc -c <"$blob") test "$got" -eq "$full" || { echo "FAIL: blob.bin is ${got} bytes, expected ${full}" exit 1 } echo "OK (${got} bytes)" httrack-3.49.14/tests/47_local-crange-overflow.test0000755000175000017500000000566415230602340015573 #!/bin/bash # C2: a resume whose 206 carries a Content-Range end of INT64_MAX must not # sign-overflow the crange+1 range check (UBSan aborts on the pre-fix binary). # Pass 1 leaves a partial + temp-ref; pass 2 resumes, gets the hostile 206, and # must reject the range and refetch the whole file rather than overflow. Teeth # are UBSan-only: a normal build wraps to the same reject+restart. set -u : "${top_srcdir:=..}" testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server=$(nativepath "${testdir}/local-server.py") root=$(nativepath "${testdir}/server-root") python=$(find_python) || ! echo "python3 not found; skipping" >&2 || exit 77 tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_crange.XXXXXX") || exit 1 serverpid= crawlpid= cleanup() { test -n "$crawlpid" && kill -9 "$crawlpid" 2>/dev/null stop_server "$serverpid" rm -rf "$tmpdir" } trap cleanup EXIT HUP INT QUIT PIPE TERM serverlog="${tmpdir}/server.log" : >"$serverlog" "$python" "$server" --root "$root" >"$serverlog" 2>&1 & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$serverlog" 2>/dev/null) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$serverlog")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } base="http://127.0.0.1:${port}" which httrack >/dev/null || { echo "could not find httrack" exit 1 } out="${tmpdir}/crawl" mkdir "$out" common=(-O "$out" --quiet --disable-security-limits --robots=0 --timeout=30 --retries=1 -c1) refdir="${out}/hts-cache/ref" # --- pass 1: crawl, interrupt once the blob download is underway ------------- printf '[pass 1: interrupt mid-download] ..\t' httrack "${common[@]}" "${base}/crange206/index.html" >"${tmpdir}/log1" 2>&1 & crawlpid=$! for _ in $(seq 1 300); do test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" && break kill -0 "$crawlpid" 2>/dev/null || break sleep 0.1 done sleep 0.3 kill -TERM "$crawlpid" 2>/dev/null wait "$crawlpid" 2>/dev/null crawlpid= test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" || { echo "FAIL: no temp-ref survived pass 1; cannot drive the resume" exit 1 } echo "OK (temp-ref present)" # --- pass 2: --continue -> resume -> hostile INT64_MAX Content-Range ---------- printf '[pass 2: hostile 206, no overflow, refetch] ..\t' httrack "${common[@]}" --continue "${base}/crange206/index.html" >"${tmpdir}/log2" 2>&1 echo "OK (terminated)" blob=$(find "$out" -name blob.bin 2>/dev/null | head -1) full=6008 # len(CRANGE206_BODY) = len("CR206DAT") + 6000 printf '[file recovered whole] ..\t' test -s "$blob" || { echo "FAIL: blob.bin missing after the hostile 206" exit 1 } got=$(wc -c <"$blob") test "$got" -eq "$full" || { echo "FAIL: blob.bin is ${got} bytes, expected ${full}" exit 1 } echo "OK (${got} bytes)" httrack-3.49.14/tests/46_local-update-304-resume.test0000755000175000017500000000731715230602340015553 #!/bin/bash # C7: a server 304 answering a resume's Range request is out of protocol; httrack # must drop the partial and refetch, not finalize it as complete at the partial # byte count. Pass 1 leaves a partial + temp-ref; pass 2 resumes, gets a bogus # 304, and must recover the whole file. set -u : "${top_srcdir:=..}" testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server=$(nativepath "${testdir}/local-server.py") root=$(nativepath "${testdir}/server-root") python=$(find_python) || ! echo "python3 not found; skipping" >&2 || exit 77 tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_c7.XXXXXX") || exit 1 serverpid= crawlpid= cleanup() { test -n "$crawlpid" && kill -9 "$crawlpid" 2>/dev/null stop_server "$serverpid" rm -rf "$tmpdir" } trap cleanup EXIT HUP INT QUIT PIPE TERM serverlog="${tmpdir}/server.log" : >"$serverlog" counter="${tmpdir}/reqcount" mark="${tmpdir}/got304" RESUME304_COUNTER="$counter" RESUME304_MARK="$mark" "$python" "$server" --root "$root" >"$serverlog" 2>&1 & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$serverlog" 2>/dev/null) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$serverlog")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } base="http://127.0.0.1:${port}" which httrack >/dev/null || { echo "could not find httrack" exit 1 } out="${tmpdir}/crawl" mkdir "$out" common=(-O "$out" --quiet --disable-security-limits --robots=0 --timeout=30 --retries=1 -c1) refdir="${out}/hts-cache/ref" # --- pass 1: crawl, interrupt once the blob download is underway ------------- printf '[pass 1: interrupt mid-download] ..\t' httrack "${common[@]}" "${base}/resume304/index.html" >"${tmpdir}/log1" 2>&1 & crawlpid=$! for _ in $(seq 1 300); do test -s "$counter" && break kill -0 "$crawlpid" 2>/dev/null || break sleep 0.1 done sleep 0.5 kill -TERM "$crawlpid" 2>/dev/null wait "$crawlpid" 2>/dev/null crawlpid= test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" || { echo "FAIL: no temp-ref survived pass 1; cannot drive C7" exit 1 } echo "OK (temp-ref present)" before=$(wc -c <"$counter" 2>/dev/null || echo 0) # --- pass 2: --continue -> resume Range -> bogus 304 -> drop + refetch -------- printf '[pass 2: resume gets 304, must refetch] ..\t' httrack "${common[@]}" --continue "${base}/resume304/index.html" >"${tmpdir}/log2" 2>&1 echo "OK (terminated)" blob=$(find "$out" -name blob.bin 2>/dev/null | head -1) full=8200 # len(RESUME304_BODY) = len("C7DATA--") + 8192 printf '[file recovered whole] ..\t' test -s "$blob" || { echo "FAIL: blob.bin missing after the 304 resume (partial dropped, not refetched)" exit 1 } got=$(wc -c <"$blob") test "$got" -eq "$full" || { echo "FAIL: blob.bin is ${got} bytes, expected ${full} (partial finalized as complete)" exit 1 } echo "OK (${got} bytes)" # Pass 2 must issue at least two requests: the resume (Range -> 304) and the # range-less refetch (-> 200). Exactly one means the partial was trusted. after=$(wc -c <"$counter" 2>/dev/null || echo 0) hits=$((after - before)) printf '[resume then refetch] ..\t' test "$hits" -ge 2 || { echo "FAIL: only ${hits} pass-2 request(s); the 304 was trusted, no refetch" exit 1 } echo "OK (${hits} requests)" # The recovery must go through the resume path: a Range request that drew the # bogus 304 (a fresh re-crawl sends no Range, so this marker stays empty). printf '[resume Range drew a 304] ..\t' test -s "$mark" || { echo "FAIL: no Range request got a 304; the resume path was not exercised" exit 1 } echo "OK" httrack-3.49.14/tests/45_local-maxsize-recv.test0000755000175000017500000000116115230602340015072 #!/bin/bash # # -M caps received volume, not saved 200-only bytes (#520): links to large 404 # bodies pump received >> saved; the cap must trip though little lands on disk. set -euo pipefail : "${top_srcdir:=..}" # The mirror bound is the load-bearing half: it fires while <100 KB is saved, # so the cap can only have tripped on received volume, not saved bytes (which # would exceed the cap and fetch all 16 links). bash "$top_srcdir/tests/local-crawl.sh" \ --log-found 'More than 500000 bytes have been transferred.. giving up' \ --max-mirror-bytes 100000 \ httrack 'BASEURL/maxrecv/index.html' -M500000 -c4 httrack-3.49.14/tests/44_local-update-errormask.test0000644000175000017500000000074715230602340015747 #!/bin/bash # Issue #176: on --update a page that 200'd on the first crawl but now 403s must # keep its good local copy, not be overwritten by the error body nor purged. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --rerun \ --found 'errmask/keep.dat' \ --file-min-bytes 'errmask/keep.dat' 1024 \ --file-matches 'errmask/keep.dat' '^KEEP' \ --file-not-matches 'errmask/keep.dat' 'error 403' \ httrack 'BASEURL/errmask/index.html' httrack-3.49.14/tests/43_local-update-truncate.test0000644000175000017500000000202215230602340015552 #!/bin/bash # # -M hard-abort must not destroy already-complete files (#77 follow-up). # Pass 1 mirrors bigtrunc fully. Pass 2 re-fetches under --update -M: fast.bin # overruns the cap, its abort tears down slow.bin's stalled re-fetch. Both were # complete on disk from pass 1, and both must survive the aborted update: # - slow.bin's re-fetch is incomplete; the direct-to-disk write must not be # left truncated (the previous copy is restored). # - fast.bin fully arrives but is torn down; the aborted slot must not overwrite # it with an empty body. # Unfixed, slow.bin is truncated and fast.bin is zeroed while the cache still # records them complete. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" \ --rerun-args '--update -M400000' \ --log-found 'More than 400000 bytes have been transferred.. giving up' \ --found bigtrunc/slow.bin \ --file-min-bytes bigtrunc/slow.bin 655360 \ --file-min-bytes bigtrunc/fast.bin 655360 \ httrack 'BASEURL/bigtrunc/index.html' -c2 httrack-3.49.14/tests/42_local-maxsize-slow.test0000755000175000017500000000140615230602340015116 #!/bin/bash # # -M byte cap under a slow server (#77): p0 overruns -M at once while p1..p3 # trickle for a minute; the cap must abort the in-flight transfers, not wait # them out. Unfixed, the smooth stop drains the trickle at server pace. set -euo pipefail : "${top_srcdir:=..}" start=$(date +%s) bash "$top_srcdir/tests/local-crawl.sh" \ --log-found 'More than 400000 bytes have been transferred.. giving up' \ httrack 'BASEURL/bigtrickle/index.html' -M400000 -c4 wall=$(($(date +%s) - start)) # trickle runs 60s; a smooth-only stop waits it out, the hard stop lands near 8s. # Wall clock is the discriminating check: the log line above fires either way. if [ "$wall" -ge 30 ]; then echo "crawl took ${wall}s, -M hard stop did not engage" >&2 exit 1 fi httrack-3.49.14/tests/41_local-utf8-link.test0000644000175000017500000000164015230602340014271 #!/bin/bash # # #180: raw non-ASCII hrefs must reach the wire UTF-8 percent-encoded whatever # the declared page charset; each PDF exists only at its exact UTF-8 path. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --rerun \ --found 'charset/header/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ --found 'charset/meta5/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ --found 'charset/metaeq/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ --found 'charset/none/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ --found 'charset/latin1hdr/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ --found 'charset/latin1real/café.pdf' \ --found 'charset/metalatin1/déjà.pdf' \ --found 'charset/latin1ovl/À¡x.pdf' \ --found 'charset/priority/nuée.pdf' \ --found 'charset/preenc/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ --found 'charset/bom/ç»Ÿè®¡å¤§æ•°æ®æœåС平å°.pdf' \ httrack 'BASEURL/charset/index.html' httrack-3.49.14/tests/40_local-why.test0000644000175000017500000000215015230602340013253 #!/bin/bash # set -euo pipefail # --why: report which +/- filter rule decides for a URL, without crawling. tmpdir="$(mktemp -d)" trap 'rm -rf "$tmpdir"' EXIT why() { local want="$1" out shift out="$(httrack -O "$tmpdir/p" -q "$@" | grep -E 'accepted|rejected|no filter|unable')" test "$out" == "$want" || { echo "want: $want" echo "got : $out" exit 1 } } base=http://www.example.com why "$base/x.zip: rejected by rule #2 (-*.zip)" \ --why "$base/x.zip" "$base/" '+*.png' '-*.zip' why "$base/a.png: accepted by rule #1 (+*.png)" \ --why "$base/a.png" "$base/" '+*.png' '-*.zip' why "$base/i.html: no filter rule matches; the wizard decides (same-site links are followed by default)" \ --why "$base/i.html" "$base/" '+*.png' '-*.zip' # scheme-less input gets the same http:// default as primary URLs why "$base/x.zip: rejected by rule #2 (-*.zip)" \ --why "www.example.com/x.zip" "$base/" '+*.png' '-*.zip' # the rule latest in the list decides why "$base/x.zip: accepted by rule #3 (+*x.zip)" \ --why "$base/x.zip" "$base/" '+*.png' '-*.zip' '+*x.zip' httrack-3.49.14/tests/39_local-delayed-cancel.test0000644000175000017500000000051515230602340015311 #!/bin/bash # # Cancelled delayed-type-checks must not orphan .delayed placeholders (#483). # Timing-dependent (hence two tries); -A keeps the window reachable. set -euo pipefail : "${top_srcdir:=..}" for _ in 1 2; do bash "$top_srcdir/tests/local-crawl.sh" \ httrack 'BASEURL/dcancel/index.html' -E1 -c4 -A25000 done httrack-3.49.14/tests/38_local-update-304.test0000644000175000017500000000072215230602340014244 #!/bin/bash # # An all-304 update of a tiny site (headers under the 32K rollback threshold) # is a healthy run: it must not trip the no-data rollback as a fake outage. set -eu : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --rerun \ --log-found 'no files updated' \ --log-not-found 'No data seems to have been transferred' \ --found 'mini304/index.html' --found 'mini304/page.html' \ httrack 'BASEURL/mini304/index.html' httrack-3.49.14/tests/37_local-cache-outage.test0000644000175000017500000000052515230602340015003 #!/bin/bash # # An update run against a dead server must not destroy the cache: the no-data # rollback restores the previous hts-cache generation (zip caches lost it). set -eu : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --rerun-dead \ --found 'simple/basic.html' \ httrack 'BASEURL/simple/basic.html' httrack-3.49.14/tests/36_local-bigcrawl.test0000644000175000017500000000427615230602340014256 #!/bin/bash # # Diverse seeded /big/ crawl: 12 pattern families, decoy absence, update pass # must 304-revalidate. 361 = 1 index + 96 pages + 192 imgs + 5 shared + 61 # family + 6 singles; the 4 planted errors write -o1 pages, not counted. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --rerun \ --errors-content 4 --files 361 \ --found 'big/p/95.html' \ --found 'big/a/d1/d2/d3/d4/d5/d6/d7/d8/deep.png' \ --found 'big/a/f2-2x.png' \ --found 'big/a/subs.vtt' \ --found 'big/a/font.woff2' \ --found 'big/a/js-data.bin' \ --found 'big/d/01.pdf' \ --found 'big/d/named.pdf' \ --found 'big/a/doc.pdf' \ --found "big/f9/caf$(printf '\xc3\xa9').html" \ --found 'big/f7/fa.html' \ --found 'big/a/ref.png' \ --found 'big/f6/sub/leaf.html' \ --found 'big/f1/dir/index.html' \ --found 'big/f10/empty.html' \ --found 'big/indexd41d.html' \ --found 'big/a/i0a.png' \ --not-found 'big/x/og' \ --not-found 'big/x/tw' \ --not-found 'big/x/jsonld.png' \ --not-found 'big/x/never-scanned.png' \ --not-found 'big/x/atom-only.html' \ --not-found 'big/x/sitemap-only.html' \ --not-found 'big/x/form-target.html' \ --not-found 'big/x/formact' \ --not-found 'big/x/ping' \ --not-found 'big/x/aj.jar' \ --not-found 'big/x/bj.jar' \ --not-found 'big/x/is1.png' \ --not-found 'big/x/concat.html' \ --file-matches 'big/f1/gzid.html' '

gzid

' \ --file-matches 'big/p/2.html' 'srcset="\.\./a/f2-1x\.png 1x, \.\./a/f2-2x\.png 2x"' \ --file-matches 'big/a/blk2.css' 'url\(blk2-bg\.png\)' \ --file-matches 'big/p/5.html' "document\\.write\\('&2 exit 1 fi httrack-3.49.14/tests/33_local-delayed.test0000644000175000017500000000127015230602340014057 #!/bin/bash # # Degenerate delayed-type paths (#5/#107 family): redirects that never resolve # a name must drop cleanly -- no .delayed leftovers (audited by local-crawl.sh), # no "not cached" warnings, resolvable links still land correctly. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --rerun --errors 0 \ --found 'delayed/real.pdf' \ --file-matches 'delayed/real.pdf' '%PDF' \ --found 'delayed/notype.bin.html' \ --found 'delayed/empty.html' \ --not-found 'delayed/noloc.html' \ --not-found 'delayed/selfloop.html' \ --not-found 'delayed/chain9.pdf' \ --log-not-found 'not cached' \ httrack 'BASEURL/delayed/index.html' httrack-3.49.14/tests/32_local-cdispo.test0000644000175000017500000000077715230602340013743 #!/bin/bash # # Content-Disposition names the saved file: the attachment filename replaces # the URL-derived name, and a traversal filename is reduced to its last # component, inside the mirror. set -euo pipefail : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'cdispo/report.pdf' \ --file-matches 'cdispo/report.pdf' '%PDF' \ --not-found 'cdispo/fetch.pdf' \ --found 'cdispo/evil.pdf' \ --not-found 'evil.pdf' \ httrack 'BASEURL/cdispo/index.html' httrack-3.49.14/tests/30_local-fragment-link.test0000755000175000017500000000103315230602340015203 #!/bin/bash # Issue #279: an anchored link (target.html#sec, quoted or bare) fetches the # target with the fragment dropped (strict server 400s on a '#' in the request) # but keeps it in the rewritten local link so the anchor still works. set -e : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'fraglink/target.html' \ --file-matches 'fraglink/index.html' 'href=target\.html#sec' \ --file-matches 'fraglink/index.html' 'href="target\.html#sec2"' \ httrack 'BASEURL/fraglink/index.html' httrack-3.49.14/tests/29_local-redirect-fragment.test0000755000175000017500000000061515230602340016064 #!/bin/bash # Issue #204: a 302 Location with a #fragment must drop the fragment before the # target is fetched. The server is strict (400 on a '#' in the request-target), # so a leaked fragment logs an error and the target is never saved. set -e : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'redir/target.html' \ httrack 'BASEURL/redir/index.html' httrack-3.49.14/tests/28_local-pause.test0000755000175000017500000000225215230602340013575 #!/bin/bash # # --pause (#185): a fixed inter-file delay must slow a multi-file crawl. Measure # the same crawl with and without --pause and compare: the harness overhead # cancels, leaving only the pause. Integer seconds keep it portable (BSD date # has no %N); a lower bound is not timing-flaky since a pause only adds time. set -e : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" # python3 runs the local server (mirror local-crawl.sh); skip when absent, else # run() swallows its exit-77 and the serverless 0s/0s crawl looks like a fail. find_python >/dev/null || { echo "python3 not found; skipping local crawl tests" exit 77 } run() { # echoes the wall-clock seconds of one crawl local t0 t1 t0=$(date +%s) bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ httrack 'BASEURL/types/index.html' -c1 "$@" >/dev/null 2>&1 t1=$(date +%s) echo $((t1 - t0)) } base=$(run) paused=$(run --pause 0.5) delta=$((paused - base)) echo "crawl: ${base}s, with --pause 0.5: ${paused}s (delta ${delta}s)" if [ "$delta" -lt 2 ]; then echo "FAIL: --pause did not delay the crawl (delta ${delta}s)" >&2 exit 1 fi httrack-3.49.14/tests/27_local-cookies-file.test0000644000175000017500000000162215230602340015025 #!/bin/bash # # End-to-end --cookies-file (#215): /gated/secret.php needs a cookie no page # ever Set-Cookies, so it is reachable only when the option preloads it from a # Netscape cookies.txt. Locks the CLI->opt->cookie_load->wire plumbing. set -e : "${top_srcdir:=..}" # preloaded cookie -> secret page is served. -o0 means a 500 leaves no file, so # --found/--files only hold when the secret is genuinely fetched (200). bash "$top_srcdir/tests/local-crawl.sh" --cookie 'session=opensesame' \ --errors 0 --files 2 \ --found 'gated/index.html' --found 'gated/secret.html' \ httrack 'BASEURL/gated/index.php' -o0 # control: without the cookie the secret 500s; -o0 suppresses the error page so # its absence is real (error + missing file) bash "$top_srcdir/tests/local-crawl.sh" --errors 1 \ --found 'gated/index.html' --not-found 'gated/secret.html' \ httrack 'BASEURL/gated/index.php' -o0 httrack-3.49.14/tests/26_local-strip-query.test0000755000175000017500000000176315230602340014770 #!/bin/bash # # End-to-end --strip-query (#112): two links to one resource differing only by # ?utm_source dedup to a single saved file (2 files written: index + resource); # the control crawl without the option keeps both variants (3 files). Locks the # CLI->opt->hash plumbing the engine self-test can't reach. set -e : "${top_srcdir:=..}" # stripped: the two ?utm_source variants collapse to one resource bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --files 2 \ httrack 'BASEURL/stripquery/index.html' --strip-query 'utm_source' # control: no stripping -> both query-named variants are saved bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --files 3 \ httrack 'BASEURL/stripquery/index.html' # strip still applies with url-hack off (-%u0): exercises the urlhack-off # savename branch, which must normalize the dedup key the same way the hash does bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --files 2 \ httrack 'BASEURL/stripquery/index.html' -%u0 --strip-query 'utm_source' httrack-3.49.14/tests/25_local-mime-exclude.test0000755000175000017500000000131515230602340015032 #!/bin/bash # # A -mime: exclusion must abort the transfer on the response Content-Type, not # fetch the whole 1 MB body then discard it (#58). The bytes-received guard is # the real one: the file is absent either way, but only the fix keeps the count # tiny (header only) instead of pulling the body. Match it positively (a small, # <=4-digit count) so a vanished/reworded summary line fails rather than passes. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'mimex/real.html' \ --not-found 'mimex/blob.pdf' \ --log-found 'excluded by MIME type filter' \ --log-found '\[[0-9]{1,4} bytes received' \ httrack 'BASEURL/mimex/index.html' '-mime:application/pdf' httrack-3.49.14/tests/24_local-resume-overlap.test0000644000175000017500000000723415230602340015424 #!/bin/bash # Issue #198: on a resumed download the server may answer the Range with a 206 # that starts *before* the offset we asked for (block-aligned ranges). httrack # must honor the returned Content-Range, not blindly append, or the overlap # bytes get duplicated and the file grows (corrupt PDFs). Pass 1 interrupts # flaky.bin mid-body (partial + temp-ref); pass 2 resumes against a 206 that # backs up 8 bytes. The result must equal the same bytes fetched whole (full.bin). set -eu : "${top_srcdir:=..}" testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server=$(nativepath "${testdir}/local-server.py") root=$(nativepath "${testdir}/server-root") python=$(find_python) || ! echo "python3 not found; skipping" >&2 || exit 77 tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_198.XXXXXX") || exit 1 serverpid= crawlpid= cleanup() { if test -n "$crawlpid"; then kill -9 "$crawlpid" 2>/dev/null || true; fi stop_server "$serverpid" rm -rf "$tmpdir" } trap cleanup EXIT HUP INT QUIT PIPE TERM # OVERLAP_COUNTER gets a byte per flaky.bin request so pass 1 knows when to interrupt. serverlog="${tmpdir}/server.log" : >"$serverlog" counter="${tmpdir}/hits" resumed="${tmpdir}/resumed" # gets a byte when the server serves a resume 206 OVERLAP_COUNTER="$counter" OVERLAP_RESUMED="$resumed" \ "$python" "$server" --root "$root" \ >"$serverlog" 2>&1 & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$serverlog" 2>/dev/null) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$serverlog")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } base="http://127.0.0.1:${port}" which httrack >/dev/null || { echo "could not find httrack" exit 1 } out="${tmpdir}/crawl" common=(-O "$out" --quiet --disable-security-limits --robots=0 --timeout=30 --retries=0 -c1) refdir="${out}/hts-cache/ref" # pass 1: interrupt once flaky.bin's prefix is streaming (partial + temp-ref). printf '[pass 1: interrupt flaky.bin] ..\t' httrack "${common[@]}" "${base}/overlap/index.html" >"${tmpdir}/log1" 2>&1 & crawlpid=$! for _ in $(seq 1 300); do test -s "$counter" && break kill -0 "$crawlpid" 2>/dev/null || break sleep 0.1 done sleep 0.5 kill -TERM "$crawlpid" 2>/dev/null || true wait "$crawlpid" 2>/dev/null || true crawlpid= test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" || { echo "FAIL: no temp-ref survived pass 1; cannot drive the resume" exit 1 } echo "OK (temp-ref present)" # pass 2: --continue -> resume Range -> 206 that starts 8 bytes early. printf '[pass 2: resume flaky.bin] ..\t' httrack "${common[@]}" --continue "${base}/overlap/index.html" >"${tmpdir}/log2" 2>&1 || true echo "OK" # Guard against a silent full re-download: the byte-compare below only tests the # fix if pass 2 actually went through the resume Range -> 206 path. printf '[resume path was exercised] ..\t' if ! test -s "$resumed"; then echo "FAIL: pass 2 never triggered a resume 206; the overlap fix was not exercised" exit 1 fi echo "OK" printf '[resumed file is not corrupted] ..\t' dir=$(find "$out" -maxdepth 1 -type d -name '127.0.0.1*' | head -1) flaky="${dir}/overlap/flaky.bin" full="${dir}/overlap/full.bin" if ! test -f "$flaky" || ! test -f "$full"; then echo "FAIL: flaky.bin or full.bin missing after pass 2" exit 1 fi if ! cmp -s "$flaky" "$full"; then echo "FAIL: resumed flaky.bin ($(wc -c <"$flaky")) != full.bin ($(wc -c <"$full")); overlap duplicated" exit 1 fi echo "OK ($(wc -c <"$flaky") bytes, byte-identical)" httrack-3.49.14/tests/23_local-errpage.test0000644000175000017500000000134415230602340014076 #!/bin/bash # Issue #17: with "no error pages" (-o0), 4xx/5xx bodies must not be written; # a genuine 0-byte 200 stays. Default (-o1) writes the error page. (#17's purge # half also does not reproduce; the purge path is not exercised here.) set -e : "${top_srcdir:=..}" # -o0: 404 suppressed, good page and the legit 0-byte 200 kept. bash "$top_srcdir/tests/local-crawl.sh" --errors 1 \ --found 'errpage/good.html' \ --found 'errpage/empty.html' \ --not-found 'errpage/missing.html' \ httrack 'BASEURL/errpage/index.html' '-o0' # Control -o1 (default): the 404 error page is written. bash "$top_srcdir/tests/local-crawl.sh" --errors 1 \ --found 'errpage/missing.html' \ httrack 'BASEURL/errpage/index.html' '-o1' httrack-3.49.14/tests/22_local-broken-size.test0000755000175000017500000000121415230602340014677 #!/bin/bash # Issues #32/#41: a Content-Length that disagrees with the body warns # "incomplete transfer" and skips the cache; -%B (tolerant) accepts it. set -euo pipefail : "${top_srcdir:=..}" # Default: warn, but the file is still written. bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'size/oversize.bin' \ --log-found 'incomplete transfer \(expected' \ httrack 'BASEURL/size/index.html' # -%B (tolerant): no warning, file written. bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'size/oversize.bin' \ --log-not-found 'incomplete transfer|not cached' \ httrack 'BASEURL/size/index.html' '-%B' httrack-3.49.14/tests/21_local-intl-update.test0000644000175000017500000000057515230602340014702 #!/bin/bash # # #157: a dotless, accented URL named .html on the first crawl must keep .html # across an update -- not revert to the extensionless name. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --rerun \ --found 'intl/Instalação_CVS_no_Ubuntu.html' \ --not-found 'intl/Instalação_CVS_no_Ubuntu' \ httrack 'BASEURL/intl/index.html' httrack-3.49.14/tests/20_local-resume-loop.test0000755000175000017500000000714415230602340014724 #!/bin/bash # Issue #206: a continue/update crawl looped forever when the resume Range got a # 416. Pass 1 leaves a partial + temp-ref; pass 2 must terminate and not loop. set -u : "${top_srcdir:=..}" testdir=$(cd "$(dirname "$0")" && pwd) # shellcheck source=tests/testlib.sh . "${testdir}/testlib.sh" server=$(nativepath "${testdir}/local-server.py") root=$(nativepath "${testdir}/server-root") python=$(find_python) || ! echo "python3 not found; skipping" >&2 || exit 77 tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_206.XXXXXX") || exit 1 serverpid= crawlpid= cleanup() { test -n "$crawlpid" && kill -9 "$crawlpid" 2>/dev/null stop_server "$serverpid" rm -rf "$tmpdir" } trap cleanup EXIT HUP INT QUIT PIPE TERM # --- start the server, discover its ephemeral port -------------------------- # RESUME_COUNTER gets a byte per /resume/blob.txt request (pass-2 delta bounds re-gets). serverlog="${tmpdir}/server.log" : >"$serverlog" counter="${tmpdir}/blobcount" RESUME_COUNTER="$counter" "$python" "$server" --root "$root" >"$serverlog" 2>&1 & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$serverlog" 2>/dev/null) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$serverlog")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } base="http://127.0.0.1:${port}" which httrack >/dev/null || { echo "could not find httrack" exit 1 } out="${tmpdir}/crawl" mkdir "$out" common=(-O "$out" --quiet --disable-security-limits --robots=0 --timeout=30 --retries=0) refdir="${out}/hts-cache/ref" # --- pass 1: crawl, interrupt once the blob download is underway ------------- printf '[pass 1: interrupt mid-download] ..\t' httrack "${common[@]}" "${base}/resume/index.html" >"${tmpdir}/log1" 2>&1 & crawlpid=$! # Wait until blob.txt is requested, then SIGTERM so httrack's exit handler # finalizes the cache and serializes the temp-ref. for _ in $(seq 1 300); do test -s "$counter" && break kill -0 "$crawlpid" 2>/dev/null || break sleep 0.1 done sleep 0.5 kill -TERM "$crawlpid" 2>/dev/null wait "$crawlpid" 2>/dev/null crawlpid= test -n "$(find "$refdir" -name '*.ref' 2>/dev/null)" || { echo "FAIL: no temp-ref survived pass 1; cannot drive #206" exit 1 } echo "OK (temp-ref present)" before=$(wc -c <"$counter" 2>/dev/null || echo 0) # --- pass 2: --continue -> resume Range -> 416, bounded against the #206 loop - # Kill pass 2 after a deadline (portable stand-in for `timeout`, absent on macOS). printf '[pass 2: resume must terminate] ..\t' HANG_RC=137 # 128 + SIGKILL httrack "${common[@]}" --continue "${base}/resume/index.html" >"${tmpdir}/log2" 2>&1 & crawlpid=$! (sleep 30 && kill -9 "$crawlpid" 2>/dev/null) & guard=$! rc=0 wait "$crawlpid" 2>/dev/null || rc=$? crawlpid= kill "$guard" 2>/dev/null || true wait "$guard" 2>/dev/null || true if test "$rc" -eq "$HANG_RC"; then echo "FAIL: pass 2 did not terminate (#206 resume->416 loop)" exit 1 fi echo "OK (terminated, rc=$rc)" # The fix re-gets once (resume Range + range-less re-get = 2): the lower bound # rejects a drop-the-link non-fix (1), the upper bound rejects the loop (many). after=$(wc -c <"$counter" 2>/dev/null || echo 0) hits=$((after - before)) printf '[bounded re-get count] ..\t' if test "$hits" -lt 2; then echo "FAIL: only ${hits} pass-2 request(s); the stale partial was not re-got" exit 1 fi if test "$hits" -gt 8; then echo "FAIL: ${hits} pass-2 requests for blob.txt (resume is looping)" exit 1 fi echo "OK (${hits} requests)" httrack-3.49.14/tests/19_local-connect-fallback.test0000644000175000017500000000741715230602340015653 #!/bin/bash # # A host that resolves to several addresses must fall back to the next one when # a connect fails, instead of giving up on the first (dead IPv6 on a dual-stack # host, ...). HTTRACK_DEBUG_RESOLVE pins "deadhost" to a refused address first # (127.0.0.2, nothing listening) then the live server (127.0.0.1): the crawl # only succeeds if httrack retries the second address. A second case pins every # address to a refused one, so the slot must exhaust the list and error out # (rather than hang or loop). set -euo pipefail : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" if test "${V6_SUPPORT:-}" == "no"; then echo "no IPv6 support (resolver list/override is IPv6-only), skipping" exit 77 fi python=$(find_python) || { echo "python3 missing, skipping" exit 77 } # The fixture needs a second loopback IP (dead 127.0.0.2 + live 127.0.0.1) for # the fallback to have a target; GNU/Hurd has only 127.0.0.1, so skip there. case "$(uname -s)" in GNU | GNU/*) echo "GNU/Hurd: single loopback IP, connect-fallback fixture unbuildable, skipping" exit 77 ;; esac server=$(nativepath "$top_srcdir/tests/local-server.py") root=$(nativepath "$top_srcdir/tests/server-root") tmpdir=$(mktemp -d) serverpid= cleanup() { stop_server "$serverpid" rm -rf "$tmpdir" return 0 } trap cleanup EXIT # bind the live server to 127.0.0.1 only, so 127.0.0.2 refuses the connect "$python" "$server" --root "$root" --bind 127.0.0.1 >"$tmpdir/srv.out" 2>"$tmpdir/srv.err" & serverpid=$! port= for _ in $(seq 1 50); do line=$(head -n1 "$tmpdir/srv.out" 2>/dev/null || true) if test "${line%% *}" == "PORT"; then port="${line#PORT }" break fi kill -0 "$serverpid" 2>/dev/null || { echo "server exited early: $(cat "$tmpdir/srv.err")" exit 1 } sleep 0.1 done test -n "$port" || { echo "could not discover server port" exit 1 } out="$tmpdir/crawl" # macOS has only 127.0.0.1, so the dead 127.0.0.x connects block to the timeout # instead of refusing instantly (as on Linux); a small --timeout + --retries=0 # bound the stall without changing what the fallback exercises. HTTRACK_DEBUG_RESOLVE="deadhost:127.0.0.2,127.0.0.1" \ httrack "http://deadhost:$port/simple/basic.html" -O "$out" \ -c1 --robots=0 --timeout=5 --retries=0 --quiet -Z >"$tmpdir/log" 2>&1 log="$out/hts-log.txt" # the dead address was tried, then the next one (proves the fallback ran) if ! grep -q "trying next address" "$log"; then echo "FAIL: no connect fallback happened" cat "$log" exit 1 fi # 0 errors and the file was actually fetched (over the live address) errs=$(grep -iEc "^[0-9:]*[[:space:]]Error:" "$log" || true) test "$errs" == "0" || { echo "FAIL: $errs error(s) reported" grep -iE "Error:" "$log" exit 1 } test -f "$out/deadhost_$port/simple/basic.html" || { echo "FAIL: basic.html not downloaded via fallback" find "$out" -type f exit 1 } # every address dead: the slot exhausts the list, then errors out (the harness # timeout would catch a hang/loop) out2="$tmpdir/crawl2" HTTRACK_DEBUG_RESOLVE="alldead:127.0.0.2,127.0.0.3" \ httrack "http://alldead:$port/simple/basic.html" -O "$out2" \ -c1 --robots=0 --timeout=5 --retries=0 --quiet -Z >"$tmpdir/log2" 2>&1 log2="$out2/hts-log.txt" grep -q "trying next address" "$log2" || { echo "FAIL: exhaustion path never tried the fallback address" cat "$log2" exit 1 } grep -iqE "^[0-9:]*[[:space:]]Error:" "$log2" || { echo "FAIL: all addresses failing did not report an error" cat "$log2" exit 1 } test ! -f "$out2/alldead_$port/simple/basic.html" || { echo "FAIL: file downloaded despite every address failing" exit 1 } echo "OK: connect fallback succeeds, and exhausting all addresses errors out" httrack-3.49.14/tests/18_local-update.test0000644000175000017500000000157115230602340013741 #!/bin/bash # # An update pass keeps the names the first crawl chose: type and save name # ride the cache, so a declared-text/html .pdf stays .html, a typeless .png # stays .png, and a sniff-kept ext is reproduced from X-Save even when the # refetched content changed (mutant.jpg serves PNG bytes on the rerun). : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --rerun \ --found 'types/report.html' --not-found 'types/report.pdf' \ --found 'types/notype.png' --not-found 'types/notype.html' \ --found 'types/lie.png' --not-found 'types/lie.html' \ --found 'types/wrongtype.jpg' --not-found 'types/wrongtype.png' \ --found 'types/bigtype.jpg' --not-found 'types/bigtype.png' \ --found 'types/packed.jpg' --not-found 'types/packed.png' \ --found 'types/mutant.jpg' --not-found 'types/mutant.png' \ httrack 'BASEURL/types/index.html' httrack-3.49.14/tests/17_local-empty-ct.test0000644000175000017500000000070015230602340014211 #!/bin/bash # # An empty "Content-Type:" header value must be treated as "no usable type" # (keep the URL extension), not parsed from an uninitialized buffer. The crawl # also runs under ASan/UBSan in CI, which catches the uninitialized read this # guards against. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'types/emptyct.png' --not-found 'types/emptyct.html' \ httrack 'BASEURL/types/index.html' httrack-3.49.14/tests/16_local-assume.test0000644000175000017500000000070115230602340013744 #!/bin/bash # # --assume under the default delayed type check (-%N2), issue #56. A user type # pinned with --assume must be honored immediately, not lost to the delayed # name: photo.png served as image/png but assumed text/html is saved as .html. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'types/photo.html' --not-found 'types/photo.png' \ httrack 'BASEURL/types/photo.png' --assume png=text/html httrack-3.49.14/tests/15_local-types.test0000644000175000017500000000252615230602340013621 #!/bin/bash # # Content-Type vs URL-extension naming (#267 family, default -%N2). A MISSING # type keeps a specific non-HTML ext; a DECLARED disagreeing type is trusted # unless magic bytes prove the ext right (lie/wrongtype/packed keep theirs), # so a real HTML body (report.pdf) still becomes .html. Wrong names are # asserted absent so a regression in either direction fails. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 \ --found 'types/notype.png' --not-found 'types/notype.html' \ --found 'types/notype.pdf' --not-found 'types/notype.html' \ --found 'types/photo.png' \ --found 'types/doc.pdf' \ --found 'types/lie.png' --not-found 'types/lie.html' \ --found 'types/wrongtype.jpg' --not-found 'types/wrongtype.png' \ --found 'types/bigtype.jpg' --not-found 'types/bigtype.png' \ --found 'types/mutant.jpg' --not-found 'types/mutant.png' \ --found 'types/packed.jpg' --not-found 'types/packed.png' \ --found 'types/report.html' --not-found 'types/report.pdf' \ --found 'types/page.htm' --not-found 'types/page.html' \ --found 'types/script.js' \ --found 'types/style.css' \ --found 'types/data.json' \ --found 'types/control.html' --not-found 'types/control.php' \ --found 'types/gend61c.png' --not-found 'types/gend61c.html' \ httrack 'BASEURL/types/index.html' httrack-3.49.14/tests/14_local-https.test0000755000175000017500000000121115230602340013607 #!/bin/bash # # HTTPS crawl against the local test server, using the shipped self-signed # cert. httrack does not verify certs (htslib.c: SSL_CTX_new with no # SSL_CTX_set_verify), so the self-signed cert is accepted as-is and this # exercises the real TLS path offline. basic.html links to link.html with four # distinct query strings, each saved under a hashed name -> 5 files. : "${top_srcdir:=..}" if test "$HTTPS_SUPPORT" == "no"; then echo "no https support compiled, skipping" exit 77 fi bash "$top_srcdir/tests/local-crawl.sh" --tls --errors 0 --files 5 \ --found 'simple/basic.html' \ httrack 'BASEURL/simple/basic.html' httrack-3.49.14/tests/13_local-cookies.test0000755000175000017500000000117215230602340014106 #!/bin/bash # # Cookie chain against the local test server (replaces the old online # ut/cookies/*.php fixtures). entrance.php sets cat/cake; second.php checks # them and sets badger; third.php checks all three. A missing or wrong cookie # returns 500, which would surface as an httrack error and a missing file, so a # clean 3-files/0-errors run proves the cookie jar is replayed across links. : "${top_srcdir:=..}" bash "$top_srcdir/tests/local-crawl.sh" --errors 0 --files 3 \ --found 'cookies/entrance.html' \ --found 'cookies/second.html' \ --found 'cookies/third.html' \ httrack 'BASEURL/cookies/entrance.php' httrack-3.49.14/tests/13_crawl_proxy_https.test0000644000175000017500000001143315230602340015153 #!/bin/bash # # Issue #85: an https crawl must go through the configured proxy (CONNECT # tunnel), not bypass it and hit the origin directly. Fully local: a self-signed # TLS origin plus a logging CONNECT proxy, so no network access is needed. set -euo pipefail : "${top_srcdir:=..}" # shellcheck source=tests/testlib.sh . "$top_srcdir/tests/testlib.sh" if test "${HTTPS_SUPPORT:-}" == "no"; then echo "no https support compiled, skipping" exit 77 fi python=$(find_python) || python= if test -z "$python" || ! command -v openssl >/dev/null 2>&1; then echo "python3/openssl missing, skipping" exit 77 fi server=$(nativepath "$top_srcdir/tests/proxy-https-server.py") tmpdir=$(mktemp -d) pids= cleanup() { for pid in $pids; do stop_server "$pid" done rm -rf "$tmpdir" } trap cleanup EXIT # self-signed cert for the local TLS origin (httrack does not verify certs) openssl req -x509 -newkey rsa:2048 -keyout "$tmpdir/key.pem" \ -out "$tmpdir/cert.pem" -days 2 -nodes -subj "/CN=127.0.0.1" \ >/dev/null 2>&1 cat "$tmpdir/key.pem" "$tmpdir/cert.pem" >"$tmpdir/both.pem" # start_server : launches a proxy+origin pair, sets $origin_port # and $proxy_port from its announced ephemeral ports. start_server() { local dir="$1" mode="$2" ports pem mkdir -p "$dir" ports="$dir/ports.txt" pem=$(nativepath "$tmpdir/both.pem") dir_native=$(nativepath "$dir") : >"$ports" "$python" "$server" "$pem" "$dir_native" "$mode" \ >"$ports" 2>"$dir/server.err" & pids="$pids $!" for _ in $(seq 1 100); do grep -q "^ready" "$ports" 2>/dev/null && break sleep 0.1 done grep -q "^ready" "$ports" 2>/dev/null || { echo "server ($mode) did not start" >&2 cat "$dir/server.err" >&2 exit 1 } origin_port=$(awk '/^ORIGIN/{print $2}' "$ports") proxy_port=$(awk '/^PROXY/{print $2}' "$ports") } # Run httrack, but kill it after a deadline so a hang (e.g. a missing bound on # the proxy response) surfaces as the kill code $HANG_RC instead of stalling the # whole job. A portable stand-in for `timeout`, which macOS lacks. HANG_RC=137 # 128 + SIGKILL run_crawl() { local out="$1" proxy="$2" port="$3" rm -rf "$out" httrack "https://127.0.0.1:${port}/" --proxy "$proxy" \ -O "$out" -r1 -s0 --timeout=10 >"$out.log" 2>&1 & local pid=$! (sleep 60 && kill -9 "$pid" 2>/dev/null) & local guard=$! local rc=0 wait "$pid" 2>/dev/null || rc=$? kill "$guard" 2>/dev/null || true wait "$guard" 2>/dev/null || true return "$rc" } # --- working proxy ---------------------------------------------------------- ok="$tmpdir/ok" start_server "$ok" ok # 1. page retrieved AND the proxy saw a CONNECT to the origin run_crawl "$ok/out" "127.0.0.1:${proxy_port}" "$origin_port" grep -rq "ORIGIN-PAGE-85" "$ok/out" || { echo "FAIL: origin page not downloaded through proxy" >&2 cat "$ok/out.log" >&2 exit 1 } grep -q "^CONNECT 127.0.0.1:${origin_port} " "$ok/proxy.log" || { echo "FAIL: proxy never received a CONNECT (https bypassed the proxy)" >&2 cat "$ok/proxy.log" >&2 exit 1 } echo "OK: https tunneled through proxy via CONNECT" # 2. authenticated proxy: creds ride the CONNECT, and NEVER reach the origin : >"$ok/proxy.log" : >"$ok/origin-headers.log" run_crawl "$ok/out2" "user:secret@127.0.0.1:${proxy_port}" "$origin_port" grep -rq "ORIGIN-PAGE-85" "$ok/out2" || { echo "FAIL: origin page not downloaded through authenticated proxy" >&2 exit 1 } got=$(awk '/^AUTH Basic /{print $3}' "$ok/proxy.log" | head -1) # base64("user:secret"); compared as a literal to stay portable (no base64 -d, # which differs between GNU and BSD) test "$got" == "dXNlcjpzZWNyZXQ=" || { echo "FAIL: Proxy-Authorization not carried on CONNECT (got '$got')" >&2 cat "$ok/proxy.log" >&2 exit 1 } if grep -qi "proxy-authorization" "$ok/origin-headers.log"; then echo "FAIL: proxy credentials leaked to the origin through the tunnel" >&2 cat "$ok/origin-headers.log" >&2 exit 1 fi echo "OK: proxy credentials carried on CONNECT, not leaked to origin" # --- hostile proxy ---------------------------------------------------------- # A proxy that answers 200 then streams headers forever must not hang the crawl: # the client bounds the response. run_crawl kills a hung httrack after 60s, so a # missing bound surfaces as $HANG_RC here. flood="$tmpdir/flood" start_server "$flood" flood rc=0 run_crawl "$flood/out" "127.0.0.1:${proxy_port}" "$origin_port" || rc=$? test "$rc" -ne "$HANG_RC" || { echo "FAIL: crawl hung on a flooding proxy (bounded read missing)" >&2 exit 1 } grep -rq "ORIGIN-PAGE-85" "$flood/out" 2>/dev/null && { echo "FAIL: flooding proxy unexpectedly served the page" >&2 exit 1 } echo "OK: bounded proxy response, no hang on a flooding proxy" httrack-3.49.14/tests/12_crawl_https.test0000755000175000017500000000045615230602340013717 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 if test "${HTTPS_SUPPORT:-}" == "no"; then echo "no https support compiled, skipping" exit 77 fi bash crawl-test.sh --errors 0 --files 5 httrack https://ut.httrack.com/simple/basic.html httrack-3.49.14/tests/11_crawl-parsing.test0000755000175000017500000000363415230602340014136 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 # http://code.google.com/p/httrack/issues/detail?id=4&can=1 bash crawl-test.sh --errors 0 --files 4 \ --found ut.httrack.com/parsing/back5e1f.gif \ --found ut.httrack.com/parsing/events.html \ --found ut.httrack.com/parsing/fade230f4.gif \ --found ut.httrack.com/parsing/fade3860.gif \ httrack http://ut.httrack.com/parsing/events.html # http://code.google.com/p/httrack/issues/detail?id=2&can=1 bash crawl-test.sh --errors 0 --files 3 \ --found ut.httrack.com/parsing/background-image.css \ --found ut.httrack.com/parsing/background-image.html \ --found ut.httrack.com/parsing/fade.gif \ httrack http://ut.httrack.com/parsing/background-image.html # javascript parsing bash crawl-test.sh --errors 0 --files 3 \ --found ut.httrack.com/parsing/back.gif \ --found ut.httrack.com/parsing/fade.gif \ --found ut.httrack.com/parsing/javascript.html \ httrack http://ut.httrack.com/parsing/javascript.html # handling of + before query string bash crawl-test.sh --errors 0 --files 6 \ --found ut.httrack.com/parsing/escaping.html \ --found "ut.httrack.com/parsing/foo bar30f4.html" \ --found "ut.httrack.com/parsing/foo bar5e1f.html" \ --found "ut.httrack.com/parsing/foo+bar+plus3860.html" \ --found "ut.httrack.com/parsing/foo barae52.html" \ --found "ut.httrack.com/parsing/foo bar7b30.html" \ httrack http://ut.httrack.com/parsing/escaping.html # handling of # encoded in filename # see http://code.google.com/p/httrack/issues/detail?id=25 bash crawl-test.sh --errors 2 --files 4 \ --found "ut.httrack.com/parsing/escaping2.html" \ --found "ut.httrack.com/parsing/++foo++bar++plus++.html" \ --found "ut.httrack.com/parsing/foo#bar#.html" \ --found "ut.httrack.com/parsing/foo bar.html" \ httrack http://ut.httrack.com/parsing/escaping2.html httrack-3.49.14/tests/11_crawl-longurl.test0000755000175000017500000000065715230602340014157 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 # http://code.google.com/p/httrack/issues/detail?id=42&can=1 # we expect 2 errors only because other links are too longs (to be modified if suitable) bash crawl-test.sh --errors 2 --files 1 \ --found ut.httrack.com/overflow/longquerywithaccents.html \ httrack http://ut.httrack.com/overflow/longquerywithaccents.php httrack-3.49.14/tests/11_crawl-international.test0000755000175000017500000000624215230602340015340 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 # unicode tests bash crawl-test.sh \ --errors 1 --files 10 \ --found ut.httrack.com/unicode-links/caf%a91bce.html \ --found ut.httrack.com/unicode-links/café30f4.html \ --found ut.httrack.com/unicode-links/café3860.html \ --found ut.httrack.com/unicode-links/café463e.html \ --found ut.httrack.com/unicode-links/café5e1f.html \ --found ut.httrack.com/unicode-links/café7b30.html \ --found ut.httrack.com/unicode-links/café8007.html \ --found ut.httrack.com/unicode-links/café9fa8.html \ --found ut.httrack.com/unicode-links/caféae52.html \ --found ut.httrack.com/unicode-links/caféc009.html \ --found ut.httrack.com/unicode-links/utf8.html \ httrack http://ut.httrack.com/unicode-links/utf8.html bash crawl-test.sh \ --errors 2 --files 9 \ --found ut.httrack.com/unicode-links/café3860.html \ --found ut.httrack.com/unicode-links/café9fa8.html \ --found ut.httrack.com/unicode-links/café30f4.html \ --found ut.httrack.com/unicode-links/café5e1f.html \ --found ut.httrack.com/unicode-links/café7b30.html \ --found ut.httrack.com/unicode-links/café8007.html \ --found ut.httrack.com/unicode-links/caf%e939bd.html \ --found ut.httrack.com/unicode-links/caf%e9ae52.html \ --found ut.httrack.com/unicode-links/caféaec2.html \ --found ut.httrack.com/unicode-links/caféfad6.html \ --found ut.httrack.com/unicode-links/default.html \ httrack http://ut.httrack.com/unicode-links/default.html bash crawl-test.sh \ --errors 2 --files 9 \ --found ut.httrack.com/unicode-links/caf%a9ae52.html \ --found ut.httrack.com/unicode-links/caf%a9bf59.html \ --found ut.httrack.com/unicode-links/café30f4.html \ --found ut.httrack.com/unicode-links/café3860.html \ --found ut.httrack.com/unicode-links/café5e1f.html \ --found ut.httrack.com/unicode-links/café647f.html \ --found ut.httrack.com/unicode-links/café7b30.html \ --found ut.httrack.com/unicode-links/café8007.html \ --found ut.httrack.com/unicode-links/caféaec2.html \ --found ut.httrack.com/unicode-links/caféfad6.html \ --found ut.httrack.com/unicode-links/iso88591.html \ httrack http://ut.httrack.com/unicode-links/iso88591.html bash crawl-test.sh \ --errors 4 --files 9 \ --found ut.httrack.com/unicode-links/caf%a8%a6c72a.html \ --found ut.httrack.com/unicode-links/caf%a9bf59.html \ --found ut.httrack.com/unicode-links/café8007.html \ --found ut.httrack.com/unicode-links/cafébf43.html \ --found ut.httrack.com/unicode-links/cafédcd8.html \ --found ut.httrack.com/unicode-links/café2461.html \ --found ut.httrack.com/unicode-links/caf%a8%a61bce.html \ --found ut.httrack.com/unicode-links/caf%a9ae52.html \ --found ut.httrack.com/unicode-links/café7b30.html \ --found ut.httrack.com/unicode-links/café30f4.html \ --found ut.httrack.com/unicode-links/café5e1f.html \ --found ut.httrack.com/unicode-links/café3860.html \ --found ut.httrack.com/unicode-links/gb18030.html \ httrack http://ut.httrack.com/unicode-links/gb18030.html httrack-3.49.14/tests/11_crawl-idna.test0000755000175000017500000000137215230602340013403 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 # unicode tests bash crawl-test.sh \ --errors 1 --files 5 \ --found 'café.ut.httrack.com/unicode-links/café3860.html' \ --found 'café.ut.httrack.com/unicode-links/café30f4.html' \ --found 'café.ut.httrack.com/unicode-links/café5e1f.html' \ --found 'café.ut.httrack.com/unicode-links/café7b30.html' \ httrack 'http://ut.httrack.com/unicode-links/idna.html' \ '+*.ut.httrack.com/*' --robots=0 # unicode tests (bogus links) bash crawl-test.sh \ --errors 0 --files 1 \ --found 'ut.httrack.com/unicode-links/idna_bogus.html' \ httrack 'http://ut.httrack.com/unicode-links/idna_bogus.html' \ '-*' --robots=0 httrack-3.49.14/tests/11_crawl-cookies.test0000755000175000017500000000054015230602340014120 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 bash crawl-test.sh --errors 0 --files 3 \ --found ut.httrack.com/cookies/third.html \ --found ut.httrack.com/cookies/second.html \ --found ut.httrack.com/cookies/entrance.html \ httrack http://ut.httrack.com/cookies/entrance.php httrack-3.49.14/tests/10_crawl-simple.test0000755000175000017500000000030315230602340013751 #!/bin/bash # set -euo pipefail bash check-network.sh || ! echo "skipping online unit tests" || exit 77 bash crawl-test.sh --errors 0 --files 5 httrack http://ut.httrack.com/simple/basic.html httrack-3.49.14/tests/02_update-cache.test0000755000175000017500000000356015230602340013706 #!/bin/bash # # Update path: re-mirroring a site reads the cache (cache_readex) to decide what # is up to date -- a path the one-shot crawl tests never exercise. Offline # (file://), so it always runs. # # 1. mirror, then re-mirror unchanged -> the cache-read pass must complete clean # (guards against a crash/abort/error in cache_readex). # 2. change a source file, re-mirror -> the update must pick up the new content # (guards the update decision that reads the cached metadata). set -euo pipefail site=$(mktemp -d) out=$(mktemp -d) trap 'rm -rf "$site" "$out"' EXIT cat >"$site/index.html" <a b EOF echo 'OLDCONTENT' >"$site/a.html" mkdir -p "$site/sub" echo '

bbb

' >"$site/sub/b.html" url="file://$site/index.html" # count Error: lines in the log (grep -c exits 1 on zero matches: guard it) errors() { grep -ciE '^[0-9:]*[[:space:]]Error:' "$out/hts-log.txt" || true; } # 1. fresh mirror writes the cache httrack "$url" -O "$out" -q -%v0 -r3 >/dev/null 2>&1 test -e "$out/hts-cache/new.zip" || { echo "no cache was written" >&2 exit 1 } # 2. re-mirror unchanged: the update reads the cache and must complete cleanly httrack "$url" -O "$out" -q -%v0 -r3 >/dev/null 2>&1 test "$(errors)" = 0 || { echo "update (unchanged) reported errors" >&2 exit 1 } for suffix in a.html sub/b.html; do test -n "$(find "$out" -path "*/$suffix" -print -quit)" || { echo "missing $suffix after update" >&2 exit 1 } done # 3. change a source file: the update must pick up the new content sleep 1 echo 'NEWCONTENT' >"$site/a.html" httrack "$url" -O "$out" -q -%v0 -r3 >/dev/null 2>&1 test "$(errors)" = 0 || { echo "update (changed) reported errors" >&2 exit 1 } grep -q NEWCONTENT "$(find "$out" -path '*/a.html')" || { echo "update did not pick up the changed source" >&2 exit 1 } httrack-3.49.14/tests/02_manpage-regen.test0000755000175000017500000000316615230602340014073 #!/bin/bash # # The committed man/httrack.1 must match what man/makeman.sh produces from the # current "httrack --help" output. This catches a --help change that was not # followed by "make -C man regen-man". # # Keep this POSIX-portable: the harness runs it via $(BASH), which is a plain # POSIX /bin/sh on some platforms (e.g. macOS), so avoid bashisms (such as # process substitution) despite the #!/bin/bash above. # pipefail is a bashism; keep to POSIX set flags ($(BASH) may be /bin/sh here). set -eu : "${top_srcdir:=..}" gen="$top_srcdir/man/makeman.sh" committed="$top_srcdir/man/httrack.1" # Need the generator and a runnable httrack. test -f "$gen" || { echo "makeman.sh not found; skipping" >&2 exit 77 } command -v httrack >/dev/null 2>&1 || { echo "httrack not in PATH; skipping" >&2 exit 77 } tmp=$(mktemp) || exit 1 committed_clean=$(mktemp) || exit 1 generated_clean=$(mktemp) || exit 1 trap 'rm -f "$tmp" "$committed_clean" "$generated_clean"' EXIT README="$top_srcdir/README" bash "$gen" httrack >"$tmp" 2>/dev/null || { echo "makeman.sh failed" >&2 exit 1 } # Ignore the two intentionally date-dependent lines (page date, copyright year). # Temp files, not process substitution, so this works under a POSIX /bin/sh. strip_volatile() { grep -vE '^\.TH httrack |^Copyright \(C\) 1998-'; } strip_volatile <"$committed" >"$committed_clean" strip_volatile <"$tmp" >"$generated_clean" if diff "$committed_clean" "$generated_clean" >/dev/null; then exit 0 fi echo "man/httrack.1 is out of date. Regenerate with: make -C man regen-man" >&2 diff "$committed_clean" "$generated_clean" | head -40 >&2 exit 1 httrack-3.49.14/tests/01_zlib-savename-cached.test0000644000175000017500000000253015230602340015315 #!/bin/bash # set -euo pipefail # Update-run naming from a real cache entry (-#test=savename cached=|). # Named 01_zlib-*: the cache writer needs zlib, which the MSan job can't run. # resolve httrack before cd: make check puts a RELATIVE ../src on PATH httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT cd "$scratch" name() { local fil="$1" ctype="$2" want="$3" shift 3 out="$("$httrack_bin" -O /dev/null -#test=savename "$fil" "$ctype" "$@" | sed -n 's/^savename: //p')" test "${out##*/}" == "$want" || { echo "FAIL: '$fil' '$ctype' $* -> '$out' (want '$want')" exit 1 } } # No live bytes: the recorded save name (X-Save) reproduces the previous # verdict; cached body bytes (PNG magic) are ignored; css has no magic rule. name '/photo.jpg' 'image/png' 'photo.jpg' 'cached=image/png|www.example.com/photo.jpg' name '/photo.jpg' 'image/png' 'photo.png' 'cached=image/png|www.example.com/photo.png' name '/photo.jpg' 'image/jpeg' 'photo.jpg' 'cached=image/jpeg|www.example.com/photo.png' name '/style.css' 'image/png' 'style.css' 'cached=image/png|www.example.com/style.css' # agreement keeps the URL ext verbatim (.jpeg), never canonicalized to .jpg name '/photo.jpeg' 'image/jpeg' 'photo.jpeg' 'cached=image/jpeg|www.example.com/photo.jpeg' httrack-3.49.14/tests/01_zlib-repair-shift.test0000644000175000017500000000133115230602340014704 #!/bin/bash # # Keep this POSIX-portable: the harness runs it via $(BASH), which is a plain # POSIX /bin/sh on some platforms (e.g. macOS), so avoid bashisms and GNU-only # tool flags despite the #!/bin/bash above. # unzRepair header read must not overflow a signed shift (-#test=zip-repair-shift # ). A damaged local file header whose CRC high word has bit 15 set made # READ_32 shift an int past INT_MAX; UBSan aborts before the fix casts to uLong. set -eu dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT out=$(httrack -#test=zip-repair-shift "$dir") printf '%s\n' "$out" | grep -qx "zip-repair-shift: OK (recovered 1 entry)" || { echo "expected 'zip-repair-shift: OK (recovered 1 entry)', got: $out" >&2 exit 1 } httrack-3.49.14/tests/01_zlib-cache-writefail.test0000644000175000017500000000172015230602340015340 #!/bin/bash # # Keep this POSIX-portable: the harness runs it via $(BASH), which is a plain # POSIX /bin/sh on some platforms (e.g. macOS), so avoid bashisms and GNU-only # tool flags despite the #!/bin/bash above. # Cache write-failure policy (-#test=cache-writefail ). #174/#219: disk # full or a failure streak aborts cleanly; an isolated failure or an oversized # entry is only dropped. set -eu dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT out=$(httrack -#test=cache-writefail "$dir") # Match the exact success line (error logs also go to stdout); a renamed/removed # test prints the registry to stderr, which exits non-zero but never prints this. printf '%s\n' "$out" | grep -qx "cache-writefail: OK" || { echo "expected 'cache-writefail: OK', got: $out" >&2 exit 1 } # A skipped entry must be warned about with its URL. printf '%s\n' "$out" | grep -q "entry not cached: example.com/" || { echo "expected a URL-bearing skip warning" >&2 exit 1 } httrack-3.49.14/tests/01_zlib-cache-golden.test0000644000175000017500000000350715230602340014627 #!/bin/bash # # Keep this POSIX-portable: the harness runs it via $(BASH), which is a plain # POSIX /bin/sh on some platforms (e.g. macOS), so avoid bashisms and GNU-only # tool flags despite the #!/bin/bash above. # Golden cache-format regression test (driven by 'httrack -#test=cache-golden '). # # 01_zlib-cache.test writes the cache with the same build it reads back (a # round-trip), so it cannot catch a read-path or ZIP-format regression where # writer and reader drift together. This reads a *committed* cache frozen by an # earlier build and asserts a fixed set of entries still decodes field- and # byte-exact. # # Regenerate the fixture after a deliberate format change with # 'httrack -#test=cache-golden regen', then copy /hts-cache/new.zip over the # committed file. set -eu : "${top_srcdir:=..}" fixture="$top_srcdir/tests/fixtures/cache-golden" test -e "$fixture/hts-cache/new.zip" || { echo "missing committed cache fixture: $fixture/hts-cache/new.zip" >&2 exit 1 } dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT # Read against a private copy so the source tree is never touched (a read # session does not write, but copying keeps the test hermetic). Create the dir # with mkdir so it is writable for the cleanup trap: under "make distcheck" the # srcdir is read-only, and "cp -r" of that directory would carry its read-only # mode over and defeat the rm -rf. mkdir -p "$dir/hts-cache" cp "$fixture/hts-cache/new.zip" "$dir/hts-cache/new.zip" out=$(httrack -#test=cache-golden "$dir") # Match the exact success line: the read must have found and verified every # entry, not merely failed to enter the mode (a renamed/removed test prints the # registry to stderr, which also exits non-zero but never prints this). test "$out" = "cache-golden: OK" || { echo "expected 'cache-golden: OK', got: $out" >&2 exit 1 } httrack-3.49.14/tests/01_zlib-cache-legacy.test0000644000175000017500000000122115230602340014612 #!/bin/bash # # The pre-3.31 .dat/.ndx cache import was removed: cache_init must refuse the # legacy pair and leave the files untouched (httrack -#test=cache-legacy ). set -eu dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT # the refusal errors land on stdout (no log file); pin them and the verdict out=$(httrack -#test=cache-legacy "$dir" 2>/dev/null) cnt=$(printf '%s\n' "$out" | grep -c 'no longer supported' || true) test "$cnt" = 2 || { echo "expected 2 refusal messages, got $cnt" >&2 exit 1 } out=$(printf '%s\n' "$out" | tail -n1) test "$out" = "cache-legacy: OK" || { echo "expected 'cache-legacy: OK', got: $out" >&2 exit 1 } httrack-3.49.14/tests/01_zlib-cache-corrupt.test0000644000175000017500000000112015230602340015042 #!/bin/bash # # Read-side cache corruption (httrack -#test=cache-corrupt ): zip byte # surgery (bad/oversized X-Size, blanked X-In-Cache, smashed header, garbled # deflate) must each be rejected per-entry, never crash, never taint the sibling. set -eu dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT # the smashed-header case logs expected "Corrupted cache entry" warnings on # stdout; the verdict is the last line out=$(httrack -#test=cache-corrupt "$dir" 2>/dev/null | tail -n1) test "$out" = "cache-corrupt: OK" || { echo "expected 'cache-corrupt: OK', got: $out" >&2 exit 1 } httrack-3.49.14/tests/01_zlib-cache.test0000755000175000017500000000413115230602340013356 #!/bin/bash # # Keep this POSIX-portable: the harness runs it via $(BASH), which is a plain # POSIX /bin/sh on some platforms (e.g. macOS), so avoid bashisms and GNU-only # tool flags despite the #!/bin/bash above. # Cache create/read/update logic (driven by 'httrack -#test=cache '). # # The in-process self-test stores several hand-crafted edge entries (normal # HTML, an empty redirect with a near-limit location, a non-HTML body kept via # all-in-cache, a binary body with embedded NUL/high bytes), a few thousand # small entries (index/lookup scale), and a few large compressible and # incompressible bodies (zlib deflate/inflate). It reads everything back # asserting every header field and the body round-trip byte for byte, then # updates one entry and confirms the new value is read back. It exits non-zero # on the first mismatch. set -eu dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT # The working directory is a required argument; without it the test prints a # usage line to stderr and returns non-zero. out=$(httrack -#test=cache "$dir") # Match the exact success line, so the test cannot pass for an unrelated reason # (e.g. the cache test being gone, which prints the registry to stderr but # never prints this line). test "$out" = "cache-selftest: OK" || { echo "expected 'cache-selftest: OK', got: $out" >&2 exit 1 } # The self-test must have actually produced a ZIP cache on disk. test -e "$dir/hts-cache/new.zip" || { echo "no ZIP cache was written by the self-test" >&2 exit 1 } # Sanity-check the cache footprint: the few-thousand-entry pass is expected to # weigh ~1-2 MB. Fail if it balloons well past that (e.g. a per-entry overhead # regression or runaway growth), so the cache size stays bounded. # du -sk (1024-byte units) is portable; GNU's -b (apparent bytes) is rejected # by BSD/macOS du. Block-allocated size is an upper bound on apparent size, # which is all a ceiling check needs. ceiling=$((4 * 1024)) # KiB kbytes=$(du -sk "$dir/hts-cache" | cut -f1) test "$kbytes" -le "$ceiling" || { echo "cache footprint ${kbytes} KiB exceeds ${ceiling} KiB ceiling" >&2 exit 1 } httrack-3.49.14/tests/01_zlib-contentcodings.test0000755000175000017500000000036415230602340015340 #!/bin/bash # set -euo pipefail # brotli/zstd decode, unknown codings, and the decoded-size budget. dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=contentcodings "$dir" run | grep -q "contentcodings self-test OK" httrack-3.49.14/tests/01_zlib-warc-wacz.test0000755000175000017500000000135715230602340014220 #!/bin/bash # set -euo pipefail # --wacz packaging over synthetic transactions: the WACZ unzips in-process to # the fixed layout, every entry is ZIP STORE, each datapackage sha256 recomputes # from the stored bytes, and the digest chains datapackage.json. WACZ needs the # OpenSSL SHA-256 digests, so the self-test is absent on non-OpenSSL builds. httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack if ! "$httrack_bin" -#test 2>&1 | grep -q '^ warc-wacz'; then echo "warc-wacz self-test unavailable (build without OpenSSL); skipping" exit 77 fi scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT out=$("$httrack_bin" -O /dev/null -#test=warc-wacz "$scratch/") echo "$out" case "$out" in *": OK") ;; *) exit 1 ;; esac httrack-3.49.14/tests/01_zlib-warc-cdx.test0000755000175000017500000000065615230602340014033 #!/bin/bash # set -euo pipefail # --warc-cdx CDXJ index over synthetic transactions: sorted, one line per # response/revisit/resource, each offset/length inflates to the right member. httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT out=$("$httrack_bin" -O /dev/null -#test=warc-cdx "$scratch/") echo "$out" case "$out" in *": OK") ;; *) exit 1 ;; esac httrack-3.49.14/tests/01_zlib-warc.test0000755000175000017500000000107515230602340013253 #!/bin/bash # set -euo pipefail # WARC/1.1 writer self-test: framing, Content-Length, gzip members, round-trip, # revisit dedup, plus v1.1 WARC-Truncated, ftp resource records, and # --warc-max-size rotation, over synthetic transactions. httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT for t in warc warc-trunc warc-ftp warc-rotate warc-verbatim; do out=$("$httrack_bin" -O /dev/null "-#test=$t" "$scratch/") echo "$out" case "$out" in *": OK") ;; *) exit 1 ;; esac done httrack-3.49.14/tests/01_zlib-acceptencoding.test0000755000175000017500000000040015230602340015254 #!/bin/bash # set -euo pipefail # Accept-Encoding (#450): advertise gzip+deflate; decode gzip/zlib/raw-deflate. dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=acceptencoding "$dir" run | grep -q "acceptencoding self-test OK" httrack-3.49.14/tests/01_engine-xfread.test0000755000175000017500000000205115230602340014070 #!/bin/bash # set -euo pipefail # http_xfread1 must refuse an in-memory receive buffer that would exceed a # 32-bit index (hostile Content-Length, or an endless stream) rather than # allocate it, while still accepting a normal small size. -#test=xfread-limit # drives both refusal paths and the accept path. out="$(httrack -O /dev/null -#test=xfread-limit)" # Match with here-strings, not `echo | grep -q`: under pipefail the early grep # exit SIGPIPEs echo and fails the pipeline even when the pattern matched. for case in bylen bygrow; do grep -q "${case}: refused=1 adr=null msg=In-memory content too large" <<<"$out" || { echo "FAIL ${case}: $out" exit 1 } done # Exactly INT32_MAX must be refused too (the reallocs add 1). grep -q 'boundary: msg=In-memory content too large' <<<"$out" || { echo "FAIL boundary: $out" exit 1 } # The guard must NOT fire for a legitimate small size. if grep -q 'accept: msg=In-memory content too large' <<<"$out"; then echo "FAIL accept (guard fired on a legit size): $out" exit 1 fi httrack-3.49.14/tests/01_engine-warc-surt.test0000755000175000017500000000035015230602340014546 #!/bin/bash # set -euo pipefail # SURT canonicalization of the CDXJ sort key (--warc-cdx). Pure string work, # so it runs under the MSan-instrumented 01_engine glob. httrack -O /dev/null -#test=warc-surt | grep -q "warc-surt: OK" httrack-3.49.14/tests/01_engine-version-macros.test0000755000175000017500000000425415230602340015575 #!/bin/bash # # version.rc repeats the version that htsglobal.h declares. Signing enforces that # every binary in a release reports the same one, so a drift fails the signing # request on release day rather than the build. Assert the two agree. set -euo pipefail src="${top_srcdir:-..}/src" h="$src/htsglobal.h" rc="$src/version.rc" for f in "$h" "$rc"; do [ -f "$f" ] || { echo "cannot find $f" exit 1 } done # 3.49-12 (display) and 3.49.12 (dotted). version=$(sed -n 's/^#define HTTRACK_VERSION[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$h") versionid=$(sed -n 's/^#define HTTRACK_VERSIONID[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$h") if [ -z "$version" ] || [ -z "$versionid" ]; then echo "could not read the version from $h" exit 1 fi # The same version, as version.rc states it. fileversion=$(sed -n 's/^[[:space:]]*FILEVERSION[[:space:]][[:space:]]*\(.*\)$/\1/p' "$rc" | tr -d ' \r') productversion=$(sed -n 's/^[[:space:]]*PRODUCTVERSION[[:space:]][[:space:]]*\(.*\)$/\1/p' "$rc" | tr -d ' \r') rc_fileversion=$(sed -n 's/.*VALUE "FileVersion",[[:space:]]*"\([^"]*\)".*/\1/p' "$rc") rc_productversion=$(sed -n 's/.*VALUE "ProductVersion",[[:space:]]*"\([^"]*\)".*/\1/p' "$rc") rc_productname=$(sed -n 's/.*VALUE "ProductName",[[:space:]]*"\([^"]*\)".*/\1/p' "$rc") # 3.49.12 -> 3,49,12,0 expected_numeric="$(echo "$versionid" | tr '.' ','),0" fail=0 check() { # what expected actual if [ "$2" != "$3" ]; then echo "version.rc $1 is \"$3\", but htsglobal.h says it should be \"$2\"" fail=1 fi } check FILEVERSION "$expected_numeric" "$fileversion" check PRODUCTVERSION "$expected_numeric" "$productversion" check FileVersion "$versionid" "$rc_fileversion" check ProductVersion "$version" "$rc_productversion" # Signing pins the product name too. check ProductName "HTTrack Website Copier" "$rc_productname" [ "$fail" -eq 0 ] || exit 1 # And the shipped binary must agree with the header it was built from. out=$(httrack --version) case "$out" in *"$version"*) ;; *) echo "httrack --version says \"$out\", which does not mention $version" exit 1 ;; esac echo "version resource agrees with htsglobal.h: $version ($expected_numeric)" httrack-3.49.14/tests/01_engine-useragent.test0000755000175000017500000000026715230602340014623 #!/bin/bash # set -euo pipefail # Default User-Agent (#449): honest HTTrack token, no Windows 98 relic. httrack -O /dev/null -#test=useragent run | grep -q "useragent self-test OK" httrack-3.49.14/tests/01_engine-unescape-bounds.test0000755000175000017500000000031215230602340015710 #!/bin/bash # set -euo pipefail # Entity/URL unescapers reserve one byte for the trailing NUL (no 1-byte OOB). httrack -O /dev/null -#test=unescape-bounds run | grep -q "unescape-bounds self-test OK" httrack-3.49.14/tests/01_engine-urlhack.test0000644000175000017500000000041115230602340014243 #!/bin/bash # set -euo pipefail # -%u url-hack split (#271): www / // / query-order dedup toggle independently. # All assertions live in the engine self-test (hash compare flag resolution). httrack -O /dev/null -#test=urlhack run | grep -q "urlhack self-test OK" httrack-3.49.14/tests/01_engine-topindex.test0000755000175000017500000000047315230602340014457 #!/bin/bash # set -euo pipefail # hts_buildtopindex takes a system-charset path but verif_backblue below it # expects utf-8, mangling a non-ASCII project dir on Windows (#216, #217). dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=topindex "$dir" run | grep -q "topindex self-test OK" httrack-3.49.14/tests/01_engine-strsafe.test0000755000175000017500000000332315230602340014271 #!/bin/bash # set -euo pipefail # htssafe.h bounded string operations (driven by 'httrack -#test=strsafe'). # Success path: every bounded op (strcpybuff/strcatbuff/strncatbuff/strlcpybuff) # must behave correctly. 'run' selects the success path (vs the overflow modes). rc=0 out=$(httrack -#test=strsafe run) || rc=$? test "$rc" -eq 0 || exit 1 test "$out" == "strsafe: OK" || exit 1 # Overflow path: an over-capacity write into a sized buffer must be caught by # the bounded macro and abort the process, not be silently truncated/completed. # Assert the htssafe abort signature specifically, so the test cannot pass for # an unrelated reason (e.g. the strsafe test being gone, which prints the # registry to stderr and also exits non-zero). # the bounded macro aborts (non-zero exit), so don't let set -e trip on it err=$(httrack -#test=strsafe overflow "this string is far too long for the buffer" 2>&1) || true case "$err" in *"strsafe: NOT aborted"*) echo "over-capacity write was NOT caught" >&2 exit 1 ;; *"overflow while copying"*) ;; *) echo "expected htssafe overflow abort, got: $err" >&2 exit 1 ;; esac # Same guarantee for the htsbuff builder. The source is exactly the buffer # capacity (6 bytes into a 6-byte buffer), so this also pins the boundary: a # '<=' off-by-one in the capacity check would let it through (and print "NOT # aborted"). Match the specific htsbuff abort message, not just any assert. err=$(httrack -#test=strsafe overflow-buff "abcdef" 2>&1) || true case "$err" in *"strsafe: NOT aborted"*) echo "htsbuff over-capacity write was NOT caught" >&2 exit 1 ;; *"htsbuff append overflow"*) ;; *) echo "expected htsbuff overflow abort, got: $err" >&2 exit 1 ;; esac httrack-3.49.14/tests/01_engine-stripquery.test0000755000175000017500000000041515230602340015050 #!/bin/bash # set -euo pipefail # --strip-query: pattern-scoped query-key stripping for dedup. All assertions # live in the engine self-test (hts_query_strip_keys + fil_normalized_filtered). httrack -O /dev/null -#test=stripquery | grep -q "strip-query self-test OK" httrack-3.49.14/tests/01_engine-status.test0000755000175000017500000000025615230602340014147 #!/bin/bash # set -euo pipefail # HTTP status -> reason phrase, including the modern 429/451 (#453). httrack -O /dev/null -#test=status run | grep -q "status self-test OK" httrack-3.49.14/tests/01_engine-sniff.test0000644000175000017500000000654015230602340013730 #!/bin/bash # set -euo pipefail # MIME magic consistency (-#test=sniff ), the # tie-break behind htsname's wire-vs-extension naming. chk() { local mime="$1" body="$2" want="$3" out="$(httrack -#test=sniff "$mime" "$body" | sed -n 's/^sniff: //p')" test "$out" == "$want" || { echo "FAIL: '$mime' '$body' -> '$out' (want '$want')" exit 1 } } yes='known=1 consistent=1' no='known=1 consistent=0' unk='known=0 consistent=0' # images chk image/jpeg hex:FFD8FFE000104A46 "$yes" chk image/png hex:89504E470D0A1A0A "$yes" chk image/png hex:FFD8FFE000104A46 "$no" # jpeg bytes are not a png chk image/gif 'GIF89a' "$yes" chk image/bmp 'BMxxxx' "$yes" chk image/tiff hex:49492A00 "$yes" chk image/tiff hex:4D4D002A "$yes" # both endians chk image/x-icon hex:00000100 "$yes" chk image/x-icon hex:00000200 "$yes" # Windows cursor, spec maps to x-icon chk image/webp 'RIFFxxxxWEBPVP' "$yes" chk image/webp 'RIFFxxxxWAVE' "$no" # riff subtype discriminates chk image/avif hex:0000001C6674797061766966 "$yes" chk image/avif hex:0000001C6674797068656963 "$no" # heic brand is not avif chk image/heic hex:0000001C6674797068656963 "$yes" chk image/svg+xml '' "$yes" # BOM+ws skip; hex, as Windows argv cannot carry the raw BOM through the ANSI codepage chk image/svg+xml hex:EFBBBF20203C3F786D6C2076657273696F6E3D22312E30223F3E "$yes" # audio / video chk audio/mpeg 'ID3xxx' "$yes" chk audio/mpeg hex:FFFB9000 "$yes" # bare frame sync chk audio/aac hex:FFF15080 "$yes" chk audio/flac 'fLaC' "$yes" chk audio/ogg hex:4F67675300 "$yes" chk audio/x-wav 'RIFFxxxxWAVE' "$yes" chk video/x-msvideo 'RIFFxxxxAVI ' "$yes" chk video/x-msvideo 'RIFFxxxxWAVE' "$no" chk video/mp4 hex:000000186674797069736F6D "$yes" chk video/webm hex:1A45DFA3 "$yes" chk video/mpeg hex:000001BA "$yes" chk video/x-ms-wmv hex:3026B2758E66CF11 "$yes" # archives; zip magic covers the office-container families chk application/zip hex:504B0304 "$yes" chk application/vnd.openxmlformats-officedocument.wordprocessingml.document hex:504B0304 "$yes" chk application/vnd.oasis.opendocument.text hex:504B0304 "$yes" chk application/msword hex:D0CF11E0A1B11AE1 "$yes" chk application/msword hex:504B0304 "$no" # legacy .doc is OLE, not zip chk application/x-gzip hex:1F8B08 "$yes" chk application/x-bzip2 'BZh9' "$yes" chk application/x-7z-compressed hex:377ABCAF271C "$yes" chk application/x-rar-compressed hex:526172211A07 "$yes" chk application/zstd hex:28B52FFD "$yes" chk application/x-tar "hex:$(printf '00%.0s' {1..257})7573746172" "$yes" # ustar at 257 chk application/x-tar hex:7573746172 "$no" # documents, fonts, misc chk application/pdf '%PDF-1.7' "$yes" chk application/pdf 'soft 404' "$no" chk application/postscript '%!PS-Adobe' "$yes" chk application/rtf '{\rtf1' "$yes" chk font/woff2 'wOF2' "$yes" chk font/otf 'OTTO' "$yes" chk font/ttf hex:0001000000 "$yes" chk application/x-shockwave-flash 'CWSx' "$yes" chk application/x-java-vm hex:CAFEBABE "$yes" chk application/wasm hex:0061736D "$yes" chk text/html $' \r\n' "$yes" chk text/html '' "$yes" chk text/html 'plain text, no markup' "$no" chk text/xml '' "$yes" # no magic rule at all: never confirmed, never blocks the wire type chk text/css 'body { }' "$unk" chk text/plain 'hello' "$unk" chk application/x-javascript 'var x;' "$unk" httrack-3.49.14/tests/01_engine-simplify.test0000755000175000017500000000213015230602340014451 #!/bin/bash # set -euo pipefail # path simplify engine (fil_simplifie): collapses ./ and ../ segments. simp() { test "$(httrack -O /dev/null -#test=simplify "$1")" == "simplified=$2" || exit 1 } simp './foo/bar/' 'foo/bar/' simp './foo/bar' 'foo/bar' simp './foo/./bar' 'foo/bar' simp './foo/bar/.././tmp/foobar' 'foo/tmp/foobar' simp './foo/bar/.././tmp/foobar/../foobaz' 'foo/tmp/foobaz' # single '..' collapses one segment simp './a/../b' 'b' simp './a/b/../../c' 'c' # repeated './' is squeezed simp './a/./././b' 'a/b' # leading '..' that would go above the root is discarded, per RFC 3986 §5.2.4 simp './a/../../b' 'b' # empty segments ('//') are not dot-segments and are preserved, per RFC 3986 simp 'a//b' 'a//b' simp 'a//b/../c' 'a//c' # absolute paths keep the leading '/'; above-root '..' is clamped to it simp '/a/../b' '/b' simp '/a/../../b' '/b' simp '/../x' '/x' # collapses to nothing -> './' (relative) or '/' (absolute) simp '..' './' simp 'a/..' './' simp '/' '/' simp 'a/b/..' 'a/' # trailing bare '..' simp 'a/../b?x=../y' 'b?x=../y' # '?' freezes simplification httrack-3.49.14/tests/01_engine-selftest-dispatch.test0000644000175000017500000000106615230602340016247 #!/bin/bash # # The -#test dispatch itself: a bare -#test lists the registry, and an unknown # name errors (non-zero, diagnostic) instead of silently passing. set -eu # Bare -#test lists known tests (printed to stderr). list=$(httrack -#test 2>&1) printf '%s\n' "$list" | grep -q "filter" || exit 1 printf '%s\n' "$list" | grep -q "cache-writefail" || exit 1 # Unknown name: non-zero exit + diagnostic, and no test result line. rc=0 err=$(httrack -#test=bogus 2>&1) || rc=$? test "$rc" -ne 0 || exit 1 printf '%s\n' "$err" | grep -q "Unknown self-test" || exit 1 httrack-3.49.14/tests/01_engine-savename.test0000755000175000017500000001666515230602340014436 #!/bin/bash # set -euo pipefail # Local save-name resolution (url_savename via -#test=savename [key=value ...]). # name() asserts on the basename, full() on the whole path; prior= registers an # already-crawled link whose sav is rooted under the -O path (/dev/null here). # resolve httrack before cd: make check puts a RELATIVE ../src on PATH httrack_bin=$(cd "$(dirname "$(command -v httrack)")" && pwd)/httrack # scratch dir: body= and cached= write temp files (st-savename-body.tmp, hts-cache/) scratch=$(mktemp -d) trap 'rm -rf "$scratch"' EXIT cd "$scratch" run() { "$httrack_bin" -O /dev/null -#test=savename "$@" | sed -n 's/^savename: //p' } name() { local fil="$1" ctype="$2" want="$3" shift 3 out="$(run "$fil" "$ctype" "$@")" test "${out##*/}" == "$want" || { echo "FAIL: '$fil' '$ctype' $* -> '$out' (want '$want')" exit 1 } } full() { local fil="$1" ctype="$2" want="$3" shift 3 out="$(run "$fil" "$ctype" "$@")" test "$out" == "$want" || { echo "FAIL: '$fil' '$ctype' $* -> '$out' (want '$want')" exit 1 } } # #115: an unknown trailing ".token" is part of the name, keep it and append the type. name '/article-1.884291' 'text/html' 'article-1.884291.html' name '/news/story-12345.987654' 'text/html' 'story-12345.987654.html' # Recognized extensions still collapse to the resolved type. name '/page.php' 'text/html' 'page.html' name '/page.asp' 'text/html' 'page.html' name '/foo' 'text/html' 'foo.html' # A bare trailing dot is not a tail to keep. name '/page.' 'text/html' 'page.html' # Soft-404 (#267/#408): a binary URL served as HTML is named .html. name '/x.pdf' 'text/html' 'x.html' name '/x.gif' 'text/html' 'x.html' # Type agrees with the extension: keep it, no churn, no double extension. name '/x.pdf' 'application/pdf' 'x.pdf' name '/x.jpg' 'image/jpeg' 'x.jpg' name '/x.html' 'text/html' 'x.html' name '/x.js' 'application/x-javascript' 'x.js' name '/types/data.json' 'application/json' 'data.json' # Agreeing type must not rewrite the extension's casing (no strip-and-reappend). name '/x.JPG' 'image/jpeg' 'x.JPG' # A Content-Disposition filename replaces the URL name outright. name '/x.php' 'application/pdf' 'report.pdf' cdispo=report.pdf name '/download' 'text/html' 'setup.exe' cdispo=setup.exe # Reserved characters in a hostile Content-Disposition name are sanitized. name '/x.php' 'application/pdf' 'set_up.exe' 'cdispo=set:up.exe' # The md5-of-query suffix lands inside a Content-Disposition name too. name '/x.php?id=1' 'application/pdf' 'report681a.pdf' cdispo=report.pdf # Still-downloading path (status=-1): mime drives the ext, cdispo is ignored # there (the deliberately unfolded 4th resolve_extension variant). name '/x.pdf' 'text/html' 'x.html' status=-1 name '/x.html' 'text/html' 'x.html' status=-1 name '/x.php' 'application/pdf' 'x.pdf' status=-1 cdispo=report.pdf # Contested type (wire disagrees with a specific ext): magic bytes proving the # extension right keep it, anything else trusts the wire as before. name '/photo.jpg' 'image/png' 'photo.jpg' body=hex:FFD8FFE000104A46 name '/photo.jpg' 'image/png' 'photo.png' body=hex:89504E470D0A1A0A name '/photo.jpg' 'image/png' 'photo.png' name '/doc.pdf' 'text/html' 'doc.pdf' body=hex:255044462D312E34 name '/doc.pdf' 'text/html' 'doc.html' 'body=soft 404' name '/style.css' 'image/png' 'style.png' 'body=body { }' # no rule for css: wire wins # A redirect answer resolves nothing: delayed placeholder name. name '/x.php' 'text/html' 'x.0.delayed' statuscode=301 # Root and query-only URLs get index + the md5-of-query suffix. name '/' 'text/html' 'index.html' name '/?a=1' 'text/html' 'index3872.html' # Same URL crawled before: reuse its sav verbatim (case preserved). full '/X.PHP' 'text/html' 'www.example.com/CASE.HTML' \ 'prior=www.example.com|/X.PHP|www.example.com/CASE.HTML' # Another URL owns the name: collision suffix -2, then -3, case-insensitively. name '/x.php' 'text/html' 'x-2.html' \ 'prior=www.example.com|/other.html|/dev/null/www.example.com/x.html' name '/x.php' 'text/html' 'x-3.html' \ 'prior=www.example.com|/o1.html|/dev/null/www.example.com/x.html' \ 'prior=www.example.com|/o2.html|/dev/null/www.example.com/x-2.html' name '/INDEX.HTML' 'text/html' 'INDEX-2.HTML' \ 'prior=www.example.com|/index.html|/dev/null/www.example.com/index.html' # Same basename in another directory is NOT a collision. name '/x.php' 'text/html' 'x.html' \ 'prior=www.example.com|/sub/x.html|/dev/null/www.example.com/sub/x.html' # 8-3 modes: DOS truncates every component to 8+3, ISO9660 level 2 to 31. full '/directory-long/verylongfilename.html' 'text/html' \ '/dev/null/EXAMPLE/DIRECTOR/VERYLONG.HTM' n83=1 full '/directory-long/verylongfilename.html' 'text/html' \ '/dev/null/EXAMPLE_C/DIRECTORY_LONG/VERYLONGFILENAME.HTM' n83=2 name '/verylongfilename.php' 'text/html' 'VERYLO-2.HTM' n83=1 \ 'prior=www.example.com|/other.html|/dev/null/EXAMPLE/VERYLONG.HTM' # urlhack dedup (#271): // collapse and www-strip map to the prior link's sav; # the per-feature negatives opt out and take a fresh name. full '/a//b.php' 'text/html' '/dev/null/www.example.com/a/PRIOR.html' \ 'prior=www.example.com|/a/b.php|/dev/null/www.example.com/a/PRIOR.html' full '/a//b.php' 'text/html' '/dev/null/www.example.com/a/b.html' no-slash=1 \ 'prior=www.example.com|/a/b.php|/dev/null/www.example.com/a/PRIOR.html' full '/w.php' 'text/html' '/dev/null/www.example.com/W-PRIOR.html' adr=example.com \ 'prior=www.example.com|/w.php|/dev/null/www.example.com/W-PRIOR.html' full '/w.php' 'text/html' '/dev/null/example.com/w.html' adr=example.com no-www=1 \ 'prior=www.example.com|/w.php|/dev/null/www.example.com/W-PRIOR.html' # Distinct URLs must stay distinct under urlhack (no over-normalization). full '/a//b.php' 'text/html' '/dev/null/www.example.com/a/b.html' \ 'prior=www.example.com|/a/c.php|/dev/null/www.example.com/a/C-PRIOR.html' # --strip-query (#112): stripped key dedups onto the prior sav; without the # option the same URLs stay distinct. full '/page.php?id=3&sid=42' 'text/html' '/dev/null/www.example.com/PAGE-PRIOR.html' \ strip=sid 'prior=www.example.com|/page.php?id=3|/dev/null/www.example.com/PAGE-PRIOR.html' full '/page.php?id=3&sid=42' 'text/html' '/dev/null/www.example.com/page475b.html' \ 'prior=www.example.com|/page.php?id=3|/dev/null/www.example.com/PAGE-PRIOR.html' # A kept key that differs must still block the dedup (no over-stripping). full '/page.php?id=3&sid=42' 'text/html' '/dev/null/www.example.com/page475b.html' \ strip=sid 'prior=www.example.com|/page.php?id=4|/dev/null/www.example.com/PAGE-PRIOR.html' # Hostile fils stay rooted under the mirror: ../ (raw or %2e-encoded) drops out, # control characters become spaces. full '/../../etc/passwd' 'text/html' '/dev/null/www.example.com///etc/passwd.html' full '/%2e%2e/%2e%2e/etc/passwd' 'text/html' '/dev/null/www.example.com///etc/passwd.html' full '/x.php' 'application/pdf' '/dev/null/www.example.com///evil.exe' 'cdispo=../../evil.exe' name $'/evil\rname\t.php' 'text/html' 'evil name .html' # #133: oversized names are capped only on Windows (MAX_PATH, chopping the # extension); elsewhere the platform PATH_MAX leaves a 300-char name whole. case "$(uname -s 2>/dev/null)" in MINGW* | MSYS* | CYGWIN*) name "/$(printf 'a%.0s' {1..300}).php" 'text/html' "$(printf 'a%.0s' {1..210})" ;; *) name "/$(printf 'a%.0s' {1..300}).php" 'text/html' "$(printf 'a%.0s' {1..300}).html" ;; esac httrack-3.49.14/tests/01_engine-robots.test0000755000175000017500000000026515230602340014134 #!/bin/bash # set -euo pipefail # robots.txt RFC 9309 Allow/Disallow precedence (#452): longest match wins. httrack -O /dev/null -#test=robots run | grep -q "robots self-test OK" httrack-3.49.14/tests/01_engine-relative.test0000755000175000017500000000607415230602340014443 #!/bin/bash # # lienrelatif (build relative path) + ident_url_relatif (resolve a link, collapse # ./ and ../). Regression net for #137/#162; expected values hand-computed. set -euo pipefail # relative path from 's directory to rel() { local got got=$(httrack -O /dev/null -#test=relative "$1" "$2") test "$got" == "relative=$3" || { echo "FAIL rel($1, $2): got '$got' want 'relative=$3'" exit 1 } } # resolve against origin / -> adr=.. fil=.. ident() { local got got=$(httrack -O /dev/null -#test=resolve "$1" "$2" "$3") test "$got" == "$4" || { echo "FAIL ident($1, $2, $3): got '$got' want '$4'" exit 1 } } ### lienrelatif rel 'dir/page.html' 'dir/index.html' 'page.html' rel 'dir/page.html' 'dir/page.html' 'page.html' # self-link rel 'a.html' 'dir/index.html' '../a.html' rel 'x.html' 'a/b/c/index.html' '../../../x.html' rel 'h/a/x.jpg' 'h/a/sub/page.html' '../x.jpg' rel 'a/b/c/x.html' 'index.html' 'a/b/c/x.html' rel 'h/sub/x.jpg' 'h/page.html' 'sub/x.jpg' rel 'h/dir2/x.jpg' 'h/dir1/page.html' '../dir2/x.jpg' # sibling dir rel 'h/bc/x.jpg' 'h/b/page.html' '../bc/x.jpg' # b/bc prefix trap rel 'h/b/x.jpg' 'h/bc/page.html' '../b/x.jpg' rel 'h2/img/x.jpg' 'h1/p/page.html' '../../h2/img/x.jpg' # cross-host rel 'img.cdn/photo.jpg' 'www.site/articles/2020/post.html' '../../../img.cdn/photo.jpg' rel 'h/a/' 'h/a/sub/page.html' '../' # link is ancestor dir rel 'x.html' 'page.html' 'x.html' rel 'dir/page.html?x=1' 'dir/index.html?y=2' 'page.html' # ? stripped ### ident_url_relatif ident 'img.gif' 'www.foo.com' '/dir/page.html' 'adr=www.foo.com fil=/dir/img.gif' ident 'sub/img.gif' 'www.foo.com' '/dir/page.html' 'adr=www.foo.com fil=/dir/sub/img.gif' ident '/img.gif' 'www.foo.com' '/dir/page.html' 'adr=www.foo.com fil=/img.gif' # embedded ../ collapses (#137) ident '../img.gif' 'www.foo.com' '/dir/sub/page.html' 'adr=www.foo.com fil=/dir/img.gif' ident 'sub/../logo.png' 'www.foo.com' '/articles/2020/post.html' 'adr=www.foo.com fil=/articles/2020/logo.png' ident '../../pix/sub/../logo.png' 'www.foo.com' '/articles/2020/post.html' 'adr=www.foo.com fil=/pix/logo.png' ident '../../../../x.gif' 'www.foo.com' '/a/b/page.html' 'adr=www.foo.com fil=/x.gif' # above-root clamp ident '?page=2' 'www.foo.com' '/dir/index.html?old=1' 'adr=www.foo.com fil=/dir/index.html?page=2' ident 'http://other.com/a/b/../c/index.html' 'www.foo.com' '/p.html' 'adr=other.com fil=/a/c/index.html' # file:// collapses ../ like the other schemes; traversal contained, // authority kept ident 'file:///var/data/pix/sub/../logo.png' 'www.foo.com' '/p.html' 'adr=file:// fil=/var/data/pix/logo.png' ident 'file:///a/b/c/../../d/e.gif' 'www.foo.com' '/p.html' 'adr=file:// fil=/a/d/e.gif' ident 'file:///a/../../b' 'www.foo.com' '/p.html' 'adr=file:// fil=/b' ident 'file://srv/share/../x' 'www.foo.com' '/p.html' 'adr=file:// fil=//srv/x' ident 'mailto:foo@bar.com' 'www.foo.com' '/p.html' 'error=-1' # unsupported scheme ident 'javascript:void(0)' 'www.foo.com' '/p.html' 'error=-1' echo "OK" httrack-3.49.14/tests/01_engine-cookieimport.test0000755000175000017500000000052215230602340015324 #!/bin/bash # set -euo pipefail # Drives -#test=cookieimport: load a cookie jar (and, on Windows, copied IE # cookies *@*.txt) from a long, non-ASCII folder through the UTF-8/long-path # file wrappers (#133,#630). dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=cookieimport "$dir" | grep -q "cookieimport:.*OK" httrack-3.49.14/tests/01_engine-direnum.test0000755000175000017500000000045615230602340014271 #!/bin/bash # set -euo pipefail # Drives -#test=direnum: enumerate a long+non-ASCII directory through the # opendir/readdir wrappers, checking each child round-trips as UTF-8 (#133,#630). dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=direnum "$dir" | grep -q "direnum:.*OK" httrack-3.49.14/tests/01_engine-mirror-io.test0000755000175000017500000000057215230602340014544 #!/bin/bash # set -euo pipefail # Drives -#test=mirrorio: rounds a file through a path that is both long # (>MAX_PATH) and non-ASCII, exercising the mirror I/O wrappers the engine's # raw file ops now route to on Windows (#133, #630). Positive control on POSIX. dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=mirrorio "$dir" | grep -q "mirrorio:.*OK" httrack-3.49.14/tests/01_engine-longpath-io.test0000644000175000017500000000044215230602340015037 #!/bin/bash # set -euo pipefail # Drives -#test=longpath: a >MAX_PATH round trip exercising hts_pathToUCS2's # \\?\ prefixing on Windows (#133); a positive control on POSIX. dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT httrack -O /dev/null -#test=longpath "$dir" | grep -q "longpath:.*OK" httrack-3.49.14/tests/01_engine-redirect.test0000644000175000017500000000051315230602340014416 #!/bin/bash # set -euo pipefail # #159: a redirect to a same-file alias (http<->https, user@host, ..) must be # followed through, not turned into a self-pointing "moved" stub. The decision # helper is exercised by the engine self-test. httrack -O /dev/null -#test=redirect-samefile run | grep -q "redirect-samefile self-test OK" httrack-3.49.14/tests/01_engine-fsize.test0000644000175000017500000000112215230602340013732 #!/bin/bash # # File sizes past the 32-bit wrap ('httrack -#test=fsize '). 5GB, so a # signed *and* an unsigned truncation both show up; sparse, so it costs no disk. set -euo pipefail dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT rc=0 out=$(httrack -#test=fsize "$dir") || rc=$? echo "$out" # 77 = platform can't host the 5GB probe (EFBIG); skip, don't fail. [ "$rc" = 77 ] && exit 77 [ "$rc" = 0 ] || exit "$rc" want="fsize: width=8,8 size=5368709120,5368709120 psize=5368709120 absent=-1" test "$out" == "$want" || { echo "FAIL: unexpected size report (want '$want')" exit 1 } httrack-3.49.14/tests/01_engine-expandhome.test0000644000175000017500000000342015230602340014745 #!/bin/bash # # SC2088: the literal, unexpanded '~' is the input under test. # shellcheck disable=SC2088 set -euo pipefail # ~ expansion for the -O base path (expand_home). $HOME is pinned so the cases # cannot depend on the caller's, but MSYS rewrites it into a Windows path # before the native httrack.exe reads it: ask the engine what it saw rather # than hardcoding the value. ask() { HOME=HTSHOME httrack -O /dev/null -#test=expandhome "$1" } exp() { test "$(ask "$1")" == "expanded=$2" || exit 1 } home=$(ask '~') home=${home#expanded=} # or every case below is vacuous: '~' means expansion never fired, '.' means it # fell back to the default without ever reading $HOME test "$home" != '~' || exit 1 test "$home" != '.' || exit 1 exp '~' "$home" exp '~/foo' "$home/foo" exp '~/foo/bar/#' "$home/foo/bar/#" exp '~/' "$home/" exp '~/../x' "$home/../x" # ~user/ needs getpwnam: left alone rather than mangled into $HOME + "user/" exp '~smith/foo' '~smith/foo' exp '~root' '~root' # only a leading '~' expands; anything else is a literal path component exp 'a~/x' 'a~/x' exp './~/x' './~/x' exp 'foo~bar' 'foo~bar' # an unset or empty $HOME must not turn ~/foo into the absolute /foo test "$(env -u HOME httrack -O /dev/null -#test=expandhome '~/foo')" == "expanded=./foo" || exit 1 test "$(HOME='' httrack -O /dev/null -#test=expandhome '~/foo')" == "expanded=./foo" || exit 1 # A $HOME past the 2 * HTS_URLMAXSIZE buffer is left alone: strcatbuff aborts # rather than truncates. Only meaningful where the engine sees the value we set: # MSYS rewrites HOME into a path of its own choosing, long or not. if test "$home" = HTSHOME; then long=$(printf '%04096d' 0 | tr '0' 'A') test "$(HOME="$long" httrack -O /dev/null -#test=expandhome '~/foo')" == "expanded=~/foo" || exit 1 fi httrack-3.49.14/tests/01_engine-reconcile.test0000644000175000017500000000066015230602340014563 #!/bin/bash # # Cache generation reconcile policies (httrack -#test=reconcile ): # promote a stranded old generation, keep the larger one after an aborted # run, and restore the old one when an update transferred nothing. set -eu dir=$(mktemp -d) trap 'rm -rf "$dir"' EXIT out=$(httrack -#test=reconcile "$dir") test "$out" = "cache-reconcile: OK" || { echo "expected 'cache-reconcile: OK', got: $out" >&2 exit 1 } httrack-3.49.14/tests/01_engine-rcfile.test0000755000175000017500000000746415230602340014100 #!/bin/bash # # Config-file alias loading (no network). A .httrackrc in the working directory # is read by optinclude_file(), whose cmdl_ins macro inserts each alias-expanded # token into the x_argvblk block. That macro used to copy with an unbounded # strcpy on a bare char*; it is now bounded (strlcpybuff + cmdl_room over the # block capacity). Two properties are checked: # 1. The bound does not truncate: a long user-agent alias reaches doit.log # intact. user-agent expands to two tokens (-F ), so it exercises # both cmdl_ins insertions. # 2. The bound holds under exhaustion: a pathological .httrackrc whose alias # expansions overflow the block aborts cleanly through the htssafe bounds # check (a message naming htsalias.c) instead of overrunning the heap. The # unbounded version segfaulted here. # set -e with the intentional-nonzero httrack runs guarded explicitly (the # crawls below are expected to fail/abort and their status is inspected by hand). set -euo pipefail # Resolve httrack to an absolute path before we cd: PATH may hold a build-relative # entry that would not resolve from the temp directory. bin=$(command -v httrack) || { echo "FAIL: httrack not found on PATH" exit 1 } case "$bin" in /*) ;; *) bin="$(cd "$(dirname "$bin")" && pwd)/$(basename "$bin")" ;; esac tmp=$(mktemp -d "${TMPDIR:-/tmp}/httrack_rcfile.XXXXXX") || exit 1 trap 'rm -rf "$tmp"' EXIT HUP INT QUIT PIPE TERM # HTS_HTTRACKRC is ".httrackrc" on POSIX but "httrackrc" on Windows: write both, # each platform reads the one it knows. write_rc() { cat >"$1/.httrackrc" cp "$1/.httrackrc" "$1/httrackrc" } # --- 1. alias token survives the bound intact ------------------------------- d1="$tmp/intact" mkdir -p "$d1" echo 'hello' >"$d1/index.html" # optinclude_file() lowercases each config line, so the marker is lowercase to # survive the comparison verbatim. marker='zzz_rcfile_marker_0123456789_abcdefghijklmnopqrstuvwxyz_intact' printf 'user-agent=%s\n' "$marker" | write_rc "$d1" # Run with no -O so the working-directory .httrackrc is loaded (an -O path makes # the engine skip the rc files). Output lands in the temp dir. Guard the run so a # nonzero exit is captured for the assertion instead of tripping set -e. rc=0 (cd "$d1" && "$bin" "file://$d1/index.html" --quiet -n >.log 2>&1) || rc=$? test "$rc" -eq 0 || { echo "FAIL: rc-file crawl exited $rc" exit 1 } test -f "$d1/hts-cache/doit.log" || { echo "FAIL: doit.log not written (rc file not processed)" exit 1 } # A truncated copy would cut the token; require the full -F value. grep -q -- "-F $marker" "$d1/hts-cache/doit.log" || { echo "FAIL: user-agent alias missing or truncated in doit.log" head -1 "$d1/hts-cache/doit.log" exit 1 } # --- 2. block exhaustion aborts through the bound, not the heap ------------- d2="$tmp/exhaust" mkdir -p "$d2" echo 'hi' >"$d2/index.html" # Each line inserts ~two tokens of ~200 bytes; 400 lines overflow the block's # fixed slack (current_size + 32768) many times over, deterministically. val=$(printf 'a%.0s' $(seq 1 200)) for _ in $(seq 1 400); do printf 'user-agent=%s\n' "$val" done | write_rc "$d2" # The process aborts (httrack turns the fatal signal into exit 134 either way), # so the exit code does not distinguish the bounded abort from a heap overflow; # the stderr diagnostic does. The htssafe bounds check names the offending file. # Expected to fail, so the nonzero exit is swallowed; only the log is inspected. (cd "$d2" && "$bin" "file://$d2/index.html" --quiet -n >.log 2>&1) || true grep -Eq "overflow while copying.*htsalias\.c" "$d2/.log" || { echo "FAIL: exhausted rc file did not abort through the htsalias.c bound" echo "(an unbounded copy would overrun the heap here)" tail -3 "$d2/.log" exit 1 } exit 0 httrack-3.49.14/tests/01_engine-pause.test0000755000175000017500000000066415230602340013744 #!/bin/bash # # --pause (#185): the inter-file pause target must stay in [min,max] and spread # across it (a per-call rand() would collapse it toward min). Driven by the # in-process 'httrack -#test=pause' test. POSIX-portable ($(BASH) is /bin/sh on macOS). set -eu # 'run' is an ignored placeholder argument. out=$(httrack -#test=pause run) test "$out" = "pause: OK" || { echo "expected 'pause: OK', got: $out" >&2 exit 1 } httrack-3.49.14/tests/01_engine-parse.test0000755000175000017500000004350415230602340013741 #!/bin/bash # # Offline HTML parser tests: each section crawls a file:// fixture (no network) # and checks which assets the parser captured and how it rewrote the links. set -euo pipefail tmp=$(mktemp -d "${TMPDIR:-/tmp}/httrack_parse.XXXXXX") || exit 1 trap 'rm -rf "$tmp"' EXIT HUP INT QUIT PIPE TERM # a minimal valid 1x1 GIF, reused for every referenced asset gif() { printf 'GIF89a\1\0\1\0\200\0\0\0\0\0\377\377\377!\371\4\1\0\0\0\0,\0\0\0\0\1\0\1\0\0\2\2D\1\0;' >"$1" } # crawl into with link rewriting on, no extra fetching crawl() { local html="$1" out="$2" rm -rf "$out" mkdir -p "$out" # the crawl's own exit status is irrelevant here; the assertions below check # the mirrored files, so don't let set -e trip on a non-zero httrack exit httrack "file://$html" -O "$out" --quiet --near -n >"$out/.log" 2>&1 || true } # assert a file with the given basename was saved somewhere under found() { test -n "$(find "$2" -type f -name "$1" -print -quit)" || ! echo "FAIL: expected '$1' to be downloaded under $2" || exit 1 } # assert NO file with the given basename was saved (e.g. a descriptor token must # not be mistaken for a URL) notfound() { test -z "$(find "$2" -type f -name "$1" -print -quit)" || ! echo "FAIL: '$1' should not have been downloaded under $2" || exit 1 } # the mirrored fixture page (under "file/"), not HTTrack's own landing index savedhtml() { find "$1" -type f -path '*/file/*' -name index.html -print -quit } # srcset on and (#235, #236): every candidate captured and # rewritten, descriptors preserved, following attributes left intact. site="$tmp/srcset" mkdir -p "$site" for f in a b c d e f g h i j v dz; do gif "$site/$f.gif"; done # unquoted heredoc: $site expands in the absolute-URL candidate cat >"$site/index.html" < trailing attr after srcset plain link still works EOF out="$tmp/srcset-out" crawl "$site/index.html" "$out" # every candidate downloads, incl. unique tails (catches first-only parsing), # whitespace-padded (h,i), (v), absolute (j), post-data: URI (dz) for f in a b c d e f g h i j v dz; do found "$f.gif" "$out"; done # the width/density descriptors are not URLs and must not be fetched notfound "480w" "$out" notfound "800w" "$out" notfound "2x" "$out" saved=$(savedhtml "$out") test -n "$saved" || ! echo "FAIL: saved index.html not found" || exit 1 # descriptors must survive the rewrite (no "b.gif 480w" mangled into a path) grep -Eq 'srcset="[^"]*480w[^"]*800w' "$saved" || ! echo "FAIL: srcset width descriptors lost/reordered in rewritten HTML" || exit 1 grep -Eq 'srcset="[^"]*1x[^"]*2x' "$saved" || ! echo "FAIL: srcset density descriptors lost/reordered in rewritten HTML" || exit 1 # the descriptor-less comma form keeps both candidates and the separator verbatim grep -Eq 'srcset="e\.gif, f\.gif"' "$saved" || ! echo "FAIL: comma-separated srcset without descriptors was altered" || exit 1 # an attribute following srcset in the same tag must be left intact grep -q 'alt="trailing attr after srcset"' "$saved" || ! echo "FAIL: srcset swallowed a following attribute" || exit 1 # a comma inside a URL (data: URI, CDN path) is part of the URL, not a split # point (WHATWG): the data: URI stays verbatim; the next candidate (dz) downloads grep -Fq 'data:image/gif;base64,R0lGODlhAQABAAAAACw= 1x' "$saved" || ! echo "FAIL: a comma inside a data: URI srcset candidate was mis-split" || exit 1 # real rewrite, not passthrough: the absolute file:// candidate becomes local # (a flat fixture can't show this; the footer comment's file:// is not in srcset) grep -Eq 'srcset="j\.gif 2x"' "$saved" || ! echo "FAIL: absolute file:// srcset URL was not rewritten to a local link" || exit 1 ! grep -Eq 'srcset="[^"]*file://' "$saved" || ! echo "FAIL: a file:// URL survived inside a rewritten srcset attribute" || exit 1 # xlink:href (#298) and CSS background-image (#237): detected and rewritten to # local. background-image is covered in both an external xlink:href (#298)
excluded attribute EOF out2="$tmp/attrs-out" crawl "$site2/index.html" "$out2" saved2=$(savedhtml "$out2") test -n "$saved2" || ! echo "FAIL: saved attrs page not found" || exit 1 # detected attributes: the absolute URL is rewritten to a local link grep -Eq 'xlink:href="xl\.gif"' "$saved2" || ! echo "FAIL #298: xlink:href not detected/rewritten" || exit 1 # #237 external
HTTrack Website Copier
Open Source offline browser

How to start, Step-by-step






Back to Home

httrack-3.49.14/html/step9_opt9.html0000644000175000017500000001470415230602340012667 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Log files, Index, Cache




  • Force to store all files in cache

  • Force to store all files in the cache, even gif files, zip files and so on..
    Without this option, the engine will only save in cache html files for updating/continue purpose.
    It can be useful, however, to keep all files in cache if you want in the future to change the site structure
    Warning! This option will appreciably inflate the cache that will become as big as the mirror itself!


  • Do not re-download locally erased files

  • This option prevents HTTrack from re-asking a file that exists locally with null size, or that has been erased by the user
    (If the user erased the file, this option will create a null-file to prevent the engine to catch the file next time)
    Useful if you are erasing progressively large files on the local mirror and do not want to reload them!


  • Create Log files

  • Create log file where informations, error and warnings about the current mirror will be saved
    If you do not generate log files, you will not be able to know what errors occurred!
    It is strongly advised to leave this option checked
    Note: You can define the debug-level of the log-files. Default is "normal"


  • Make an index

  • Generate an index.html on the top of the directory. Very useful.

  • Make a word database

  • Generate an index.txt database on the top of the directory. Very useful for linguistic analysis, this feature will allow you to list all words of all mirrored pages in the current project.
    With this index file, you will be able to list which words were detected, and where.






Back to Home

httrack-3.49.14/html/step9_opt8.html0000644000175000017500000001406415230602340012665 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Browser ID




  • Browser "Identity"

  • Enter here the name of the engine, as it will be seen by Web-servers
    For example, entering "Mozilla/4.5 (compatible; MSIE 4.01; Windows 98)" will disguise HTTrack into a standard MSIE4 browser
    This field is for statistical purpose, and you can enter whatever you want, a browser name that does not exist or even your grandma's name
    However, beware that several sites may deliver a different content whether the browser is called "Netscape" or "Explorer".. some elitist ones will even refuse to deliver anything depending on the browser name. This case is rare, fortunately.


  • HTML Footer

  • Enter here the optionnal text that will be included as a comment in each HTML file to make archiving easier
    The string entered is generally an HTML comment (<!-- HTML comment -->) with optionnal %s, which will be transformed into a specific string information:
    %s #1 : host name (for example, www.example.com)
    %s #2 : file name (for example, /index.html)
    %s #3 : date of the mirror
    Example: <!-- Page mirrored from %s, file %s. Archive date: %s -->
    Note: You can select (none), in this case no comments will be added to the pages. However, this is NOT advised as you may want to know in the future where the page has been taken, when/why..






Back to Home

httrack-3.49.14/html/step9_opt7.html0000644000175000017500000001325615230602340012666 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Proxy




  • Proxy

  • You can enter manually the proxy name and port (enter the name in the first field, the port in the second field)

  • Use proxy for FTP transfers

  • The engine can use default HTTP proxy for all ftp (ftp://) transfers. Most proxies allow this, and if you are behind a firewall, this option will allow you to easily catch all ftp links. Besides, ftp transfers managed by the proxy are more reliable than the engine's default FTP client.
    This option is checked by default


  • Configure

  • Click on this button to configure the proxy.
    If the proxy needs authentication you can define the login username/password







  • Hide password

  • Use it if you do not want to display the password (hides the proxy name)





Back to Home

httrack-3.49.14/html/step9_opt6.html0000644000175000017500000001455315230602340012666 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Spider




  • Accept cookies

  • Accept cookies generated by the remote server
    If you do not accept cookies, some "session-generated" pages will not be retrieved


  • Check document type

  • Define when the engine has to check document type
    The engine must know the document type, to rewrite the file types. For example, if a link called /cgi-bin/gen_image.cgi generates a gif image, the generated file will not be called "gen_image.cgi" but "gen_image.gif"
    Avoid "never", because the local mirror could be bogus


  • Parse scripts

  • Must the engine parse scripts to seek included filenames?
    It is checked by default


  • Spider

  • Must the engine follow remote robots.txt rules when they exist?
    The default is "follow"


  • Update hack

  • Attempt to limit transfers by wrapping known bogus responses from servers. For example, pages with same size will be considered as "up to date", even if the timestamp seems different. This can be useful for many dynamically generated pages, but this can also cause not-updated pages in rare cases.

  • Tolerant requests

  • Tolerate wrong file size, and make requests compliant with old servers
    It is unchecked by default, because this option can cause files to become bogus


  • Force old HTTP/1.0 requests

  • This option forces the engine to use HTTP/1.0 requests, and avoid HEAD requests.
    Useful for some sites with old server versions, or with many dynamically generated pages.






Back to Home

httrack-3.49.14/html/step9_opt5.html0000644000175000017500000001515415230602340012663 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Build




  • Local Structure Type

  • Lets you define the local structure of the site.
    The default is "site structure": you will get the same folder/files names and structure as the original
    You can, however, put all images in one single folder, html in another and so on..


  • DOS Names

  • Force the engine to generate DOS names (8 characters for the name, 3 for the type)

  • ISO9660 Names

  • Force the engine to generate ISO9660-compatible names for storing on medias such as CDROM or DVDROM

  • No error pages

  • Do not generate error pages (if a 404 error occurred, for example)
    If a page is missing on the remote site, there will not be any warning on the local site


  • No external pages

  • Rewrite all external links (links that needs an Internet connection) so that there can be a warning page before ("Warning, you need to be online to go to this link..")
    Useful if you want to separate the local and online realm


  • Hide passwords

  • Do not include username and password for protected sites in the code, when a link will not be caught. This allow to remain the access data private.

  • Hide query strings

  • Do not include query strings for local links. Query strings (?foo=45&bar=67) are generally not necessary for local (file://) files, but query strings can be useful to show several information (example: page-4.html?index=History). However, some basic browsers may not understand that (wireless browsers, especially), and hiding query strings might be a good idea in this case.

  • Do not purge old files

  • Do not purge, after an update, the local files that no longer exist on the remote site, or that have been skipped





Back to Home

httrack-3.49.14/html/step9_opt4.html0000644000175000017500000001564715230602340012671 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Scan Rules






Back to Home

httrack-3.49.14/html/step9_opt3.html0000644000175000017500000001372015230602340012656 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Flow Control




  • Number of connections

  • Define the number of simultaneous connections that can be initiated by the engine.
    It is recommended to limit this number to 1 or 2 if you are mirroring big files on a site, more on standard sites (8 is recommended, up to 42 if it is supported by the system)


  • TimeOut

  • Define what time the engine has to wait if no response if given by a server.
    120 seconds is recommended (less of fast pipes, more if you connection is sloppy)
    You can optionally skip all links from a host that has generated a timeout. Warning: is this checkbox is selected, a timeout will eliminate all links from the origin server


  • Retries

  • Number of retries if a non-fatal error occurred (timeout, for example)
    Note that this will not solve fatal errors such as "Not Found" pages and so on!


  • Min Transfer Rate

  • Minimum transfer rate tolerated on a site. If the transfer rate if slower that the defined value, then the link is skipped
    You can optionally skip all links from a host that has generated a "too slow" error. Warning: is this checkbox is selected, a "too slow" errors will eliminate all links from the origin server






Back to Home

httrack-3.49.14/html/step9_opt2.html0000644000175000017500000001736715230602340012670 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Limits




  • Maximum mirror depth

  • Define how deep will the engine seek in the site A depth of 3 means that you will catch all pages you have indicated, plus all that can be accessed clicking twice on any link
    Note: This option is not filled by default, so the depth is infinite. But because the engine will stay on the site you indicated, only the desired sites will be mirrored, and not all the web!


  • Maximum external depth

  • Define how deep will the engine seek in external sites, or on addresses that were forbidden.
    Normally, HTTrack will not go on external sites by default (except if authorized by filters), and will avoid addresses forbidden by filters. You can override this behaviour, and tell the engine to catch N levels of "external" sites.
    Note: Use this option with great care, as it is overriding all other options (filters and default engine limiter)
    Note: This option is not filled by default, so the depth is equal to zero.


  • Maximum size of an HTML file

  • Define the biggest Html file the engine is allowed to catch.
    This option allows you to avoid big files if you do not want to download them.


  • Max size of a non-HTML file

  • Define the biggest non-html file (image, ZIP file..) the engine is allowed to catch.
    This option allows you to avoid big files if you do not want to download them.


  • Site size limit

  • This option limits the total amount of bytes that can be downloaded in the current mirror

  • Pause after downloading..

  • This option lets the engine do a pause every time it has retrieved a specific amount of bytes
    Useful if you are mirroring a site bigger than the available space: you can then backup and erase the downloaded files during the pause


  • Max time overall

  • This option limits the total amount of time that can be spent on the current mirror

  • Max transfer rate

  • This option limits the transfer rate on the current mirror
    Useful if you do not want HTTrack to monopolize the bandwidth!


  • Max connections / seconds

  • This option limits the number of connections per second for the current mirror. This number can be a floating number (such as 0.1 == 1 connection per 10 seconds)
    Useful to limit server load.
    The default is 10, but you can disable it with a value of 0 - THIS IS NOT ADVISED UNLESS YOU KNOW WHAT YOU ARE DOING (risks of server overload)


  • Maximum number of links

  • Maximum number of links that can be analyzed, that is, either downloaded, or not downloaded. Do not set a too low limit for that, because once the limit is reached, the engine will stop immediately.
    Do not set a too high limit, too, because it will take some memory.. 100,000 links (default) is generally enough.






Back to Home

httrack-3.49.14/html/step9_opt1.html0000644000175000017500000001357715230602340012666 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Links




  • Attempt to detect all links

  • Asks the engine to try to detect all links in a page, even for unknown tags or unknown javascript code. This can generate bad requests or error in pages, but may be helpful to catch all desired links
    Useful, for example, in pages with many javascript tricks


  • Get non-html files related to a link

  • This option allows you to catch all file references in captured HTML files, even external ones
    For example, if an image in an Html page has its source on another web site, this image will be captured together.


  • Test validity of all links

  • This option forces the engine to test all links in spidered pages, i.e. to check if every link is valid or not by performing a request to the server. If an error occurred, it is reported to the error log-file.
    Useful to test all external links in a website


  • Get HTML files first!

  • With this option enabled, the engine will attempt to download all HTML files first, and then download other (images) files. This can speed up the parsing process, by efficiently scanning the HTML structure.





Back to Home

httrack-3.49.14/html/step9_opt11.html0000644000175000017500000001521015230602340012731 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : MIME Types






  • MIME Types

  • An important new feature for some people. This panel tells the engine that if a link is encountered, with a specific type (.cgi, .asp, or .php3 for example), it MUST assume that this link has always the same MIME type, for example the "text/html" MIME type. This is VERY important to speed up many mirrors. Some big HTML files which have many links of unknown type embedded, such as ".asp", cause the engine to test all links, and this slows down the parser.

    In this case, you can tell HTTrack: ".asp pages are in fact HTML pages"
    This is possible, using:

    File type: asp MIME identity: text/html

    You can declare multiple definitions, or declare multiple types separated by ",", like in:
    File type: asp,php,php3 MIME identity: text/html

    Most important MIME types are:
    text/htmlHtml files, parsed by HTTrack
    image/gifGIF files
    image/jpegJpeg files
    image/pngPNG files
    application/x-zip.zip files
    application/x-mp3.mp3 files
    application/x-foo.foo files
    application/octet-streamUnknown files

    You can rename files on a mirror. If you KNOW that all "dat" files are in fact "zip" files renamed into "dat", you can tell httrack:
    File type: dat MIME identity: application/x-zip

    You can also "name" a file type, with its original MIME type, if this type is not known by HTTrack. This will avoid a test when the link will be reached:
    File type: foo MIME identity: application/octet-stream

    In this case, HTTrack won't check the type, because it has learned that "foo" is a known type, or MIME type "application/octet-stream". Therefore, it will let untouched the "foo" type.






Back to Home

httrack-3.49.14/html/step9_opt10.html0000644000175000017500000001355215230602340012737 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel : Expert Options




    Advice: leave these options to default values!

  • Use a cache for updates

  • This option MUST be set if you want to update the site later, or if you want to have the opportunity to continue a crashed mirror
    Disable it only if you want to save few kilobytes, but, err, again, it is not advised to disable this option!


  • Primary filter (scan mode)

  • Which files must be saved?
    You can choose Html and/or Non-Html, or none (this last option is automatically set for scanning)


  • Travel mode

  • Set the default spidering direction
    The default is to catch all files in the same level and lower levels, which is the most logical


  • Global travel mode

  • Set the default global spidering direction
    The default is to stay on the same address if no specific authorization has been delivered


  • Activate debug mode

  • Enables some extra debug informations, like headers debugging and some interface informations (for debugging purpose only)





Back to Home

httrack-3.49.14/html/step9.html0000644000175000017500000001322315230602340011707 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Option panel


  • Click on one of the option tab below to have more informations

  • Each option tab is described, including remarks and examples

Back to Home

httrack-3.49.14/html/step5.html0000644000175000017500000001153215230602340011704 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Step 5 : Check the result


  1. Check log files

  2. You may check the error log file, which could contain useful information if errors have occurred


  3. See the troubleshooting page




Back to Home

httrack-3.49.14/html/step4.html0000644000175000017500000001173715230602340011712 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Step 4 : Wait!


  1. Wait until the mirror is finishing

  2. You can cancel at any time the mirror, or cancel files currently downloaded for any reasons (file too big, for example)
    Options can be changed during the mirror: maximum number of connections, limits...



  3. Go to the next step...




Back to Home

httrack-3.49.14/html/step3.html0000644000175000017500000001353515230602340011707 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Step 3 : Ready to start


  1. If you want, you may connect immediately or delay the mirror

  2. If you don't select anything, HTTrack will assume that you are already connected to the Internet and that you want to start the mirror action now

    • Connect to this provider

    • You can select here a specific provider to connect to when begining the mirror if you are not already connected to the Internet.

    • Disconnect when finished

    • Click on this checkbox to ask httrack to disconnect the network when mirror is finished.

    • Shutdown PC when finished

    • Click on this checkbox to ask httrack to shutdown your computer when mirror is finished.

    • On Hold

    • You can enter here the time of the mirror start. You can delay up to 24 hours a mirror using this feature.



  3. Click on the FINISH button


  4. Go to the next step...




Back to Home

httrack-3.49.14/html/step2.html0000644000175000017500000001534615230602340011710 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Step 2 : Fill the addresses


  1. Select an action

  2. The default action is Download web sites



    • Download web site(s)

    • Will transfert the desired sites with default options
    • Download web site(s) + questions

    • Will transfert the desired sites with default options, and ask questions if any links are considered as potentially downloadable
    • Get individual files

    • Will only get the desired files you specify (for example, ZIP files), but will not spider through HTML files
    • Download all sites in pages (multiple mirror)

    • Will download all sites that appears in the site(s) selected. If you drag&drop your boormark file, this option lets you mirror all your favorite sites
    • Test links in pages (bookmark test)

    • Will test all links indicated. Useful to check a bookmark file
    • * Continue interrupted download

    • Use this option if a download has been interrupted (user interruption,crash..)
    • * Update existing download

    • Use this option to update an existing project. The engine will recheck the complete structure, checking each downloaded file for any updates on the web site


  3. Enter the site's addresses

  4. You can click on the Add a URL button to add each address, or just type them in the box



  5. You may define options by clicking on the Set options button

  6. You can define filters or download parameters in the option panel


  7. You may also add a URL by clicking on the Add a URL button

  8. This option lets you define additional parameters (login/password) for the URL, or capture a complex URL from your browser


  9. Click on the NEXT button


  10. Go to the next step...




Back to Home

httrack-3.49.14/html/step1.html0000644000175000017500000001311215230602340011674 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Step 1 : Choose a project name and destination folder


  1. Change the destination folder if necessary

  2. It is more convenient to organize all mirrors in one directory, for example My Web Sites
    If you already have made mirrors using HTTrack, be sure that you have selected the correct folder.




  3. Select the project name:
    • Select a new project name

    • This name is, for example, the theme of the mirrored sites, for example My Friend's Site



      OR

    • Select an existing project for update/retry

    • Directly select the existing project name in the popup list



  4. Click on the NEXT button


  5. Go to the next step...




Back to Home

httrack-3.49.14/html/start.html0000644000175000017500000000050015230602340011772 HTTrack documentation HTTrack documentation httrack-3.49.14/html/shelldoc.html0000644000175000017500000001247215230602340012445 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Windows Shell Documentation


Note: WinHTTrack (Windows release of HTTrack) and WebHTTrack (Linux/Unix release of HTTrack) are very similar, but not exactly identical. You may encounter minor differences (in the display, or in various options) between these two releases. The engine behind these two release is identical.

WinHTTrack WebHTTrack

httrack-3.49.14/html/scripting.html0000644000175000017500000002004415230602340012644 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

HTTrack Programming page - scripting


We will see here several examples, written in batch script (can be adapted to almost all batch script languages) or in C.



How to get one single file

httrack --get http://localhost/


How to get one single file and pipe it to stdout

httrack --quiet --get http://localhost/ -O tmpget -V "cat \$0" | grep -iE "TITLE" rm -rf tmpget


How to search in all HTML files on a website

httrack --skeleton http://localhost/ -V "if grep -iE \"TITLE\" \"\$0\">/dev/null; then echo \"Match found at \$0\"; fi"
rm -rf tmpget

Same thing but matches only the first file:
httrack --skeleton http://localhost/ -V "if grep -iE \"TITLE\" \"\$0\">/dev/null; then echo \"Match found at \$0\"; kill -9 \$PPID; fi"
rm -rf tmpget


Indexing a website, and using the index as a search engine

httrack localhost -%I
Will generate an index.txt file, which contains all detected keywords, sorted and indexed using this format:

keyword
<tab>   number_of_hits_in_current_page_for_this_keyword   page_location
<tab>   number_of_hits_in_current_page_for_this_keyword   page_location
<tab>   number_of_hits_in_current_page_for_this_keyword   page_location
...
=total_number_of_hits_for_this_keyword
((total_number_of_hits_for_this_keyword*1000)/total_number_of_keywords)

Example:

abilities
	1 localhost/manual/mod/index-2.html
	1 localhost/manual/mod/index.html
	1 localhost/manual/mod/mod_negotiation.html
	=3
	(0)
ability
	2 localhost/manual/misc/FAQ.html
	2 localhost/manual/suexec.html
	1 localhost/manual/handler.html
	1 localhost/manual/misc/security_tips.html
	1 localhost/manual/mod/mod_rewrite.html
	1 localhost/manual/mod/mod_setenvif.html
	1 localhost/manual/multilogs.html
	1 localhost/manual/netware.html
	1 localhost/manual/new_features_1_3.html
	1 localhost/manual/windows.html
	=12
	(0)
able
	4 localhost/manual/dso.html
	4 localhost/manual/mod/core.html
	3 localhost/manual/dns-caveats.html
	3 localhost/manual/mod/mod_auth.html
	3 localhost/manual/mod/mod_rewrite.html
	3 localhost/manual/upgrading_to_1_3.html
	2 localhost/manual/misc/API.html
	2 localhost/manual/misc/FAQ.html
	2 localhost/manual/misc/windoz_keepalive.html
	2 localhost/manual/mod/mod_auth_db.html
	2 localhost/manual/mod/mod_auth_dbm.html
	1 localhost/manual/misc/descriptors.html
	1 localhost/manual/misc/fin_wait_2.html
	1 localhost/manual/misc/security_tips.html
	1 localhost/manual/mod/mod_auth_digest.html
	1 localhost/manual/mod/mod_cern_meta.html
	1 localhost/manual/mod/mod_env.html
	1 localhost/manual/mod/mod_example.html
	1 localhost/manual/mod/mod_unique_id.html
	1 localhost/manual/mod/mod_usertrack.html
	1 localhost/manual/stopping.html
	1 localhost/manual/suexec.html
	1 localhost/manual/vhosts/ip-based.html
	1 localhost/manual/windows.html
	=43
	(0)
...

Script example: search.sh


httrack-3.49.14/html/plug.html0000644000175000017500000006022315230602340011614 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

HTTrack Programming page - plugging functions


You can write external functions to be plugged in the httrack library very easily. We'll see there some examples.

The httrack commandline tool allows (since the 3.30 release) to plug external functions to various callbacks defined in httrack. The 3.41 release introduces a cleaned up verion of callbacks, with two major changes:
  • Cleaned up function prototypes, with two arguments always passed (the caller carg structure, and the httrackp* object), convenient to pass an user-defined pointer (see CALLBACKARG_USERDEF(carg))
  • The httrackp* option structure can be directly accessed to plug callbacks (no need to give the callback name and function name in the commandline!)
  • The callback plug is made through the CHAIN_FUNCTION() helper, allowing to chain multiple callbacks of the same type (the callbacks MUST preserve the chain by calling ancestors)

References:
  • the httrack-library.h prototype file
    Note: the Initialization, Main functions, Options handling and Wrapper functions sections are generally the only ones to be considered.
  • the htsdefines.h prototype file, which describes callback function prototypes
  • the htsopt.h prototype file, which describes the full httrackp* structure
  • the callbacks-example*.c files given in the httrack archive
  • the example given at the end of this document

Below the list of functions to be defined in the module (plugin).

module function namefunction descriptionfunction signature
hts_plug The module entry point. The opt structure can be used to plug callbacks, using the CHAIN_FUNCTION() macro helper. The argv optional argument is the one passed in the commandline as --wrapper parameter.
return value: 1 upon success, 0 upon error (the mirror will then be aborted)

Wrappers can be plugged inside hts_plug() using:
CHAIN_FUNCTION(opt, <callback name>, <our callback function name>, <our callback function optional custom pointer argument>);

Example:
CHAIN_FUNCTION(opt, check_html, process, userdef);
extern int hts_plug(httrackp *opt, const char* argv);
hts_unplug The module exit point. To free allocated resources without using global variables, use the uninit callback (see below)extern int hts_unplug(httrackp *opt);

Note that all callbacks (except init and uninit) take as first two argument:
  • the t_hts_callbackarg structure
    this structure holds the callback chain (parent callbacks defined before the current callback) pointers, and the user-defined pointer ; see CALLBACKARG_USERDEF(carg))
  • the httrackp structure
    this structure, holding all current httrack options and mirror state, can be read or mofidied

Below the list of callbacks, and associated external wrappers.
callback namecallback descriptioncallback function signature
initNote: the use the "start" callback is advised. Called during initialization.
return value: none
void mycallback(t_hts_callbackarg *carg);
uninitNote: the use os the "end" callback is advised.
Called during un-initialization
return value: none
void mycallback(t_hts_callbackarg *carg);
startCalled when the mirror starts. The opt structure passed lists all options defined for this mirror. You may modify the opt structure to fit your needs.
return value: 1 upon success, 0 upon error (the mirror will then be aborted)
int mycallback(t_hts_callbackarg *carg, httrackp* opt);
endCalled when the mirror ends
return value: 1 upon success, 0 upon error (the mirror will then be considered aborted)
int mycallback(t_hts_callbackarg *carg, httrackp* opt);
choptCalled when options are to be changed. The opt structure passed lists all options, updated to take account of recent changes
return value: 1 upon success, 0 upon error (the mirror will then be aborted)
int mycallback(t_hts_callbackarg *carg, httrackp* opt);
preprocessCalled when a document (which is an html document) is to be parsed (original, not yet modified document). The html address points to the document data address (char**), and the length address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using the hts_realloc()/hts_free() library functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of hts_strdup() in such cases is advised. The url_address and url_file are the address and URI of the file being processed
return value: 1 if the new pointers can be applied (default value)
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char** html, int* len, const char* url_address, const char* url_file);
postprocessCalled when a document (which is an html document) is parsed and transformed (links rewritten). The html address points to the document data address (char**), and the length address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using the hts_realloc()/hts_free() library functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of hts_strdup() in such cases is advised. The url_address and url_file are the address and URI of the file being processed
return value: 1 if the new pointers can be applied (default value)
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char** html, int* len, const char* url_address, const char* url_file);
check_htmlCalled when a document (which may not be an html document) is to be parsed. The html address points to the document data, of lenth len. The url_address and url_file are the address and URI of the file being processed
return value: 1 if the parsing can be processed, 0 if the file must be skipped without being parsed
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* html, int len, const char* url_address, const char* url_file);
queryCalled when the wizard needs to ask a question. The question string contains the question for the (human) user
return value: the string answer ("" for default reply)
const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);
query2Called when the wizard needs to ask a questionconst char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);
query3Called when the wizard needs to ask a questionconst char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);
loopCalled periodically (informational, to display statistics)
return value: 1 if the mirror can continue, 0 if the mirror must be aborted
int mycallback(t_hts_callbackarg *carg, httrackp* opt, lien_back* back, int back_max, int back_index, int lien_tot, int lien_ntot, int stat_time, hts_stat_struct* stats);
check_linkCalled when a link has to be tested. The adr and fil are the address and URI of the link being tested. The passed status value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine
return value: same meaning as the passed status value ; you may generally return -1 to let the engine take the decision by itself
int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr, const char* fil, int status);
check_mimeCalled when a link download has begun, and needs to be tested against its MIME type. The adr and fil are the address and URI of the link being tested, and the mime string contains the link type being processed. The passed status value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine
return value: same meaning as the passed status value ; you may generally return -1 to let the engine take the decision by itself
int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr, const char* fil, const char* mime, int status);
pauseCalled when the engine must pause. When the lockfile passed is deleted, the function can return
return value: none
void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* lockfile);
filesaveCalled when a file is to be saved on disk
return value: none
void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* file);
filesave2Called when a file is to be saved or checked on disk
The hostname, filename and local filename are given. Two additional flags tells if the local file is new (is_new), if the local file is to be modified (is_modified), and if the file was not updated remotely (not_updated).
(!is_new && !is_modified): the file is up-to-date, and will not be modified
(is_new && is_modified): a new file will be written (or an updated file is being written)
(!is_new && is_modified): a file is being updated (append)
(is_new && !is_modified): an empty file will be written ("do not recatch locally erased files")
not_updated: the file was not re-downloaded because it was up-to-date (no data transferred again)

return value: none
void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* hostname, const char* filename, const char* localfile, int is_new, int is_modified, int not_updated);
linkdetectedCalled when a link has been detected
return value: 1 if the link can be analyzed, 0 if the link must not even be considered
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* link);
linkdetected2Called when a link has been detected
return value: 1 if the link can be analyzed, 0 if the link must not even be considered
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* link, const const char* tag_start);
xfrstatusCalled when a file has been processed (downloaded, updated, or error)
return value: must return 1
int mycallback(t_hts_callbackarg *carg, httrackp* opt, lien_back* back);
savenameCalled when a local filename has to be processed. The adr_complete and fil_complete are the address and URI of the file being saved ; the referer_adr and referer_fil are the address and URI of the referer link. The save string contains the local filename being used. You may modifiy the save string to fit your needs, up to 1024 bytes (note: filename collisions, if any, will be handled by the engine by renaming the file into file-2.ext, file-3.ext ..).
return value: must return 1
int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save);
sendheadCalled when HTTP headers are to be sent to the remote server. The buff buffer contains text headers, adr and fil the URL, and referer_adr and referer_fil the referer URL. The outgoing structure contains all information related to the current slot.
return value: 1 if the mirror can continue, 0 if the mirror must be aborted
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing);
receiveheadCalled when HTTP headers are recevived from the remote server. The buff buffer contains text headers, adr and fil the URL, and referer_adr and referer_fil the referer URL. The incoming structure contains all information related to the current slot.
return value: 1 if the mirror can continue, 0 if the mirror must be aborted
int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming);
detectCalled when an unknown document is to be parsed. The str structure contains all information related to the document.
return value: 1 if the type is known and can be parsed, 0 if the document type is unknown
int mycallback(t_hts_callbackarg *carg, httrackp* opt, htsmoduleStruct* str);
parseThe str structure contains all information related to the document.
return value: 1 if the document was successfully parsed, 0 if an error occurred
int mycallback(t_hts_callbackarg *carg, httrackp* opt, htsmoduleStruct* str);


Note: the optional libhttrack-plugin module (libhttrack-plugin.dll or libhttrack-plugin.so), if found in the library environment, is loaded automatically, and its hts_plug() function being called.

An example is generally more efficient than anything else, so let's write our first module, aimed to stupidely print all parsed html files:
/* system includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* standard httrack module includes */
#include "httrack-library.h"
#include "htsopt.h"
#include "htsdefines.h"

/* local function called as "check_html" callback */
static int process_file(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt, 
                        /*other parameters are callback-specific*/
                        char* html, int len, const char* url_address, const char* url_file) {
  void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg);    /*optional user-defined arg*/

  /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */
  if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) {
    if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt,
                                                html, len, url_address, url_file)) {
        return 0;  /* abort */
      }
  }

  printf("file %s%s content: %s\n", url_address, url_file, html);
  return 1;  /* success */
}

/* local function called as "end" callback */
static int end_of_mirror(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt) {
  void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg);    /*optional user-defined arg*/

  /* processing */
  fprintf(stderr, "That's all, folks!\n");

  /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */
  if (CALLBACKARG_PREV_FUN(carg, end) != NULL) {
    /* status is ok on our side, return other callabck's status */
    return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt);
  }

  return 1;  /* success */
}

/*
module entry point
the function name and prototype MUST match this prototype
*/
EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) {
  /* optional argument passed in the commandline we won't be using here */
  const char *arg = strchr(argv, ',');
  if (arg != NULL)
    arg++;

  /* plug callback functions */
  CHAIN_FUNCTION(opt, check_html, process_file, /*optional user-defined arg*/NULL);
  CHAIN_FUNCTION(opt, end, end_of_mirror, /*optional user-defined arg*/NULL);

  return 1;  /* success */
}

/*
module exit point
the function name and prototype MUST match this prototype
*/
EXTERNAL_FUNCTION int hts_unplug(httrackp *opt) {
  fprintf(stderr, "Module unplugged");

  return 1;  /* success */
}

Compile this file ; for example:
gcc -O -g3 -shared -o mylibrary.so myexample.c
and plug the module using the commandline ; for example:
httrack --wrapper mylibrary http://www.example.com
or, if some parameters are desired:
httrack --wrapper mylibrary,myparameter-string http://www.example.com
(the "myparameter-string" string will be available in the 'arg' parameter passed to the hts_plug entry point)


httrack-3.49.14/html/plug_330.html0000644000175000017500000004513615230602340012207 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

HTTrack Programming page - plugging functions
releases 3.30 to 3.40 (not beyond)


You can write external functions to be plugged in the httrack library very easily. We'll see there some examples.

The httrack commandline tool allows (since the 3.30 release) to plug external functions to various callbacks defined in httrack.
See also: the httrack-library.h prototype file, and the callbacks-example.c given in the httrack archive.

Example: httrack --wrapper check-html=callback:process_file ..
With the callback.so (or callback.dll) module defined as below:
int process_file(char* html, int len, char* url_adresse, char* url_fichier) {
  printf("now parsing %s%s..\n", url_adresse, url_fichier);
  strcpy(currentURLBeingParsed, url_adresse);
  strcat(currentURLBeingParsed, url_fichier);
  return 1;  /* success */
}
Below the list of callbacks, and associated external wrappers:
typedef void (* t_hts_htmlcheck_filesave2)();
"callback name"callback descriptioncallback function signature
"init"Note: deprecated, should not be used anymore (unsafe callback) - see "start" callback or wrapper_init() module function below this table.Called during initialization ; use of htswrap_add (see httrack-library.h) is permitted inside this function to setup other callbacks.
return value: none
void (* myfunction)(void);
"free"Note: deprecated, should not be used anymore (unsafe callback) - see "end" callback or wrapper_exit() module function below this table.
Called during un-initialization
return value: none
void (* myfunction)(void);
"start"Called when the mirror starts. The opt structure passed lists all options defined for this mirror. You may modify the opt structure to fit your needs. Besides, use of htswrap_add (see httrack-library.h) is permitted inside this function to setup other callbacks.
return value: 1 upon success, 0 upon error (the mirror will then be aborted)
int (* myfunction)(httrackp* opt);
"end"Called when the mirror ends
return value: 1 upon success, 0 upon error (the mirror will then be considered aborted)
int (* myfunction)(void);
"change-options"Called when options are to be changed. The opt structure passed lists all options, updated to take account of recent changes
return value: 1 upon success, 0 upon error (the mirror will then be aborted)
int (* myfunction)(httrackp* opt);
"check-html"Called when a document (which may not be an html document) is to be parsed. The html address points to the document data, of lenth len. The url_adresse and url_fichier are the address and URI of the file being processed
return value: 1 if the parsing can be processed, 0 if the file must be skipped without being parsed
int (* myfunction)(char* html,int len,char* url_adresse,char* url_fichier);
"preprocess-html"Called when a document (which is an html document) is to be parsed (original, not yet modified document). The html address points to the document data address (char**), and the length address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using standard C library realloc()/free() functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of strdup() in such cases is advised. The url_adresse and url_fichier are the address and URI of the file being processed
return value: 1 if the new pointers can be applied (default value)
int (* myfunction)(char** html,int* len,char* url_adresse,char* url_fichier);
"postprocess-html"Called when a document (which is an html document) is parsed and transformed (links rewritten). The html address points to the document data address (char**), and the length address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using standard C library realloc()/free() functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of strdup() in such cases is advised. The url_adresse and url_fichier are the address and URI of the file being processed
return value: 1 if the new pointers can be applied (default value)
int (* myfunction)(char** html,int* len,char* url_adresse,char* url_fichier);
"query"Called when the wizard needs to ask a question. The question string contains the question for the (human) user
return value: the string answer ("" for default reply)
char* (* myfunction)(char* question);
"query2"Called when the wizard needs to ask a questionchar* (* myfunction)(char* question);
"query3"Called when the wizard needs to ask a questionchar* (* myfunction)(char* question);
"loop"Called periodically (informational, to display statistics)
return value: 1 if the mirror can continue, 0 if the mirror must be aborted
int (* myfunction)(lien_back* back,int back_max,int back_index,int lien_tot,int lien_ntot,int stat_time,hts_stat_struct* stats);
"check-link"Called when a link has to be tested. The adr and fil are the address and URI of the link being tested. The passed status value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine
return value: same meaning as the passed status value ; you may generally return -1 to let the engine take the decision by itself
int (* myfunction)(char* adr,char* fil,int status);
"check-mime"Called when a link download has begun, and needs to be tested against its MIME type. The adr and fil are the address and URI of the link being tested, and the mime string contains the link type being processed. The passed status value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine
return value: same meaning as the passed status value ; you may generally return -1 to let the engine take the decision by itself
int (* myfunction)(char* adr,char* fil,char* mime,int status);
"pause"Called when the engine must pause. When the lockfile passed is deleted, the function can return
return value: none
void (* myfunction)(char* lockfile);
"save-file"Called when a file is to be saved on disk
return value: none
void (* myfunction)(char* file);
"save-file2"Called when a file is to be saved or checked on disk
The hostname, filename and local filename are given. Two additional flags tells if the file is new (is_new) and is the file is to be modified (is_modified).
(!is_new && !is_modified): the file is up-to-date, and will not be modified
(is_new && is_modified): a new file will be written (or an updated file is being written)
(!is_new && is_modified): a file is being updated (append)
(is_new && !is_modified): an empty file will be written ("do not recatch locally erased files")
return value: none
void (* myfunction)(char* hostname,char* filename,char* localfile,int is_new,int is_modified);
"link-detected"Called when a link has been detected
return value: 1 if the link can be analyzed, 0 if the link must not even be considered
int (* myfunction)(char* link);
"transfer-status"Called when a file has been processed (downloaded, updated, or error)
return value: must return 1
int (* myfunction)(lien_back* back);
"save-name"Called when a local filename has to be processed. The adr_complete and fil_complete are the address and URI of the file being saved ; the referer_adr and referer_fil are the address and URI of the referer link. The save string contains the local filename being used. You may modifiy the save string to fit your needs, up to 1024 bytes (note: filename collisions, if any, will be handled by the engine by renaming the file into file-2.ext, file-3.ext ..).
return value: must return 1
int (* myfunction)(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save);
"send-header"Called when HTTP headers are to be sent to the remote server. The buff buffer contains text headers, adr and fil the URL, and referer_adr and referer_fil the referer URL. The outgoing structure contains all information related to the current slot.
return value: 1 if the mirror can continue, 0 if the mirror must be aborted
int (* myfunction)(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* outgoing);
"receive-header"Called when HTTP headers are recevived from the remote server. The buff buffer contains text headers, adr and fil the URL, and referer_adr and referer_fil the referer URL. The incoming structure contains all information related to the current slot.
return value: 1 if the mirror can continue, 0 if the mirror must be aborted
int (* myfunction)(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* incoming);


Below additional function names that can be defined inside the module (DLL/.so):
"module function name"function description
int function-name_init(char *args);Called when a function named function-name is extracted from the current module (same as wrapper_init). The optional args provides additional commandline parameters. Returns 1 upon success, 0 if the function should not be extracted.
int wrapper_init(char *fname, char *args);Called when a function named fname is extracted from the current module. The optional args provides additional commandline parameters. Besides, use of htswrap_add (see httrack-library.h) is permitted inside this function to setup other callbacks. Returns 1 upon success, 0 if the function should not be extracted.
int wrapper_exit(void);Called when the module is unloaded. The function should return 1 (but the result is ignored).


Below additional function names that can be defined inside the optional libhttrack-plugin module (libhttrack-plugin.dll or libhttrack-plugin.so) searched inside common library path:
"module function name"function description
void plugin_init(void);Called if the module (named libhttrack-plugin.(so|dll)) is found in the library path. Use of htswrap_add (see httrack-library.h) is permitted inside this function to setup other callbacks.




httrack-3.49.14/html/overview.html0000644000175000017500000001262315230602340012514 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Overview


Please visit our website!


WinHTTrack snapshot

HTTrack HTTrack is an easy-to-use offline browser utility. It allows you to download a World Wide website from the Internet to a local directory, building recursively all directories, getting html, images, and other files from the server to your computer. HTTrack arranges the original site's relative link-structure. Simply open a page of the "mirrored" website in your browser, and you can browse the site from link to link, as if you were viewing it online. HTTrack can also update an existing mirrored site, and resume interrupted downloads. HTTrack is fully configurable, and has an integrated help system.

httrack-3.49.14/html/options.html0000644000175000017500000001236515230602340012344 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Options

Note: this is a legacy option list and may be out of date. For the authoritative, always-current reference see the httrack manual page, and for a task-oriented walkthrough see the Command-line Guide.

  • Filters: how to use them

  • Here you can find informations on filters: how to accept all gif files in a mirror, for example

The complete, current list of command-line options is generated from the program itself, in the httrack manual page.

WinHTTrack and WebHTTrack offer the same options through their graphical option panels, described in the step-by-step guide.

httrack-3.49.14/html/library.html0000644000175000017500000001133615230602340012312 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

HTTrack Programming page - using the library


All library prototypes are available in the httrack-library.h file.
You may also want to check the httrack.c and httrack.h files to get an example of use of this library.



httrack-3.49.14/html/index.html0000644000175000017500000001434515230602340011760 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Documentation

httrack-3.49.14/html/httrack.man.html0000644000175000017500000014247215230602340013066 httrack

httrack

NAME
SYNOPSIS
DESCRIPTION
EXAMPLES
OPTIONS
General options:
Action options:
Proxy options:
Limits options:
Flow control:
Links options:
Build options:
Spider options:
Browser ID:
Log, index, cache
Expert options:
Guru options: (do NOT use if possible)
Dangerous options: (do NOT use unless you exactly know what you are doing)
Command-line specific options:
Details: Option N
Details: User-defined option N
Details: User-defined option N and advanced variable extraction
Details: Option K
Shortcuts:
Details: Option %W: External callbacks prototypes
see htsdefines.h
FILES
ENVIRONMENT
DIAGNOSTICS
LIMITS
BUGS
COPYRIGHT
AVAILABILITY
AUTHOR
SEE ALSO

NAME

httrack - offline browser : copy websites to a local directory

SYNOPSIS

httrack [ url ]... [ -filter ]... [ +filter ]... [ -O, --path ] [ -w, --mirror ] [ -W, --mirror-wizard ] [ -g, --get-files ] [ -i, --continue ] [ -Y, --mirrorlinks ] [ -P, --proxy ] [ -%f, --httpproxy-ftp[=N] ] [ -%b, --bind ] [ -rN, --depth[=N] ] [ -%eN, --ext-depth[=N] ] [ -mN, --max-files[=N] ] [ -MN, --max-size[=N] ] [ -EN, --max-time[=N] ] [ -AN, --max-rate[=N] ] [ -%cN, --connection-per-second[=N] ] [ -%G, --pause ] [ -GN, --max-pause[=N] ] [ -cN, --sockets[=N] ] [ -TN, --timeout[=N] ] [ -RN, --retries[=N] ] [ -JN, --min-rate[=N] ] [ -HN, --host-control[=N] ] [ -%P, --extended-parsing[=N] ] [ -n, --near ] [ -t, --test ] [ -%L, --list ] [ -%S, --urllist ] [ -NN, --structure[=N] ] [ -%N, --delayed-type-check ] [ -%D, --cached-delayed-type-check ] [ -%M, --mime-html ] [ -LN, --long-names[=N] ] [ -KN, --keep-links[=N] ] [ -x, --replace-external ] [ -%x, --disable-passwords ] [ -%q, --include-query-string ] [ -%g, --strip-query ] [ -o, --generate-errors ] [ -X, --purge-old[=N] ] [ -%p, --preserve ] [ -%T, --utf8-conversion ] [ -bN, --cookies[=N] ] [ -%K, --cookies-file ] [ -%Y, --why ] [ -u, --check-type[=N] ] [ -j, --parse-java[=N] ] [ -sN, --robots[=N] ] [ -%h, --http-10 ] [ -%k, --keep-alive ] [ -%z, --disable-compression ] [ -%B, --tolerant ] [ -%s, --updatehack ] [ -%u, --urlhack ] [ -%A, --assume ] [ -@iN, --protocol[=N] ] [ -%w, --disable-module ] [ -F, --user-agent ] [ -%R, --referer ] [ -%E, --from ] [ -%F, --footer ] [ -%l, --language ] [ -%a, --accept ] [ -%X, --headers ] [ -C, --cache[=N] ] [ -k, --store-all-in-cache ] [ -%r, --warc ] [ -%n, --do-not-recatch ] [ -%v, --display ] [ -Q, --do-not-log ] [ -q, --quiet ] [ -z, --extra-log ] [ -Z, --debug-log ] [ -v, --verbose ] [ -f, --file-log ] [ -f2, --single-log ] [ -I, --index ] [ -%i, --build-top-index ] [ -%I, --search-index ] [ -pN, --priority[=N] ] [ -S, --stay-on-same-dir ] [ -D, --can-go-down ] [ -U, --can-go-up ] [ -B, --can-go-up-and-down ] [ -a, --stay-on-same-address ] [ -d, --stay-on-same-domain ] [ -l, --stay-on-same-tld ] [ -e, --go-everywhere ] [ -%H, --debug-headers ] [ -%!, --disable-security-limits ] [ -V, --userdef-cmd ] [ -%W, --callback ] [ -y, --background-on-suspend ] [ -K, --keep-links[=N] ]

DESCRIPTION

httrack allows you to download a World Wide Web site from the Internet to a local directory, building recursively all directories, getting HTML, images, and other files from the server to your computer. HTTrack arranges the original site’s relative link-structure. Simply open a page of the "mirrored" website in your browser, and you can browse the site from link to link, as if you were viewing it online. HTTrack can also update an existing mirrored site, and resume interrupted downloads.

EXAMPLES

httrack www.example.com/bob/

mirror site www.example.com/bob/ and only this site

httrack www.example.com/bob/ www.anothertest.com/mike/ +*.com/*.jpg
-mime:application/*

mirror the two sites together (with shared links) and accept any .jpg files on .com sites

httrack www.example.com/bob/bobby.html +* -r6
httrack www.example.com/bob/bobby.html --spider -P
proxy.myhost.com:8080
httrack --update
httrack
httrack --continue

OPTIONS

General options:

-O

path for mirror/logfiles+cache (-O path_mirror[,path_cache_and_logfiles]) (--path <param>)

Action options:

-w

*mirror web sites (--mirror)

-W

mirror web sites, semi-automatic (asks questions) (--mirror-wizard)

-g

just get files (saved in the current directory) (--get-files)

-i

continue an interrupted mirror using the cache (--continue)

-Y

mirror ALL links located in the first level pages (mirror links) (--mirrorlinks)

Proxy options:

-P

proxy use (-P [socks5://|connect://][user:pass@]proxy:port) (--proxy <param>)

-%f

*use proxy for ftp (f0 don’t use) (--httpproxy-ftp[=N])

-%b

use this local hostname to make/send requests (-%b hostname) (--bind <param>)

Limits options:

-rN

set the mirror depth to N (* r9999) (--depth[=N])

-%eN

set the external links depth to N (* %e0) (--ext-depth[=N])

-mN

maximum file length for a non-html file (--max-files[=N])

-mN,N2

maximum file length for non html (N) and html (N2)

-MN

maximum overall size that can be uploaded/scanned (--max-size[=N])

-EN

maximum mirror time in seconds (60=1 minute, 3600=1 hour) (--max-time[=N])

-AN

maximum transfer rate in bytes/seconds (1000=1KB/s max) (--max-rate[=N])

-%cN

maximum number of connections/seconds (*%c5) (--connection-per-second[=N])

-%G

random pause of MIN[:MAX] seconds between files (e.g. %G5:10) (--pause <param>)

-GN

pause transfer if N bytes reached, and wait until lock file is deleted (--max-pause[=N])

Flow control:

-cN

number of multiple connections (*c4) (--sockets[=N])

-TN

timeout, number of seconds after a non-responding link is shutdown; also bounds host name resolution (--timeout[=N])

-RN

number of retries, in case of timeout or non-fatal errors (*R1) (--retries[=N])

-JN

traffic jam control, minimum transfert rate (bytes/seconds) tolerated for a link (--min-rate[=N])

-HN

host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow (--host-control[=N])

Links options:

-%P

*extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don’t use) (--extended-parsing[=N])

-n

get non-html files ’near’ an html file (ex: an image located outside) (--near)

-t

test all URLs (even forbidden ones) (--test)

-%L

<file> add all URL located in this text file (one URL per line) (--list <param>)

-%S

<file> add all scan rules located in this text file (one scan rule per line) (--urllist <param>)

Build options:

-NN

structure type (0 *original structure, 1+: see below) (--structure[=N])

or user defined structure (-N "%h%p/%n%q.%t")

-%N

delayed type check, don’t make any link test but wait for files download to start instead (experimental) (%N0 don’t use, %N1 use for unknown extensions, * %N2 always use) (--delayed-type-check)

-%D

cached delayed type check, don’t wait for remote type during updates, to speedup them (%D0 wait, * %D1 don’t wait) (--cached-delayed-type-check)

-%M

generate a RFC MIME-encapsulated full-archive (.mht) (--mime-html)

-%t

keep the original file extension, don’t rewrite it from the MIME type (%t0 rewrite)

-LN

long names (L1 *long names / L0 8-3 conversion / L2 ISO9660 compatible) (--long-names[=N])

-KN

keep original links (e.g. http://www.adr/link) (K0 *relative link, K absolute links, K4 original links, K3 absolute URI links, K5 transparent proxy link) (--keep-links[=N])

-x

replace external html links by error pages (--replace-external)

-%x

do not include any password for external password protected websites (%x0 include) (--disable-passwords)

-%q

*include query string for local files (useless, for information purpose only) (%q0 don’t include) (--include-query-string)

-%g

strip query keys for dedup ([host/pattern=]key1,key2,...) (--strip-query <param>)

-o

*generate output html file in case of error (404..) (o0 don’t generate) (--generate-errors)

-X

*purge old files after update (X0 keep delete) (--purge-old[=N])

-%p

preserve html files ’as is’ (identical to ’-K4 -%F ""’) (--preserve)

-%T

links conversion to UTF-8 (--utf8-conversion)

Spider options:

-bN

accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])

-%K

load extra cookies from a Netscape cookies.txt (--cookies-file <param>)

-%Y

explain which filter rule accepts or rejects a URL, then exit (--why <param>)

-u

check document type if unknown (cgi,asp..) (u0 don’t check, * u1 check but /, u2 check always) (--check-type[=N])

-j

*parse scripts (j0 don’t parse, bitmask: |1 parse default, |4 don’t parse .js |8 don’t be aggressive) (--parse-java[=N])

-sN

follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (--robots[=N])

-%h

force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (--http-10)

-%k

use keep-alive if possible, greately reducing latency for small files and test requests (%k0 don’t use) (--keep-alive)

-%z

do not request compressed content (%z0 request) (--disable-compression)

-%B

tolerant requests (accept bogus responses on some servers, but not standard!) (--tolerant)

-%s

update hacks: various hacks to limit re-transfers when updating (identical size, bogus response..) (--updatehack)

-%u

url hacks: various hacks to limit duplicate URLs (strip //, www.foo.com==foo.com..) (--urlhack)

opt out of one url-hack part: --keep-www-prefix (www.foo.com<>foo.com), --keep-double-slashes (//), --keep-query-order (?b&a)

-%A

assume that a type (cgi,asp..) is always linked with a mime type (-%A php3,cgi=text/html;dat,bin=application/x-zip) (--assume <param>)

shortcut: ’--assume standard’ is equivalent to -%A php2 php3 php4 php cgi asp jsp pl cfm nsf=text/html
can also be used to force a specific file type: --assume foo.cgi=text/html

-@iN

internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (--protocol[=N])

-%w

disable a specific external mime module (-%w httrack-plugin) (--disable-module <param>)

Browser ID:

-F

user-agent field sent in HTTP headers (-F "user-agent name") (--user-agent <param>)

-%R

default referer field sent in HTTP headers (--referer <param>)

-%E

from email address sent in HTTP headers (--from <param>)

-%F

footer string in Html code (-%F "Mirrored from {url} on {date}"; fields {addr} {path} {url} {date} {lastmodified} {version} {mime} {charset} {status} {size}, or legacy %s) (--footer <param>)

-%l

preferred language (-%l "fr, en, jp, *" (--language <param>)

-%a

accepted formats (-%a "text/html,image/png;q=0.9,*/*;q=0.1" (--accept <param>)

-%X

additional HTTP header line (-%X "X-Magic: 42" (--headers <param>)

Log, index, cache

-C

create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before) (--cache[=N])

-k

store all files in cache (not useful if files on disk) (--store-all-in-cache)

-%r

write an ISO-28500 WARC/1.1 archive; --warc-file NAME sets the output name, --warc-max-size N rotates segments past N bytes, --warc-cdx also writes a sorted CDXJ index, --wacz packages it all as a WACZ file (--warc)

-%n

do not re-download locally erased files (--do-not-recatch)

-%v

display on screen filenames downloaded (in realtime) - * %v1 short version - %v2 full animation (--display)

-Q

no log - quiet mode (--do-not-log)

-q

no questions - quiet mode (--quiet)

-z

log - extra infos (--extra-log)

-Z

log - debug (--debug-log)

-v

log on screen (--verbose)

-f

*log in files (--file-log)

-f2

one single log file (--single-log)

-I

*make an index (I0 don’t make) (--index)

-%i

make a top index for a project folder (* %i0 don’t make) (--build-top-index)

-%I

make an searchable index for this mirror (* %I0 don’t make) (--search-index)

Expert options:

-pN

priority mode: (* p3) (--priority[=N])

p0 just scan, don’t save anything (for checking links)
p1 save only html files
p2 save only non html files
*p3 save all files
p7 get html files before, then treat other files

-S

stay on the same directory (--stay-on-same-dir)

-D

*can only go down into subdirs (--can-go-down)

-U

can only go to upper directories (--can-go-up)

-B

can both go up&down into the directory structure (--can-go-up-and-down)

-a

*stay on the same address (--stay-on-same-address)

-d

stay on the same principal domain (--stay-on-same-domain)

-l

stay on the same TLD (eg: .com) (--stay-on-same-tld)

-e

go everywhere on the web (--go-everywhere)

-%H

debug HTTP headers in logfile (--debug-headers)

Guru options: (do NOT use if possible)

-#test

list engine self-tests (run one with -#test=NAME [args])

-#C

cache list (-#C ’*.com/spider*.gif’ (--debug-cache <param>)

-#R

cache repair (damaged cache) (--repair-cache)

-#d

debug parser (--debug-parsing)

-#E

extract new.zip cache meta-data in meta.zip

-#f

always flush log files (--advanced-flushlogs)

-#FN

maximum number of filters (--advanced-maxfilters[=N])

-#h

version info (--version)

-#K

scan stdin (debug) (--debug-scanstdin)

-#L

maximum number of links (-#L1000000) (--advanced-maxlinks[=N])

-#p

display ugly progress information (--advanced-progressinfo)

-#P

catch URL (--catch-url)

-#T

generate transfer ops. log every minutes (--debug-xfrstats)

-#u

wait time (--advanced-wait)

-#Z

generate transfer rate statistics every minutes (--debug-ratestats)

Dangerous options: (do NOT use unless you exactly know what you are doing)

-%!

bypass built-in security limits aimed to avoid bandwidth abuses (bandwidth, simultaneous connections) (--disable-security-limits)

IMPORTANT NOTE: DANGEROUS OPTION, ONLY SUITABLE FOR EXPERTS
USE IT WITH EXTREME CARE

Command-line specific options:

-V

execute system command after each files ($0 is the filename: -V "rm \$0") (--userdef-cmd <param>)

-%W

use an external library function as a wrapper (-%W myfoo.so[,myparameters]) (--callback <param>)

-y

go to background when suspended (y0 don’t) (--background-on-suspend)

Details: Option N

-N0

Site-structure (default)

-N1

HTML in web/, images/other files in web/images/

-N2

HTML in web/HTML, images/other in web/images

-N3

HTML in web/, images/other in web/

-N4

HTML in web/, images/other in web/xxx, where xxx is the file extension (all gif will be placed onto web/gif, for example)

-N5

Images/other in web/xxx and HTML in web/HTML

-N99

All files in web/, with random names (gadget !)

-N100

Site-structure, without www.domain.xxx/

-N101

Identical to N1 except that "web" is replaced by the site’s name

-N102

Identical to N2 except that "web" is replaced by the site’s name

-N103

Identical to N3 except that "web" is replaced by the site’s name

-N104

Identical to N4 except that "web" is replaced by the site’s name

-N105

Identical to N5 except that "web" is replaced by the site’s name

-N199

Identical to N99 except that "web" is replaced by the site’s name

-N1001

Identical to N1 except that there is no "web" directory

-N1002

Identical to N2 except that there is no "web" directory

-N1003

Identical to N3 except that there is no "web" directory (option set for g option)

-N1004

Identical to N4 except that there is no "web" directory

-N1005

Identical to N5 except that there is no "web" directory

-N1099

Identical to N99 except that there is no "web" directory

Details: User-defined option N

-%n

Name of file without file type (ex: image)

-%N

Name of file, including file type (ex: image.gif)

-%t

File type (ex: gif)

-%p

Path [without ending /] (ex: /someimages)

-%h

Host name (ex: www.example.com)

-%M

URL MD5 (128 bits, 32 ascii bytes)

-%Q

query string MD5 (128 bits, 32 ascii bytes)

-%k

full query string

-%r

protocol name (ex: http)

-%q

small query string MD5 (16 bits, 4 ascii bytes)

’%s?’ Short name version (ex: %sN)

-%[param]

param variable in query string

-%[param:before:after:empty:notfound]

advanced variable extraction

Details: User-defined option N and advanced variable extraction

%[param:before:after:empty:notfound]
param : parameter name
before : string to prepend if the parameter was found
after : string to append if the parameter was found
notfound : string replacement if the parameter could not be found
empty : string replacement if the parameter was empty
all fields, except the first one (the parameter name), can be empty

Details: Option K

-K0

foo.cgi?q=45 -> foo4B54.html?q=45 (relative URI, default)

-K

-> http://www.foobar.com/folder/foo.cgi?q=45 (absolute URL) (--keep-links[=N])

-K3

-> /folder/foo.cgi?q=45 (absolute URI)

-K4

-> foo.cgi?q=45 (original URL)

-K5

-> http://www.foobar.com/folder/foo4B54.html?q=45 (transparent proxy URL)

Shortcuts:

--mirror

<URLs> *make a mirror of site(s) (default)

--get

<URLs> get the files indicated, do not seek other URLs (-qg)

--list

<text file> add all URL located in this text file (-%L)

--mirrorlinks

<URLs> mirror all links in 1st level pages (-Y)

--testlinks

<URLs> test links in pages (-r1p0C0I0t)

--spider

<URLs> spider site(s), to test links: reports Errors & Warnings (-p0C0I0t)

--testsite

<URLs> identical to --spider

--skeleton

<URLs> make a mirror, but gets only html files (-p1)

--update

update a mirror, without confirmation (-iC2)

--continue

continue a mirror, without confirmation (-iC1)

--catchurl

create a temporary proxy to capture an URL or a form post URL

--clean

erase cache & log files

--http10

force http/1.0 requests (-%h)

Details: Option %W: External callbacks prototypes

see htsdefines.h

FILES

/etc/httrack.conf

The system wide configuration file.

ENVIRONMENT

HOME

Is being used if you defined in /etc/httrack.conf the line path ˜/websites/#

DIAGNOSTICS

Errors/Warnings are reported to hts-log.txt by default, or to stderr if the -v option was specified.

LIMITS

These are the principals limits of HTTrack for that moment. Note that we did not heard about any other utility that would have solved them. - Several scripts generating complex filenames may not find them (ex: img.src=’image’+a+Mobj.dst+’.gif’) - Cgi-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like -*cgi-bin*

BUGS

Please reports bugs to <bugs@httrack.com>. Include a complete, self-contained example that will allow the bug to be reproduced, and say which version of httrack you are using. Do not forget to detail options used, OS version, and any other information you deem necessary.

COPYRIGHT

Copyright (C) 1998-2026 Xavier Roche and other contributors

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

AVAILABILITY

The most recent released version of httrack can be found at: http://www.httrack.com

AUTHOR

Xavier Roche <roche@httrack.com>

SEE ALSO

The HTML documentation (available online at http://www.httrack.com/html/ ) contains more detailed information. Please also refer to the httrack FAQ (available online at http://www.httrack.com/html/faq.html )


httrack-3.49.14/html/filters.html0000644000175000017500000004631215230602340012320 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Filters: Advanced


See also: The FAQ

You have to know that once you have defined starts links, the default mode is to mirror these links - i.e. if one of your start page is www.example.com/test/index.html, all links starting with www.example.com/test/ will be accepted. But links directly in www.example.com/.. will not be accepted, however, because they are in a higher structure. This prevent HTTrack from mirroring the whole site. (All files in structure levels equal or lower than the primary links will be retrieved.)

But you may want to download files that are not directly in the subfolders, or on the contrary refuse files of a particular type. That is the purpose of filters.

Scan rules based on URL or extension (e.g. accept or refuse all .zip or .gif files)

To accept a family of links (for example, all links with a specific name or type), you just have to add an authorization filter, like +*.gif. The pattern is a plus (this one: +), followed by a pattern composed of letters and wildcards (this one: *).

To forbid a family of links, define an authorization filter, like -*.gif. The pattern is a dash (this one: -), followed by a the same kind of pattern as for the authorization filter.

Example: +*.gif will accept all files finished by .gif
Example: -*.gif will refuse all files finished by .gif

To see which rule accepted or blocked a given URL, run HTTrack with the --why (-%Y) option, described in the manual page.

Scan rules based on size (e.g. accept or refuse files bigger/smaller than a certain size)

Once a link is scheduled for download, you can still refuse it (i.e. abort the download) by checking its size to ensure that you won't reach a defined limit. Example: You may want to accept all files on the domain www.example.com, using '+www.example.com/*', including gif files inside this domain and outside (external images), but not take to large images, or too small ones (thumbnails)
Excluding gif images smaller than 5KB and images larger than 100KB is therefore a good option; +www.example.com +*.gif -*.gif*[<5] -*.gif*[>100]
Important notice: size scan rules are checked after the link was scheduled for download, allowing to abort the connection.

Scan rules based on MIME types (e.g. accept or refuse all files of type audio/mp3)

Once a link is scheduled for download, you can still refuse it (i.e. abort the download) by matching its MIME type against certain patterns. Example: You may want to accept all files on the domain www.example.com, using '+www.example.com/*', and exclude all gif files, using '-*.gif'. But some dynamic scripts (such as www.example.com/dynamic.php) can both generate html content, or image data content, depending on the context. Excluding this script, using the scan rule '-www.example.com/dynamic.php', is therefore not a good solution.
The only reliable way in such cases is to exclude the specific mime type 'image/gif', using the scan rule syntax:
-mime:image/gif
Important notice: MIME types scan rules are only checked against links that were scheduled for download, i.e. links already authorized by url scan rules. Hence, using '+mime:image/gif' will only be a hint to accept images that were already authorized, if previous MIME scan rules excluded them - such as in '-mime:*/* +mime:text/html +mime:image/gif'

Scan rules patterns:

1.a. Scan rules based on URL or extension


Filters are analyzed by HTTrack from the first filter to the last one. The complete URL name is compared to filters defined by the user or added automatically by HTTrack.

A scan rule has a higher priority if it is declared later - hierarchy is important:

+*.gif -image*.gif Will accept all gif files BUT image1.gif,imageblue.gif,imagery.gif and so on
-image*.gif +*.gif Will accept all gif files, because the second pattern is prioritary (because it is defined AFTER the first one)

Note: these scan rules can be mixed with scan rules based on size (see 1.b)

We saw that patterns are composed of letters and wildcards (*), as in */image*.gif


Special wild cards can be used for specific characters: (*[..])

* any characters (the most commonly used)
*[file] or *[name] any filename or name, e.g. not /,? and ; characters
*[path] any path (and filename), e.g. not ? and ; characters
*[a,z,e,r,t,y] any letters among a,z,e,r,t,y
*[a-z] any letters
*[0-9,a,z,e,r,t,y] any characters among 0..9 and a,z,e,r,t,y
*[\*] the * character
*[\\] the \ character
*[\[,\]] the [ or ] character
*[] no characters must be present after


Here are some examples of filters: (that can be generated automatically using the interface)

www.thisweb.com* This will refuse/accept this web site (all links located in it will be rejected)
*.com/* This will refuse/accept all links that contains .com in them
*cgi-bin* This will refuse/accept all links that contains cgi-bin in them
www.*[path].com/*[path].zip This will refuse/accept all zip files in .com addresses
*example*/*.tar* This will refuse/accept all tar (or tar.gz etc.) files in hosts containing example
*/*somepage* This will refuse/accept all links containing somepage (but not in the address)
*.html This will refuse/accept all html files.
Warning! With this filter you will accept ALL html files, even those in other addresses. (causing a global (!) web mirror..) Use www.example.com/*.html to accept all html files from a web.
*.html*[] Identical to *.html, but the link must not have any supplemental characters at the end (links with parameters, like www.example.com/index.html?page=10, will be refused)

1.b. Scan rules based on size


Filters are analyzed by HTTrack from the first filter to the last one. The sizes are compared against scan rules defined by the user.

A scan rule has a higher priority if it is declared later - hierarchy is important.
Note: scan rules based on size can be mixed with regular URL patterns


Size patterns:

*[<NN] the file size must be smaller than NN KB
(note: this may cause broken files during the download)
*[>NN] the file size must be greater than NN KB
(note: this may cause broken files during the download)
*[<NN>MM] the file size must be smaller than NN KB and greater than MM KB
(note: this may cause broken files during the download)


Here are some examples of filters: (that can be generated automatically using the interface)

-*[<10] the file will be forbidden if its size is smaller than 10 KB
-*[>50] the file will be forbidden if its size is greater than 50 KB
-*[<10] -*[>50] the file will be forbidden if if its size is smaller than 10 KB or greater than 50 KB
+*[<80>1] the file will be accepted if if its size is smaller than 80 KB and greater than 1 KB

2. Scan rules based on MIME types


Filters are analyzed by HTTrack from the first filter to the last one. The complete MIME type is compared against scan rules defined by the user.

A scan rule has a higher priority if it is declared later - hierarchy is important
Note: scan rules based on MIME types can NOT be mixed with regular URL patterns or size patterns within the same rule, but you can use both of them in distinct ones


Here are some examples of filters: (that can be generated automatically using the interface)

-mime:application/octet-stream This will refuse all links of type 'application/octet-stream' that were already scheduled for download (i.e. the download will be aborted)
-mime:application/* This will refuse all links of type begining with 'application/' that were already scheduled for download (i.e. the download will be aborted)
-mime:application/* +mime:application/pdf This will refuse all links of type begining with 'application/' that were already scheduled for download, except for 'application/pdf' ones (i.e. all other 'application/' link download will be aborted)
-mime:video/* This will refuse all video links that were already scheduled for download (i.e. the download will be aborted)
-mime:video/* -mime:audio/* This will refuse all audio and video links that were already scheduled for download (i.e. the download will be aborted)
-mime:*/* +mime:text/html +mime:image/* This will refuse all links that were already scheduled for download, except html pages, and images (i.e. all other link download will be aborted). Note that this is a very unefficient way of filtering files, as aborted downloads will generate useless requests to the server. You are strongly advised to use additional URL scan rules

2. Scan rules based on URL or size, and scan rules based on MIME types interactions

You must use scan rules based on MIME types very carefully, or you will end up with an imcomplete mirror, or create an unefficient download session (generating costly and useless requests to the server)


Here are some examples of good/bad scan rules interactions:

Purpose Method Result
Download all html and images on www.example.com -*
+www.example.com/*.html
+www.example.com/*.php
+www.example.com/*.asp
+www.example.com/*.gif
+www.example.com/*.jpg
+www.example.com/*.png
-mime:*/* +mime:text/html +mime:image/*
Good: efficient download
-*
+www.example.com/*
-mime:*/* +mime:text/html +mime:image/*
Bad: many aborted downloads, leading to poor performances and server load
Download only html on www.example.com, plus ZIP files -*
+www.example.com/*.html
+www.example.com/somedynamicscript.php
+www.example.com/*.zip
-mime:* +mime:text/html +mime:application/zip
Good: ZIP files will be downloaded, even those generated by 'somedynamicscript.php'
-*
+www.example.com/*.html
-mime:* +mime:text/html +mime:application/zip
Bad: ZIP files will never be scheduled for download, and hence the zip mime scan rule will never be used
Download all html, and images smaller than 100KB on www.example.com -*
+www.example.com/*.html
+www.example.com/*.php
+www.example.com/*.asp
+www.example.com/*.gif*[<100]
+www.example.com/*.jpg*[<100]
+www.example.com/*.png*[<100]
-mime:*/* +mime:text/html +mime:image/*
Good: efficient download
-*
+www.example.com/**[<100]
-mime:*/* +mime:text/html +mime:image/*
Bad: many aborted downloads, leading to poor performances and server load

httrack-3.49.14/html/fcguide.html0000644000175000017500000031622415230602340012260 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Httrack Users Guide (3.10)

By Fred Cohen

Background and Introduction

I started using httrack in mid-2000 and found it to be an excellent tool for imaging web sites. Various words are used to describe this process - from imaging to mirroring to snaking and so on. I will be using a variety of these words in my description.

I have used many such tools over the years, have performed many manual and semi-automatic operations of similar sorts, and written partial programs to do similar functions, but - at least for now - httrack seems to me to be the best option for this function.

The only problem I encountered when using httrack was that it is so rich with features that I could never really figure out precisely the right thing to do at any given point. I was using recepies rather than knowledge to get the job done - and I was pestering the authors for those recepies. After a few days of very helpful assistance from the authors I volunteered to write a users manual for httrack - and here it is. I hope it gets the job done.


Basics

Httrack is a program that gets information from the Internet, looks for pointers to other information, gets that information, and so forth. If you ask it to, and have enough disk space, it will try to make a copy of the whole Internet on your computer. While this may be the answer to Dilbert's boss when he asks to get a printout of the Internet for some legal document, for most of us, we want to get copies of just the right part of the Internet, and have them nicely organized for our use. This is where httrack does a great job. Here's a simple example:


httrack "http://www.all.net/" -O "/tmp/www.all.net" "+*.all.net/*" -v

In this example, we ask httrack to start the Universal Resource Locator (URL) http://www.all.net/ and store the results under the directory /tmp/www.all.net (the -O stands for "output to") while not going beyond the bounds of all the files in the www.all.net domain and printing out any error messages along the way (-v means verbose). This is the most common way that I use httrack. Please note that this particular command might take you a while - and run you out of disk space.

This sort of a mirror image is not an identical copy of the original web site - in some ways it's better such as for local use - while in other ways it may be problematic - such as for legal use. This default mirroring method changes the URLs within the web site so that the references are made relative to the location the copy is stored in. This makes it very useful for navigating through the web site on your local machine with a web browser since most things will work as you would expect them to work. In this example, URLs that point outside of the www.all.net domain space will still point there, and if you encounter one, the web browser will try to get the data from that location.

For each of the issues discussed here - and many more - httrack has options to allow you to make different choices and get different results. This is one of the great things about httrack - and one of the the real major problems with using it without the knowledge of all that it can do. If you want to know all the things httrack can do, you might try typing:


httrack --help

Unfortunately, while this outputs a though list of options, it is somewhat less helpful it might be for those who don't know what the options all mean and haven't used them before. On the other hand, this is most useful for those who already know how to use the program but don't remember some obscure option that they haven't used for some time.

The rest of this manual is dedicated to detailing what you find in the help message and providing examples - lots and lots of examples... Here is what you get (page by page - use <enter> to move to the next page in the real program) if you type 'httrack --help':

>httrack --help
 HTTrack version 3.03BETAo4 (compiled Jul  1 2001)
	usage: ./httrack <URLs> [-option] [+<FILTERs>] [-<FILTERs>]
	with options listed below: (* is the default value)

General options:
  O  path for mirror/logfiles+cache (-O path_mirror[,path_cache_and_logfiles]) (--path <param>)
 %O  top path if no path defined (-O path_mirror[,path_cache_and_logfiles])

Action options:
  w *mirror web sites (--mirror)
  W  mirror web sites, semi-automatic (asks questions) (--mirror-wizard)
  g  just get files (saved in the current directory) (--get-files)
  i  continue an interrupted mirror using the cache
  Y   mirror ALL links located in the first level pages (mirror links) (--mirrorlinks)

Proxy options:
  P  proxy use (-P proxy:port or -P user:pass@proxy:port) (--proxy <param>)
 %f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=N])

Limits options:
  rN set the mirror depth to N (* r9999) (--depth[=N])
 %eN set the external links depth to N (* %e0) (--ext-depth[=N])
  mN maximum file length for a non-html file (--max-files[=N])
  mN,N'                  for non html (N) and html (N')
  MN maximum overall size that can be uploaded/scanned (--max-size[=N])
  EN maximum mirror time in seconds (60=1 minute, 3600=1 hour) (--max-time[=N])
  AN maximum transfer rate in bytes/seconds (1000=1kb/s max) (--max-rate[=N])
 %cN maximum number of connections/seconds (*%c10)
  GN pause transfer if N bytes reached, and wait until lock file is deleted (--max-pause[=N])

Flow control:
  cN number of multiple connections (*c8) (--sockets[=N])
  TN timeout, number of seconds after a non-responding link is shutdown (--timeout)
  RN number of retries, in case of timeout or non-fatal errors (*R1) (--retries[=N])
  JN traffic jam control, minimum transfert rate (bytes/seconds) tolerated for a link (--min-rate[=N])
  HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow (--host-control[=N])

Links options:
 %P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=N])
  n  get non-html files 'near' an html file (ex: an image located outside) (--near)
  t  test all URLs (even forbidden ones) (--test)
 %L <file> add all URL located in this text file (one URL per line) (--list <param>)

Build options:
  NN structure type (0 *original structure, 1+: see below) (--structure[=N])
     or user defined structure (-N "%h%p/%n%q.%t")
  LN long names (L1 *long names / L0 8-3 conversion) (--long-names[=N])
  KN keep original links (e.g. http://www.adr/link) (K0 *relative link, K absolute links, K3 absolute URI links) (--keep-links[=N])
  x  replace external html links by error pages (--replace-external)
 %x  do not include any password for external password protected websites (%x0 include) (--no-passwords)
 %q *include query string for local files (useless, for information purpose only) (%q0 don't include) (--include-query-string)
  o *generate output html file in case of error (404..) (o0 don't generate) (--generate-errors)
  X *purge old files after update (X0 keep delete) (--purge-old[=N])

Spider options:
  bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
  u  check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (--check-type[=N])
  j *parse scripts (j0 don't parse) (--parse-java[=N])
  sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) (--robots[=N])
 %h  force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (--http-10)
 %B  tolerant requests (accept bogus responses on some servers, but not standard!) (--tolerant)
 %s  update hacks: various hacks to limit re-transfers when updating (identical size, bogus response..) (--updatehack)
 %A  assume that a type (cgi,asp..) is always linked with a mime type (-%A php3=text/html) (--assume <param>)

Browser ID:
  F  user-agent field (-F "user-agent name") (--user-agent <param>)
 %F  footer string in Html code (-%F "Mirrored [from host %s [file %s [at %s]]]" (--footer <param>)
 %l  preferred language (-%l "fr, en, jp, *" (--language <param>)

Log, index, cache
  C  create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before) (--cache[=N])
  k  store all files in cache (not useful if files on disk) (--store-all-in-cache)
 %n  do not re-download locally erased files (--do-not-recatch)
 %v  display on screen filenames downloaded (in realtime) (--display)
  Q  no log - quiet mode (--do-not-log)
  q  no questions - quiet mode (--quiet)
  z  log - extra infos (--extra-log)
  Z  log - debug (--debug-log)
  v  log on screen (--verbose)
  f *log in files (--file-log)
  f2 one single log file (--single-log)
  I *make an index (I0 don't make) (--index)
 %I  make an searchable index for this mirror (* %I0 don't make) (--search-index)

Expert options:
  pN priority mode: (* p3) (--priority[=N])
      0 just scan, don't save anything (for checking links)
      1 save only html files
      2 save only non html files
     *3 save all files
      7 get html files before, then treat other files
  S  stay on the same directory
  D *can only go down into subdirs
  U  can only go to upper directories
  B  can both go up&down into the directory structure
  a *stay on the same address
  d  stay on the same principal domain
  l  stay on the same TLD (eg: .com)
  e  go everywhere on the web
 %H  debug HTTP headers in logfile (--debug-headers)

Guru options: (do NOT use)
 #0  Filter test (-#0 '*.gif' 'www.bar.com/foo.gif')
 #f  Always flush log files
 #FN Maximum number of filters
 #h  Version info
 #K  Scan stdin (debug)
 #L  Maximum number of links (-#L1000000)
 #p  Display ugly progress information
 #P  Catch URL
 #R  Old FTP routines (debug)
 #T  Generate transfer ops. log every minutes
 #u  Wait time
 #Z  Generate transfer rate statistics every minutes
 #!  Execute a shell command (-#! "echo hello")

Command-line specific options:
  V execute system command after each files ($0 is the filename: -V "rm \$0") (--userdef-cmd <param>)
 %U run the engine with another id when called as root (-%U smith) (--user <param>)

Details: Option N
  N0 Site-structure (default)
  N1 HTML in web/, images/other files in web/images/
  N2 HTML in web/HTML, images/other in web/images
  N3 HTML in web/,  images/other in web/
  N4 HTML in web/, images/other in web/xxx, where xxx is the file extension
(all gif will be placed onto web/gif, for example) N5 Images/other in web/xxx and HTML in web/HTML N99 All files in web/, with random names (gadget !) N100 Site-structure, without www.domain.xxx/ N101 Identical to N1 except that "web" is replaced by the site's name N102 Identical to N2 except that "web" is replaced by the site's name N103 Identical to N3 except that "web" is replaced by the site's name N104 Identical to N4 except that "web" is replaced by the site's name N105 Identical to N5 except that "web" is replaced by the site's name N199 Identical to N99 except that "web" is replaced by the site's name N1001 Identical to N1 except that there is no "web" directory N1002 Identical to N2 except that there is no "web" directory N1003 Identical to N3 except that there is no "web" directory (option set for g option) N1004 Identical to N4 except that there is no "web" directory N1005 Identical to N5 except that there is no "web" directory N1099 Identical to N99 except that there is no "web" directory Details: User-defined option N %n Name of file without file type (ex: image) (--do-not-recatch) %N Name of file, including file type (ex: image.gif) %t File type (ex: gif) %p Path [without ending /] (ex: /someimages) %h Host name (ex: www.example.com) (--http-10) %M URL MD5 (128 bits, 32 ascii bytes) %Q query string MD5 (128 bits, 32 ascii bytes) %q small query string MD5 (16 bits, 4 ascii bytes) (--include-query-string) %s? Short name version (ex: %sN) %[param] param variable in query string Shortcuts: --mirror <URLs> *make a mirror of site(s) (default) --get <URLs> get the files indicated, do not seek other URLs (-qg) --list <text file> add all URL located in this text file (-%L) --mirrorlinks <URLs> mirror all links in 1st level pages (-Y) --testlinks <URLs> test links in pages (-r1p0C0I0t) --spider <URLs> spider site(s), to test links: reports Errors & Warnings (-p0C0I0t) --testsite <URLs> identical to --spider --skeleton <URLs> make a mirror, but gets only html files (-p1) --update update a mirror, without confirmation (-iC2) --continue continue a mirror, without confirmation (-iC1) --catchurl create a temporary proxy to capture an URL or a form post URL --clean erase cache & log files --http10 force http/1.0 requests (-%h) example: httrack www.example.com/bob/ means: mirror site www.example.com/bob/ and only this site example: httrack www.example.com/bob/ www.anothertest.com/mike/ +*.com/*.jpg means: mirror the two sites together (with shared links) and accept any .jpg files on .com sites example: httrack www.example.com/bob/bobby.html +* -r6 means get all files starting from bobby.html, with 6 link-depth, and possibility of going everywhere on the web example: httrack www.example.com/bob/bobby.html --spider -P proxy.myhost.com:8080 runs the spider on www.example.com/bob/bobby.html using a proxy example: httrack --update updates a mirror in the current folder example: httrack --continue continues a mirror in the current folder HTTrack version 3.03BETAo4 (compiled Jul 1 2001) Copyright (C) 1998-2013 Xavier Roche and other contributors [compiled: Linux linux 2.2.18 #9 SMP Sat Dec 30 09:51:39 CET 2000 i586 unknown]

For many of you, the manual is now complete, but for the rest of us, I will now go through this listing one item at a time with examples... I will be here a while...


Syntax

httrack <URLs> [-option] [+<FILTERs>] [-<FILTERs>] 

The syntax of httrack is quite simple. You specify the URLs you wish to start the process from (<URLS>), any options you might want to add ([-option], any filters specifying places you should ([+<FILTERs>]) and should not ([-<FILTERs>]) go, and end the command line by pressing <enter>. Httrack then goes off and does your bidding. For example:


httrack www.all.net/bob/

This will use the 'defaults' (those selections from the help page marked with '*' in the listing above) to image the web site. Specifically, the defauls are:

  w *mirror web sites
 %f *use proxy for ftp (f0 don't use)
  cN number of multiple connections (*c8)
  RN number of retries, in case of timeout or non-fatal errors (*R1)
 %P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use)
  NN  name conversion type (0 *original structure, 1+: see below)
  LN  long names (L1 *long names / L0 8-3 conversion)
  K   keep original links (e.g. http://www.adr/link) (K0 *relative link)
  o *generate output html file in case of error (404..) (o0 don't generate)
  X *purge old files after update (X0 keep delete)
  bN  accept cookies in cookies.txt (0=do not accept,* 1=accept)
  u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
  j *parse scripts (j0 don't parse)
  sN  follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
  C  create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)
  f *log file mode
  I *make an index (I0 don't make)
  pN priority mode: (* p3)  *3 save all files
  D  *can only go down into subdirs
  a  *stay on the same address
  --mirror      <URLs> *make a mirror of site(s) (default)

Here's what all of that means:

      w *mirror web sites 

    Automatically go though each URL you download and look for links to other URLs inside it, dowloading them as well.

     %f *use proxy for ftp (f0 don't use) 

    If there are and links to ftp URLs (URLs using the file transfer protocol (FTP) rather than the hypertext transfer protocol HTTP), go through an ftp proxy server to get them.

      cN number of multiple connections (*c8) 

    Use up to 8 simultaneous downloads so that at any gioven time, up to 8 URLs may be underway.

      RN number of retries, in case of timeout or non-fatal errors (*R1) 

    Retry once if anything goes wrong with a download.

     %P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) 

    Try to parse all URLs - even if they are in Javascript, Java, tags of unknown types, or anywhere else the program can find things.

      NN  name conversion type (0 *original structure, 1+: see below) 

    Use the original directory and file structure of the web site in your mirror image of the site.

      LN  long names (L1 *long names / L0 8-3 conversion) 

    If filenames do not follow the old DOS conventions, store them with the same names used on the web site.

      K   keep original links (e.g. http://www.adr/link) (K0 *relative link) 

    Use relative rather than the original links so that URLs within this web site are adjusted to point to the files in the mirror.

      o *generate output html file in case of error (404..) (o0 don't generate) 

    IF there are errors in downloading, create a file that indicates that the URL was not found. This makes browsing go a lot smoother.

      X *purge old files after update (X0 keep delete) 

    Files not found on the web site that were previously there get deleted so that you have an accurate snapshot of the site as it is today - losing historical data.

      bN  accept cookies in cookies.txt (0=do not accept,* 1=accept) 

    Accept all cokkies sent to you and return them if requested. This is required for many sites to function. These cookies are only kept relative to the specific site, so you don't have to worry about your browser retaining them.

      u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) 

    This causes different document types to be analyzed differently.

      j *parse scripts (j0 don't parse) 

    This causes scripts to be parsed looking for URLs.

      sN  follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) 

    This tells the program to follow the wishes of the site owner with respect to limiting where robots like this one search.

      C  create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before) 

    If you are downloading a site you have a previous copy of, supplemental parameters are transmitted to the server, for example the 'If-Modified-Since:' field will be used to see if files are newer than the last copy you have. If they are newer, they will be downloaded, otherwise, they will not.

      f *log file mode 

    This retains a detailed log of any important events that took place.

      I *make an index (I0 don't make) 

    This makes a top-level index.html file so that if you image a set of sites, you can have one place to start reviewing the set of sites.

      pN priority mode: (* p3)  *3 save all files 

    This will cause all downloaded files to be saved.

      D  *can only go down into subdirs 

    This prevents the program from going to higher level directories than the initial subdirectory, but allows lower-level subdirectories of the starting directory to be investigated.

      a  *stay on the same address 

    This indicates that only the web site(s) where the search started are to be collected. Other sites they point to are not to be imaged.

      --mirror      <URLs> *make a mirror of site(s) (default) 

    This indicates that the program should try to make a copy of the site as well as it can.

Now that's a lot of options for the default - but of course there are a lot more options to go. For the most part, the rest of the options represent variations on these themes. For example, instead of saving all files, we might only want to save html files, or instead of 8 simultaneous sessions, we might want only 4.

If we wanted to make one of these changes, we would specify the option on the command line. For example:


httrack www.all.net/bob/ -c4 -B

This would restrict httrack to only use 4 siumultaneous sessions but allow it to go up the directory structure (for example to www.all.net/joe/) as well as down it (for example to www.all.net/bob/deeper/).

You can add a lot of options to a command line!


A Thorough Going Over

Now that you have an introduction, it's time for a more though coverage. This is where I go through each of the options and describe it in detail with examples... Actually, I won't quite do that. But I will get close.

Options tend to come in groups. Each group tends to be interrelated, so it's easier and more useful to go through them a group at a time with some baseline project in mind. In my case, the project is to collect all of the information on the Internet about some given subject. We will assume that, through a previous process, I have gotten a list of URLs of interest to me. Typically there will be hundreds of these URLs, and they will be a mixed bag of sites that are full of desired information, pages with lists of pointers to other sites, URLs of portions of a web site that are of interest (like Bob's home pages and subdirectories), and so forth. Let us say that for today we are looking for the definitive colleciton of Internet information on shoe sizes from around the world.


General Options


General options:
  O  path for mirror/logfiles+cache (-O path_mirror[,path_cache_and_logfiles])

For this project, I will want to keep all of the information I gather in one place, so I will specify that output area of the project as /tmp/shoesizes by adding '-O /tmp/shoesizes' to every command line I use.. for example:


httrack http://www.shoesizes.com -O /tmp/shoesizes

The action options tell httrack how to operate at the larger level.


Action Options


Action options:
  w *mirror web sites
  W  mirror web sites, semi-automatic (asks questions)
  g  just get files (saved in the current directory)
  i  continue an interrupted mirror using the cache
  Y   mirror ALL links located in the first level pages (mirror links)

If I want httrack to ask me questions - such as what options to use, what sites to mirror, etc. I can tell it to ask these questions as follows:


httrack http://www.shoesizes.com -O /tmp/shoesizes -W


I can also do:

httrack
OR
httrack -W
OR
httrack -w

The '-W' options asks whether the or not a site has to be mirrored, while the '-w' option does not ask this question but asks the remainder of the questions required to mirror the site.

The -g option allows you to get the files exactly as they are and store them in the current directory. This is handy for a relatively small collection of information where organization isn't important. With this option, the html files will not even be parsed to look for other URLs. This option is useful for getting isolated files (e.g., httrack -g www.mydrivers.com/drivers/windrv32.exe).

If I start a collection process and it fails for one reason or another - such as me interrupting it because I am running out of disk space - or a network outage - then I can restart the process by using the -i option:

httrack http://www.shoesizes.com -O /tmp/shoesizes -i 

Finally, I can mirror all links in the first level pages of the URLs I specify. A good example of where to use whis would be in a case where I have a page that points to a lot of other sites and I want to get the initial information on those sites before mirroring them:

httrack http://www.shoesizes.com/othersites.html -O /tmp/shoesizes -Y 

Proxy Options

Many users use a proxy for many of their functions. This is a key component in many firewalls, but it is also commonly used for anonymizing access and for exploiting higher speed communications at a remote server.

Proxy options:
  P  proxy use (-P proxy:port or -P user:pass@proxy:port)
 %f *use proxy for ftp (f0 don't use)

If you are using a standard proxy that doesn't require a user ID and password, you would do something like this:

httrack http://www.shoesizes.com -O /tmp/shoesizes -P proxy.www.all.net:8080 

In this case, we have asusmed that proxy.www.all.net is the host that does the proxy service and that it uses port 8080 for this service. In some cases you will have to ask your network or firewall administrator for these details, however, in most cases they should be the same as the options used in your web browser.

In some cases, a user ID and password are required for the proxy server. This is common in corporate environments where only authorized users may access the Internet.

httrack http://www.shoesizes.com -O /tmp/shoesizes -P fc:password@proxy.www.all.net:8080 

In this case, the user ID 'fc' and the password 'password' are used on proxy.www.all.net port 8080. Again, your network or firewall administrator can be most helpful in addressing the specifics for your environment.

FTP normally operates through a proxy server, but for systems that have direct connections to the Internet, the following option should help:

httrack ftp://ftp.shoesizes.com -O /tmp/shoesizes -%f0 

Limits Options


Limits options:
  rN set the mirror depth to N
  mN maximum file length for a non-html file
  mN,N'                  for non html (N) and html (N')
  MN maximum overall size that can be uploaded/scanned
  EN maximum mirror time in seconds (60=1 minute, 3600=1 hour)
  AN maximum transfer rate in bytes/seconds (1000=1kb/s max)
  GN pause transfer if N bytes reached, and wait until lock file is deleted
  %eN set the external links depth to N (* %e0) (--ext-depth[=N])
  %cN maximum number of connections/seconds (*%c10)

Setting limits provides the means by which you can avoid running out of disk space, CPU time, and so forth. This may be particularly helpful for those who accidentally try to image the whole Internet.


httrack http://www.shoesizes.com -O /tmp/shoesizes -r50

In this example, we limit the directlry depth to 50 levels deep. As a general rule, web sites don't go much deeper than 20 levels or so, and if you think about it, if there are only 2 subdirectories per directory level, a directory structure 50 deep would have about 10 trillion directories. Of course many sites have a small number of files many levels deep in a directory structure for various reasons. In some cases, a symbolic link will cause an infinite recursion of directory levels as well, so placing a limit may be advisable.


httrack http://www.shoesizes.com -O /tmp/shoesizes -m50000000

This example sets the maximum file length for non-HTML files to 50 megabytes. This is not an unusual length for things like tar files, and in some cases - for example when there are images of CD-ROMs to fetch from sites, you might want a limit more like 750 megabytes.


httrack http://www.shoesizes.com -O /tmp/shoesizes -m50000000,100000

In this example, we have set a limit for html files as well - at 100,000 bytes. HTML files are rarely larger than this, however, in some cases larger sizes may be needed.


httrack http://www.shoesizes.com -O /tmp/shoesizes -M1000000000

This option sets the maximum total size - in bytes - that can be uploaded from a site - in this case to 1 gigabyte. Depending on how much disk space you have, such an option may be worthwhile.


httrack http://www.shoesizes.com -O /tmp/shoesizes -E3600

This sets the maximum runtime for the download process. Of course depending on the speed of your connection it may take longer or shorter runtimes to get the same job done, and network traffic is also a factor. 3600 seconds corresponds to one hour.


httrack http://www.shoesizes.com -O /tmp/shoesizes A100000000

This option specifies the largest number of bytes per second that should be used for transfers. For example, you might want to go slow for some servers that are heavily loaded in the middle of the day, or to download slowly so that the servers at the other end are less likely to identify you as mirroring their site. The setting above limits my bandwidth to 100 million bytes per second - slow I know, but I wouldn't want to stress the rest of the Internet.


httrack http://www.shoesizes.com -O /tmp/shoesizes -G100000000

In this case, the G option is used to 'pause' a download after the first gigabyte is downloaded pending manual removal of the lockfile. This is handy of you want to download some portion of the data, move it to secondary storage, and then continue - or if you want to only download overnight and want to stop before daylight and continue the next evening. You could even combine this option with a cron job to remove the lock file so that the job automatically restarts at 7PM every night and gets another gigabyte.


httrack http://www.shoesizes.com -O /tmp/shoesizes %e5

In this case, httrack will only go to depth 5 for external links, thus not imaging the entire web, but only yhose links within 5 links of these web pages.

Also note that the interaction of these options may cause unintended consequences. For example, limiting bandwidth and download time conspire to limit the total amount of data that can be downloaded.


Flow Control Options


Flow control:
  cN number of multiple connections (*c8)
  %cN maximum number of connections/seconds (*%c10)
  TN timeout, number of seconds after a non-responding link is shutdown
  RN number of retries, in case of timeout or non-fatal errors (*R1)
  JN traffic jam control, minimum transfert rate (bytes/seconds) tolerated for a link
  HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow


This example allows up to 128 simultaneous downloads. Note that this is likely to crash remote web servers - or at least fail to download many of the files - because of limits on the number of simultaneous sessions at many sites. At busy times of day, you might want to lower this to 1 or 2, especially at sites that limit the number of simultaneous users. Otherwise you will not get all of the downloads.


httrack http://www.shoesizes.com -O /tmp/shoesizes -c128

Many operating systems have a limit of 64 file handles, including internet connections and all other files that can be opened. Therefore, in many cases, more that 48 connections might cause a "socket error" because the OS can not handle that many sockets. This is also true for many servers. As an example, a test with 48 sockets on a cgi-based web server (Pentium 166,80Meg RAM) overloaded the machine and stopped other services from running correctly. Some servers will ban users that try to brutally download the website. 8 sockets is generally good, but when I'm getting large files (e.g., from a a site with large graphical images) 1 or 2 sockets is a better selection. Here are some other figures from one sample set of runs:

    Tests: on a 10/100Mbps network, 30MB website, 99 files (70 images (some are
    little, other are big (few MB)), 23 HTML)
    With 8 sockets: 1,24MB/s
    With 48 sockets: 1,30MB/s
    With 128 sockets: 0,93MB/s
    

This limits the number of connections per second. It is similar to the above option but allows the pace to be controlled rather than the simultanaety. It is particulsrly useful for long-term pulls at low rates that allow little impact on remote infrastructure. The default is 10 connections per second.


httrack http://www.shoesizes.com -O /tmp/shoesizes -%c20

The timeout option causes downloads to time out after a non-response from a download attempt. 30 seconds is pretty reasonable for many sites. You might want to increase the number of retries as well so that you try again and again after such timeouts.


httrack http://www.shoesizes.com -O /tmp/shoesizes -T30

This example increases the number of retries to 5. This means that if a download fails 5 times, httrack will give up on it. For relatively unreliable sites - or for busy times of day, this number should be higher.


httrack http://www.shoesizes.com -O /tmp/shoesizes -R5

This is an interesting option. It says that in a traffic jam - where downloads are excessively slow - we might decide to back off the download. In this case, we have limited downloads to stop bothering once we reach 10 bytes per second.


httrack http://www.shoesizes.com -O /tmp/shoesizes -J10

These three options will cause the download from a host to be abandoned if (respectively) (0) never, (1) a timeout is reached, (2) slow traffic is detected, (or) (3) a timeout is reached OR slow traffic is detected.


httrack http://www.shoesizes.com -O /tmp/shoesizes -H0
httrack http://www.shoesizes.com -O /tmp/shoesizes -H1
httrack http://www.shoesizes.com -O /tmp/shoesizes -H2
httrack http://www.shoesizes.com -O /tmp/shoesizes -H3

Of course these options can be combined to provide a powerful set of criteria for when to continue a download and when to give it up, how hard to push other sites, and how much to stress infrastructures.


Link Following Options


Links options:
 %P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use)
  n   get non-html files 'near' an html file (ex: an image located outside)
  t   test all URLs (even forbidden ones)
 %L <file> add all URL located in this text file (one URL per line)

The links options allow you to control what links are followed and what links are not as well as to provide long lists of links to investigate. Any setting other than the default for this option forces the engine to use less reliable and more complex parsing. 'Dirty' parsing means that links like 'xsgfd syaze="foo.gif"' will cause HTTrack to download foo.gif, even if HTTrack don't know what the "xsgfd syaze=" tag actually means! This option is powerful because some links might otherwise be missed, but it can cause errors in HTML or javascript.

This will direct the program to NOT search Javascript for unknown tag fields (e.g., it will find things like foo.location="bar.html"; but will not find things like bar="foo.gif";). While I have never had a reason to use this, some users may decide that they want to be more conservative in their searches. As a note, javascript imported files (.js) are not currently searched for URLs.


httrack http://www.shoesizes.com -O /tmp/shoesizes '%P0'

Now here is a classic bit of cleverness that 'does the right thing' for some cases. In this instance, we are asking httrack to get images - like gif and jpeg files that are used by a web page in its display, even though we would not normally get them. For example, if we were only getting a portion of a web site (e.g., everything under the 'bob directory') we might want to get graphics from the rest of the web sote - or the rest of the web - that are used in those pages as well so that our mirror will look right.


httrack http://www.shoesizes.com -O /tmp/shoesizes -n

Here, we limit the collection to bob's area of the server - except that we get images and other such things that are used by bob in his area of the server.


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -n

This option 'tests' all links - even those forbidden (by the robot exclusion protocol) - by using the 'HEAD' protocol to test for the presence of a file.


httrack http://www.shoesizes.com/ -O /tmp/shoesizes -t

In this case, we use a file to list the URLs we wish to mirror. This is particularly useful when we have a lot to do and don't want to tirelessly type in URLs on command line after command line. It's also useful - for example - if you update a set of mirrored sites evey evening. You can set up a command like this to run automatically from your cron file.


httrack -%L linkfile -O /tmp/shoesizes

This will update the mirror of your list of sites whenever it is run.


httrack -%L linkfile -O /tmp/shoesizes -B --update

The link file is also useful for things like this example where, after a binary image of a hard disk was analyzed (image) URLs found on that disk were collected by httrack:


strings image | grep "http://" > list;
httrack -%L list -O /tmp/shoesizes

Mirror Build Options


Build options:
  NN  name conversion type (0 *original structure, 1+: see below)
  N   user defined structure (-N "%h%p/%n%q.%t")
  LN  long names (L1 *long names / L0 8-3 conversion)
  K   keep original links (e.g. http://www.adr/link) (K0 *relative link)
  x   replace external html links by error pages
  o *generate output html file in case of error (404..) (o0 don't generate)
  X *purge old files after update (X0 keep delete)
  %x  do not include any password for external password protected websites (%x0 include) (--no-passwords)
  %q *include query string for local files (information only) (%q0 don't include) (--include-query-string)

The user can define naming conventions for building the mirror of a site by using these options. For example, to retain the original structure, the default is used. This only modifies the structure to the extent that select characters (e.g., ~, :, <, >, \, and @) are replaced by _ in all pathnames.


httrack http://www.shoesizes.com -O /tmp/shoesizes -N0

OR


httrack http://www.shoesizes.com -O /tmp/shoesizes

In either case, the mirror will build with the same directory hierarchy and name structure as the original site. For cases when you want to define your own structure, you use a string like this:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -N "%h%p/%n.%t"

In this case, %h, %p, $n, and %t stand for the href element (e.g., http://www.shoesizes.com or ftp://ftp.shoesizes.com), %p stands for the pathname (e.g., /bob/), %n stands for the name of the file, and %t stands for type (file extension). The full list of these options follows:

    %n      Name of file without file type (ex: image)
    %N      Name of file, including file type (ex: image.gif)
    %t      File type (ex: gif)
    %p      Path [without ending /] (ex: /someimages)
    %h      Host name (ex: www.all.net)
    %M      URL MD5 (128 bits, 32 ascii bytes)
    %Q      query string MD5 (128 bits, 32 ascii bytes)
    %q      small query string MD5 (16 bits, 4 ascii bytes)
    %s?     Short name version (ex: %sN)
    

Other 'N' options include:

    
    Details: Option N
      N0 Site-structure (default)
      N1 HTML in web/, images/other files in web/images/
      N2 HTML in web/HTML, images/other in web/images
      N3 HTML in web/,  images/other in web/
      N4 HTML in web/, images/other in web/xxx, where xxx is the file extension
    (all gif will be placed onto web/gif, for example) N5 Images/other in web/xxx and HTML in web/HTML N99 All files in web/, with random names (gadget !) N100 Site-structure, without www.domain.xxx/ N101 Identical to N1 except that "web" is replaced by the site's name N102 Identical to N2 except that "web" is replaced by the site's name N103 Identical to N3 except that "web" is replaced by the site's name N104 Identical to N4 except that "web" is replaced by the site's name N105 Identical to N5 except that "web" is replaced by the site's name N199 Identical to N99 except that "web" is replaced by the site's name N1001 Identical to N1 except that there is no "web" directory N1002 Identical to N2 except that there is no "web" directory N1003 Identical to N3 except that there is no "web" directory (option set for g option) N1004 Identical to N4 except that there is no "web" directory N1005 Identical to N5 except that there is no "web" directory N1099 Identical to N99 except that there is no "web" directory

Long names are normally used (the -L0 option) but if you are imaging to a DOS file system or want accessibility from older versions of DOS and Windows, you can use the -L1 option to generate these filename sizes.


httrack http://www.shoesizes.com -O /tmp/shoesizes -L1

With the 'K' option, you can keep the original links in files. While this is less useful in being able to view a web site froim the mirrored copy, it is vitally important if you want an accurate copy of exactly what was on the web site in the first place. In a forensic image, for example, you might want to use this option to prevent the program from modifying the data as it is collected.


httrack http://www.shoesizes.com -O /tmp/shoesizes -K

In this case, instead of leaving external links (URLs that point to sites not being mirrored) in the pages, these links are replaced by pages that leave messages indicating that they could not be found. This is useful for local mirrors not on the Internet or mirrors that are on the Internet but that are not supposed to lead users to external sites. A really good use for this is that 'bugging' devices placed in web pages to track who is using them and from where will be deactivated byt his process.


httrack http://www.shoesizes.com -O /tmp/shoesizes -x

This option prevents the generation of '404' error files to replace files that were not found even though there were URLs pointing to them. It is useful for saving space as well as eliminating unnecessary files in operations where a working web site is not the desired result.


httrack http://www.shoesizes.com -O /tmp/shoesizes -o0

This option prevents the authoatic purging of files from the mirror site that were not found in the original web site after an 'update' is done. If you want to retain old data and old names for files that were renamed, this option should be used. If you want an up-to-date reflection of the current web site, you should not use this option.


httrack http://www.shoesizes.com -O /tmp/shoesizes -X0

These options can be combined as desired to produce a wide range of different arrangements, from collections of only graphical files stored in a graphics area, to files identified by their MD5 checksums only, all stored in the same directory.


httrack http://www.shoesizes.com -O /tmp/shoesizes %x0 include

This will not include passwords for web sites. If you mirror http://smith_john:foobar@www.privatefoo.com/smith/, and exclude using filters some links, these links will be by default rewritten with password data. For example, "bar.html" will be renamed into http://smith_john:foobar@www.privatefoo.com/smith/bar.html This can be a problem if you don't want to disclose the username/password! The %x option tell the engine not to include username/password data in rewritten URLs.


httrack http://www.shoesizes.com -O /tmp/shoesizes %q

This option is not very useful, because parameters are useless, as pages are not dynamic anymore when mirrored. But some javascript code may use the query string, and it can give useful information. For example: catalog4FB8.html?page=computer-science is clearer than catalog4FB8.html Therefore, this option is activated by default.


Spider Options

These options provide for automation with regard to the remote server. For example, some sites require that cookies be accepted and sent back in order to allow access.


Spider options:
 bN  accept cookies in cookies.txt (0=do not accept,* 1=accept)
 u   check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
 j   *parse scripts (j0 don't parse)
 sN  follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
 %h  force HTTP/1.0 requests (reduce update features, only for old servers or proxies)
 %B  tolerant requests (accept bogus responses on some servers, but not standard!)
 %s  update hacks: various hacks to limit re-transfers when updating
 %A  assume that a type (cgi,asp..) is always linked with a mime type (-%A php3=text/html) (--assume <param>)

By default, cookies are universally accepted and returned. This makes for more effective collection of data, but allows the site to be identified with its collection of data more easily. To disable cookies, use this option:


httrack http://www.shoesizes.com -O /tmp/shoesizes -b0

Some documents have known extension types (e.g., html), while others have unknown types (e.g., iuh87Zs) and others may have misleading types (e.g., an html file with a 'gif' file extension. These options provide for (0) not checking file types, (1) checking all file types except directories, and (2) checking all file types including directories. Choose from these options:


httrack http://www.shoesizes.com -O /tmp/shoesizes -u0
httrack http://www.shoesizes.com -O /tmp/shoesizes -u1
httrack http://www.shoesizes.com -O /tmp/shoesizes -u2

Meta tags or 'robots.txt' files on a web site are used to indicate what files should and should not be visited by automatic programs when collectiong data. The polite and prudent move for normal data collection (and the default) is to follow this indication:


httrack http://www.shoesizes.com -O /tmp/shoesizes -s2

This follows the robots protocol and meta-tags EXCEPT in cases where the filters disagree with the robots protocols or meta-tags.


httrack http://www.shoesizes.com -O /tmp/shoesizes -s1

In this next case, we ignore meta-tags and robots.txt files completely and just take whatever we can get from the site. The danger of this includes the fact that automated programs - like games or search engines may generate an unlimited number of nearly identical or identical outputs that will put us in an infinite loop collecting useless data under different names. The benefit is that we will get all the data there is to get.


httrack http://www.shoesizes.com -O /tmp/shoesizes -s0

This next option uses strict HTTP/1.0 protocol. This means the program will use HTTP/1.0 headers (as in RFC1945.TXT) and NOT extended 1.1 features described in RFC2616.TXT. For example, reget (complete a partially downloaded file) is a HTTP/1.1 feature. The Etag feature is also a HTTP/1.1 feature (Etag is a special identifier that allow to easily detect file changes).


httrack http://www.shoesizes.com -O /tmp/shoesizes -%h

Some servers give responses not strictly within the requirements of the official http protocol. These 'Bogus' responses can be accepted by using this option. For example, when requesting foo.gif (5132 bytes), the server can, optionally, add:

Content-length: 5132

This helps the client by allowing it to reserve a block of memory, instead of collecting each byte and re-reserving memory each time data is being received. But some servers are bogus, and send a wrong filesize. When HTtrack detects the end of file (connection broken), there are three cases:

    1- The connection has been closed by the server, and we have received all data (we have received the number of bytes incicated by the server). This is fine because we have successfully received the file.

    2- The connection has been closed by the server, BUT the filesize received is different from the server's headers: the connection has been suddenly closed, due to network problems, so we reget the file

    3- The connetion has been closed by the server, the filesize received is different from the server's headers, BUT the file is complete, because the server gave us a WRONG information! In this case, we use the bogus server option:


httrack http://www.shoesizes.com -O /tmp/shoesizes -%B

These options can be combined for the particular needs of the situaiton and are often adapted as a result of site-specific experiences.


httrack http://www.shoesizes.com -O /tmp/shoesizes -%s

This is a collection of "tricks" which are not really "RFC compliant" but which can save bandwidth by trying not to retransfer data in several cases.


httrack http://www.shoesizes.com -O /tmp/shoesizes -%A asp=text/html

The most important new feature for some people, maybe. This option tells the engine that if a link is en countered, with a specific type (.cgi, .asp, or .php3 for example), it MUST assume that this link has always the same MIME type, for example the "text/html" MIME type. This is VERY important to speed up many mirrors.

We have done tests on big HTML files (approx. 150 MB, 150,000,000 bytes!) with 100,000 links inside. Such files are being parsed in approx. 20 seconds on my own PC by the latest optimized releases of HTTra ck. But these tests have been done with links of known types, that is, html, gif, and so on.. If you have, say, 10,000 links of unknown type, such as ".asp", this will cause the engine to test ALL t hese files, and this will SLOOOOW down the parser. In this example, the parser will take hours, instead of 20 seconds! In this case, it would be great to tell HTTrack: ".asp pages are in fact HTML pages" This is possible, using: -%A asp=text/html

The -%A option can be replaced by the alias --assume asp=text/html which is MUCH more clear. You can use multiple definitions, separated by ",", or use multiple options. Therefore, these two lines are identical:

--assume asp=text/html --assume php3=text/html --assume cgi=image/gif
--assume asp=text/html,php3=text/html,cgi=image/gif

The MIME type is the standard well known "MIME" type. Here are the most important ones:

text/html       Html files, parsed by HTTrack
image/gif       GIF files
image/jpeg      Jpeg files
image/png       PNG files

There is also a collection of "non standard" MIME types. Example:

application/x-foo       Files with "foo" type

Therefore, you can give to all files terminated by ".mp3" the MIME type: application/x-mp3

This allow you to rename files on a mirror. If you KNOW that all "dat" files are in fact "zip" files ren amed into "dat", you can tell httrack:

--assume dat=application/x-zip

You can also "name" a file type, with its original MIME type, if this type is not known by HTTrack. This will avoid a test when the link will be reached:

--assume foo=application/foobar

In this case, HTTrack won't check the type, because it has learned that "foo" is a known type, or MIME type "application/foobar". Therefore, it will let untouched the "foo" type.

A last remark, you can use complex definitions like:

--assume asp=text/html,php3=text/html,cgi=image/gif,dat=application/x-zip,mpg=application/x-mp3,application/foobar

..and save it on your .httrackrc file:

set assume asp=text/html,php3=text/html,cgi=image/gif,dat=application/x-zip,mpg=application/x-mp3,application/foobar

Browser Options

Browsers commonly leave footprints in web servers - as web servers leave footprints in the browser.


Browser ID:
  F  user-agent field (-F "user-agent name")
 %F  footer string in Html code (-%F "Mirrored [from host %s [file %s [at %s]]]"
 %l  preferred language (-%l "fr, en, jp, *" (--language <param>)

The user-agent field is used by browsers to determine what kind of browser you are using as well as other information - such as your system type and operating system version. The 'User Agent' field can be set to indicate whatever is desired to the server. In this case, we are claiming to be a netscape browser (version 1.0) running a non-exitent Solaris operating system version on a Sun Sparcstation.


httrack http://www.shoesizes.com -O /tmp/shoesizes -F "Mozilla 1.0, Sparc, Solaris 23.54.34"

On the other side, we may wish to mark each page collected with footer information so that we can see from the page where it was collected from, when, and under what name it was stored.


httrack http://www.shoesizes.com -O /tmp/shoesizes -%F "Mirrored [from host %s [file %s [at %s]]]"

This makes a modified copy of the file that may be useful in future identification. While it is not 'pure' in some senses, it may (or may not) be considered siilar to a camera that adds time and date stamps from a legal perspective.


httrack http://www.shoesizes.com -O /tmp/shoesizes -%l "fr, en, jp, *"

"I prefer to have pages with french language, then english, then japanese, then any other language"


Log, Cache, and Index Options

A lot of options are available for log files, indexing of sites, and cached results:


Log, index, cache
  C  create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)
  k  store all files in cache (not useful if files on disk)
 %n  do not re-download locally erased files
  Q  log quiet mode (no log)
  q  quiet mode (no questions)
  z  extra infos log
  Z  debug log
  v  verbose screen mode
  %v display on screen filenames downloaded (in realtime) (--display)
  f  log file mode
  f2 one single log file (--single-log)
  I  *make an index (I0 don't make)
  %I make an searchable index for this mirror (* %I0 don't make) (--search-index)

A cache memory area is used for updates and retries to make the process far more efficient than it would otherwise be. You can choose to (0) go without a cache, (1) do not check remotly if the file has been updated or not, just load the cache content, or (2) see what works best and use it (the default). Here is the no cache example.


httrack http://www.shoesizes.com -O /tmp/shoesizes -C0

The cache can be used to store all files - if desired - but if files are being stored on disk anyway (the normal process for a mirroring operation), this is not helpful.


httrack http://www.shoesizes.com -O /tmp/shoesizes -k

In some cases, a file from a mirror site is erased locally. For example, if a file contains inappropriate content, it may be erased from the mirror site but remain on the remote site. This option allows you to leave deleted files permanently deleted when you do a site update.


httrack http://www.shoesizes.com -O /tmp/shoesizes -update '%n'

If no log is desired, the following option should be added.


httrack http://www.shoesizes.com -O /tmp/shoesizes -Q

If no questions should be asked of the user (in a mode that would otherwise ask questions), the following option should be added.


httrack http://www.shoesizes.com -O /tmp/shoesizes -q

By adding these options, you get (-z) extra log information or (-Z) debugging information, and (-v) verbose screen output.


httrack http://www.shoesizes.com -O /tmp/shoesizes -z -Z -v

Multiple log files can be created, but by default, this option is used to put all logs into a single log file.


httrack http://www.shoesizes.com -O /tmp/shoesizes -f2

Finally, an index is normally made of the sites mirrored (a pointer to the first page found from each specified URL) in an index.html file in the project directory. This can be prevented through the use of this option:


httrack http://www.shoesizes.com -O /tmp/shoesizes -I0

httrack http://www.shoesizes.com -O /tmp/shoesizes %v

Animated information when using console-based version, example:

17/95: localhost/manual/handler.html (6387 bytes) - OK

httrack http://www.shoesizes.com -O /tmp/shoesizes f2

Do not split error and information log (hts-log.txt and hts-err.txt) - use only one file (hts-log.txt)


httrack http://www.shoesizes.com -O /tmp/shoesizes -%I linux.localdomain

Still in testing, this option asks the engine to generate an index.txt, useable by third-party programs or scripts, to index all words contained in html files. The above example will produce index.txt:

..
abridged
        1 linux/manual/misc/API.html
        =1
        (0)
absence
        3 linux/manual/mod/core.html
        2 linux/manual/mod/mod_imap.html
        1 linux/manual/misc/nopgp.html
        1 linux/manual/mod/mod_proxy.html
        1 linux/manual/new_features_1_3.html
        =8
        (0)
absolute
        3 linux/manual/mod/mod_auth_digest.html
        1 linux/manual/mod/mod_so.html
        =4
        (0)
..

Expert User Options

For expert users, the following options provide further options.


Expert options:
  pN priority mode: (* p3)
      0 just scan, don't save anything (for checking links)
      1 save only html files
      2 save only non html files
     *3 save all files
      7 get html files before, then treat other files
  S   stay on the same directory
  D  *can only go down into subdirs
  U   can only go to upper directories
  B   can both go up&down into the directory structure
  a  *stay on the same address
  d   stay on the same principal domain
  l   stay on the same location (.com, etc.)
  e   go everywhere on the web
 %H  debug HTTP headers in logfile

One interesting application allows the mirror utility to check for valid and invalid links on a site. This is commonly used in site tests to look for missing pages or other html errors. I often run such programs against my web sites to verify that nothing is missing.


httrack http://www.shoesizes.com -O /tmp/shoesizes -p0

To check for valid links outside of a site, the '-t' option can be used:


httrack http://www.shoesizes.com -O /tmp/shoesizes -t

These options can be combined, for example, to provide a service that checks sites for validity of links and reports back a list of missing files and statistics.

Other options allow the retention of select files - for example - (1) only html files, (2) only non-html files, (3) all files, and (7) get all html files first, then get other files. This last option provides a fast way to get the web pointers so that, for example, a time limited collection process will tend to get the most important content first.

In many cases, we only want the files froma given directory. In this case, we specify this option:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -S

This option allows the mirror to go only into subdirectories of the initial directory on the remote host. You might want to combine it with the -n option to get all non-html files linked from the pages you find.


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -D -n

If you only want to work your way up the directory structure from the specified URL (don't ask me why you might want to do this), the following command line is for you:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -U

If you want to go both up and down the directory structure (i.e., anywhere on on this site that the requested page leads you to), this option will be best:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -B

The default is to remain on the same IP address - or host name. This option specifes this explicitly:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -a

If you want to restrict yourself only to the same principal domain (e.g., include sites liks ftp.shoesizes.com), you would use this option.


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -d

To restrict yourself to the same major portion of the Internet (e.g., .com, .net, .edu, etc.) try this option:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -l

Finally, if you want to mirror the whole Internet - at least every place on the internet that is ever led to - either directly or indirectly - from the starting point, use this one... Please note that this will almost always run you out of resources unless you use other options - like limiting the depth of search.


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -e

Last but not least, you can include debugging informaiton on all headers from a collection process by using this option:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -'%H'

The options S, D, U, B, a, d, l, and e can be replaces with filter options approximately as follows:


S     -www.foo.com/* +www.foo.com/bar/*[file]
D     (default)
U     +www.foo.com/bar/* -www.foo.com/*[name]/*
B     +www.foo.com/bar/*
a     (default)
d     +*[name].foo.com/*
l     +*[name].com/*
e     +* (this is crazy unless a depth limit is used!)

Guru Options - DO NOT USE!!!

This is a new section, for all "not very well documented options". You can use them, in fact, do not believe what is written above!

 #0  Filter test (-#0 '*.gif' 'www.bar.com/foo.gif')

To test the filter system. Example:

$ httrack -#0 'www.*.com/*foo*bar.gif' 'www.mysite.com/test/foo4bar.gif'
www.mysite.com/test/foo4bar.gif does match www.*.com/*foo*bar.gif
 #f  Always flush log files

Useful if you want the hts-log.txt file to be flushed regularly (not buffered)

 #FN Maximum number of filters

Use if if you want to use more than the maximum default number of filters, that is, 500 filters: -#F2000 for 2,000 filters

 #h  Version info

Informations on the version number

 #K  Scan stdin (debug)

Not useful (debug only)

 #L  Maximum number of links (-#L1000000)

Use if if you want to use more than the maximum default number of links, that is, 100,000 links: -#L2000000 for 2,000,000 links

 #p  Display ugly progress information

Self-explanatory :) I will have to improve this one

 #P  Catch URL

"Catch URL" feature, allows to setup a temporary proxy to capture complex URLs, often linked with POST action (when using form based authentication)

 #R  Old FTP routines (debug)

Debug..

 #T  Generate transfer ops. log every minutes

Generate a log file with transfer statistics

 #u  Wait time

"On hold" option, in seconds

 #Z  Generate transfer rate statistics every minutes

Generate a log file with transfer statistics

 #!  Execute a shell command (-#! "echo hello")

Debug..


Command-line Specific Options


Command-line specific options:
  V execute system command after each files ($0 is the filename: -V "rm \$0") (--userdef-cmd <param>)

This option is very nice for a wide array of actions that might be based on file details. For example, a simple log of all files collected could be generated by using:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes -V "/bin/echo \$0"
 %U run the engine with another id when called as root (-%U smith) (--user <param>)

Change the UID of the owner when running as r00t

  Details: User-defined option N
    %[param] param variable in query string

This new option is important: you can include query-string content when forming the destination filename!

Example: you are mirroring a huge website, with many pages named as:
www.foo.com/catalog.php3?page=engineering
www.foo.com/catalog.php3?page=biology
www.foo.com/catalog.php3?page=computing
..

Then you can use the -N option:

httrack www.foo.com -N "%h%p/%n%[page].%t"

If found, the "page" parameter will be included after the filename, and the URLs above will be saved as:

/home/mywebsites/foo/www.foo.com/catalogengineering.php3
/home/mywebsites/foo/www.foo.com/catalogbiology.php3
/home/mywebsites/foo/www.foo.com/catalogcomputing.php3
...

Shortcuts

These options provide shortcust to combinations of other options that are commonly used.


Shortcuts:
--mirror      <URLs> *make a mirror of site(s) (default)
--get         <URLs>  get the files indicated, do not seek other URLs (-qg)
--list   <text file>  add all URL located in this text file (-%L)
--mirrorlinks <URLs>  mirror all links in 1st level pages (-Y)
--testlinks   <URLs>  test links in pages (-r1p0C0I0t)
--spider      <URLs>  spider site(s), to test links: reports Errors & Warnings (-p0C0I0t)
--testsite    <URLs>  identical to --spider
--skeleton    <URLs>  make a mirror, but gets only html files (-p1)
--update              update a mirror, without confirmation (-iC2)
--continue            continue a mirror, without confirmation (-iC1)
--catchurl            create a temporary proxy to capture an URL or a form post URL
--clean               erase cache & log files
--http10              force http/1.0 requests (-%h)

Mirror is the default behavior. It is detailed earlier.

get simply gets the files specified on the command line.

The list option is useful for including a list of sites to collect data from.

The mirrorlinks option is ideal for using the result of a previous search (like a list of pages found in a web search or somebody's URL collection) to guide the collection of data. With additional options (such as depth 1) it can be used to collect all of the pages linked to a given page without going further. Here is an example:


httrack http://www.shoesizes.com/bob/ -O /tmp/shoesizes --mirrorlinks -e -r1

Testing links in pages is useful for automating the verification that a link from a file is not pointing to a non-existent page.

The spider option does a site test automatically and returns errors for broken links.

The skeleton option makes a mirror of html files only.

The update option updates a site to match a remote mirror.

The continue option continues a previously terminated mirroring activity. This is useful for all sorts of mirror failures.

The catchurl option is a small application designed to catch difficult pages, like sites protected via formulas. You can see at http://httrack.free.fr/HelpHtml/addurl.html a Windows description of this application. The purpose is to create a temporary proxy, that will catch the user request to a page, and then store this request to continue the mirror. For example,

    1. browse www.foo.com/bar/ until you have a page with a form
    2. fill this form to enter the site BUT do not click "submit"
    3. start the --catchurl application
    4. change your browser proxy settings according to the --catchurl application
    5. click on "submit" on your browser
    6. HTTrack has now captured this click and has stored it
    7. restore your proxy settings
    8. (click back in your browser)
    

The clean option erases cache and log files.

The http10 option forces http/1.0 requests (the same as -%h).


Filters

Filters are normally placed at the end of the command line, but can be intermixed with other command line options if desired, except that if they are placed between (for example) the '-O' and the pathname, your results may be different than you might otherwise predict. There are two sorts of filters, filters that indicate what to include (+) and filters that indicate what to exclude (-).

Starting with the initially specified URLs, the default operation mode is to mirror starting from these URLs downward into the directory structure of the host (i.e. if one of your starting pages was www.all.net/test/a.html, all links starting with www.all.net/test/ will be collected but links in www.all.net/anything-else will not be collected, because they are in a higher directory strcuture level. This prevents HTTrack from mirroring the whole site. If you may want to download files are in other parts of the site or pf particular types - or to not download files in a particular part of the site or of a particular type, you can use filters to specify more precisely what to collect and what not to collect.

The syntax for filters is similar to Unix regular expressions. A simple filter can be made by using characters from the URL with '*' as a wildcard for 0 or more characters - with the last filter rule having the highest precendence. An initial '+' indicates URLs to include and an initial '-' indicated URLs to not include. For example:


'-*' '+*jpg'

would only get files ending in the 'jpg' extension, while:


'-*jpg'

would not get any files ending in the jpg extension. You can add more filter lines to restrict or expand the scope as desired. The last rule is checked first, and so on - so that the rules are in reverse priority order. Here's an example:
+*.gif -image*.gif Will accept all gif files BUT image1.gif,imageblue.gif,imagery.gif and so on
-image*.gif +*.gif Will accept all gif files, because the second pattern is prioritary (because it is defined AFTER the first one)

The full syntax for filters follows:
* any characters (the most commonly used)
*[file] or *[name] any filename or name, e.g. not /,? and ; characters
*[path] any path (and filename), e.g. not ? and ; characters
*[a,z,e,r,t,y] any letters among a,z,e,r,t,y
*[a-z] any letters
*[0-9,a,z,e,r,t,y] any characters among 0..9 and a,z,e,r,t,y
*[] no characters must be present after
<filter>*[< NN] size less than NN Kbytes
<filter>*[> PP] size more than PP Kbytes
<filter>*[< NN > PP] size less than NN Kbytes and more than PP Kbytes

Here are some examples of filters: (that can be generated automatically using the interface)
-www.all.net* This will refuse/accept this web site (all links located in it will be rejected)
+*.com/* This will accept all links that contains .com in them
-*cgi-bin* This will refuse all links that contains cgi-bin in them
+*.com/*[path].zip This will accept all zip files in .com addresses
-*example*/*.tar* This will refuse all tar (or tar.gz etc.) files in hosts containing example
+*/*somepage* This will accept all links containing somepage (but not in the address)
-*.html This will refuse all html files from anywhere in the world.
+*.html*[] Accept *.html, but the link must not have any supplemental characters at the end
(e.g., links with parameters, like www.all.net/index.html?page=10 will not match this filter)
-*.gif*[> 5] -*.zip +*.zip*[< 10] refuse all gif files smaller than 5KB, exlude all zip files, EXCEPT zip files smaller than 10KB


User Authentication Protocols

Smoe servers require user ID and password information in order to gain access. In this example, the user ID smith with password foobar is accessing www.all.net/private/index.html


httrack smith:foobar@www.all.net/private/index.html

For more advanced forms of authentication, such as those involving forms and cookies of various sorts, an emerging capability is being provided through th URL capture features (--catchurl). This feature don't work all of the time.


.httrackrc

A file called '.httrackrc' can be placed in the current directory, or if not found there, in the home directory, to include command line options. These options are included whenever httrack is run. A sample .httrack follows:

    
     set sockets 8
     set retries 4
     index on
     set useragent "Mozilla [en] (foo)"
     set proxy proxy:8080
    

But the syntax is not strict, you can use any of these:

    
     set sockets 8
     set sockets=8
     sockets=8
     sockets 8
    

.httrackrc is sought in the following sequence with the first occurence used:

  • in the dirctory indicated by -O option (.httrackrc)
  • in the current directory (.httrackrc)
  • in the user's home directory (.httrackrc)
  • in /etc/httrack.conf (named httrack.conf to be "standard")

An example .httrackrc looks like:

    
    set sockets=8
    set index on
    retries=2
    allow *.gif
    deny ad.doubleclick.net/*
    

Each line is composed of an option name and a parameter. The "set" token can be used, but is not mandatory (it is ignored, in fact). The "=" is also optionnal, and is replaced by a space internally. The "on" and "off" are the same as "1" and "0" respectively. Therefore, the example .httrackrc above is equivalent to:

    
    sockets=8
    index=1
    retries=2
    allow=*.gif
    deny=ad.doubleclick.net/*
    

Because the "=" seems to (wrongly) imply a variable assignment (the option can be defined more than once to define more than one filter) the following .httrackrc:

    
    allow *.gif
    allow *.jpg
    

looks better for a human than:

    
    allow=*.gif
    allow=*.jpg
    

Here's a example run with the example .httrackrc file:

    
    $ httrack ghost
    $ cat hts-cache/doit.log
    -c8 -C1 -R2 +*.gif -ad.doubleclick.net/* ghost
    

The "-c8 -C1 -R2 +*.gif -ad.doubleclick.net/*" was added by the .httrackrc


Release Notes

Some things change between releases. Here are some recent changes in httrack that may affect some of these options:

Options S,D,U,B, and a,d,l,e are default behaviours of HTTrack. they were the only options in old versions (1.0). With the introduction of filters, their roles are now limited, because filters can override them.

Note for the -N option: "%h%p/%n%q.%t" will be now be used if possible. In normal cases, when a file does not have any parameters (www.foo.com/bar.gif) the %q option does not add anything, so there are no differences in file names. But when parameters are present (for example, www.foo.com/bar.cgi?FileCollection=133.gif), the additionnal query string (in this case, FileCollection=133.gif) will be "hashed" and added to the filename. For example:

'www.all.net/bar.cgi?FileCollection=133.gif'

will be named

'/tmp/mysite/bar4F2E.gif'

The additionnal 4 letters/digits are VERY useful in cases where there are a substantial number of identical files:


www.all.net/bar.cgi?FileCollection=133.gif
www.all.net/bar.cgi?FileCollection=rose.gif
www.all.net/bar.cgi?FileCollection=plant4.gif
www.all.net/bar.cgi?FileCollection=silver.gif
and so on...

In these cases, there is a small probability of a hash collision for large numbers of files.


Some More Examples

Here are some examples of special purpose httrack command lines that might be useful for your situation.

This is a 'forensic' dump of a web site - intended to collect all URLs reachable from the initial point and at that particular site. It is intended to make no changes whatsoever to the image. It also prints out an MD5 checksum of each file imaged so that the image can be verified later to detect and changes after imaging. It uses 5 retries to be more certain than normal of getting the files, never abandons its efforts, keeps original links, does not generate error files, ignores site restrictions for robots, logs as much as it can, stays in the principal domain, places debugging headers in the log file,


httrack "www.website.com/" -O "/tmp/www.website.com" -R5H0Ko0s0zZd %H -V "md5 \$0" "+*.website.com/*" 

Here's an example of a site where I pulled a set of data related to some subject. In this case, I only wanted the relevant subdirectory, all external links were to remain the same, a verbose listing of URLs was to be printed, and I wanted files near (n) and below (D) the original directory. Five retries just makes sure I don't miss anything.


httrack "http://www.somesite.com/~library/thing/thingmain.htm" -O /tmp/thing -R5s0zZvDn

This listing is, of course, rather verbose. To reduce the noise, you might want to do something more like this:


httrack "http://www.somesite.com/~library/thing/thingmain.htm" -O /tmp/thing -R5s0zvDn

A still quieter version - without any debugging information but with a list of files loaded looks like this:


httrack "http://www.somesite.com/~library/thing/thingmain.htm" -O /tmp/thing -R5s0vDn

For the strong silent type, this might be still better:


httrack "http://www.somesite.com/~library/thing/thingmain.htm" -O /tmp/thing -R5s0qDn

General questions:

Q: The install is not working on NT without administrator rights!

A: That's right. You can, however, install WinHTTrack on your own machine, and then copy your WinHTTrack folder from your Program Files folder to another machine, in a temporary directory (e.g. C:\temp\)

Q: Where can I find French/other languages documentation?

A: Windows interface is available on several languages, but not yet the documentation!

Q: Is HTTrack working on NT/2000?

A: Yes, it should

Q: What's the difference between HTTrack and WinHTTrack?

A: WinHTTrack is the Windows release of HTTrack (with a graphic shell)

Q: Is HTTrack Mac compatible?

A: No, because of a lack of time. But sources are available

Q: Can HTTrack be compiled on all Un*x?

A: It should. The Makefile may be modified in some cases, however

Q: I use HTTrack for professional purpose. What about restrictions/license fee?

A: There is no restrictions using HTTrack for professional purpose, except if you want to sell a product including HTTrack components (parts of the source, or any other component). See the license.txt file for more informations

Q: Is a DLL/library version available?

A: Not yet. But, again, sources are available (see license.txt for distribution infos)

Q: Is there a X11/KDE shell available for Linux and Un*x?

A: No. Unfortunately, we do not have enough time for that - if you want to help us, please write one!


Troubleshooting:

Q: Only the first page is caught. What's wrong?
A: First, check the hts-err.txt error log file - this can give you precious informations.

The problem can be a website that redirects you to another site (for example, www.all.net to public.www.all.net) : in this case, use filters to accept this site

This can be, also, a problem in the HTTrack options (link depth too low, for example)

Q: With WinHTTrack, sometimes the minimize in system tray causes a crash!

A: This bug sometimes appears in the shell on some systems. If you encounter this problem, avoid minimizing the window!

Q: URLs with https:// are not working!
A: HTTrack does not support https (secure socket layer protocol), only http protocol

Q: Files are created with strange names, like '-1.html'!

A: Check the build options (you may have selected user-defined structure with wrong parameters!)

Q: When capturing real audio links (.ra), I only get a shortcut!

A: Yes. The audio/video realtime streaming capture is not yet supported

Q: Using user:password@address is not working!

A: Again, first check the hts-err.txt error log file - this can give you precious informations

The site may have a different authentication scheme (form based authentication, for example)

Q: When I use HTTrack, nothing is mirrored (no files) What's happening?

A: First, be sure that the URL typed is correct. Then, check if you need to use a proxy server (see proxy options in WinHTTrack or the -P proxy:port option in the command line program). The site you want to mirror may only accept certain browsers. You can change your "browser identity" with the Browser ID option in the OPTION box. Finally, you can have a look at the hts-err.txt (and hts-log.txt) file to see what happened.

Q: There are missing files! What's happening?

A: You may want to capture files that are in a different folder, or in another web site. In this case, HTTrack does not capture them automatically, you have to ask it to do. For that, use the filters.

Example: You are downloading http://www.all.net/foo/ and can not get .jpg images located in http://www.all.net/bar/ (for example, http://www.all.net/bar/blue.jpg)

Then, add the filter rule +www.all.net/bar/*.jpg to accept all .jpg files from this location

You can, also, accept all files from the /bar folder with +www.all.net/bar/*, or only html files with +www.all.net/bar/*.html and so on..

Q: I'm downloading too many files! What can I do?

A: This is often the case when you use too large filters, for example +*.html, which asks the engine to catch all .html pages (even ones on other sites!). In this case, try to use more specific filters, like +www.all.net/specificfolder/*.html

If you still have too many files, use filters to avoid somes files. For example, if you have too many files from www.all.net/big/, use -www.all.net/big/* to avoid all files from this folder.

Q: File types are sometimes changed! Why?

A: By default, HTTrack tries to know the type of remote files. This is useful when links like http://www.all.net/foo.cgi?id=1 can be either HTML pages, images or anything else. Locally, foo.cgi will not be recognized as an html page, or as an image, by your browser. HTTrack has to rename the file as foo.html or foo.gif so that it can be viewed.

Sometimes, however, some data files are seen by the remote server as html files, or images : in this case HTTrack is being fooled.. and rename the file. You can avoid this by disabling the type checking in the option panel.

Q: I can not access to several pages (access forbidden, or redirect to another location), but I can with my browser, what's going on?

A: You may need cookies! Cookies are specific datas (for example, your username or password) that are sent to your browser once you have logged in certain sites so that you only have to log-in once. For example, after having entered your username in a website, you can view pages and articles, and the next time you will go to this site, you will not have to re-enter your username/password.

To "merge" your personnal cookies to an HTTrack project, just copy the cookies.txt file from your Netscape folder (or the cookies located into the Temporary Internet Files folder for IE) into your project folder (or even the HTTrack folder)

Q: Some pages can't be seen, or are displayed with errors!

A: Some pages may include javascript or java files that are not recognized. For example, generated filenames. There may be transfer problems, too (broken pipe, etc.). But most mirrors do work. We still are working to improve the mirror quality of HTTrack.

Q: Some Java applets do not work properly!

A: Java applets may not work in some cases, because HTTrack does not parse compiled class files to find the resources they load. Java applets often need to be online anyway, since remote files are fetched directly at runtime.

If there is no way to make some classes work properly, you can exclude them with the filters. They will be available, but only online.

Q: HTTrack is being idle for a long time without transfering. What's happening?

A: Maybe you try to reach some very slow sites. Try a lower TimeOut value (see options, or -Txx option in the command line program). Note that you will abandon the entire site (except if the option is unchecked) if a timeout happen You can, with the Shell version, skip some slow files, too.

Q: I want to update a site, but it's taking too much time! What's happening?

A: First, HTTrack always tries to minimize the download flow by interrogating the server about the file changes. But, because HTTrack has to rescan all files from the begining to rebuild the local site structure, it can takes some time. Besides, some servers are not very smart and always consider that they get newer files, forcing HTTrack to reload them, even if no changes have been made!

Q: I am behind a firewall. What can I do?

A: You need to use a proxy, too. Ask your administrator to know the proxy server's name/port. Then, use the proxy field in HTTrack or use the -P proxy:port option in the command line program.

Q: HTTrack has crashed during a mirror, what's happening?

A: We are trying to avoid bugs and problems so that the program can be as reliable as possible. But we can not be infallible. If you occurs a bug, please check if you have the latest release of HTTrack, and send us an email with a detailed description of your problem (OS type, addresses concerned, crash description, and everything you deem to be necessary). This may help the other users too.

Q: I want to update a mirrored project, but HTTrack is retransfering all pages. What's going on?

A: First, HTTrack always rescan all local pages to reconstitute the website structure, and it can take some time. Then, it asks the server if the files that are stored locally are up-to-date. On most sites, pages are not updated frequently, and the update process is fast. But some sites have dynamically-generated pages that are considered as "newer" than the local ones.. even if there are identical! Unfortunately, there is no possibility to avoid this problem, which is strongly linked with the server abilities.


Questions concerning a mirror:

Q: I want to mirror a Web site, but there are some files outside the domain, too. How to retrieve them?

A: If you just want to retrieve files that can be reached through links, just activate the 'get file near links' option. But if you want to retrieve html pages too, you can both use wildcards or explicit addresses ; e.g. add www.all.net/* to accept all files and pages from www.all.net.

Q: I have forgotten some URLs of files during a long mirror.. Should I redo all?

A: No, if you have kept the 'cache' files (in hts-cache), cached files will not be retransferred.

Q: I just want to retrieve all ZIP files or other files in a web site/in a page. How do I do it?

A: You can use different methods. You can use the 'get files near a link' option if files are in a foreign domain. You can use, too, a filter adress: adding +*.zip in the URL list (or in the filter list) will accept all ZIP files, even if these files are outside the address.

Example : httrack www.all.net/someaddress.html +*.zip will allow you to retrieve all zip files that are linked on the site.

Q: There are ZIP files in a page, but I don't want to transfer them. How do I do it?

A: Just filter them: add -*.zip in the filter list.

Q: I don't want to load gif files.. but what may happen if I watch the page?

A: If you have filtered gif files (-*.gif), links to gif files will be rebuild so that your browser can find them on the server.

Q: I get all types of files on a web site, but I didn't select them on filters!

A: By default, HTTrack retrieves all types of files on authorized links. To avoid that, define filters like

-* +<website>/*.html +<website>/*.htm +<website>/ +*.<type wanted>

Example: httrack www.all.net/index.html -* +www.all.net/*.htm* +www.all.net/*.gif +www.all.net/*.jpg

Q: When I use filters, I get too many files!

A: You are using too large a filter, for example *.html will get ALL html files identified. If you want to get all files on an address, use www.<address>/*.html. There are lots of possibilities using filters.

Example:httrack www.all.net +*.www.all.net/*.htm*

Q: When I use filters, I can't access another domain, but I have filtered it!

A: You may have done a mistake declaring filters, for example +www.all.net/* -*all* will not work, because -*all* has an upper priority (because it has been declared after +www.all.net)

Q: Must I add a  '+' or '-' in the filter list when I want to use filters?

A: YES. '+' is for accepting links and '-' to avoid them. If you forget it, HTTrack will consider that you want to accept a filter if there is a wild card in the syntax - e.g. +<filter> if identical to <filter> if <filter> contains a wild card (*) (else it will be considered as a normal link to mirror)

Q: I want to find file(s) in a web-site. How do I do it?

A: You can use the filters: forbid all files (add a -* in the filter list) and accept only html files and the file(s) you want to retrieve (BUT do not forget to add +<website>*.html in the filter list, or pages will not be scanned! Add the name of files you want with a */ before ; i.e. if you want to retrieve file.zip, add */file.zip)

Example:httrack www.all.net +www.all.net/*.htm* +thefileiwant.zip

Q: I want to download ftp files/ftp site. How to do?

A: First, HTTrack is not the best tool to download many ftp files. Its ftp engine is basic (even if reget are possible) and if your purpose is to download a complete site, use a specific client.

You can download ftp files just by typing the URL, such as ftp://ftp.www.all.net/pub/files/file010.zip and list ftp directories like ftp://ftp.www.all.net/pub/files/ .

Note: For the filters, use something like +ftp://ftp.www.all.net/*

Q: How can I retrieve .asp or .cgi sources instead of .html result?

A: You can't! For security reasons, web servers do not allow that.

Q: How can I remove these annoying <!-- Mirrored from... --> from html files?

A: Use the footer option (-&F, or see the WinHTTrack options)

Q: Do I have to select between ascii/binary transfer mode?

A: No, http files are always transferred as binary files. Ftp files, too (even if ascii mode could be selected)

Q: Can HTTrack perform form-based authentication?

A: Yes. See the URL capture abilities (--catchurl for command-line release, or in the WinHTTrack interface)

Q: Can I redirect downloads to tar/zip archive?

A: Yes. See the shell system command option (-V option for command-line release)

Q: Can I use username/password authentication on a site?

A: Yes. Use user:password@your_url (example: http://foo:bar@www.all.net/private/mybox.html)

Q: Can I use username/password authentication for a proxy?

A: Yes. Use user:password@your_proxy_name as your proxy name (example: smith:foo@proxy.mycorp.com)

Q: Can HTTrack generates HP-UX or ISO9660 compatible files?

A: Yes. See the build options (-N, or see the WinHTTrack options)

Q: If there any SOCKS support?

A: Not yet!

Q: What's this hts-cache directory? Can I remove it?

A: NO if you want to update the site, because this directory is used by HTTrack for this purpose. If you remove it, options and URLs will not be available for updating the site

Q: Can I start a mirror from my bookmarks?

A: Yes. Drag&Drop your bookmark.html file to the WinHTTrack window (or use file://filename for command-line release) and select bookmark mirroring (mirror all links in pages, -Y) or bookmark testing (--testlinks)

Q: I am getting a "pipe broken" error and the mirror stops, what should I do?

A: Chances are this is a result of downloading too many pages at a time. Remote servers may not allow or be able to handle too many sessions, or your system may be unable to provide the necessary resources. Try redusing this number - for example using the -c2 options for only 2 simultaneous sesions.

httrack-3.49.14/html/faq.html0000644000175000017500000014713515230602340011424 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

F A Q



    Tips:
  • In case of troubles/problems during transfer, first check the hts-log.txt (and hts-err.txt) files to figure out what happened. These log files report all events that may be useful to detect a problem. You can also ajust the debug level of the log files in the option
  • The tutorial written by Fred Cohen is a very good document to read, to understand how to use the engine, how the command line version works, and how the window version works, too! All options are described and explained in clear language!




Very Frequently Asked Questions:

Q: HTTrack does not capture all files I want to capture!
A: This is a frequent question, generally related to the filters. BUT first check if your problem is not related to the
robots.txt website rules.

Okay, let me explain how to precisely control the capture process.

Let's take an example:

Imagine you want to capture the following site:
www.example.com/gallery/flowers/

HTTrack, by default, will capture all links encountered in www.example.com/gallery/flowers/ or in lower directories, like www.example.com/gallery/flowers/roses/.
It will not follow links to other websites, because this behaviour might cause to capture the Web entirely!
It will not follow links located in higher directories, too (for example, www.example.com/gallery/flowers/ itself) because this might cause to capture too much data.

This is the default behaviour of HTTrack, BUT, of course, if you want, you can tell HTTrack to capture other directorie(s), website(s)!..
In our example, we might want also to capture all links in www.example.com/gallery/trees/, and in www.example.com/photos/

This can easily done by using filters: go to the Option panel, select the 'Scan rules' tab, and enter this line: (you can leave a blank space between each rules, instead of entering a carriage return)
+www.example.com/gallery/trees/*
+www.example.com/photos/*


This means "accept all links beginning with www.example.com/gallery/trees/ and www.example.com/photos/" - the + means "accept" and the final * means "any character will match after the previous ones". Remember the *.doc or *.zip encountered when you want to select all files from a certain type on your computer: it is almost the same here, except the beginning "+"

Now, we might want to exclude all links in www.example.com/gallery/trees/hugetrees/, because with the previous filter, we accepted too many files. Here again, you can add a filter rule to refuse these links. Modify the previous filters to:
+www.example.com/gallery/trees/*
+www.example.com/photos/*
-www.example.com/gallery/trees/hugetrees/*


You have noticed the - in the beginning of the third rule: this means "refuse links matching the rule" ; and the rule is "any files beginning with www.example.com/gallery/trees/hugetrees/
Voila! With these three rules, you have precisely defined what you wanted to capture.

A more complex example?

Imagine that you want to accept all jpg files (files with .jpg type) that have "blue" in the name and located in www.example.com
+www.example.com/*blue*.jpg

More detailed information can be found here!


General questions:

Q: Is there any 'spyware' or 'adware' in this program? Can you prove that there isn't any?
A: No ads (banners), and absolutely no 'spy' features inside the program.
The best proof is the software status: all sources are released, and everybody can check them. Open source is the best protection against privacy problems - HTTrack is an open source project, free of charge and free of any spy 'features'.
However, be sure to always download HTTrack from a trusted source (preferably httrack.com), as some rogue freeware sites are "embedding" free software inside adware/spyware installers. If the version you installed contained some embedded adware/tool bar/whatever, there is a high potential risk of virus/badware infection (the only official Internet Explorer feature is a 'Launch WinHTTrack' optional menu in the Tools section, which can be selected while installing).


Q: This software is 'free', but I bought it from an authorized reseller . What's going on?
A: HTTrack is free (free as in 'freedom') as it is covered by the GNU General Public License (GPL). You can freely download it, without paying any fees, copy it to your friends, and modify it if you respect the license. There are NO official/authorized resellers, because HTTrack is NOT a commercial product. But you can be charged for duplication fees, or any other services (example: software CDroms or shareware collections, or fees for maintenance), but you should have been informed that the software was free software/GPL, and you MUST have received a copy of the GNU General Public License. Otherwise this is dishonest and unfair (ie. selling httrack on ebay without telling that it was a free software is a scam).

Q: Are there any risks of viruses with this software?
A: For the software itself: All official releases (at httrack.com) are checked against all known viruses, and the packaging process is also checked. Archives are stored on Un*x servers, not really concerned by viruses. It has been reported, however, that some rogue freeware sites are embedding free software and freeware inside badware installers. Always download httrack from the main site (www.httrack.com), and never from an untrusted source!
For files you are downloading on the WWW using HTTrack: You may encounter websites which were corrupted by viruses, and downloading data on these websites might be dangerous if you execute downloaded executables, or if embedded pages contain infected material (as dangerous as if using a regular Browser). Always ensure that websites you are crawling are safe. (Note: remember that using an antivirus software is a good idea once you are connected to the Internet)


Q: The install is not working on Windows without administrator rights!
A: That's right. You can, however, install WinHTTrack on your own machine, and then copy your WinHTTrack folder from your Program Files folder to another machine, in a temporary directory (e.g. C:\temp\). You may download the 'non-installer' version, and unzip it in any directory (or an USB key).

Q: Where can I find French/other languages documentation?
A: Windows interface is available on several languages, but not yet the documentation!

Q: Which systems does HTTrack run on?
A: HTTrack runs on current Windows, Linux and other Unix-like systems, and macOS. Very old platforms such as Windows 95/98 are no longer supported; you may try an older release (such as 3.33) on those.

Q: What's the difference between HTTrack, WinHTTrack and WebHTTrack?
A: WinHTTrack is the Windows GUI release of HTTrack (with a native graphic shell) and WebHTTrack is the Linux/Posix release of HTTrack (with an html graphic shell)

Q: Is HTTrack Mac compatible?
A: Yes, using the original sources, or with MacPorts.

Q: Can HTTrack be compiled on all Un*x?
A: It should. The configure.ac may be modified in some cases, however

Q: I use HTTrack for professional purpose. What about restrictions/license fee?
A: HTTrack is covered by the GNU General Public License (GPL). There is no restrictions using HTTrack for professional purpose, except if you develop a software which uses HTTrack components (parts of the source, or any other component). See the license.txt file for more information. See also the next question regarding copyright issues when redistributing downloaded material.

Q: Is there any license royalties for distributing a mirror made with HTTrack?
A: On the HTTrack side, no. However, sharing, publishing or reusing copyrighted material downloaded from a site requires the authorization of the copyright holders, and possibly paying royalty fees. Always ask the authorization before creating a mirror of a site, even if the site appears to be royalty-free and/or without copyright notice.

Q: Is a DLL/library version available?
A: Yes. The default distribution includes a DLL (Windows) or a .so (Un*X), used by the program

Q: Is there a GUI version available for Linux and Un*x?
A: Yes. It is called WebHTTrack. See the download section at www.httrack.com!

Troubleshooting:

Q: Some sites are captured very well, other aren't. Why?
A: There are several reasons (and solutions) for a mirror to fail. Reading the log files (ans this FAQ!) is generally a VERY good idea to figure out what occurred.
There are cases, however, that can not be (yet) handled:
  • Flash sites - no full support
  • Intensive Java/Javascript sites - might be bogus/incomplete
  • Complex CGI with built-in redirect, and other tricks - very complicated to handle, and therefore might cause problems
  • Parsing problem in the HTML code (cases where the engine is fooled, for example by a false comment (<!--) which has no closing comment (-->) detected. Rare cases, but might occur. A bug report is then generally good!
Note: For some sites, setting "Force old HTTP/1.0 requests" option can be useful, as this option uses more basic requests (no HEAD request for example). This will cause a performance loss, but will increase the compatibility with some cgi-based sites.

Q: Only the first page is caught. What's wrong?
A: First, check the hts-log.txt file (and/or hts-err.txt error log file) - this can give you precious information.
The problem can be a website that redirects you to another site (for example, www.example.com to public.example.com) : in this case, use filters to accept this site
This can be, also, a problem in the HTTrack options (link depth too low, for example)


Q: With WinHTTrack, sometimes the minimize in system tray causes a crash!
A: This bug sometimes appears in the shell on some systems. If you encounter this problem, avoid minimizing the window!

Q: Are https URL working?
A: Yes, HTTrack does support (since 3.20 release) https (secure socket layer protocol) sites

Q: Are ipv6 URL working?
A: Yes, HTTrack does support (since 3.20 release) ipv6 sites, using A/AAAA entries, or direct v6 addresses (like http://[3ffe:b80:12:34:56::78]/)

Q: Files are created with strange names, like '-1.html'!
A: Check the build options (you may have selected user-defined structure with wrong parameters!)

Q: When capturing real audio/video links (.ram), I only get a shortcut!
A: The .ra/.rm associated file can be captured together with the shortcut, if proper filters are set. Streaming protocols such as rtsp:// are out of scope: HTTrack is an HTTP/FTP mirror and does not capture rtsp streams.

Q: Using user:password@address is not working!
A: Again, first check the hts-log.txt and hts-err.txt error log files - this can give you precious information
The site may have a different authentication scheme - form based authentication, for example. In this case, use the URL capture features of HTTrack, it might work.
Note: If your username and/or password contains a '@' character, you may have to replace all '@' occurrences by '%40' so that it can work, such as in user%40domain.com:foobar@www.foo.com/auth/. You may have to do the same for all "special" characters like spaces (%20), quotes (%22)..


Q: When I use HTTrack, nothing is mirrored (no files) What's happening?
A: First, be sure that the URL typed is correct. Then, check if you need to use a proxy server (see proxy options in WinHTTrack or the -P proxy:port option in the command line program). The site you want to mirror may only accept certain browsers. You can change your "browser identity" with the Browser ID option in the OPTION box. Finally, you can have a look at the hts-log.txt (and hts-err.txt) file to see what happened.

Q: There are missing files! What's happening?
A: You may want to capture files that exist in a different folder, or in another web site. You may also want to capture files that are forbidden by default by the
robots.txt website rules. In these cases, HTTrack does not capture these links automatically, you have to tell it to do so.

  • Either use the filters.
    Example: You are downloading http://www.example.com/foo/ and can not get .jpg images located in http://www.example.com/bar/ (for example, http://www.example.com/bar/blue.jpg)
    Then, add the filter rule +www.example.com/bar/*.jpg to accept all .jpg files from this location
    You can, also, accept all files from the /bar folder with +www.example.com/bar/*, or only html files with +www.example.com/bar/*.html and so on..

  • If the problems are related to robots.txt rules, that do not let you access some folders (check in the logs if you are not sure), you may want to disable the default robots.txt rules in the options. (but only disable this option with great care, some restricted parts of the website might be huge or not downloadable)

Q: There are corrupted images/files! How to fix them?
A: First check the log files to ensure that the images do really exist remotely and are not fake html error pages renamed into .jpg ("Not found" errors, for example). Rescan the website with "Continue an interrupted download" to catch images that might be broken due to various errors (transfer timemout, for example). Then, check if the broken image/file name is present in the log (hts-log.txt) - in this case you will find there the reason why the file has not been properly caught.
If this doesn't work, delete the corrupted files (Note: to detect corrupted images, you can browse the directories with a tool like ACDSee and then delete them) and rescan the website as described before. HTTrack will be obliged to recatch the deleted files, and this time it should work, if they do really exist remotely!.


Q: FTP links are not caught! What's happening?
A: FTP files might be seen as external links, especially if they are located in outside domain. You have either to accept all external links (See the links options, -n option) or only specific files (see
filters section).
Example: You are downloading http://www.example.com/foo/ and can not get ftp://ftp.example.com files
Then, add the filter rule +ftp.example.com/* to accept all files from this (ftp) location

Q: I got some weird messages telling that robots.txt do not allow several files to be captured. What's going on?
A: These rules, stored in a file called robots.txt, are given by the website, to specify which links or folders should not be caught by robots and spiders - for example, /cgi-bin or large images files. They are followed by default by HTTrack, as it is advised. Therefore, you may miss some files that would have been downloaded without these rules - check in your logs if it is the case:
Info: Note: due to www.foobar.com remote robots.txt rules, links beginning with these path will be forbidden: /cgi-bin/,/images/ (see in the options to disable this)
If you want to disable them, just change the corresponding option in the option list! (but only disable this option with great care, some restricted parts of the website might be huge or not downloadable)


Q: I have duplicate files! What's going on?
A: This is generally the case for top indexes (index.html and index-2.html), isn't it?
This is a common issue, but that can not be easily avoided!
For example, http://www.foobar.com/ and http://www.foobar.com/index.html might be the same pages. But if links in the website refers both to http://www.foobar.com/ and http://www.foobar.com/index.html, these two pages will be caught. And because http://www.foobar.com/ must have a name, as you may want to browse the website locally (the / would give a directory listing, NOT the index itself!), HTTrack must find one. Therefore, two index.html will be produced, one with the -2 to show that the file had to be renamed.
It might be a good idea to consider that http://www.foobar.com/ and http://www.foobar.com/index.html are the same links, to avoid duplicate files, isn't it? NO, because the top index (/) can refer to ANY filename, and if index.html is generally the default name, index.htm can be chosen, or index.php3, mydog.jpg, or anything you may imagine. (some webmasters are really crazy)

Note: In some rare cases, duplicate data files can be found when the website redirect to another file. This issue should be rare, and might be avoided using filters.


Q: I'm downloading too many files! What can I do?
A: This is often the case when you use too large a filter, for example +*.html, which asks the engine to catch all .html pages (even ones on other sites!). In this case, try to use more specific filters, like +www.example.com/specificfolder/*.html
If you still have too many files, use filters to avoid somes files. For example, if you have too many files from www.example.com/big/, use -www.example.com/big/* to avoid all files from this folder. Remember that the default behaviour of the engine, when mirroring http://www.example.com/big/index.html, is to catch everything in http://www.example.com/big/. Filters are your friends, use them!


Q: The engine turns crazy, getting thousands of files! What's going on?
A: This can happen if a loop occurs in some bogus website. For example, a page that refers to itself, with a timestamp in the query string (e.g. http://www.example.com/foo.asp?ts=2000/10/10,09:45:17:147). These are really annoying, as it is VERY difficult to detect the loop (the timestamp might be a page number). To limit the problem: set a recurse level (for example to 6), or avoid the bogus pages (use the filters)

Q: File are sometimes renamed (the type is changed)! Why?
A: By default, HTTrack tries to know the type of remote files. This is useful when links like http://www.example.com/foo.cgi?id=1 can be either HTML pages, images or anything else. Locally, foo.cgi will not be recognized as an html page, or as an image, by your browser. HTTrack has to rename the file as foo.html or foo.gif so that it can be viewed.

Q: File are sometimes *incorrectly* renamed! Why?
A: Sometimes, some data files are seen by the remote server as html files, or images : in this case HTTrack is being fooled.. and rename the file. This can generally be avoided by using the "use HTTP/1.0 requests" option. You might also avoid this by disabling the type checking in the option panel.

Q: How do I rename all ".dat" files into ".zip" files?
A: Simply use the --assume dat=application/x-zip option

Q: I can not access several pages (access forbidden, or redirect to another location), but I can with my browser, what's going on?
A: You may need cookies! Cookies are specific data (for example, your username or password) that are sent to your browser once you have logged in certain sites so that you only have to log-in once. For example, after having entered your username in a website, you can view pages and articles, and the next time you will go to this site, you will not have to re-enter your username/password.
To supply your own cookies to an HTTrack project, put a Netscape-format cookies.txt file in your project folder, or point HTTrack at one with the --cookies-file option. You can export your browser's session cookies to that format with a browser extension.


Q: Some pages can't be seen, or are displayed with errors!
A: Some pages may include javascript or java files that are not recognized. For example, generated filenames. There may be transfer problems, too (broken pipe, etc.). But most mirrors do work. We still are working to improve the mirror quality of HTTrack.

Q: Some Java applets do not work properly!
A: Java applets may not work in some cases, because HTTrack does not parse compiled class files to find the resources they load. Java applets often need to be online anyway, since remote files are fetched directly at runtime.
If there is no way to make some classes work properly, you can exclude them with the filters. They will be available, but only online.


Q: HTTrack is taking too much time for parsing, it is very slow. What's wrong?
A: Former (before 3.04) releases of HTTrack had problems with parsing. It was really slow, and performances -especially with huge HTML files- were not really good. The engine is now optimized, and should parse very quickly all html files. For example, a 10MB HTML file should be scanned in less than 3 or 4 seconds.

Therefore, higher values mean that the engine had to wait a bit for testing several links.
  • Sometimes, links are malformed in pages. "a href="/foo"" instead of "a href="/foo/"", for example, is a common mistake. It will force the engine to make a supplemental request, and find the real /foo/ location.


  • Dynamic pages. Links with names terminated by .php3, .asp or other type which are different from the regular .html or .htm will require a supplemental request, too. HTTrack has to "know" the type (called "MIME type") of a file before forming the destination filename. Files like foo.gif are "known" to be images, ".html" are obviously HTML pages - but ".php3" pages may be either dynamically generated html pages, images, data files...

    If you KNOW that ALL ".php3" and ".asp" pages are in fact HTML pages on a mirror, use the assume option:
    --assume php3=text/html,asp=text/html

    This option can be used to change the type of a file, too : the MIME type "application/x-MYTYPE" will always have the "MYTYPE" type. Therefore,
    --assume dat=application/x-zip
    will force the engine to rename all dat files into zip files


Q: HTTrack is being idle for a long time without transfering. What's happening?
A: Maybe you try to reach some very slow sites. Try a lower TimeOut value (see options, or -Txx option in the command line program). Note that you will abandon the entire site (except if the option is unchecked) if a timeout happen You can, with the Shell version, skip some slow files, too.

Q: I want to update a site, but it's taking too much time! What's happening?
A: First, HTTrack always tries to minimize the download flow by interrogating the server about the file changes. But, because HTTrack has to rescan all files from the beginning to rebuild the local site structure, it can take some time. Besides, some servers are not very smart and always consider that they get newer files, forcing HTTrack to reload them, even if no changes have been made!

Q: I wanted to update a site, but after the update the site disappeared!! What's going on?
A: You may have done something wrong, but not always
  • The site has moved : the current location only shows a notification. Therefore, all other files have been deleted to show the current state of the website!
  • The connection failed: the engine could not catch the first files, and therefore deleted everything. To avoid that, using the option "do not purge old files" might be a good idea
  • You tried to add a site to the project BUT in fact deleted the former addresses.
    Example: A project contains 'www.foo.com www.bar.com' and you want to add 'www.doe.com'. Ensure that 'www.foo.com www.bar.com www.doe.com' is the new URL list, and NOT 'www.doe.com'!

Q: I am behind a firewall. What can I do?
A: You need to use a proxy, too. Ask your administrator to know the proxy server's name/port. Then, use the proxy field in HTTrack or use the -P proxy:port option in the command line program.

Q: HTTrack has crashed during a mirror, what's happening?
A: We are trying to avoid bugs and problems so that the program can be as reliable as possible. But we can not be infallible. If you occurs a bug, please check if you have the latest release of HTTrack, and send us an email with a detailed description of your problem (OS type, addresses concerned, crash description, and everything you deem to be necessary). This may help the other users too.


Q: I want to update a mirrored project, but HTTrack is retransfering all pages. What's going on?
A: First, HTTrack always rescans all local pages to reconstitute the website structure, and it can take some time. Then, it asks the server if the files that are stored locally are up-to-date. On most sites, pages are not updated frequently, and the update process is fast. But some sites have dynamically-generated pages that are considered as "newer" than the local ones.. even if they are identical! Unfortunately, there is no possibility to avoid this problem, which is strongly linked with the server abilities.

Q: I want to continue a mirrored project, but HTTrack is rescanning all pages. What's going on?
A: HTTrack has to (quickly) rescan all pages from the cache, without retransfering them, to rebuild the internal file structure. However, this process can take some time with huge sites with numerous links.

Q: HTTrack window sometimes "disappears" at then end of a mirrored project. What's going on?
A: This is a known bug in the interface. It does NOT affect the quality of the mirror, however. We are still hunting it down, but this is a smart bug..


Questions concerning a mirror:

Q: I want to mirror a Web site, but there are some files outside the domain, too. How to retrieve them?
A: If you just want to retrieve files that can be reached through links, just activate the 'get file near links' option. But if you want to retrieve html pages too, you can both use wildcards or explicit addresses ; e.g. add www.example.com/* to accept all files and pages from www.example.com.

Q: I have forgotten some URLs of files during a long mirror.. Should I redo all?
A: No, if you have kept the 'cache' files (in hts-cache), cached files will not be retransferred.

Q: I just want to retrieve all ZIP files or other files in a web site/in a page. How do I do it?
A: You can use different methods. You can use the 'get files near a link' option if files are in a foreign domain. You can use, too, a filter address: adding +*.zip in the URL list (or in the filter list) will accept all ZIP files, even if these files are outside the address.
Example : httrack www.example.com/someaddress.html +*.zip will allow you to retrieve all zip files that are linked on the site.


Q: There are ZIP files in a page, but I don't want to transfer them. How do I do it?
A: Just filter them: add -*.zip in the filter list.

Q: I don't want to download ZIP files bigger than 1MB and MPG files smaller than 100KB. Is it possible?
A: You can use
filters for that ; using the syntax:
-*.zip*[>1000] -*.mpg*[<100]

Q: I don't want to load gif files.. but what may happen if I watch the page?
A: If you have filtered gif files (-*.gif), links to gif files will be rebuilt so that your browser can find them on the server.

Q: I don't want to download thumbnail images.. is it possible?
A: Filters can not be used with image pixel size ; but you can filter on file size (bytes). Use advanced
filters for that ; such as:
-*.gif*[<10] to exclude gif files smaller than 10KiB.


Q: I get all types of files on a web site, but I didn't select them on filters!
A: By default, HTTrack retrieves all types of files on authorized links. To avoid that, define filters like
-* +<website>/*.html +<website>/*.htm +<website>/ +*.<type wanted>
Example: httrack www.example.com/index.html -* +www.example.com/*.htm* +www.example.com/*.gif +www.example.com/*.jpg

Q: When I use filters, I get too many files!
A: You might use too large a filter, for example *.html will get ALL html files identified. If you want to get all files on an address, use www.<address>/*.html.
If you want to get ONLY files defined by your filters, use something like -* +www.foo.com/*, because +www.foo.com/* will only accept selected links without forbidding other ones!
There are lots of possibilities using filters.
Example:httrack www.example.com +*.example.com/*.htm*

Q: When I use filters, I can't access another domain, but I have filtered it!
A: You may have done a mistake declaring filters, for example +www.example.com/* -*example* will not work, because -*example* has an upper priority (because it has been declared after +www.example.com)

Q: Must I add a  '+' or '-' in the filter list when I want to use filters?
A: YES. '+' is for accepting links and '-' to avoid them. If you forget it, HTTrack will consider that you want to accept a filter if there is a wild card in the syntax - e.g. +<filter> is identical to <filter> if <filter> contains a wild card (*) (else it will be considered as a normal link to mirror)


Q: I want to find file(s) in a web-site. How do I do it?
A: You can use the filters: forbid all files (add a -* in the filter list) and accept only html files and the file(s) you want to retrieve (BUT do not forget to add +<website>*.html in the filter list, or pages will not be scanned! Add the name of files you want with a */ before ; i.e. if you want to retrieve file.zip, add */file.zip)
Example:httrack www.example.com +www.example.com/*.htm* +thefileiwant.zip

Q: I want to download ftp files/ftp site. How do I do it?
A: First, HTTrack is not the best tool to download many ftp files. Its ftp engine is basic (even if reget are possible) and if your purpose is to download a complete site, use a specific client.
You can download ftp files just by typing the URL, such as ftp://ftp.somesite.com/pub/files/file010.zip and list ftp directories like ftp://ftp.somesite.com/pub/files/
.
Note: For the filters, use something like +ftp.somesite.com/*

Q: How can I retrieve .asp or .cgi sources instead of .html result?
A: You can't! For security reasons, web servers do not allow that.

Q: How can I remove these annoying <!-- Mirrored from... --> from html files?
A: Use the footer option (-%F, or see the WinHTTrack options)

Q: Do I have to select between ascii/binary transfer mode?
A: No, http files are always transferred as binary files. Ftp files, too (even if ascii mode could be selected)

Q: Can HTTrack perform form-based authentication?
A: Yes. See the URL capture abilities (--catchurl for command-line release, or in the WinHTTrack interface)

Q: Can I redirect downloads to tar/zip archive?
A: Yes. See the shell system command option (-V option for command-line release)

Q: Can I use username/password authentication on a site?
A: Yes. Use user:password@your_url (example: http://foo:bar@www.example.com/private/mybox.html)

Q: Can I use username/password authentication for a proxy?
A: Yes. Use user:password@your_proxy_name as your proxy name (example: smith:foo@proxy.mycorp.com)

Q: Can HTTrack generates HP-UX or ISO9660 compatible files?
A: Yes. See the build options (-N, or see the WinHTTrack options)

Q: Is there any SOCKS support?
A: Yes. HTTrack supports SOCKS5 and HTTP CONNECT proxies: give the proxy with a scheme prefix, e.g. -P socks5://host:port or -P connect://host:port (prefix user:pass@ before the host for authenticated proxies).

Q: What's this hts-cache directory? Can I remove it?
A: NO if you want to update the site, because this directory is used by HTTrack for this purpose. If you remove it, options and URLs will not be available for updating the site

Q: What is the meaning of the Links scanned: 12/34 (+5) line in WinHTTrack/WebHTTrack?
A: 12 is the number of links scanned and stored, 34 the total number of links detected to be parsed, and 5 the number of files downloaded in background. In this example, 17 links were downloaded out of a (temporary) total of 34 links.

Q: Can I start a mirror from my bookmarks?
A: Yes. Drag&Drop your bookmark.html file to the WinHTTrack window (or use file://filename for command-line release) and select bookmark mirroring (mirror all links in pages, -Y) or bookmark testing (--testlinks)

Q: Can I convert a local website (file:// links) to a standard website?
A: Yes. Just start from the top index (example: file://C:\foopages\index.html) and mirror the local website. HTTrack will convert all file:// links to relative ones.

Q: Can I copy a project to another folder - Will the mirror work?
A: Yes. There is no absolute links, all links are relative. You can copy a project to another drive/computer/OS, and browse is without installing anything.

Q: Can I copy a project to another computer/system? Can I then update it ?
A: Absolutely! You can keep your HTTrack favorite folder (C:\My Web Sites) in your local hard disk, copy it for a friend, and possibly update it, and then bring it back!
You can copy individual folders (projects), too: exchange your favorite websites with your friends, or send an old version of a site to someone who has a faster connection, and ask him to update it!

Note: Export (Windows <-> Linux)
The file and cache structure is compatible between Linux/Windows, but you may have to do some changes, like the path
Windows -> Linux/Unix
Copy (in binary mode) the entire folder and then to update it, enter into it and do a
httrack --update -O ./

Note: You can then safely replace the existing folder (under Windows) with this one, because the Linux/Unix version did not change any options
Note: If you often switch between Windows/Linux with the same project, it might be a good idea to edit the hts-cache/doit.log file and delete old "-O" entries, because each time you do a httrack --update -O ./ an entry is added, causing the command line to be long
Linux/Unix -> Windows
Copy (in binary mode) the entire folder in your favorite Web mirror folder. Then, select this project, AND retype ALL URLs AND redefine all options as if you were creating a new project. This is necessary because the profile (winprofile.ini) has not be created with the Linux/Unix version. But do not be afraid, WinHTTrack will use cached files to update the project!


Q: How can I grab email addresses in web pages?
A: You can not. HTTrack has not be designed to be an email grabber, like many other (bad) products.


Other problems:

Q: My problerm is not listed!
A: Feel free to
contact us!


httrack-3.49.14/html/dev.html0000644000175000017500000001355515230602340011431 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

HTTrack Programming page


HTTrack can be used as a third-party program in batch files, or as library. Depending on your needs, you may look:

Programming

Technical references

  • Cache format

  • HTTrack stores original HTML data and references to downloaded files in a cache, located in the hts-cache directory. This page describes the HTTrack cache format.


httrack-3.49.14/html/contact.html0000644000175000017500000002200515230602340012274 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Contact Us!


Please visit our website!

About this project:
Informations on this project:

This project has been developed by:
Xavier Roche (xroche at httrack dot com)
  for the main engine and Windows interface
  and maintainer for v2.0 and v3.0
Yann Philippot (yphilippot at lemel dot fr)
  for the java binary  dot class parser
David Lawrie (dalawrie at lineone dot net)
Robert Lagadec (rlagadec at yahoo dot fr)
  for checking both English & French translations
Juan Pablo Barrio Lera (University of León)
  for Spanish translations
Rainer Klueting (rainer at klueting dot de)
Bastian Gorke (bastiang at yahoo dot com)
Rudi Ferrari (Wyando at netcologne dot de)
Marcus Gaza (MarcusGaza at t-online dot de)
  for German translations
Rudi Ferrari (Wyando at netcologne dot de)
  for Dutch translations
Lukasz Jokiel (Opole University of Technology, Lukasz dot Jokiel at po dot opole dot pl)
  for Polish translations
Rui Fernandes (CANTIC, ruiefe at mail dot malhatlantica dot pt)
Pedro T dot  Pinheiro (Universidade Nova de Lisboa-FCT, ptiago at mail dot iupi dot pt)
  for Portuguese translations
Andrei Iliev (iliev at vitaplus dot ru)
  for Russian translations
Witold Krakowski (wtkrak at netscape dot net )
  for Italian translations
Jozsef Tamas Herczeg (hdodi at freemail dot hu)
  for Hungarian translation
Paulo Neto (company at layout dot com dot br)
  for Brazilian translation
Brook Qin (brookqwr at sina dot com) 
   for simplified Chinese translation
David Hing Cheong Hung (DAVEHUNG at mtr dot com dot hk)
Addy Lin (addy1975 at pchome dot com dot tw)
   for traditional Chinese translation
Jesper Bramm (bramm at get2net dot dk)
   for Danish translation
Tõnu Virma
   for Estonian translation
Staffan Ström (staffan at fam-strom dot org)
   for Swedish translation
Mehmet Akif Köeoðlu (mak at ttnet dot net dot tr)
  for Turkish translation
Aleksandar Savic (aleks at macedonia dot eu dot org)
  for Macedonian translation
Takayoshi Nakasikiryo
  for Japanese translation
Martin Sereday (sereday at slovanet dot sk)
  for Slovak translation
Antonín Matìjèík (matejcik at volny dot cz)
  for Czech translation
Andrij Shevchuk (http://programy dot com dot ua)
  for Ukrainian translation
Tobias "Spug" Langhoff (spug_enigma at hotmail dot com)
  for Norwegian translation
Jadran Rudeciur (jrudec at email dot si)
  for Slovenian translation
Alin Gheorghe Miron (miron dot alin at personal dot ro)
  for Romanian translation
Michael Papadakis (mikepap at freemail dot gr)
  for Greek translation

Thanks to:
Leto Kauler (molotov at tasmail dot com)
  for the site/logos design

Special Thanks to:
Patrick Ducrot & Daniel Carré (ENSI of Caen)
  for their initial support
Fred Cohen (fc at all dot net)
  for HTTrack user's guide

Greetings to:
Christian Marillat (marillat dot christian at wanadoo dot fr)
  for autoconf compliance and  .deb package
Jean-loup Gailly from gzip dot org
  for the help provided with Zlib
Eric A dot  Young (eay at cryptsoft dot com)
  for SSL cryptographic material (OpenSSL)

Russ Freeman from gipsymedia
  for hints on DLL dynamic load
Paul DiLascia
  for helping to fix problems with CHtmlView
ISMRA/Ensi of Caen 
  for their initial support
 .. and all users that are using and supporting HTTrack!



If you want to ask any question to the authors, report bugs/problems, please first check the HTTrack Website Copier forum.
You can also contact by email, but due to the large volume of messages, it is impossible to always respond (especially for configuration help or other configuration-related questions).




This program is covered by the GNU General Public License.
HTTrack/HTTrack Website Copier is Copyright (C) 1998-2026 Xavier Roche and other contributors
httrack-3.49.14/html/cmdguide.html0000644000175000017500000007551515230602340012440 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Command-Line Guide

This is a task-oriented guide to the httrack command line: how to do the things people actually ask for, and the handful of defaults that surprise newcomers. It sits on top of the generated manual page, which lists every option in full. When you want the exhaustive detail for a flag, that page is the reference; this one is the map.

Two habits before anything else. First, HTTrack has its own options: they are not wget or curl flags, so reach for the tables here rather than guessing. Second, when a mirror does something you did not expect, the answer is almost always in the log. Every project writes hts-log.txt (and hts-err.txt) into its output directory, and those files name every URL that was refused, redirected, or filtered out. Read them first.

On this page

1. Quick start

A mirror is one command: a start URL and an output directory.

httrack https://example.com/ --path mydir

With no other options HTTrack mirrors that site, stays on the same host, follows links to any depth, rebuilds them to browse offline, and stores everything under mydir. The same directory also holds the log files and the hts-cache/ folder that makes a later update or resume possible.

Two defaults are worth knowing up front, because both catch people out:

  • HTTrack throttles itself to about 100 KB/s even when you pass no rate option. If a mirror feels slow, that is why. See Limits for how to lift it.
  • The download proceeds as a well-behaved robot: it identifies itself as HTTrack, obeys robots.txt, and sends a Referer with each request. A site that blocks that behavior needs the levers in Identity, not brute force.

2. Scope: how far the crawl reaches

Scope decides which links HTTrack is even willing to follow, before any filter you write. Get this right and most "it downloaded too much" or "it only grabbed the index" problems disappear.

OptionWhat it controls
--depth (-r)Maximum link depth. The start page is level 1, so one level of links out is -r2, not -r1.
--stay-on-same-address (-a), --stay-on-same-domain (-d), --stay-on-same-tld (-l), --go-everywhere (-e)How far off the starting host the crawl may travel: same address (host), same principal domain, same top-level domain (for example .com), or everywhere. The default keeps you on the starting host.
--can-go-down (-D), --can-go-up (-U), --stay-on-same-dir (-S), --can-go-up-and-down (-B)Directory travel: down into subdirectories only, up to parent directories only, stay in the same directory, or both up and down.
--near (-n)Also fetch non-HTML files "near" a followed link, such as an image linked from a page you kept but hosted elsewhere.
--ext-depth (-%e)How many levels of external links to follow once the crawl leaves your scope (default 0).
--test (-t)Also HEAD-test links that fall outside the scope, which are normally refused, without downloading them: a way to see what scope is excluding.

The single most common surprise is "only the home page came down." That is usually not a scope option at all: it is an off-host redirect. A start URL of http://example.com/ that redirects to https://www.example.com/ lands you on a different host, and same-host scope stops the crawl there. Start from the final URL, or add a filter that re-admits the real host (see Filters). The log will show the redirect.

-n is the fix for pages that render locally without their images or stylesheets: it lets HTTrack pull in requisites that sit just outside scope. Note that its embedded-asset handling (following img, link, script, style and HTML5 source/track targets past the normal depth and filter limits) applies only when -n is on; it is not automatic. It can also over-fetch by dragging in a whole external host from a single link, in which case name the assets you want with a filter instead.

3. Filters and scan rules

Filters are the number-one source of confusion, and also the tool that solves most scope problems once you understand them. A filter is a rule that accepts (+) or rejects (-) URLs by pattern. The sign is mandatory: +pattern adds, -pattern removes, and a bare pattern is an error.

The rules that matter:

  • Last match wins. Rules are applied in order and the last one that matches a URL decides its fate. Order your rules from general to specific.
  • Wildcards. * matches any run of characters; *[a-z], *[0-9] and similar classes match sets. So +*.pdf means "any URL ending in .pdf".
  • Whitelisting. To keep one site and nothing else, deny everything then re-admit the host: "-*" "+example.com/*". A lone + rule only adds to the default scope; it never restricts.
  • Size rules. *[>100000] and *[<1000] filter by byte size. Because size is only known once the transfer starts, an oversize file is fetched partway and then aborted, not skipped for free.
  • mime: rules. A rule like -mime:video/* matches the Content-Type. That type is only known after the response headers arrive, so a mime rule cannot stop a request; it can only abort the body. Use a URL pattern when you want to avoid the fetch entirely.

Quote your filters. Shells treat *, [ and sometimes + specially, so wrap each rule in quotes as shown above. The full pattern language, with tables for wildcards, size and mime, is in the filters page, and the FAQ has a worked tutorial.

robots.txt. By default HTTrack obeys robots.txt (-s2). -s0 ignores it entirely, -s1 obeys it but lets one of your + filters override a disallow for a URL you explicitly asked for. Note that a 403 Forbidden is a server refusal, not a robots rule: robots options will not help there. That is an identity problem.

Filter wildcards

Inside a filter pattern, * matches any run of characters; a few bracket forms match narrower sets. The full table, with size and mime rules, is on the filters page.

WildcardMatchesExample
*any run of characters+*.pdf — any URL ending .pdf
*[file], *[name]one path segment (any char but / and ?)example.com/*[file]/ — a directory-index page
*[path]a path, slashes allowed (any char but ?)example.com/*[path].zip
*[param]an optional query stringpage.html*[param] matches with or without ?...
*[a,b,c]any one character in the set*[a,b,c].txt
*[a-z]any one character in the rangeimg*[0-9].gif
*[\x]the literal character x (escapes * [ ] \)*[\*] matches a real *
*[<NN], *[>NN]file size in KB below / above NN-*.gif*[<5] skips GIFs under 5 KB
*[]end anchor: nothing may follow*.html*[] rejects i.html?p=1

4. Limits and politeness

HTTrack ships cautious on purpose: it is easy to hammer a small site by accident, and the abuse page is worth a read. The limits below let you go faster when you own the target, and slower when you do not.

OptionWhat it controls
--max-rate (-A)Maximum transfer rate in bytes/sec. The default is about 100 KB/s even without this flag. Raise it to go faster.
--sockets (-c)Number of parallel connections (default 4). --tiny, --wide and --ultrawide are presets.
--connection-per-second (-%c)New connections opened per second (default 5).
--max-size (-M)Stop after N bytes received from the network across the whole mirror (this counts what was transferred, not what was saved).
--max-time (-E)Stop after N seconds of wall-clock time.
--max-files (-m)Per-file size caps.
--timeout (-T), --retries (-R), --min-rate (-J), --host-control (-H)Idle timeout, retry count, minimum acceptable rate, and host-ban behavior for slow or dead hosts.
--max-pause (-G), --pause (-%G)Pause the mirror at N bytes, or pause between files, to spread the load.

The security clamps. To keep an accidental typo from turning into a flood, HTTrack silently caps a few values: at most 8 connections (-c), at most 10 MB/s (-A), and at most 5 new connections per second (-%c). Ask for more and you get the ceiling, quietly. The single flag --disable-security-limits lifts all three (the short form -%! also works, but the bare ! is awkward to type safely in a shell). Use it only against infrastructure you are allowed to load that hard.

5. File names and types

Where local files land, and what they are called, is controlled by the naming options. This is the second-biggest source of "why did it do that" questions, usually about a URL like /article?id=42 or a .php page that is really HTML.

OptionWhat it controls
--structure (-N)The local path and name layout. Presets are numeric, and you can also give a template such as --structure "%h%p/%n%q.%t".
--long-names (-L)Long names, 8.3 names, or ISO9660 for CD masters.
--assume (-%A)Assume a MIME type for an extension, for example --assume php=text/html. This also skips the extra HEAD probe HTTrack would otherwise send to learn the type.
--delayed-type-check (-%N), --cached-delayed-type-check (-%D), --check-type (-u), -%tWhen and how the content type is checked, and whether the original extension is kept.
--include-query-string (-%q), --strip-query (-%g)Whether the query string appears in the local filename, and whether query keys are stripped when deciding if two URLs are the same file.

The -N presets are built from modular arithmetic on the name fields, so undocumented number combinations often "work" by accident. If you care about the exact layout, use an explicit template (the %h %p %n %q %t placeholders) rather than a magic number, and check the result on a small crawl first.

A dynamic page served as .php or .asp that is actually HTML is the classic case: without help it can be saved with an extension a browser will not open locally. --assume php=text/html fixes both the extension and the naming.

After a page is downloaded, HTTrack parses it for more links and rewrites the ones it kept so the local copy browses offline. These options tune both halves.

OptionWhat it controls
--keep-links (-K)How links are rewritten in saved pages. The numbering is inverted from what you might guess: bare -K keeps absolute URLs, and -K0 is the relative default. -K3 keeps absolute URIs, -K4 keeps the original links.
--replace-external (-x), --generate-errors (-o)Replace external links with an error page, and generate an error page for links that failed.
--preserve (-%p), --disable-passwords (-%x)Leave HTML untouched (no rewriting), and strip passwords out of saved links.
--extended-parsing (-%P), --parse-java (-j)Aggressive link discovery, and how much script content is parsed for links.
--mime-html (-%M)Save the whole mirror as a single MIME-encapsulated .mht archive (index.mht).
--index (-I), --build-top-index (-%i), --search-index (-%I)Build a per-mirror index, a top index across projects, and a searchable keyword index.

HTTrack finds links by parsing HTML and CSS. It does not run JavaScript, so any URL a page builds at runtime in script (a lazy-loaded image, a JavaScript-assembled path) is invisible to the crawler and will be missing from the mirror. There is no flag that fixes this; the asset has to appear in the static HTML or CSS to be found. -%P widens discovery for links that are present but awkwardly formatted, not for links that do not exist until script runs.

7. Identity, cookies and login

By default HTTrack is an honest robot: it sends a User-Agent of HTTrack, a Referer with each link (which reveals the crawl path to the server), and obeys robots. Plenty of sites filter exactly that profile. These options control what HTTrack says about itself.

OptionWhat it controls
--user-agent (-F)The User-Agent. Set a browser string to get past crawler blocks; --user-agent "" sends none.
--referer (-%R), --from (-%E), --language (-%l), --accept (-%a)Referer, From, Accept-Language and Accept headers.
--headers (-%X)Add raw header lines to every request.
--footer (-%F)A footer written into saved pages (on disk, not a network header). See Footer fields below.
--cookies (-b), --cookies-file (-%K)Accept cookies, and preload a Netscape cookies.txt.

Footer fields. A footer with no %s may reference named fields: {addr}, {path}, {url}, {date} (mirror time), {lastmodified} (the page's Last-Modified), {version}, {mime}, {charset}, {status} and {size}; write {{ or }} for a literal brace. A footer that contains %s keeps the older positional form (host, path, date in that order). Example: -%F "<!-- Mirrored from {url} on {date} -->".

Login. For HTTP Basic auth, put the credentials in the URL: http://user:pass@host/. An @ inside the username must be written %40. Only Basic is supported, not Digest.

For cookie or form logins, the simplest path is to log in with a browser, export its cookies.txt, and drop that file in the project directory so HTTrack sends the session cookie. For a form that needs a POST, --catchurl can capture the exact request your browser sends and replay it. A few cookie caveats to know: expiry is ignored, there is a silent cap of about 8 cookies sent per request, and -b0 disables cookies and the reuse of Basic credentials across links at the same time.

8. Proxy and network

OptionWhat it controls
--proxy (-P)Route through a proxy. HTTP, SOCKS5 and CONNECT are supported: -P host:8080, -P socks5://host:1080, -P connect://host:443, with optional user:pass@.
--httpproxy-ftp (-%f)Send FTP requests through the HTTP proxy.
--protocol (-@i)Prefer IPv4 or IPv6.
--http-10 (-%h), --keep-alive (-%k), --disable-compression (-%z)Force HTTP/1.0 (drops keep-alive and compression, useful for fragile CGI), toggle keep-alive, and toggle compression.
--bind (-%b), --tolerant (-%B)Bind to a local address, and accept technically-bogus responses some servers send.

Two network facts worth stating plainly. Over SOCKS5, HTTrack always resolves host names at the proxy (remote DNS) for both socks5:// and socks5h://, so your local resolver is never consulted. And HTTrack does not verify TLS certificates: HTTPS gives you an encrypted transport, but not an authenticated one. That is a deliberate choice for a mirroring tool, not a bug, but it is worth knowing if you are relying on it for trust.

9. Update and cache

Every project keeps a cache under hts-cache/. It records every URL that was fetched, together with the options you used, and it is what makes resuming and updating possible. It is not a size-limited scratch area you can delete: throw it away and you lose the ability to continue or update the mirror.

OptionWhat it controls
--continueCarry on an interrupted mirror, trusting the cache: it does not re-check pages already stored.
--updateRe-run the mirror, revalidating each page with the server (If-Modified-Since / If-None-Match) and downloading only what changed.
--purge-old=0 (-X0)Do not purge. By default an update deletes local files that are no longer part of the mirror; --purge-old=0 keeps them.
--cache (-C)Cache mode. The default already does the right thing and switches to update-checking when it detects an existing mirror.
--urlhack (-%u), --keep-www-prefix (-%j), --keep-double-slashes (-%o), --keep-query-order (-%y), --do-not-recatch (-%n), --updatehack (-%s), --store-all-in-cache (-k)URL-deduplication behavior and cache storage details.
--debug-cache (-#C), --repair-cache (-#R), --cleanInspect the cache, repair its ZIP, and erase cache plus logs.

The purge trap. An --update run rebuilds the list of files the mirror should contain, then deletes any previously-mirrored file that is not on the new list. This is what keeps a mirror in sync with a shrinking site, but it means a partial or interrupted update can delete files you meant to keep. If an update might not complete cleanly, add -X0 to protect the existing tree, and expect dynamic pages to look "changed" on every run. See the cache page for the details.

10. Experts and scripting

HTTrack is also a scriptable fetch-and-scan tool. These options turn off the mirror behavior and expose the engine.

OptionWhat it controls
--get URLFetch a single file and stop. Cache, index, depth, cookies and robots are all off for this mode.
--spider --testlinks --skeletonScan without saving, test links at depth 1, or keep HTML only. Handy for checking a site before a real crawl.
--userdef-cmd (-V)Run a shell command on each downloaded file; $0 is the file path. Good for on-the-fly processing.
--callback (-%W)Load an external callback module to hook the engine.
--do-not-log (-Q), --quiet (-q), --verbose (-v), --file-log (-f), --extra-log (-z), --debug-log (-Z)Logging: quiet, no questions, verbose on screen, and the various log-to-file levels.

The developer page covers the callback API and batch use in more depth.

11. Recipes

Copy-ready command lines for the tasks people ask about most. Each has the one gotcha that trips it up.

Mirror one site, nothing off-host

httrack https://example.com/ --path mydir
Same-host is already the default. The usual failure is a www.-to-apex or http-to-https redirect that moves you off host and stops the crawl; start from the final URL, or add "+finalhost/*".

One level of links only

httrack https://example.com/ --depth=2 --path mydir
Depth counts the start page as level 1, so one level out is --depth=2.

This site only, deny everything else

httrack https://example.com/ "-*" "+example.com/*" --path mydir
You must deny-all first; a lone + only adds, and the last matching rule wins.

Download the PDFs on a site

httrack https://example.com/ "-*" "+https://example.com/*.html" "+https://example.com/*[path]/" "+https://example.com/*.pdf" --path mydir
HTTrack finds PDFs by parsing the site's HTML, so a plain "-*" "+example.com/*.pdf" is wrong: it prunes the pages that carry the links and keeps only PDFs reachable from the front page. Instead admit the HTML as scaffolding (*.html and *[path]/ for directory-index pages at any depth, e.g. docs/ or a/b/deep/; *[file]/ would stop at one level), keep the PDFs, and let -* drop everything else (images, archives, off-site assets). PDFs on another host (a CDN or docs subdomain) are not included by default; allow that host too, e.g. "+docs.example.com/*.pdf", or widen to "+*.pdf" for PDFs anywhere.

Keep page requisites, including off-host images

httrack https://example.com/blog/ --near --path mydir
--near can over-fetch by pulling in an entire external host from one link; if it does, name the assets with "+cdn.example.com/*" instead.

Resume an interrupted crawl

httrack --continue --path mydir
Needs an intact hts-cache/. Deleting it loses the URL list and your options.

Update a mirror, downloading only what changed

httrack --update --path mydir
Purge deletes any previously-mirrored file not seen this run; add --purge-old=0 to protect the tree against a partial update.

Reach a section behind a login cookie

Export your browser's cookies.txt into the project directory, then:
httrack https://example.com/members/ --path mydir
The file must be Netscape cookies.txt in the project folder; --cookies=0 would disable cookies and Basic-auth reuse together.

Get past a crawler-UA block

httrack https://example.com/ --user-agent "Mozilla/5.0 (Windows NT 10.0)" --path mydir
A 403 is server-side, not robots: change the User-Agent, and add --http-10 for fragile CGI. Do not reach for --robots=0.

Full-speed mirror on your own server

httrack https://example.com/ --max-rate=2000000 --sockets=8 --disable-security-limits --path mydir
The default throttles to about 100 KB/s. --disable-security-limits lifts the built-in caps; use it only against infrastructure you are allowed to load.

Save a WARC archive of the crawl

httrack https://example.com/ --warc --path mydir
Writes a standard WARC/1.1 file (httrack-<timestamp>.warc.gz) in the project folder alongside the browsable mirror, not instead of it. Set the name with --warc-file NAME and split a large crawl with --warc-max-size N; add --warc-cdx for a sorted CDXJ index, or --wacz to bundle the archive, index and pages into one WACZ for replay tools such as replayweb.page.

HTTrack as a fetch tool

httrack --get https://host/file.bin --path tmp
--get fetches one file with cache, index, depth, cookies and robots all disabled.


For the complete, always-current option list, see the manual page. For the filter language, see filters; for the cache and updates, see cache.

httrack-3.49.14/html/cache.html0000644000175000017500000002554515230602340011720 HTTrack Website Copier - Cache format specification
HTTrack Website Copier
Open Source offline browser

Cache format specification


For updating purpose, HTTrack stores original (untouched) HTML data, references to downloaded files, and other meta-data (especially parts of the HTTP headers) in a cache, located in the hts-cache directory. Because local html pages are always modified to "fit" the local filesystem structure, and because meta-data such as the last-Modified date and Etag can not be stored with the associated files, the cache is absolutely mandatory for reprocessing (update/continue) phases.

The (new) cache.zip format

The 3.31 release of HTTrack introduces a new cache format, more extensible and efficient than the previous one (ndx/dat format). The main advantages of this cache are:
  • One single file for a complete website cache archive
  • Standard ZIP format, that can be easily reused on most platforms and languages
  • Compressed data with the efficient and opened zlib format
The cache is made of ZIP files entries ; with one ZIP file entry per fetched URL (successfully or not - errors are also stored).
For each entry:
  • The ZIP file name is the original URL [see notes below]
  • The ZIP file contents, if available, is the original (compressed, using the deflate algorythm) data
  • The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the HTTP headers fields. See also RFC.

  • The ZIP file timestamp follows the "Last-Modified-Since" field given for this URL, if any
Example of cache file:
$ unzip -l hts-cache/new.zip
Archive:  hts-cache/new.zip
HTTrack Website Copier/3.31-ALPHA-4 mirror complete in 3 seconds : 5 links scanned, 
3 files written (16109 bytes overall) [17690 bytes received at 5896 bytes/sec]
(1 errors, 0 warnings, 0 messages)
  Length     Date   Time    Name
 --------    ----   ----    ----
       94  07-18-03 08:59   http://www.httrack.com/robots.txt
     9866  01-17-04 01:09   http://www.httrack.com/html/cache.html
        0  05-11-03 13:31   http://www.httrack.com/html/images/bg_rings.gif
      207  01-19-04 05:49   http://www.httrack.com/html/fade.gif
        0  05-11-03 13:31   http://www.httrack.com/html/images/header_title_4.gif
 --------                   -------
    10167                   5 files
Example of cache file meta-data:
HTTP/1.1 200 OK
X-In-Cache: 1
X-StatusCode: 200
X-StatusMessage: OK
X-Size: 94
Content-Type: text/plain
Last-Modified: Fri, 18 Jul 2003 08:59:11 GMT
Etag: "40ebb5-5e-3f17b6df"
X-Addr: www.httrack.com
X-Fil: /robots.txt
There are also specific issues regarding this format:
  • The data in the central directory (such as CD extra field, and CD comments) are not used
  • The ZIP archive is allowed to contains more than 2^16 files (65535) ; in such case the total number of entries in the 32-bit central directory is 65536 (0xffff), but the presence of the 64-bit central directory is not mandatory
  • The ZIP archive is allowed to contains more than 2^32 bytes (4GiB) ; in such case the 64-bit central directory is emitted automatically (a single stored entry of 4GiB or more is not supported)

Meta-data stored in the "extra field" of the local file headers
The extra field is composed of text data, and this text data is composed of distinct lines of headers. The end of text, or a double CR/LF, mark the end of this zone. This method allows you to optionally store original HTTP headers just after the "meta-data" headers for informational use.

The status line (the first headers line)
Status-Line = HTTP-Version SP Status-Code SP X-Reason-Phrase CRLF

Other lines:

Specific fields:
  • X-In-Cache

  • Indicates if the data are present (value=1) in the cache (that is, as ZIP data), or in an external file (value=0). This field MUST be the first field.
  • X-StatusCode

  • The modified (by httrack) status code after processing. 304 error codes ("Not modified"), for example, are transformed into "200" codes after processing.
  • X-StatusMessage

  • The modified (by httrack) status message.
  • X-Size

  • The stored (either in cache, or in an external file) data size.
  • X-Charset

  • The original charset.
  • X-Addr

  • The original URL address part.
  • X-Fil

  • The original URL path part.
  • X-Save

  • The local filename, depending on user's "build structure" preferences.

Standard (RFC 2616) "useful" fields:
  • Content-Type
  • Last-Modified
  • Etag
  • Location
  • Content-Disposition

Specific fields in "BNF-like" grammar:
X-In-Cache          = "X-In-Cache" ":" 1*DIGIT
X-StatusCode        = "X-StatusCode" ":" 1*DIGIT
X-StatusMessage     = "X-StatusMessage" ":" *<TEXT, excluding CR, LF>
X-Size              = "X-Size" ":" 1*DIGIT
X-Charset           = "X-Charset" ":" value
X-Addr              = "X-Addr" ":" scheme ":" "//" authority
X-Fil               = "X-Fil" ":" rel_path
X-Save              = "X-Save" ":" rel_path
RFC standard fields:
Content-Type        = "Content-Type" ":" media-type
Last-Modified       = "Last-Modified" ":" HTTP-date
Etag                = "ETag" ":" entity-tag
Location            = "Location" ":" absoluteURI
Content-Disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )

And, for your information,
X-Reason-Phrase     = *<TEXT, with a maximum of 32 characters, and excluding CR, LF>
Note: Because the URLs may have an unexpected format, especially with double "/" inside, and other reserved characters ("?", "&" ..), various ZIP uncompressors can potentially have troubles accessing or decompressing the data. Libraries should generally handle this peculiar format, however.

httrack-3.49.14/html/android.html0000644000175000017500000002216615230602340012271 HTTrack on Android
HTTrack Website Copier
Open Source offline browser

HTTrack on Android


HTTrack downloads a website to your device so you can read it offline. The Android app runs the same mirroring engine as the desktop version behind a touch interface. It needs Android 7.0 or later, and is available on Google Play.

The steps below follow one mirror from start to finish.


  1. Grant storage access

  2. On first launch the app asks for permission to store mirrors on your device. The prompt reads "Allow HTTrack Website Copier to access photos, media, and files on your device?". Tap ALLOW: without it the app cannot save the downloaded files.

    First-run storage permission dialog

    If you have used an older release, a second prompt offers to bring its mirrors into the app. Tap Import to move them, or Not now to skip.

    Import mirrors from an older version


  3. Start

  4. The welcome screen shows the engine version at the bottom. Tap Next to create a project, or Browse sites to open a mirror you already made.

    Welcome screen


  5. Name the project

  6. Give the project a name, and optionally a category to group related mirrors. Base path shows where the files will be written. Tap Next.

    Project name, category, and base path


  7. Enter the address

  8. Type the site address. If a project of the same name already exists, pick Continue interrupted download or Update existing download. Tap Options to adjust the crawl, or Start to begin.

    Web address and download action


  9. Options (optional)

  10. The Options screen holds the crawl settings, grouped into eleven tabs. It uses the same profile format as the desktop version, so a tab you know from WinHTTrack behaves the same way here.

    Options tab list

    The tabs are:
    • Scan Rules: wildcard filters for the addresses to keep or skip.
    • Limits: caps on depth, size, time, speed, and number of connections.
    • Flow Control: simultaneous connections, timeouts, and retries.
    • Links: how far to follow links, and which extra files to fetch.
    • Build: how the saved files and folders are named.
    • Browser ID: the user-agent, language, and headers sent to servers.
    • Spider: cookies, robots.txt handling, and request behavior.
    • Proxy address: proxy host and port.
    • Log, Index, Cache: log files, the search index, and the update cache.
    • Type/MIME associations: map file extensions to MIME types.
    • Experts Only: scan mode, how far the crawl may travel, and link rewriting.

    Scan Rules tab

    Experts Only tab

    The desktop option reference describes every setting in full. A few desktop options are missing or fixed on Android: the proxy tab has a host and port but no login and password, the download folder is fixed inside the app's storage so there is no output-path setting, and the MIME table holds up to eight entries.

  11. Run the mirror

  12. HTTrack downloads the site and reports live figures: bytes saved, links scanned, transfer rate, and errors. Tap Abort to stop early; a partial mirror can be resumed later.

    Crawl in progress with live statistics


  13. Browse the result

  14. When the crawl finishes the app reports Success and the mirror location. Tap Browse Mirrored Website to read the copy in your browser, View log to see what happened, or New project to start again.

    Mirror finished, success


  15. Where the files are

  16. Mirrors are written under /storage/emulated/0/HTTrack/Websites, in a folder named after the project. That folder lives in your device's shared storage, so a file manager or a USB connection can reach it. Opening index.html there browses a mirror without the app.




Back to Home

httrack-3.49.14/html/addurl.html0000644000175000017500000001323615230602340012122 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

Add a URL


  1. Enter a typical Web address

  2. Just type in your address in the field



    OR

  3. Enter a Web address with authentication

  4. Useful when you need basic authentication to watch the Web page



    OR

  5. Capture a link from your Web browser to HTTrack

  6. Use this tool only for form-based pages (pages delivered after submiting a form) that need some analysis



    Set, as explained, your Web browser proxy preferences to the values indicated : set the proxy's address, and the proxy's port, then click on the button or link as you usually do in your Web browser.
    The temporary proxy, installed by HTTrack, will then capture the link and display a confirmation page.






Back to Home

httrack-3.49.14/html/abuse.html0000644000175000017500000005112715230602340011747 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
Open Source offline browser

For HTTrack users:


For webmasters having problems with bandwidth abuse / other abuses related to HTTrack:



Advice & what not to do

Please follow these common sense rules to avoid any network abuse


  • Do not overload the websites!

  • Downloading a site can overload it, if you have a fast pipe, or if you capture too many simultaneous cgi (dynamically generated pages).
    • Do not download too large websites: use filters
    • Do not use too many simultaneous connections
    • Use bandwidth limits
    • Use connection limits
    • Use size limits
    • Use time limits
    • Only disable robots.txt rules with great care
    • Try not to download during working hours
    • Check your mirror transfer rate/size
    • For large mirrors, first ask the webmaster of the site

  • Ensure that you can copy the website
    • Are the pages copyrighted?
    • Can you copy them only for private purpose?
    • Do not make online mirrors unless you are authorized to do so

  • Do not overload your network
    • Is your (corporate, private..) network connected through dialup ISP?
    • Is your network bandwidth limited (and expensive)?
    • Are you slowing down the traffic?

  • Do not steal private information
    • Do not grab emails
    • Do not grab private information


Abuse FAQ for webmasters

How to limit network abuse
HTTrack Website Copier FAQ (updated - DRAFT)


Q: How to block offline browsers, like HTTrack?

A: This is a complex question, let's study it

First, there are several different reasons for that
Why do you want to block offline browsers? :

  1. Because a large part of your bandwidth is used by some users, who are slowing down the rest
  2. Because of copyright questions (you do not want people to copy parts of your website)
  3. Because of privacy (you do not want email grabbers to steal all your user's emails)


  1. Bandwidth abuse:

    Many Webmasters are concerned about bandwidth abuse, even if this problem is caused by a minority of people. Offline browsers tools, like HTTrack, can be used in a WRONG way, and therefore are sometimes considered as a potential danger.
    But before thinking that all offline browsers are BAD, consider this: students, teachers, IT consultants, websurfers and many people who like your website, may want to copy parts of it, for their work, their studies, to teach or demonstrate to people during class school or shows. They might do that because they are connected through expensive modem connection, or because they would like to consult pages while travelling, or archive sites that may be removed one day, make some data mining, compiling information ("if only I could find this website I saw one day..").
    There are many good reasons to mirror websites, and this helps many good people.
    As a webmaster, you might be interested to use such tools, too: test broken links, move a website to another location, control which external links are put on your website for legal/content control, test the webserver response and performances, index it..

    Anyway, bandwidth abuse can be a problem. If your site is regularly "clobbered" by evil downloaders, you have
    various solutions. You have radical solutions, and intermediate solutions. I strongly recommend not to use
    radical solutions, because of the previous remarks (good people often mirror websites).

    In general, for all solutions,
    the good thing: it will limit the bandwidth abuse
    the bad thing: depending on the solution, it will be either a small constraint, or a fatal nuisance (you'll get 0 visitors)
    or, to be extreme: if you unplug the wire, there will be no bandwidth abuse

    1. Inform people, explain why ("please do not clobber the bandwidth")
      Good: Will work with good people. Many good people just don't KNOW that they can slow down a network.
      Bad: Will **only** work with good people
      How to do: Obvious - place a note, a warning, an article, a draw, a poem or whatever you want

    2. Use "robots.txt" file
      Good: Easy to setup
      Bad: Easy to override
      How to do: Create a robots.txt file on top dir, with proper parameters
      Example:
          User-agent: *

          Disallow: /bigfolder

    3. Ban registered offline-browsers User-agents
      Good: Easy to setup
      Bad: Radical, and easy to override
      How to do: Filter the "User-agent" HTTP header field

    4. Limit the bandwidth per IP (or by folders)
      Good: Efficient
      Bad: Multiple users behind proxies will be slow down, not really easy to setup
      How to do: Depends on webserver. Might be done with low-level IP rules (QoS)

    5. Prioritize small files, against large files
      Good: Efficient if large files are the cause of abuse
      Bad: Not always efficient
      How to do: Depends on the webserver

    6. Ban abuser IPs
      Good: Immediate solution
      Bad: Annoying to do, useless for dynamic IPs, and not very user friendly
      How to do: Either ban IP's on the firewall, or on the webserver (see ACLs)

    7. Limit abusers IPs
      Good: Intermediate and immediate solution
      Bad: Annoying to do, useless for dynamic IPs, and annoying to maintain..
      How to do: Use routine QoS (fair queuing), or webserver options

    8. Use technical tricks (like javascript) to hide URLs
      Good: Efficient
      Bad: The most efficient tricks will also cause your website to be heavy, and not user-friendly (and therefore less attractive, even for surfing users). Remember: clients or visitors might want to consult offline your website. Advanced users will also be still able to note the URLs and catch them. Will not work on non-javascript browsers. It will not work if the user clicks 50 times and put downloads in background with a standard browser
      How to do: Most offline browsers (I would say all, but let's say most) are unable to "understand" javascript/java properly. Reason: very tricky to handle!
      Example:
      You can replace:
          <a href="bigfile.zip">Foo</a>
      by:
          <script language="javascript">
          <!--
          document.write('<a h' + 're' + 'f="');
          document.write('bigfile' + '.' + 'zip">');
          // -->
          </script>
          Foo
          </a>

      You can also use java-based applets. I would say that it is the "best of the horrors". A big, fat, slow, bogus java applet. Avoid!

    9. Use technical tricks to lag offline browsers
      Good: Efficient
      Bad: Can be avoided by advanced users, annoying to maintain, AND potentially worst that the illness (cgi's are often taking some CPU usage). . It will not work if the user clicks 50 times and put downloads in background with a standard browser
      How to do: Create fake empty links that point to cgi's, with long delays
      Example: Use things like <ahref="slow.cgi?p=12786549"><nothing></a> (example in php:)
          <?php
          for($i=0;$i<10;$i++) {
              sleep(6);
              echo " ";
          }
          ?>

    10. Use technical tricks to temporarily ban IPs
      Good: Efficient
      Bad: Radical (your site will only be available online for all users), not easy to setup
      How to do: Create fake links with "killing" targets
      Example: Use things like <a href="killme.cgi"><nothing></a> (again an example in php:)
      <?php
      	// Add IP.
      	add_temp_firewall_rule($REMOTE_ADDR,"30s");
      ?>
      function add_temp_firewall_rule($addr) {
      	// The chain chhttp is flushed in a cron job to avoid ipchains overflow
          system("/usr/bin/sudo -u root /sbin/ipchains -I 1 chhttp -p tcp -s ".$addr." --dport 80 -j REJECT");
          syslog("user rejected due to too many copy attemps : ".$addr);
      }
      
      
      
      
      

  2. Copyright issues

    You do not want people to "steal" your website, or even copy parts of it. First, stealing a website does not
    require to have an offline browser. Second, direct (and credited) copy is sometimes better than disguised
    plagiarism. Besides, several previous remarks are also interesting here: the more protected your website will be,
    the potentially less attractive it will also be. There is no perfect solution, too. A webmaster asked me one day
    to give him a solution to prevent any website copy. Not only for offline browsers, but also against "save as",
    cut and paste, print.. and print screen. I replied that is was not possible, especially for the print screen - and
    that another potential threat was the evil photographer. Maybe with a "this document will self-destruct in 5 seconds.."
    or by shooting users after consulting the document.
    More seriously, once a document is being placed on a website, there will always be the risks of copy (or plagiarism)

    To limit the risk, previous a- and h- solutions, in "bandwidth abuse" section, can be used


  3. Privacy

    Might be related to section 2.
    But the greatest risk is maybe email grabbers.

    1. A solution can be to use javascript to hide emails.
      Good: Efficient
      Bad: Non-javascript browsers will not have the "clickable" link
      How to do: Use javascript to build mailto: links
      Example:
          <script language="javascript">
          <!--
          function FOS(host,nom,info) {
            var s;
            if (info == "") info=nom+"@"+host;
            s="mail";
            document.write("<a href='"+s+"to:"+nom+"@"+host+"'>"+info+"</a>");
          }
          FOS('mycompany.com','smith?subject=Hi, John','Click here to email me!')
          // -->
          </script>
          <noscript>
          smith at mycompany dot com
          </noscript>

    2. Another one is to create images of emails
      Good: Efficient, does not require javascript
      Bad: There is still the problem of the link (mailto:), images are bigger than text, and it can cause problems for blind people (a good solution is use an ALT attribute with the email written like "smith at mycompany dot com")
      How to do: Not so obvious if you do not want to create images by yourself
      Example: (php, Unix)
      <?php
      /*
      Email contact displayer
      Usage: email.php3?id=<4 bytes of user's md5>
      The <4 bytes of user's md5> can be calculated using the 2nd script (see below)
      Example: http://yourhost/email.php3?id=91ff1a48
      */
      $domain="mycompany.com";
      $size=12;

      /* Find the user in the system database */
      if (!$id)
        exit;
      unset($email);
      unset($name);
      unset($pwd);
      unset($apwd);
      $email="";
      $name="";
      $fp=@fopen("/etc/passwd","r");
      if ($fp) {
        $pwd=@fread($fp,filesize("/etc/passwd"));
        @fclose($fp);
      }
      $apwd=split("\n",$pwd);
      foreach($apwd as $line) {
        $fld=split(":",$line);
        if (substr(md5($fld[0]),0,8) == $id) {
          $email=$fld[0]."@".$domain;
          $nm=substr($fld[4],0,strpos($fld[4],","));
          $name=$email;
          if ($nm)
            $name="\"".$nm."\" <".$email.">";
        }
      }
      if (!$name)
        exit;

      /* Create and show the image */
      Header ("Content-type: image/gif");
      $im = imagecreate ($size*strlen($name), $size*1.5);
      $black = ImageColorAllocate ($im, 255, 255, 255);
      $white = ImageColorAllocate ($im, 0,0,0);
      ImageTTFText($im, $size, 0, 0, $size , $white, "/usr/share/enlightenment/E-docs/aircut3.ttf",$name);
      ImageGif ($im);
      ImageDestroy ($im);
      ?>

      The script to find the id:

      #!/bin/sh

      # small script for email.php3
      echo "Enter login:"
      read login
      echo "The URL is:"
      printf "http://yourhost/email.php3?id="
      printf $login|md5sum|cut -c1-8
      echo

    3. You can also create temporary email aliases, each week, for all users
      Good: Efficient, and you can give your real email in your reply-to address
      Bad: Temporary emails
      How to do: Not so hard to do
      Example: (script & php, Unix)
      #!/bin/sh
      #
      # Anonymous random aliases for all users
      # changed each week, to avoid spam problems
      # on websites
      # (to put into /etc/cron.weekly/)

      # Each alias is regenerated each week, and valid for 2 weeks

      # prefix for all users
      # must not be the prefix of another alias!
      USER_PREFIX="user-"

      # valid for 2 weeks
      ALIAS_VALID=2

      # random string
      SECRET="my secret string `hostname -f`"

      # build
      grep -vE "^$USER_PREFIX" /etc/aliases > /etc/aliases.new
      for i in `cut -f1 -d':' /etc/passwd`; do
        if test `id -u $i` -ge 500; then
          off=0
          while test "$off" -lt $ALIAS_VALID; do
            THISWEEK="`date +'%Y'` $[`date +'%U'`-$off]"
            SECRET="`echo \"$SECRET $i $THISWEEK\" | md5sum | cut -c1-4`"
            FIRST=`echo $i | cut -c1-3`
            NAME="$USER_PREFIX$FIRST$SECRET"
            echo "$NAME : $i" >> /etc/aliases.new
            #
            off=$[$off+1]
          done
        fi
      done

      # move file
      mv -f /etc/aliases /etc/aliases.old
      mv -f /etc/aliases.new /etc/aliases

      # update aliases
      newaliases

      And then, put the email address in your pages through:

      <a href="mailto:<?php
          $user="smith";
          $alias=exec("grep ".$user." /etc/aliases | cut -f1 -d' ' | head -n1");
          print $alias;
      ?>@mycompany.com>>

httrack-3.49.14/html/Makefile.in0000644000175000017500000007456015230604702012041 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = html ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ $(top_srcdir)/m4/check_codecs.m4 \ $(top_srcdir)/m4/check_zlib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/visibility.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(HelpHtmldir)" \ "$(DESTDIR)$(HelpHtmlTxtdir)" "$(DESTDIR)$(HelpHtmldivdir)" \ "$(DESTDIR)$(HelpHtmlimagesdir)" "$(DESTDIR)$(HelpHtmlimgdir)" \ "$(DESTDIR)$(HelpHtmlrootdir)" "$(DESTDIR)$(MetaInfodir)" \ "$(DESTDIR)$(VFolderEntrydir)" "$(DESTDIR)$(WebHtmldir)" \ "$(DESTDIR)$(WebHtmlimagesdir)" "$(DESTDIR)$(WebIcon16x16dir)" \ "$(DESTDIR)$(WebIcon32x32dir)" "$(DESTDIR)$(WebIcon48x48dir)" \ "$(DESTDIR)$(WebPixmapdir)" DATA = $(HelpHtml_DATA) $(HelpHtmlTxt_DATA) $(HelpHtmldiv_DATA) \ $(HelpHtmlimages_DATA) $(HelpHtmlimg_DATA) \ $(HelpHtmlroot_DATA) $(MetaInfo_DATA) $(VFolderEntry_DATA) \ $(WebHtml_DATA) $(WebHtmlimages_DATA) $(WebIcon16x16_DATA) \ $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) $(WebPixmap_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BROTLI_ENABLED = @BROTLI_ENABLED@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGS_PIE = @CFLAGS_PIE@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CFLAGS = @DEFAULT_CFLAGS@ DEFAULT_LDFLAGS = @DEFAULT_LDFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HTTPS_SUPPORT = @HTTPS_SUPPORT@ ICONV_LIBS = @ICONV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_PIE = @LDFLAGS_PIE@ LFS_FLAG = @LFS_FLAG@ LIBC_FORCE_LINK = @LIBC_FORCE_LINK@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CV_OBJDIR = @LT_CV_OBJDIR@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ONLINE_UNIT_TESTS = @ONLINE_UNIT_TESTS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHLIBPATH_VAR = @SHLIBPATH_VAR@ SOCKET_LIBS = @SOCKET_LIBS@ STRIP = @STRIP@ THREADS_CFLAGS = @THREADS_CFLAGS@ THREADS_LIBS = @THREADS_LIBS@ V6_FLAG = @V6_FLAG@ V6_SUPPORT = @V6_SUPPORT@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ ZSTD_ENABLED = @ZSTD_ENABLED@ ZSTD_LIBS = @ZSTD_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ HelpHtmlrootdir = $(docdir) HelpHtmldir = $(htmldir) HelpHtmlimgdir = $(HelpHtmldir)/img HelpHtmldivdir = $(HelpHtmldir)/div HelpHtmlimagesdir = $(HelpHtmldir)/images HelpHtmlTxtdir = $(HelpHtmldir) WebHtmldir = $(HelpHtmldir)/server WebHtmlimagesdir = $(HelpHtmldir)/server/images WebPixmapdir = $(datadir)/pixmaps WebIcon16x16dir = $(datadir)/icons/hicolor/16x16/apps WebIcon32x32dir = $(datadir)/icons/hicolor/32x32/apps WebIcon48x48dir = $(datadir)/icons/hicolor/48x48/apps VFolderEntrydir = $(prefix)/share/applications MetaInfodir = $(datadir)/metainfo # Wildcards are globbed against $(srcdir): a bare "*.html" is resolved against # the build dir and stays unexpanded (breaking "make") in an out-of-tree build. # Explicit filenames (e.g. ../history.txt, div/search.sh) resolve via VPATH and # need no prefix. HelpHtmlroot_DATA = ../httrack-doc.html ../history.txt HelpHtml_DATA = $(srcdir)/*.html HelpHtmldiv_DATA = div/search.sh HelpHtmlimg_DATA = $(srcdir)/img/* HelpHtmlimages_DATA = $(srcdir)/images/* HelpHtmlTxt_DATA = ../greetings.txt ../history.txt ../license.txt WebHtml_DATA = $(srcdir)/server/*.html $(srcdir)/server/*.js $(srcdir)/server/*.css WebHtmlimages_DATA = $(srcdir)/server/images/* # note: converted & normalized by # ico2xpm favicon.ico -o httrack.xpm # mogrify -format xpm -map /usr/share/doc/menu/examples/cmap.xpm httrack.xpm WebPixmap_DATA = $(srcdir)/server/div/*.xpm WebIcon16x16_DATA = $(srcdir)/server/div/16x16/*.png WebIcon32x32_DATA = $(srcdir)/server/div/32x32/*.png WebIcon48x48_DATA = $(srcdir)/server/div/48x48/*.png VFolderEntry_DATA = $(srcdir)/server/div/*.desktop MetaInfo_DATA = $(srcdir)/server/div/*.metainfo.xml EXTRA_DIST = $(HelpHtml_DATA) $(HelpHtmlimg_DATA) $(HelpHtmlimages_DATA) \ $(HelpHtmldiv_DATA) $(WebHtml_DATA) $(WebHtmlimages_DATA) \ $(WebPixmap_DATA) $(WebIcon16x16_DATA) $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) \ $(VFolderEntry_DATA) $(MetaInfo_DATA) \ httrack.css all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu html/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu html/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-HelpHtmlDATA: $(HelpHtml_DATA) @$(NORMAL_INSTALL) @list='$(HelpHtml_DATA)'; test -n "$(HelpHtmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(HelpHtmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(HelpHtmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(HelpHtmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(HelpHtmldir)" || exit $$?; \ done uninstall-HelpHtmlDATA: @$(NORMAL_UNINSTALL) @list='$(HelpHtml_DATA)'; test -n "$(HelpHtmldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(HelpHtmldir)'; $(am__uninstall_files_from_dir) install-HelpHtmlTxtDATA: $(HelpHtmlTxt_DATA) @$(NORMAL_INSTALL) @list='$(HelpHtmlTxt_DATA)'; test -n "$(HelpHtmlTxtdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(HelpHtmlTxtdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(HelpHtmlTxtdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(HelpHtmlTxtdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(HelpHtmlTxtdir)" || exit $$?; \ done uninstall-HelpHtmlTxtDATA: @$(NORMAL_UNINSTALL) @list='$(HelpHtmlTxt_DATA)'; test -n "$(HelpHtmlTxtdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(HelpHtmlTxtdir)'; $(am__uninstall_files_from_dir) install-HelpHtmldivDATA: $(HelpHtmldiv_DATA) @$(NORMAL_INSTALL) @list='$(HelpHtmldiv_DATA)'; test -n "$(HelpHtmldivdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(HelpHtmldivdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(HelpHtmldivdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(HelpHtmldivdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(HelpHtmldivdir)" || exit $$?; \ done uninstall-HelpHtmldivDATA: @$(NORMAL_UNINSTALL) @list='$(HelpHtmldiv_DATA)'; test -n "$(HelpHtmldivdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(HelpHtmldivdir)'; $(am__uninstall_files_from_dir) install-HelpHtmlimagesDATA: $(HelpHtmlimages_DATA) @$(NORMAL_INSTALL) @list='$(HelpHtmlimages_DATA)'; test -n "$(HelpHtmlimagesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(HelpHtmlimagesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(HelpHtmlimagesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(HelpHtmlimagesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(HelpHtmlimagesdir)" || exit $$?; \ done uninstall-HelpHtmlimagesDATA: @$(NORMAL_UNINSTALL) @list='$(HelpHtmlimages_DATA)'; test -n "$(HelpHtmlimagesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(HelpHtmlimagesdir)'; $(am__uninstall_files_from_dir) install-HelpHtmlimgDATA: $(HelpHtmlimg_DATA) @$(NORMAL_INSTALL) @list='$(HelpHtmlimg_DATA)'; test -n "$(HelpHtmlimgdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(HelpHtmlimgdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(HelpHtmlimgdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(HelpHtmlimgdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(HelpHtmlimgdir)" || exit $$?; \ done uninstall-HelpHtmlimgDATA: @$(NORMAL_UNINSTALL) @list='$(HelpHtmlimg_DATA)'; test -n "$(HelpHtmlimgdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(HelpHtmlimgdir)'; $(am__uninstall_files_from_dir) install-HelpHtmlrootDATA: $(HelpHtmlroot_DATA) @$(NORMAL_INSTALL) @list='$(HelpHtmlroot_DATA)'; test -n "$(HelpHtmlrootdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(HelpHtmlrootdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(HelpHtmlrootdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(HelpHtmlrootdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(HelpHtmlrootdir)" || exit $$?; \ done uninstall-HelpHtmlrootDATA: @$(NORMAL_UNINSTALL) @list='$(HelpHtmlroot_DATA)'; test -n "$(HelpHtmlrootdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(HelpHtmlrootdir)'; $(am__uninstall_files_from_dir) install-MetaInfoDATA: $(MetaInfo_DATA) @$(NORMAL_INSTALL) @list='$(MetaInfo_DATA)'; test -n "$(MetaInfodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(MetaInfodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(MetaInfodir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(MetaInfodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(MetaInfodir)" || exit $$?; \ done uninstall-MetaInfoDATA: @$(NORMAL_UNINSTALL) @list='$(MetaInfo_DATA)'; test -n "$(MetaInfodir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(MetaInfodir)'; $(am__uninstall_files_from_dir) install-VFolderEntryDATA: $(VFolderEntry_DATA) @$(NORMAL_INSTALL) @list='$(VFolderEntry_DATA)'; test -n "$(VFolderEntrydir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(VFolderEntrydir)'"; \ $(MKDIR_P) "$(DESTDIR)$(VFolderEntrydir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(VFolderEntrydir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(VFolderEntrydir)" || exit $$?; \ done uninstall-VFolderEntryDATA: @$(NORMAL_UNINSTALL) @list='$(VFolderEntry_DATA)'; test -n "$(VFolderEntrydir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(VFolderEntrydir)'; $(am__uninstall_files_from_dir) install-WebHtmlDATA: $(WebHtml_DATA) @$(NORMAL_INSTALL) @list='$(WebHtml_DATA)'; test -n "$(WebHtmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(WebHtmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(WebHtmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(WebHtmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(WebHtmldir)" || exit $$?; \ done uninstall-WebHtmlDATA: @$(NORMAL_UNINSTALL) @list='$(WebHtml_DATA)'; test -n "$(WebHtmldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(WebHtmldir)'; $(am__uninstall_files_from_dir) install-WebHtmlimagesDATA: $(WebHtmlimages_DATA) @$(NORMAL_INSTALL) @list='$(WebHtmlimages_DATA)'; test -n "$(WebHtmlimagesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(WebHtmlimagesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(WebHtmlimagesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(WebHtmlimagesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(WebHtmlimagesdir)" || exit $$?; \ done uninstall-WebHtmlimagesDATA: @$(NORMAL_UNINSTALL) @list='$(WebHtmlimages_DATA)'; test -n "$(WebHtmlimagesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(WebHtmlimagesdir)'; $(am__uninstall_files_from_dir) install-WebIcon16x16DATA: $(WebIcon16x16_DATA) @$(NORMAL_INSTALL) @list='$(WebIcon16x16_DATA)'; test -n "$(WebIcon16x16dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(WebIcon16x16dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(WebIcon16x16dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(WebIcon16x16dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(WebIcon16x16dir)" || exit $$?; \ done uninstall-WebIcon16x16DATA: @$(NORMAL_UNINSTALL) @list='$(WebIcon16x16_DATA)'; test -n "$(WebIcon16x16dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(WebIcon16x16dir)'; $(am__uninstall_files_from_dir) install-WebIcon32x32DATA: $(WebIcon32x32_DATA) @$(NORMAL_INSTALL) @list='$(WebIcon32x32_DATA)'; test -n "$(WebIcon32x32dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(WebIcon32x32dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(WebIcon32x32dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(WebIcon32x32dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(WebIcon32x32dir)" || exit $$?; \ done uninstall-WebIcon32x32DATA: @$(NORMAL_UNINSTALL) @list='$(WebIcon32x32_DATA)'; test -n "$(WebIcon32x32dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(WebIcon32x32dir)'; $(am__uninstall_files_from_dir) install-WebIcon48x48DATA: $(WebIcon48x48_DATA) @$(NORMAL_INSTALL) @list='$(WebIcon48x48_DATA)'; test -n "$(WebIcon48x48dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(WebIcon48x48dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(WebIcon48x48dir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(WebIcon48x48dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(WebIcon48x48dir)" || exit $$?; \ done uninstall-WebIcon48x48DATA: @$(NORMAL_UNINSTALL) @list='$(WebIcon48x48_DATA)'; test -n "$(WebIcon48x48dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(WebIcon48x48dir)'; $(am__uninstall_files_from_dir) install-WebPixmapDATA: $(WebPixmap_DATA) @$(NORMAL_INSTALL) @list='$(WebPixmap_DATA)'; test -n "$(WebPixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(WebPixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(WebPixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(WebPixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(WebPixmapdir)" || exit $$?; \ done uninstall-WebPixmapDATA: @$(NORMAL_UNINSTALL) @list='$(WebPixmap_DATA)'; test -n "$(WebPixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(WebPixmapdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(HelpHtmldir)" "$(DESTDIR)$(HelpHtmlTxtdir)" "$(DESTDIR)$(HelpHtmldivdir)" "$(DESTDIR)$(HelpHtmlimagesdir)" "$(DESTDIR)$(HelpHtmlimgdir)" "$(DESTDIR)$(HelpHtmlrootdir)" "$(DESTDIR)$(MetaInfodir)" "$(DESTDIR)$(VFolderEntrydir)" "$(DESTDIR)$(WebHtmldir)" "$(DESTDIR)$(WebHtmlimagesdir)" "$(DESTDIR)$(WebIcon16x16dir)" "$(DESTDIR)$(WebIcon32x32dir)" "$(DESTDIR)$(WebIcon48x48dir)" "$(DESTDIR)$(WebPixmapdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-HelpHtmlDATA install-HelpHtmlTxtDATA \ install-HelpHtmldivDATA install-HelpHtmlimagesDATA \ install-HelpHtmlimgDATA install-HelpHtmlrootDATA \ install-MetaInfoDATA install-VFolderEntryDATA \ install-WebHtmlDATA install-WebHtmlimagesDATA \ install-WebIcon16x16DATA install-WebIcon32x32DATA \ install-WebIcon48x48DATA install-WebPixmapDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-HelpHtmlDATA uninstall-HelpHtmlTxtDATA \ uninstall-HelpHtmldivDATA uninstall-HelpHtmlimagesDATA \ uninstall-HelpHtmlimgDATA uninstall-HelpHtmlrootDATA \ uninstall-MetaInfoDATA uninstall-VFolderEntryDATA \ uninstall-WebHtmlDATA uninstall-WebHtmlimagesDATA \ uninstall-WebIcon16x16DATA uninstall-WebIcon32x32DATA \ uninstall-WebIcon48x48DATA uninstall-WebPixmapDATA .MAKE: install-am install-data-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-HelpHtmlDATA install-HelpHtmlTxtDATA \ install-HelpHtmldivDATA install-HelpHtmlimagesDATA \ install-HelpHtmlimgDATA install-HelpHtmlrootDATA \ install-MetaInfoDATA install-VFolderEntryDATA \ install-WebHtmlDATA install-WebHtmlimagesDATA \ install-WebIcon16x16DATA install-WebIcon32x32DATA \ install-WebIcon48x48DATA install-WebPixmapDATA install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-HelpHtmlDATA \ uninstall-HelpHtmlTxtDATA uninstall-HelpHtmldivDATA \ uninstall-HelpHtmlimagesDATA uninstall-HelpHtmlimgDATA \ uninstall-HelpHtmlrootDATA uninstall-MetaInfoDATA \ uninstall-VFolderEntryDATA uninstall-WebHtmlDATA \ uninstall-WebHtmlimagesDATA uninstall-WebIcon16x16DATA \ uninstall-WebIcon32x32DATA uninstall-WebIcon48x48DATA \ uninstall-WebPixmapDATA uninstall-am .PRECIOUS: Makefile install-data-hook: if test ! -L $(DESTDIR)$(prefix)/share/httrack/html ; then \ ( cd $(DESTDIR)$(prefix)/share/httrack \ && $(LN_S) $(htmldir) html \ ) \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% httrack-3.49.14/html/Makefile.am0000755000175000017500000000407515230602340012021 HelpHtmlrootdir = $(docdir) HelpHtmldir = $(htmldir) HelpHtmlimgdir = $(HelpHtmldir)/img HelpHtmldivdir = $(HelpHtmldir)/div HelpHtmlimagesdir = $(HelpHtmldir)/images HelpHtmlTxtdir = $(HelpHtmldir) WebHtmldir = $(HelpHtmldir)/server WebHtmlimagesdir = $(HelpHtmldir)/server/images WebPixmapdir = $(datadir)/pixmaps WebIcon16x16dir = $(datadir)/icons/hicolor/16x16/apps WebIcon32x32dir = $(datadir)/icons/hicolor/32x32/apps WebIcon48x48dir = $(datadir)/icons/hicolor/48x48/apps VFolderEntrydir = $(prefix)/share/applications MetaInfodir = $(datadir)/metainfo # Wildcards are globbed against $(srcdir): a bare "*.html" is resolved against # the build dir and stays unexpanded (breaking "make") in an out-of-tree build. # Explicit filenames (e.g. ../history.txt, div/search.sh) resolve via VPATH and # need no prefix. HelpHtmlroot_DATA = ../httrack-doc.html ../history.txt HelpHtml_DATA = $(srcdir)/*.html HelpHtmldiv_DATA = div/search.sh HelpHtmlimg_DATA = $(srcdir)/img/* HelpHtmlimages_DATA = $(srcdir)/images/* HelpHtmlTxt_DATA = ../greetings.txt ../history.txt ../license.txt WebHtml_DATA = $(srcdir)/server/*.html $(srcdir)/server/*.js $(srcdir)/server/*.css WebHtmlimages_DATA = $(srcdir)/server/images/* # note: converted & normalized by # ico2xpm favicon.ico -o httrack.xpm # mogrify -format xpm -map /usr/share/doc/menu/examples/cmap.xpm httrack.xpm WebPixmap_DATA = $(srcdir)/server/div/*.xpm WebIcon16x16_DATA = $(srcdir)/server/div/16x16/*.png WebIcon32x32_DATA = $(srcdir)/server/div/32x32/*.png WebIcon48x48_DATA = $(srcdir)/server/div/48x48/*.png VFolderEntry_DATA = $(srcdir)/server/div/*.desktop MetaInfo_DATA = $(srcdir)/server/div/*.metainfo.xml EXTRA_DIST = $(HelpHtml_DATA) $(HelpHtmlimg_DATA) $(HelpHtmlimages_DATA) \ $(HelpHtmldiv_DATA) $(WebHtml_DATA) $(WebHtmlimages_DATA) \ $(WebPixmap_DATA) $(WebIcon16x16_DATA) $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) \ $(VFolderEntry_DATA) $(MetaInfo_DATA) \ httrack.css install-data-hook: if test ! -L $(DESTDIR)$(prefix)/share/httrack/html ; then \ ( cd $(DESTDIR)$(prefix)/share/httrack \ && $(LN_S) $(htmldir) html \ ) \ fi httrack-3.49.14/html/server/0000755000175000017500000000000015230604720011346 5httrack-3.49.14/html/server/style.css0000644000175000017500000000400615230602340013134 body { margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px; background: #77b; } body, td { font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; } #subTitle { background: #000; color: #fff; padding: 4px; font-weight: bold; } .tabCtrl { background: #000; color: #fff; padding: 4px; font-weight: bold; } #siteNavigation a, #siteNavigation .current { font-weight: bold; color: #448; } #siteNavigation a:link { text-decoration: none; } #siteNavigation a:visited { text-decoration: none; } #siteNavigation .current { background-color: #ccd; } #siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; } #siteNavigation a:active { text-decoration: none; background-color: #ccc; } a:link { text-decoration: underline; color: #00f; } a:visited { text-decoration: underline; color: #000; } a:hover { text-decoration: underline; color: #c00; } a:active { text-decoration: underline; } #pageContent { clear: both; border-bottom: 6px solid #000; padding: 10px; padding-top: 20px; line-height: 1.65em; background-image: url(images/bg_rings.gif); background-repeat: no-repeat; background-position: top right; } #pageContent, #siteNavigation { background-color: #ccd; } .imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; } .imgRight { float: right; margin-left: 10px; margin-bottom: 10px; } hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; } h1 { margin: 0; font-weight: bold; font-size: 2em; } h2 { margin: 0; font-weight: bold; font-size: 1.6em; } h3 { margin: 0; font-weight: bold; font-size: 1.3em; } h4 { margin: 0; font-weight: bold; font-size: 1.18em; } .blak { background-color: #000; } .hide { display: none; } .tableWidth { min-width: 400px; } .tblRegular { border-collapse: collapse; } .tblRegular td { padding: 6px; background-image: url(images/fade.gif); border: 2px solid #99c; } .tblHeaderColor, .tblHeaderColor td { background: #99c; } .tblNoBorder td { border: 0; } httrack-3.49.14/html/server/ping.js0000644000175000017500000000161015230602340012553 // Function aimed to ping the webhttrack server regularly to keep it alive // If the browser window is closed, the server will eventually shutdown function ping_server() { var iframe = document.getElementById('pingiframe'); if (iframe && iframe.src) { iframe.src = iframe.src; setTimeout(ping_server, 30000); } } // Create an invisible iframe to hold the server ping result // Only modern browsers will support that, but old browsers are compatible // with the legacy "wait for browser PID" mode if (document && document.createElement && document.body && document.body.appendChild && document.getElementById) { var iframe = document.createElement('iframe'); if (iframe) { iframe.id = 'pingiframe'; iframe.style.display = "none"; iframe.style.visibility = "hidden"; iframe.width = iframe.height = 0; iframe.src = "/ping"; document.body.appendChild(iframe); ping_server(); } } httrack-3.49.14/html/server/step4.html0000644000175000017500000002447715230602340013225 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_J9}

${LANG_TIPHELP}

${LANG_J10}
${LANG_J10b}
${/* Real commands and ini file generated below */} ${do:output-mode:html} ${do:output-mode:inifile} ${do:output-mode:} ${do:output-mode:inifile} ${do:output-mode:}
httrack-3.49.14/html/server/step3.html0000644000175000017500000001464515230602340013220 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_G44}

${LANG_TIPHELP}

${LANG_G31}
${LANG_G44}

${LANG_URLLIST}:
${LANG_G41}
httrack-3.49.14/html/server/step2.html0000644000175000017500000002124715230602340013213 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${fexist:index.html:LANG_G42}

${LANG_TIPHELP}
${/* Default values for empty settings */} ${do:set:cache:1} ${/* Convert winprofile.ini into internal variables */} ${do:copy:CurrentUrl:urls} ${do:copy:Category:projcateg} ${do:copy:CurrentAction:todo} ${do:copy:CurrentURLList:filelist} ${do:copy:Proxy:proxy} ${do:copy:Port:port} ${do:copy:Near:link} ${do:copy:Test:testall} ${do:copy:ParseAll:parseall} ${do:copy:HTMLFirst:htmlfirst} ${do:copy:Cache:cache} ${do:copy:NoRecatch:norecatch} ${do:copy:Dos:dos} ${do:copy:Index:index} ${do:copy:WordIndex:index2} ${do:copy:Log:logf} ${do:copy:RemoveTimeout:remt} ${do:copy:RemoveRateout:rems} ${do:copy:KeepAlive:ka} ${do:copy:FollowRobotsTxt:robots} ${do:copy:NoErrorPages:errpage} ${do:copy:NoExternalPages:external} ${do:copy:NoPwdInPages:hidepwd} ${do:copy:NoQueryStrings:hidequery} ${do:copy:NoPurgeOldFiles:nopurge} ${do:copy:Cookies:cookies} ${do:copy:CookiesFile:cookiesfile} ${do:copy:CheckType:checktype} ${do:copy:ParseJava:parsejava} ${do:copy:HTTP10:http10} ${do:copy:TolerantRequests:toler} ${do:copy:UpdateHack:updhack} ${do:copy:URLHack:urlhack} ${do:copy:KeepWww:keepwww} ${do:copy:KeepSlashes:keepslashes} ${do:copy:KeepQueryOrder:keepqueryorder} ${do:copy:StripQuery:stripquery} ${do:copy:StoreAllInCache:cache2} ${do:copy:Warc:warc} ${do:copy:WarcFile:warcfile} ${do:copy:LogType:logtype} ${do:copy:UseHTTPProxyForFTP:ftpprox} ${do:copy:ProxyType:proxytype} ${do:copy:Build:build} ${do:copy:PrimaryScan:filter} ${do:copy:Travel:travel} ${do:copy:GlobalTravel:travel2} ${do:copy:RewriteLinks:travel3} ${do:copy:BuildString:BuildString} ${do:copy:MaxHtml:maxhtml} ${do:copy:MaxOther:othermax} ${do:copy:MaxAll:sizemax} ${do:copy:MaxWait:pausebytes} ${do:copy:PauseFiles:pausefiles} ${do:copy:Sockets:connexion} ${do:copy:Retry:retry} ${do:copy:MaxTime:maxtime} ${do:copy:TimeOut:timeout} ${do:copy:RateOut:rate} ${do:copy:UserID:user} ${do:copy:Footer:footer} ${do:copy:MaxRate:maxrate} ${do:copy:WildCardFilters:url2} ${do:copy:Proxy:proxy} ${do:copy:Port:port} ${do:copy:Depth:depth} ${do:copy:ExtDepth:depth2} ${do:copy:MaxConn:maxconn} ${do:copy:MaxLinks:maxlinks} ${do:copy:MIMEDefsExt1:ext1} ${do:copy:MIMEDefsExt2:ext2} ${do:copy:MIMEDefsExt3:ext3} ${do:copy:MIMEDefsExt4:ext4} ${do:copy:MIMEDefsExt5:ext5} ${do:copy:MIMEDefsExt6:ext6} ${do:copy:MIMEDefsExt7:ext7} ${do:copy:MIMEDefsExt8:ext8} ${do:copy:MIMEDefsMime1:mime1} ${do:copy:MIMEDefsMime2:mime2} ${do:copy:MIMEDefsMime3:mime3} ${do:copy:MIMEDefsMime4:mime4} ${do:copy:MIMEDefsMime5:mime5} ${do:copy:MIMEDefsMime6:mime6} ${do:copy:MIMEDefsMime7:mime7} ${do:copy:MIMEDefsMime8:mime8} ${/* End convert winprofile.ini into internal variables */}
${do:if-project-file-exists:/hts-cache/winprofile.ini} ${do:end-if} ${do:if-project-file-exists:/hts-in_progress.lock} ${do:end-if}
${do:loadhash} ${LANG_S11b}
${LANG_S11}
${LANG_S13}

${LANG_S12}
${do:if-not-empty:urls}

${LANG_URLS}:


${urls}


${do:end-if:}
httrack-3.49.14/html/server/refresh.html0000644000175000017500000002371515230602340013616 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}

${LANG_H20}


${LANG_H8}${info.stat_bytes} ${LANG_H9}${info.lien_n}/${info.lien_tot} (+${info.stat_back})
${LANG_H10}${info.stat_time_str} ${LANG_H17}${info.stat_written}
${LANG_H14}${info.irate} (${info.rate}) ${LANG_H18}${info.stat_updated}
${LANG_H11}${info.stat_nsocket} ${LANG_H19}${info.stat_errors}

${LANG_H20} ${info.currentjob}

${info.state[0]}${info.name[0]}${info.file[0]}${info.size[0]}/${info.sizetot[0]}
${info.state[1]}${info.name[1]}${info.file[1]}${info.size[1]}/${info.sizetot[1]}
${info.state[2]}${info.name[2]}${info.file[2]}${info.size[2]}/${info.sizetot[2]}
${info.state[3]}${info.name[3]}${info.file[3]}${info.size[3]}/${info.sizetot[3]}
${info.state[4]}${info.name[4]}${info.file[4]}${info.size[4]}/${info.sizetot[4]}
${info.state[5]}${info.name[5]}${info.file[5]}${info.size[5]}/${info.sizetot[5]}
${info.state[6]}${info.name[6]}${info.file[6]}${info.size[6]}/${info.sizetot[6]}
${info.state[7]}${info.name[7]}${info.file[7]}${info.size[7]}/${info.sizetot[7]}
${info.state[8]}${info.name[8]}${info.file[8]}${info.size[8]}/${info.sizetot[8]}
${info.state[9]}${info.name[9]}${info.file[9]}${info.size[9]}/${info.sizetot[9]}
${info.state[10]}${info.name[10]}${info.file[10]}${info.size[10]}/${info.sizetot[10]}
${info.state[11]}${info.name[11]}${info.file[11]}${info.size[11]}/${info.sizetot[11]}
${info.state[12]}${info.name[12]}${info.file[12]}${info.size[12]}/${info.sizetot[12]}
${info.state[13]}${info.name[13]}${info.file[13]}${info.size[13]}/${info.sizetot[13]}
 
httrack-3.49.14/html/server/option9.html0000644000175000017500000002117415230602340013556 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT9}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I61}

${LANG_WARC}

${LANG_WARCFILE}

${LANG_I34b}

${LANG_I36}

${LANG_I35}

${LANG_I35b}

httrack-3.49.14/html/server/option8.html0000644000175000017500000002346515230602340013562 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT8}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I58}

${LANG_COOKIEFILE}

${LANG_I59}


${LANG_I60}

${LANG_I55}


${LANG_I62b}

${LANG_I62b2}

${LANG_KEEPWWW}

${LANG_KEEPSLASHES}

${LANG_KEEPQUERYORDER}

${LANG_STRIPQUERY}

${LANG_I62}

${LANG_I63}

httrack-3.49.14/html/server/option7.html0000644000175000017500000001643715230602340013562 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT7}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_B10}
${LANG_B13}
httrack-3.49.14/html/server/option6.html0000644000175000017500000001703615230602340013555 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT6}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I43}
${LANG_I43b}
httrack-3.49.14/html/server/option5.html0000644000175000017500000002275115230602340013554 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT5}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_G32}
${LANG_G32b}
${LANG_I50}
${LANG_I50b}
${LANG_I51}
${LANG_I65}
${LANG_PAUSEFILES}
${LANG_I52}
${LANG_I54}
${LANG_I64}
${LANG_I64b}
httrack-3.49.14/html/server/option4.html0000644000175000017500000002112115230602340013541 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT4}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I44}
${LANG_I47e}
${LANG_I47d}
${LANG_I45}
${LANG_I48}
${LANG_I46}
${LANG_I47}
httrack-3.49.14/html/server/option3.html0000644000175000017500000002074215230602340013550 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT3}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I40c}
${LANG_I34}

${LANG_I39}


${LANG_I40}


${LANG_I40b}


${LANG_I40e}


${LANG_I40d}

httrack-3.49.14/html/server/option2.html0000644000175000017500000002220515230602340013543 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT2}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I33}
${LANG_I38}
${LANG_I56}
${LANG_I66}
${LANG_I67}
${LANG_I57}
httrack-3.49.14/html/server/option2b.html0000644000175000017500000000743615230602340013716 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_Q1}

${LANG_TIPHELP}


${LANG_O2}:
${LANG_Q2}

${LANG_Q3}

httrack-3.49.14/html/server/option1.html0000644000175000017500000002026115230602340013542 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT1}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_I31}
${LANG_I32}
${LANG_I32b}
${LANG_I32c}
httrack-3.49.14/html/server/option11.html0000644000175000017500000002463115230602340013630 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT11}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_W1}:
${LANG_W2}   ${LANG_W3}


httrack-3.49.14/html/server/option10.html0000644000175000017500000002000615230602340013617 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}

${LANG_O2} - ${LANG_IOPT10}

${LANG_TIPHELP}

${LANG_IOPT1} ${LANG_IOPT2} ${LANG_IOPT3} ${LANG_IOPT4} ${LANG_IOPT5} ${LANG_IOPT11}
${LANG_IOPT6} ${LANG_IOPT7} ${LANG_IOPT8} ${LANG_IOPT9} ${LANG_IOPT10}  


${LANG_PROXYTYPE}

${LANG_IOPT10}: :
${LANG_I47c}

httrack-3.49.14/html/server/index.html0000644000175000017500000000771115230602340013265 HTTrack Website Copier - Offline Browser
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}

${LANG_G30}

${html:LANG_Y1}

${LANG_P15}
httrack-3.49.14/html/server/help.html0000644000175000017500000000614515230602340013106 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}

${LANG_O1}


${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_O16}...
${LANG_O17}...
${LANG_P16}


httrack-3.49.14/html/server/finished.html0000644000175000017500000001003615230602340013741 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}

${LANG_F18b}

${LANG_TIPHELP}


${do:if-not-empty:commandReturn}
${LANG_F19}

${commandReturnMsg}

${LANG_F20}

httrack ${commandReturnCmdl}

${LANG_F21}
${do:end-if}

${do:if-empty:commandReturn}
${LANG_F22}
${do:end-if}
${LANG_G8} : ${do:output-mode:html-urlescaped} ${do:output-mode:} ${path}/${projname}
 
httrack-3.49.14/html/server/file.html0000644000175000017500000000511315230602340013067 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}

${LANG_O1}


${LANG_D8}
${do:loadhash}
${LANG_S11b}


httrack-3.49.14/html/server/exit.html0000644000175000017500000000124215230602340013120 '${projname}' - HTTrack Website Copier ${LANG_SERVEND}.  ${LANG_CANCLSWND}. httrack-3.49.14/html/server/error.html0000644000175000017500000000375715230602340013315 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}

${LANG_FATALERR}:


${error}
${LANG_CANCLSWND}.
httrack-3.49.14/html/server/addurl.html0000644000175000017500000001175615230602340013435 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${/* show help only if available */} ${do:if-file-exists:html/index.html} ${do:end-if}
${LANG_OSFWB} ${LANG_O1} | ${LANG_O5}

${LANG_G43}

${LANG_TIPHELP}

${LANG_T2}http://
${LANG_T4}
${LANG_T5}:
${LANG_T6}:
${LANG_T7}:
httrack-3.49.14/html/server/about.html0000644000175000017500000000454515230602340013272 '${projname}' - HTTrack Website Copier
HTTrack Website Copier
${LANG_OSFWB}

${LANG_K2}


${LANG_K1}

${LANG_K3} : ${HTTRACK_WEB}



httrack-3.49.14/html/server/images/0000755000175000017500000000000015230604720012613 5httrack-3.49.14/html/server/images/header_title_4.gif0000644000175000017500000000370215230602340016074 GIF89a"»ÿÿÿkk¡??_{{¹ ++AUU€44Nvv±JJo-``!ù,Ž!@ÿÈI«½8ëÍ»ÿ`% $‰„hª®lë¾pŒAm m׸¶Û¡_MF ~„¢rÉl:Ÿ)pJ ô2Ó P#¨Ö“®·jiŒmàÉq—0„ ÔútAØ{ -©µ}5t6†kWb|:,; „…z˜ j<³ÇR¦?¡¼†MªÕ«X³jý'0`Ó  $úC‚Ž˜n¤ ³´Tµ+R Äó‡2&r@@BM‰¿%Nha±;°F  V°ã=ø>&A˜ Í :ÞT·™‚"Ë«EâdãÉ}%œþ +©:°cËÆôPÙYc[þPY!]m®·& ûÑÀÃ\* C`Ú9Ïœ›É&˜|›L.HlP™¥P´gWž #û‡5¼9¤ãÃrA+xV„˜ü:×ãà›ÛvðZý° ÿT QàÛ‘Ìõ‡{#±0`r — U$ 04ÅY`|„á# D)8pÇÞ5"+EUR.å£4=ì‡ÔQ@ØÕSPå·•Olü(äDù+v%L9¥£’Fv `”TViåUH^e,RØå•/ æ˜d–Å“SøÖ5].EÕ6´QqÙÂÔ¢˜}dôhMÀ‹Š<—g"ù§MKND+ìõÄ$fÙÙA~,ºCLqbéD¬aq&`“=j˜h3›Ú`‰khªù%A·˜lçH8ÑIít 0°Î” •?™ÈIŒB}”ç…\ ’NÿG˜¤fˆÈ’GbúX¤xhQ|ºýAjµáT+Fªï%ù›—±z°¦nÿW!¼Þºiœ]ÁBˆ›©ËNÀ=ÞúB¨ÀHŒ·MÊ~K­°ò ѧÀ!è ­|£P±Í¸^•R¤Pj‰#»ñŠÕn¹#O@i ˆfz- cÞ= 4àEnÑ¡ ú³m3ÄT6o³`2±ª "D®~+`¬3Hˆ( æb§02,+b0tÇ/q kÈl–LoÒ;{1 Ùƒœ13žÑñôyS×’¦‹ÖMÀœÀ6Àa€JA8pX£à’^¥v/ª76l ÀÌ6:Û*—wÿ]WdxÝrKŽ?[6\x©!åˆfáfÂ'Lë°Ç.{é#B‰úÀ·S11•SÊîûïVÒn­í«“’{š¾÷üòÌo%<Ç¿­ö×%"} Ô;¦ï˜Ê7ïý÷M<¿õº\Ší_ÀËwþúì» ¾ø¼{>Ú8Y>$0ðö H6€R_û@@+Ø 6!@`ì\ó©ÏÕ yóã—»Ú´ÚÄ„U…h Töƒµ½Nc•ðÀr4€ŒÅ ':ƒÒÁî ¯³í =à@]0x4 €†Gk™¤U1‡iîtA9•>‚ÃñÇ|sÛØ|è§Õ•Awúàølp³ JVãñV2d# ÿ`£‡Á'vb†*’êr58€l¨!1.Âf{¨ÓU "´!, ^ÙÃ˜ÐÆÔèÆÎÅÈ0@(b“ލÄrŠÐ³ ɲCØØYS:뚆BíB#ô³"ˆ5l}TÛä©wE„ñ¹z™¬Ôq'XèA\U{Ø*+`,tÏUH*AH´ äªqŠËöWa\f”ÐG×â× 1Ââg¤ôbÒŒ€ÀÑ;»œf Ò‘° póÒx™wÚñŒé2GÛ`çû>öÄa&ÑžªKWíéÂ%¾³‡UàaøD~X¯BÏú©ˆ*-ÓãÆJ‹1ÿb5¥9«ò‰8€!0¬Â)ßàaž^+[#ïI¿|¢-)Ðäf½†x/6È›F˜P;^&Mm‹…Ôæt 9T8TQ8áé1+Ž Å¨*eD×5î3MV! 9¬Frs_ª6ƒYÏ–jÐÇŒ[X‚UÅ LÉVøì±ŒU>õ4›ü¹P†äZ”ŠQ´©*à‡FÜ‚™#MHaÝ¢ÕŒ6íSŸ]#ŸB[ZÖV.1ÁêäFzB¨x°*ðÛ@œÊÉ2Ny šÚd–Ð&ðQI¬h$cå ¤AÚ ðƒWÀ„RÁê×Ð]Mt5à J%«Ò¸NÖ²ÄDnX™’[¦|¶ªVo­¡ÛJWž–M‚ÈÐG6!­\õ6¶€]o /Èr m:²TÎù–±|ÈZXó?ù±T¹.Å/†2‹²³Z@‡Œâ¼–‚[Njí̀㠵± UAEKÑð,ê´R/™gX\{k™ÜXI˜F;httrack-3.49.14/html/server/images/fade.gif0000644000175000017500000000006515230602340014116 GIF89aˆ! ÿÿÿ!ù, Œp‹™ÌÜ‚* ;httrack-3.49.14/html/server/images/bg_rings.gif0000644000175000017500000001021315230602340015005 GIF87aõȪÌÌݹ¹ÐÄÄ×¾¾ÓÇÇÚ½½Ò,õÈ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmß"!CàÿÀ pH,ȤÒ8h¸¨tJ­Ât…¥vËíz¿à0Øi-›ÏhBOÌn»ßð¸œ](@Ñø¼y=ïûÿBM;wzO;M€m…ŽŠ“”C„™X•š $’¤n¡¨¡—œx±åÇ—4ïúõ·suУ+Ž×xËw×§AÖ¾„{ß¿͇Ïä<ßÝDK«_½û-óg—;`:ýÿã݇ßñ CÿÁ°ŸZä'šM Î!È—i$=ÉÊ‘L¾”¤’”ô×ä”Ó< å9dP©%$V^é‡Ow£a[>Ò¢—h¢Yæ4g¦éfmk^Eâ›tž'qsÖ©'wö™Wž{Béç )"d }0B#¡Œª“á£Fúh£”Vjé”R¸!‡‰„Áé„fxé¨CЍ6ûê§§¶ZD–ªRÔ¦«´S@‘±¶ph­>(:Û=».„k¬;"Š`®l”è¢ÿ#º:,²6¬b ³Ká˜"µÐÚ"í{Òé`¶“û¶Ut¹àîö!xgXëºén9+2˜ë¼ñf`!…Ÿ ù©¦r•Ý·†\Ip®óòÚë³Sd”½e ±pŒ\ƒ†Êq«Fàîq•ÆøÃõ(›R×v0‹-‘ž©–˜0qaò¦–oS9X¬MÎlÛÍ$ˆ,•’.ßµsd@× ®Ê5d]Ò5ø,WÑe¥,!ÔRHÖÊn-}5ÖR- ÕN%vÖÃgöÙQˆ=ölVͶ^÷FöKu/97ÝhâkPÜ}ì6šwˑ߂k7È›¥—x´o"¾ÎG\?àÿÑ= ãw–ǰ¸v¢aRç,hý¥hŸ+¢9é¢ì¹úa¦û!yânóXùS±2;Ø© ¸;’òýnîç:G|)…g+:ˆ·«ÕûEïý<ˆÂÓ4}e°Z*²³L¯pO-OôšÛ~¯Ådâ§2Ìt®v=ásë°!R©齗ɳžíû§æ¯ÿ¥µ3_yü÷¿>ñO€¯ª^Y”>¾!{ë¹Ç8ö9Ð[ý:à‹(˜ ^ðƒá Â&A„™°  i…ÂuHp…Cj!pTC;ÉTó ö|uÃúð‡@ ¢‡HÄ"v.‡ U˜ŒˆµÖ õcbxLöÄ`@PŠ%ÓaÿeQb±$Ü¢›vðÅz‰QŒÇ*#ÂxÆj“Zã£4µ)-Rbc_¼_š¢ØCÙ1D^¤Ôöx«@:ʼnÀ#ØX§è勊} }þXEŠ’.‰Ó é$IÒ±± Ò©š§FÐ0D¡ ”!ÕX¾/„Ò ¬Í+KÉS]!¡$RVIËز(éàd/¥ñ$RR‘¾&E’dL¸‰—ÊÔC°fÉ] 'š}YP3??l®f?¸\çÍÿ)œ"§‰z(?kzCŽÄNyp¡¾Ç!ƒÐDAvŠTϤýò‚WÌÃrü¥mRI„¤¦ 2+!Ìúˆ§#€5ÿ­rù ÈìA#X‰†“I’E•”Oµ ô "Í?ÒœTƒÊh%6Š—V!”2½—&)7ªSÞ J%í D‘ðºýaXCµ¢–^JÔÎME%9-MP U½q0¼`ª3ŠJ­ÞtˆÈÚhZ¯¡—I•̂͢ÖȬBP¨àÒ ŒÑ5Sõ'P»:rV{͇\-w×XäÕ…`9ð×Ê„gmÞ„k]Yo&¶ιlË/ái ƒe—k‹¦pV±ÜÚ¯ØzZhi*5íi% ²–,!¶•a7'[ÎÒ(¨SHk&Ò¢bœmliBk äÿ.ö·juŒráÀ\ºI41.Ô^kØÍp÷¢¾}Óm>¢Ý›Mw¹°Ùb…)™ïú€«¬¤Sy3áÞ^y³‘émInY]TW'ðeb}c[¤T7i©E¯w¿rà|Ê}hi0¸µ_yÊe¾”JðéV£á> ó‡®íj#aí*ÀÝQp;\ ‡"ÄP”áyÝSázô—#„±3JlŒ'ÅÅëÑñ3¦Èâڙü:r*|Ì %ßEÈÚàq• ÔÅ\AY(^Í'•T‡AXÁÉ` ”ÓqåæcvT™$”»(Í6.röÁOf¥µM áÜf<§)›+äó‰lêPÇ0ÿ°D›%g Hûâ×§’P€…j‰q:´,‡kÀ6²Ìœ–ÆšÓÒPiÔ*6õ[=}P«Z[fõ§_MœMÊši¤µ`l}ëºZ×8@µ› l“ø¹×Iáád@ªØjÙ?P¢‹s¨A"ÚÈ.å³±í¢ç6šÛ×Uu¬Á­°b;`ÜänŸ¹/€ît§hݾü¶»a ïì`Þ «wÛoáê{¢üî÷$þ{ ?%8MÚyÆŠ)|UòÛ©+V¡‡[üâϸÆ7ÎñŽ{üã ¹ÈGNrýiHâß'K~'?bÐ ¿fù\þD>ÊÜ…·Íoëk ¼Ë1ÿïxÎnŠ„óüjö«|t´›è[ýpÓM)o¨+"×#÷¹Õ ƒu‹k}ëÚ)u±•öIt}±O/;,ÙË´o±·ªq#=¿Â°½ˆÛ&OłތQŽï5âõn4ƒGwyçÑáS÷Xˆ}ndÇà‡’tR<>_‘߯ä?úõmÞz¼ü͆n™X%^°¼÷Nåf‰^„¤ççm‘y@<úR±Ÿ “Z¯Ûoz¯ÿf«ì,ÃÎG{öU¨ú…õíö˜IFùT!~|Ùàû2ð>Õ‡XõQ¦'é·ù?ؾ  ÿ‘,—üÁ÷FíK?uYÍû [{û7Ð|ñƒàú{±?ÿ­—–~P?7ów^ 69X:É0yÿ7ÈoIB€ŒõLxÁÕT\8s»Ò3&ÈsxFZø‡æ—Áö3Z&È%8Â\ë×%¸‚ep( µ€2!ƒµ°¡dƒÎ€ƒÄ x>à?^bÈ‚DŽGq˜&+r7«–8 49 ëøÙK?yu5²ØD“ ÙŠÑÿ¤”C H™”‚Â2¨‡MÙy }åMMy•–ØDe%[É$E©giFš±XPWáqY=y6YÙa)sy6„H•õ”žÈ—<9[{9}Mý´CYNuÉkéšÕZ_˜ê€­õ–BИ(™ÉåY»‘˜åd™²š”–¢‚Âו‚yŠØZÃ5„³qcõ˜ÔG˜¬Y™¦™_ù€™L¢&ˆé™‘Å›¸‰—Ú \…Mi9 É Aš•‚&y™ ‘‰ÎÙ(²Éщ >VŒrIQ`µÉYÄš ¶’§•œ”`œÇ9Lè9på集ùgïI™œ%íÜÿ9(cœù°œE4lü™›õnÒENåd€Ï—]‹Õž@9ŸN³ âêeYêÉ©›ÿá‹ ¨©Lª•¼uþùCÓ‰Ÿª™Ã4g›žÙ™.ã‰k'Š¢ÚV'º:Ñ¢ÐR¢ô˜ œC”ø%¡»DKê5Ú:ÍXJz2¢¢D?¥ô¢ÿxŸTQ¤@ú£Pʤ_Ä €¡žA*E:*¢VXä¤E ¤KŽ8*H¦eùgDbú’·¥@Ÿôa,³±frÚ,izš{q¦}§–·~ ç¸@]Ú£zÚQ>4¤q@¦O!lÆ8W­"¥&P¨ßÙBJ wzÞɧÎè*œúb•z®ÿ¨WQ{:z´"©ÁØ{¬Ó¦N™Yäq‹ÛE+ƒª¯(«ùr©±©Žx–.ºZ µª”=ªÚ ÁŠ<æä"§ê'®**’¼: Ϻ5"¦]†Šß3­UP­½ÒÇß®,`‡†¸^äwോD®åê­q[æ3¬¢ v!‘¬"Ö=øêxz5o=¡¨3宯éÙfûj++æÊ+¥úA KŪnWA©Ø'/;Yea°¦A(¬Ø*o‘±ZA)PœoÁ±ÉÐS"+»C›c¢šçCŸêò“°Jð¦5Ä­%3Šž0ijKa„¥0!I­U$´>‰bÿ¤´Kû@ˆfO[žV³SfUû²7·² á´O˵ «W«ÐÖ¬c[Üf¶gk}8Kj^;([ o;`ûš¸¶upj‹·4·FÆ·…P·QH€{ [µs›}j„[¸Qà·úµ·ŽÛwk·¿Ê"‰ë!m['0÷+„&ª‹‹¡¸p†'ˆ($¸Ã‡®·ÐN½“¨¡‹*‡ˆˆ÷§ˆuD`A4±¯ ²Et¸¹{*eT¹½Û½„»ÁË#Z¼4[À‹¼›jÄ˼®lÏ ½rQoÓK½ñªp%‹½“q¼Ë½ÊqÛ ¾Îr×K¾tÈs‹¾=8ã˾~°´ë ¿t¶•XG¿0¹ 0¿ø»úïÛ¿Íû¿‰x¿|VìtG¿VÛt†Ò»£›À «hiKFÜs ü=\xÁÝ@´Ì³wZËÁúrruôGœ0G+Â*¼Â,ÜÂ. o ;httrack-3.49.14/html/server/div/0000755000175000017500000000000015230604720012130 5httrack-3.49.14/html/server/div/com.httrack.WebHTTrack.metainfo.xml0000644000175000017500000000413115230602340020540 com.httrack.WebHTTrack FSFAP GPL-3.0-or-later WebHTTrack Website Copier Copy websites to your computer for offline browsing

WebHTTrack is the web interface to HTTrack, an offline browser utility. It downloads a website from the Internet to a local directory, fetching the HTML, images, and other files and rebuilding the site's link structure so you can browse it offline.

A step-by-step web interface guides you through choosing the addresses to mirror and the options to apply. Mirrors can be updated in place and interrupted downloads resumed.

Typical uses include:

  • Keeping an offline copy of a website for reading without a connection
  • Archiving or preserving sites and capturing them for later reference
  • Updating an existing local mirror without downloading it again
WebHTTrack.desktop httrack Network offline browser website copier mirror crawl archiving https://www.httrack.com/ https://github.com/xroche/httrack/issues Xavier Roche Choosing the addresses and options for a new mirror https://www.httrack.com/html/images/screenshot_01b.jpg
httrack-3.49.14/html/server/div/WebHTTrack-Websites.desktop0000644000175000017500000000061315230602340017160 [Desktop Entry] Version=1.0 Type=Application Categories=Network; Terminal=false Name=Browse Mirrored Websites Comment=Browse Websites Mirrored by WebHTTrack Keywords=browse mirrored; Exec=webhttrack browse Icon=httrack # Helper launcher for WebHTTrack's browse mode, not a standalone app: keep it # out of software-center catalogs so it doesn't duplicate the main entry. X-AppStream-Ignore=true httrack-3.49.14/html/server/div/WebHTTrack.desktop0000644000175000017500000000047615230602340015404 [Desktop Entry] Version=1.0 Type=Application Categories=Network; Terminal=false Name=WebHTTrack Website Copier Comment=Copy websites to your computer Keywords=copy website;backup website;capture website;offline browser;surf offline;mirror;mirroring;archiving;forensics;crawl;preservation; Exec=webhttrack Icon=httrack httrack-3.49.14/html/server/div/httrack48x48.xpm0000644000175000017500000000635715230602340014765 /* XPM */ static char *httrack__[] = { /* columns rows colors chars-per-pixel */ "48 48 34 1", " c #040404040404", ". c #080808080808", "X c #0C0C0C0C0C0C", "o c #111111111111", "O c #161616161616", "+ c #1C1C1C1C1C1C", "@ c #222222222222", "# c #292929292929", "$ c #333333333333", "% c #393939393939", "& c #333333336666", "* c #424242424242", "= c #4D4D4D4D4D4D", "- c #555555555555", "; c #5F5F5F5F5F5F", ": c #666666666666", "> c #777777777777", ", c #666666669999", "< c #66666666CCCC", "1 c #808080808080", "2 c #868686868686", "3 c #969696969696", "4 c #999999999999", "5 c #A0A0A0A0A4A4", "6 c #B2B2B2B2B2B2", "7 c #99999999CCCC", "8 c #C0C0C0C0C0C0", "9 c #CCCCCCCCCCCC", "0 c #D7D7D7D7D7D7", "q c #DDDDDDDDDDDD", "w c #E3E3E3E3E3E3", "e c #EAEAEAEAEAEA", "r c #F1F1F1F1F1F1", "t c None", /* pixels */ "77777777777777777777777777777777777777777<,,<777", ";&,77,&-<-&&&&&,-&&&&&,777777777777777777<$$<777", "# ,77, +X;+34%21X", ";; -$ 2;tt*qqO:00%1qtq6t8 99q 40e:Xqw=4$rt:9w-", "$1 1- 4*4=@66$5%:$1%9%5-$ $8#=O9$:8X6:24$6=+6;4", "O4 51 4*> O4>%5O $1 6 4O >- *2 X0X5O54$3 6O5", " 6 64O2*4-@42+3: $1 6 5:* 3@ :- 5#5O44$6-@6O4", " 6O46$>*re*08 =w*$1 6 6e6 5X 2$ 2%6>14$ee;6:2", " 2=15:=*96$ee% 48$1 6 561 5X 2# 1%wq@4$06*0w$", " :4-24@*> O4:2 X9*1 6 4O 5O 2% 2$8* 4$3 88 ", " %w#:0X*> O4#3 4;1 6 4O 3$ :; 6+5 4$3 68X", " OrO%0 *> O4#24X3;1 6 4+ >1 *6 X8X5 4$4 64#", " 6 +5 *61#62:6:8*1 6 52: #w=:Xq:13X5 4$81$6;:", " > : *tt*e0+:r8$1 6 6t8 8eq 3rr%X5 4$rt:6#4", " @ @ +::O;# O5*O# * *:* $6: +61 % %O;:@% %", " ", " ", " " }; httrack-3.49.14/html/server/div/httrack32x32.xpm0000644000175000017500000000260015230602340014732 /* XPM */ static char *httrack__[] = { /* columns rows colors chars-per-pixel */ "32 32 7 1", " c #040404040404", ". c #0C0C0C0C0C0C", "X c #161616161616", "o c #333333333333", "O c #333333336666", "+ c #666666669999", "@ c #99999999CCCC", /* pixels */ "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ OOOOOOOOOOOo @@@", "@@+ @@@", "@@+ @@@", "@@+ @@@", "@@+ @@@", "@@+ @@@", "@@+ @@@", "@@+ XXXXXXXXXXX. @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@", "@@+ @@@@@@@@@@@+ @@@" }; httrack-3.49.14/html/server/div/httrack16x16.xpm0000644000175000017500000000075415230602340014746 /* XPM */ static char *httrack__[] = { /* columns rows colors chars-per-pixel */ "16 16 3 1", " c #000000000000", ". c #000000008080", "X c #808080808080", /* pixels */ "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. .X", "X. .X", "X. .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X", "X. XXXXXX .X" }; httrack-3.49.14/html/server/div/48x48/0000755000175000017500000000000015230604720012727 5httrack-3.49.14/html/server/div/48x48/httrack.png0000644000175000017500000000473415230602340015021 ‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ pHYs  šœtIMEÝ ";”S= iIDAThÞí™oHׯIÆ$µ®ÆŒb4[·¡‰A’¡T J ­Õ°I+-bk+éô@ .±H ùrAü P åVèM‹a+. Æ„ÿMeq­4›‘m6èšà®«1Fk9÷ƒîÑqMRnSÓB^XvgÞ3çÌsÎyŸç}Ï®ihèüÅM×ô…+U]ô)ux½PUuÁ£ë:º®c·‡INþáð)††’c:VU•pøâ}êÒ‘þ0ˆÆ…~L÷•îîn|>_Ì`O££i””ÀÅ‹™œœŒéÔnsíÚ5‚Á`Œ/)éÆc044´À|-s{ àI›ò{%''G(Àb±G||<‹…ÙÙY&&&˜››“¾H$ë¯@UAUÿ À_8 ƒ”—ÿKh~þ|»3gŽÐÓÓÃÈÏ?òt =Ö-ôÇ(vE…Iñ™…K}d¿ò è„ç] @8|Ц¦O¤/úµ™™:šš>áܹÓýåý†Ã§WàÊ•£ë²ÁãY§…œœd<ž&TUC×ç… ½½ôô!<ÕÕÅò—Ë@(B×cÔ7Ú¯ÃáXàóùߟ²££m¦Ù‹ªz(âÞ½{¦¶á°Yõ—û£mâã V'ˆ—¦ýýgL¾û÷ïÇÌåÍ›7e¾¥¬6k‡ýðð0iiilÞ¼9fff:°Z­À*PЙšš '§Z&Kgwnn€’’Óv‰Úõë×HOOGU—ÐèÆ‰‹‹“ WÊ>ÿ_³Z­8mrÿ+Š‚ªj YæÙ˜±¬Vë’LV•´ù믿Òßß¿°}4³ìØQ! ‡/ÒÒÒòؤ§;—ð?$&&JÞ¿r%-@JJÊŠý,sAðøØíᘌNp|||Lû•î­ ‰¿TÂb±,ï¢V=âùÑÑÑ>ûÜsÏ™èö‰˜ššB×ç·êJåh0”/¸\¶nÝjb§UÖ‹ÅÂää$33ue;]o$¶sëÖ-vï®[R›-„ÃatÕ²ääd&''ùúë¯W<É8{v ÇãÁãñàp8b&Ájµ.Wúên!U…Í›7?‚±ì¿ƒ–Óå6Zõؽû]Óõ¶mÛL×ÙÙÙ¿›B½^ï“bUR¡Ãá 9Ù|(¶aÃÒÒÒª Q½ ƒ(QX©§±±ÑÄÑÓuuY’fÐÝÝ×ÛhJ£½^/CC‹ý¬_¿~!1›alll…ñ—¦Îat½‘ééiæææèï?b¢ã5Š¢üåÏFŸl=ð'Úºýû÷× !ˆD"lÛ¶uëÖ1==Maa!|úé§¼öÚkø|>jkk¸qãiiiô÷÷c±X¸~ý:¼óÎ;¼ñÆäææ²}ûv>ÌÞ½{¹|ù²ðÕW_¥««‹ŒŒ ÚÚÚp8\»v §ÓIkk+ÓÓÓ|þùçìÝ»—¾¾>Þ|óMîܹÃÉ“')--åÎ;|øá‡ìÛ·îîn¨ªªUUUBQQ^^.TUŠ¢ˆ“'OŠªª*àEEEÂ0 a†HMMš¦‰ÁÁA188(òòòDmm­0 C†!\.—¸té’PE~z{{Eoo¯0 C(Š"Äàà ¸}û¶Ð4M$$$Ã0D eee¢¡¡A¨ª*"‘ˆÐ4MôööŠ@ ÊËË…âõz)++`×®] ež‡”” ¢µµ•¤æçR]]ÍîÝ»™ ²²’ÞÞ^QYYÉ|Byy¹8v옜ýœœîÞ½ËG}DVV–¬¼*++QU•ŠŠ š›› µµ•¼¼<ùl{{;eee¢­­ÒÒRêêê(..fm Àf³™™%ADmhh·ÛÍÝ»wáêÕ«’Ç Ã ©i±¦íééaxx˜žžff¦hooÇãñHqq1õõõø|>Ün7ÙÙÙ\¸pÇCss³L3B¡ Î;Ç–-‹*}ëÖ-Ün·Ì^Ýn76<ËÚP($X­‰Øl6¬V«»ÝÎÁƒIHH ))‰@ À½{8Î׆ Ïât:),,”÷222LÇ&YYYôõõÉr±«K—yμÐM™Ò胚R™™©E²Z­ŒŒŒ`³ÙHOO'‰ðÖ[oQ__Off&………äçç q»ÝÔÔÔ˜^Ð\˜'râÄ Ž=º$-HäöíÛò:33Sþu0<|“M›6aµ&òÞ{ï122"}¹¹¹Ô××SP0¯ÖN§“±±±y^¯——^z‰‘‘B¡ TUå§Ÿ~’'vD"RRRعs'/¾ø"n·›¶¶6>û쳄Btvvòã?>”—VdÑXÚ³gš¦ñÕW_IߨØ555|÷Ýwóü~?¥¥¥ 0<|UUeÀž={–C‡hiiáøñã2è;FBBIII1/633ÅáÇ9qâÄC öM›6™r¤ÙÙY Ãàý÷ß—'p?üð‡âòåËŒŽŽbg@?%%%x½^ü~?………¦¥^jW®\‘ƒÞ¿]7ïÛ‡Ïö„©­ßïçùçŸ7¥Ò£££øý·LÚ±Ü&&&äYÖÚ(›$&&266&ŽV:ƒ‰Úøø8õõõlܸ‘ß~ûíí¢lµ_~ùE®^T_ýuù2‰‰‰Œ¯¬¸ëÖ™®þùgÒÓÓçKÊP(D{{;¡Pˆõë×ÓÕµÈûöíã™gžá›o¾Áf³ñöÛoã÷ûÉÎΦ¢¢‚;wòí·ß²}ûöúøãñûý’j]..\@×ul6ÍÍÍìÚµ‹êêj¶lÙ"ãn%Û±cÇçûï¿ ££ƒ‚‚‚ÅšøêÕ«²HèèX\¾¬‰*qnn.‡ƒ—_~€Ó§OÓ××'k9 ½ûî?×\ºtIDø|> ÃàË/¿drr’¦¦&Ο?ÏéÓ§xå•W`Ïž=ìß¿¦i"Zw=z¢o·ÛÅòß[·nš¦ MÓDjjª¨ªª/¼ð‚PE¤¦¦Š3gþ#ŠŠŠDjjª¼_TT$¿5M“×ѪªÂår MÓä.—KÔÖÖÊ6yyy¦ßѱ5Mv»]úóòòÄÓ‚æ)€?hÿË}~¬bÎv'IEND®B`‚httrack-3.49.14/html/server/div/32x32/0000755000175000017500000000000015230604720012711 5httrack-3.49.14/html/server/div/32x32/httrack.png0000644000175000017500000000034615230602340014776 ‰PNG  IHDR szzôbKGDÿÿÿ ½§“ pHYs  šœtIMEÝ ""ð8×ýsIDATXÃíÖ± À0 ÀOÈZ3cxVá12CЍð2Â]Ò¦ Ø`p‘ÿZ¾}/ó¿ä¿ÏÿÉþ.ÿÿõ'`nQà€q` &è` ^áƒÞ0aV¨a NÑᆠ®ða#†hb %úW߉,æ¢.—.òˆÖšŒß¼³Ám-Vðb1šS¢Ô8×;f OüÈD£M@d( 壜A}]0eŽ­1y“K@ÉåQúdÄRth²†H•1Y ÝP\24@9w‘™=yɘJÄ”o¸±T¿©©Hž3 *èr¦UT¨jÕÁ©'Ÿ®h‘½-‰ÜjHF‚¨o;Iš×¨sAŠœžPŠ„˜2Úi¦vYd桟Aj£Ž«ýi[R†¢Ú”¥æK¦Luù)©³5¯ÿµŠzd±»æ¶e‹ªÁê¨uÑ6²(M Èu¥"‹«B…b+“·'Vkĵ¥Îzêw=çl à&7ÒŸ´Q¤¡çjè¤Â¢0 Ùª‡nº»—p šìkê±Q%|0‹+¸ðñwŒ0g"—ŒâÆú¡lòÊ„ „Ë,S³3Çœ`Í<hÖÎ<›¥ò=-ôÐCÿ Î;è,ãÒL7íôÓPG-õÔö !ÕXg­õÖ\wíõ8V{‚´J`öÙh§­öÚl·íöÛpÇ ÷°„´rç­÷Þ|÷í÷ßqÓm7'c»hõx®øâŒ³]waˆ× câÿMyåÿ˜g®÷ã„E>ø&…ãP¶æ¤—Þ¶äx>¹éz_Îú뚣þ€ê¯„náá®Ã®;ã²§šÍç¢ç¾{ÚÂoüÞ½7@»+¶Û0:ÛÅï½Úâ¿vò{þŽA•%p/â‹ã=½Ûâ[o>ߨ/°|+Í×ðüÚã˿ٔÏÏzúMiéÅxŸzâö£ÚÊG¼¸ð|œ[ÀÖÇŠöÑà}Ôc\Ï6AÒá ¤ ÿv4-ð`‚—;  øÁšÐmÌ *8ƒÑ‰/#„¡«W@–P†7Äá©gÃâð…L[ õ'¥x} M>"ýhB&΀0|ácxÂ*ªmˆ< ÿeàÂúM±„>á½F0þpŒ#Ïè7ÔýI…ÚØ`ÿ:@ªÑŽk¬£¡ˆG0Zñn”Q±EáÎŽ}L$"©G3î°€ÄsÈ"ù7ÙYdcÿf§ÇRŒŽL$(ëÄ?Þ/<—$"û€‡¡Cú1”°|å+ÙHYÊÒ“K¥-óÖ»r`2“)Ø$'ñH’OÞ‘£#KiÊÒõ2{Y4E!aàÂG®ñ‘Ê„e-sç:\Z›è[ *û”Lø]™Š¼&3›;qF³Ó|A¹Çl–Q›_Ä'8i™Ïub‘•Î+§(ÓyÌQÎUü',âé‚jÚPlT":sØÿÄQVŠ^ìa8!6NåQ†¸Ô¡A zC„žP¡µ¨‡\i?nÚ³mó â:…èN•>p3…¤IˆRæÙ”D,•ù„Jºœž­§aÂi区SÀ!µ?…B5IS¢jŽ©xªG«ˆÕ¦öM«+ŒªŠšÔU¯"¯¦«3«Z-ˆÖ”’,\ëð08•Ž®ª¬r]+]¥b×T0´Ì+ë öNáU°^%¬X%ñWèÌ‹•'," ‰ÆŠÈj™É¬f3ë„Ízö³  íB)&ÒÚŒZ¦­ÔiWû¥Ô®Êµ¬ÝeU0ÛØÒ£¶(À­mÑ¡[ôv·ÃíºG´â*Â=Áq—ËÜæÿ"w´oÅâŽHÝêZ—QÉõíu·ËÝîzGÙ=ÄoIXÄZPJ… B\ÍË^^¢7¼†ïÊÛÞÊqn0¿TÐaëÛÌû &¿¤¯èËßÅÕZû-°LHøª×• ƃ%–à›pÂÒtðË laÞµu*¦ï:Lb ÃSÃ@ã0‰úáaÉQKÞZïŠùk⣘f*žñW[ŒˆX}Ö±ñj< ‡€ÀBbD꾉2N2b‰, #ƒÉRFagÞØW`j’ŽYno à"ßB9³÷äôº)Ä1²šMgI”¹ÊgÎYšç|ºúø²Ëq„³tåÌçvv ÿƒ€Îpt¿DhóRh.´}—ÖE[ Ê’¾¥œi½nºÁ–Nb§ßöhšEzÔ,樛CaeíÕYý4…aÝÔR¢ÕÀr§m³SÓz£ÿ[õÑòœ´W£š×wûµI‘M8b“ÍØ£f¶‹|­l^ÊZÑà!kµÑ¶×¨$Z¿Ûî/U¾mãPC™ÚkUlZÃmEu»5Ûp…,Œ& ]xc ´øÎwa:«ï~ûû߃©·xœ Üòàº/¸2¾†+ü‡+ÁžˆKwâwÅ[›ñÝnüÒÄu®Èw†qéŽüä('¹À‹ƒ»ïºüåKöÕ`NóšÛ<æ%ÏÃÇ}í]¿wÝìÿ>éÏß=pm³Û¿¹3¤ƒ¾`Ã(}ØænºÕ*íà1=¡×>qÔ¿7u³VÝB]¿:·³^n{3:èþ±Ôd±_˜ìfÞ:GÑ÷73ÎnOà×1±s(÷<ÓDf;ØŽé¼ïnï—è{Ëþ.écd»O–ºáχxK(þ{Œ/ô˜÷QfÁ€ðaÏûæ·ñô[çü™çs½qgÏs@ð…ŸüëVßæÓßáòKýœŸYûí½ØÅƒ–½õxŸ?™‹Íö\Ô½š+ßÂлù”À}ê”fèsÈùb·>c‘oH£‡[ûòÄþÕÁ_YîS“úY&?`ÅÏtõ;Bú³C¿”Ý/"öÓ]ÕæŸÿüS%ÿ$ÓŸ¶öwtuÇjù×Pý'dÿ—±'|Î4€Pgv—€€4nÆ—l 8WX€q°Ês€:ænO"Û‚«$w©#o@BoDÇrp.èYüö‚28ƒœµ‚5¡\&˜ƒÃ{‚ƒ<( >¨>@„Ð0„¿b„§…„T„JØ L¨3)7…^á„MA…X˜…Xa…È-ws`x]H6aX†fÈ]c:\è[8c‚t8{CçS;8b9ä¦^"XmH×¥w|u¨<{xRx5qxx…ˆ]xn÷l\¸€‡8iø·r7è}Û–v¿WDÁ‰³—ˆ…m¸bTæzÿtvœxJ“hƒ^h‰|w¤øz`vŠtæ‰ÍˆÙÓˆœTX'†äˆ²Ø€©H‡‹(y+¤—‡¯XŠ¢ö‹leŒÅ·†,8Œ\‡‹©äfÉè{¦ÈŒ™C{ÏH‰«Wƒøv‡¦t×8$è‰Ú¸c㘇xf‹mWŒŽ‡éh`´¨†î˜?¸è;ihuó(‰ñ¨ŠÁŠʖ€¹Ž´F‰Šùk©]ý蹕(s)ÙFõ¨ Žù(ˆûvéaÁX‚ù? Mh°Öâ%‘óŠ%–9’ÈC“Yº–i$HN6©8=¹ )](ø$*(ŒE—4¸”“ƒLÿù”P©ÞOÈ2CY•%s•XÙƒ09`]¹•Á •`é+b9–sݦ…j¸–nù–_)0h9]gX—Z’e—z¹—Sƒ—‰—®¶9‡Iõ“NE˜P5—,IyNÇŽKg˜‰‡~iy€™k2Ùa.I^‹m™ eIŒß×™™Y’‰y’Ãd‘úø3å|ÙHš›#š©˜)Ù{ ¶°·™»&›”I›ª ’(Óš0° l™“ré‘¿©’æ¼8ËXœÖfšBY™w™6zÝØœ ‹Ò)7Ú‰h“Y Ÿ9Y*#œ®ß¹fva›H›šë¸jê©AóÿÙž¤æg̉œc°“ǛͧŸJF•†švHŸÿ‚êžÇŸ™Ÿ­h œÖ ZF¡ † ‚X›ÛÉ ÚgªEÖɪyÊEº x': åY‘ ú …ù¡Ž³¢Ûç›/ºš5)£™Y-Š’G‡“*£W¤&™”ªlAyWBjNN3žÑ7¢ w8E&GY¤òyQ™¥‰á”ZÚ¥Z:•: ¥fy =:¦&R¦f "h𦲦l*3b*qoz–º'oy§7Ñ–xº§)§\à¦@Æ—‚Ú¤+9¨†z¨Žù€Fúš|ˆ˜[µ¤B䨺¨Äy‡“¨†©c'™~j r‚Ù’4ÿ~š:v!Šm”Êžº 1Zª±vªZW§ïx£À‰ww¤Kº£„¨ø¸œð¹ž·Z©®ª«ƒÀ«ˆÆ¡âœ™x›¾8¬£Z~6z‰d·‹Öyæé¬°Zv©Ú¬ÒêŒÉʬ¸é¥žø‰ŸÊs¡zl¨dgìxŸ=&¬ãº®¬‡©Š¸­ Ù­¸AŽËŠŸŒ ©Ä÷­þ©0éʙ٪‡®j6Ä*ÆŠŽ*Z°/“¢ê°­« £>y°  ±sõ¬ëw°¯Êª§i¯×Нû¨Ø*²ÕI±鱎űªç²°±ÈZ®d² 4û£uå¤×‡³D:²W ¯Õ–¤êªF›¡$ 1SÿÚ'U*´Š¥^:µmÁ¥T{µ2¦É9§=b¬\Û^ûµ÷¶bd[¶ëq¶hkpçêwM§p #p;·ÎÕ¶b·˜GVˆº·ôz7|û·gè³5*«½ú}’z´ãz¸J;´ªÚ²œš£Ú‡la³öH¸Çê«Úªñ*±ŠÊ¸ÜZ±8 $0»{2Ë;K«ý ®&ày «Ÿ9û§k²¡Ë‚F´þZº‹» [«´®¶›«¸«ºÛ²ÙJ­Õe­.º¹*;©ž{¯«Êeé定ظÀ뭔ˑx›{»›l–¹Ó[»Ô+¤Ü°ú¸züù«Àººç8ºË—¾Þ»²–Ûº&ʹ™ÿš²'˼Qû»èk¿½†³Á›Ù;}ÛÛ°Ë‹¸šúº~0¼ À‰±ü’,ÛÀþkø;»Vº¿á+ª|³ÜÁ•»´>Šºê‹²Ê›¿~5ÀñWÀ´&œÀ.¬¿æÛ¯¿–´³v°6ŒªÍû=MK O+¿"üXKµV;ÄF¬oZûŸ*¼¶¦‡–Lœ¶KÜO¬¦QüƒS,[UL„WܦYœ„[ §sI·j©§b\ÆE“Ä Ž€k¨‚~küÆ6ׯÐ:¿î+‡B²’8«¸":Áèû¸¢ À~\¾Ty¾|ÀëRÇéÁñÕÅMÈÂõkÈ7|Á¼+ÈaêÈ1+±Òëe¹ŠÌ£Œ\¢—ÿ ÉX¾Ÿ{» Œ½|\È(¬É¤\² ÜÉ»úÉØaŽ×dG„¼#| µ3Ì¿… ½ÊêcâúÊÖÛ·µHÇÔȮָ¯ïºÉ:¾×뙲lɤ[Ÿ¬ÉÌFÃâ ¿ä›Á½ìÌÜ+ÊàöÁ⬭;œ¼»›ºšKÌåwÈŒ¹Ý|±’¬Î¼<Èڬʻü¦ÜÎíøÎ$¿JJΫ¼Çþ,»“¼Îû<Ð:¬Á¥LÁüü˜ó\Â2lϾ|l1ŒÀþzÑ‹ËÐ΋¤O#Ç‹ÃÍÈO2ÍñÖøÃ]ÉJyÄ_Ú.ÓH°aÀ„_Ì¢&}Ó7“Ó:= jÛÓñÓ@}[<=Ôc[ÔFm¶HòÔPìÄLýBýÔ:h¹RMÔN]Õ¼µÔX]qZ½Õ×Õ^=QÖÎ0ÖdÍ f}Ö ÷ÉfÜÖnýÖp×r}§Œ,Óv}×x×z½×W«Ö~ý׀؂=Ø„]؆}؈؊½ØŒÝØŽýØÙ’=Ù”]Ù–}Ù˜Ùš½ÙœÝÙžýÙ Ú¢=Ú¤]Ú¦}Ú¨Úª½Ú¬ÝÚ®ýÚ°Û²=Û´]Û¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌÝÜÎýÜÐÝÒ=ÝÔ]ÝÖ}ÝØÝÚ½ÝÜÝÝÞýÝàÞâ=Þä]Þæ}ÞèÞŸ;httrack-3.49.14/html/img/snap9_j.gif0000644000175000017500000000755515230602340012576 GIF87aŒŠªÖνÿÿÿïçÞ¥Œk,ŒŠ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,_‚FR±\2ŸJ† 6«Rê2ÕR[0vѵ~Ëä´Xm^oÛmõØíÍÊÎîzNïÏóxxcyG…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™#žŸxz€Vz`©L®¯‚b²±e²«iqW°­I§M·¼¼šÄÅÆÇ;ÊËÌËȬÏÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèh1ë!íªÑ:ò{éö÷éÑ„{û½¾õÉàH ׿/ÝüUJ -ÿõ«ÃO˜ †rðiÜèÿÓ§ CŠI²¤É“(Sª\ɲ¥Ë—0QŽŠÀi&Ç›87u ÊÓÎ>ƒ  j•P G“‚" (ÒŸ¡ú4À©Òª1³jÝêÒæ—š¤rŠ«Á#׳hÓª]˶íGâÊ –¬Ý»xóêÝË·¯ß¿€ÍµÓÅžÂõÂø LÌņ!<1#âÅ‘2ÎfÖ­çÏ C‹~I!IXG«^ͺµÚÒ^ŸuFÚ4ÐÒžµ;9µÍ3ÔîžVƒê¦µ¨nã?ó.^|¸T×Ð[Ú\µ¤î‹Ù"yS¥Í}ùðÜXqW]U<ÕðÉË‹G®ž¹m¨ÉÍË'¾Ô¸{íÊqwÎôìôÿÖI“ÚZô­V [F§àH±5` º”à‚²5!m5ÈÀƒ›uèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶ø@„Ÿhx™»DÇQäÇ>< ¤Åoø˜!™‚£ý,ä ¯I#B˜ýh™‹TV©ŠEI0 ô2P—V†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ †*ꨤ–jꩨ¦ªêª¬¶êê‰ïpÙ˜°ë¬9b@«a7씯z3XD¡’e-¹dEÖ.›mS"›˜¸Ì΢,·Ø"»ÐaÁ¶ëî»Ð%/§Ák¯‡f‘§¡c:jÉn@7æªXCãÌ’¬Y¸÷6ìðÃG,ñÄWlñÅ9P—nºþLÆp+áRGQ-°€ÇÈÀŠ|Y³N&Œ2Æ…Î+óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@W½0ß…]TýõS’D_‚M#Ý\…T›$£MVjÔI}ÞSä±wsJý6qgß§ŸØSM}UÕpÇHô†¦im÷Ýxç­÷8hs‹Ž%WÛd¶½ ë©<™kìD©(ù7’ L±Æ¾÷åÿ˜ccÜœwî9ƒs/µ ›núéq_ WÝÓôSCqçµÔõ½ _x±7U»Ûº“ýœTÁ¡꣧àzÙ´M;ï²»—tvDý^Ô³O_=ÙÐ÷ÎÓîK[ï½ÛÁ§E<ëRºñŸŸùúì·ïþûðßÉƩ¨ï«¯ºªìo øÿ , âN0@]ů¥k­Æå1Æ=&W#›Ü ¦%%?Pð0àúCf2²1…õÁcœ…eŠ$¤…ð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢ÿ·ÈÅ.zñ‹ÔèÛâŠE¹+¤p…Kœ/*WŠ3v«ƒÚªÖ2Â5î w$WÛèF"AY;*Hà\‘Çr­±ŒX¸Õ‡eÂÅìt¿ “A B’ƒÿcYÁ¶-¾„~üc 'É®m,J–ìqµ&UnÀ• €å*gIËZÚò–¤JàÜH™± ÈÒ€µÂ¥‹<⛞ì‹`¤4Å–Rö¥Gn’“$áš¹IaŠH—\–lUHrD\IºÖ·®D,Hݲ¦:×ÉÎvºóðŒ§<çIÏzÚóžø\c$‚G z³Ž˜Ì¦ ûøHNëXlôæ ÷éÏríQ¿Ìg%ôaÿÐF†—«¦d©0R²  „4]&J‰ö%¢;@i TjRH”Nx0éh`£¾–nà¥2Í©N_£¾âÙô¦á³ÏxÖŸ§y'z¾‰yÂæ»¤N%?O |€³ÓÖüÇ>ýi¼‚ ¼ëQÏ{ÍëjIšç»¤-MzÌ«*kƧ:­b§jÅh¢W´°µ¦nµÌ—×¾úõ¯€ ì9XZPw˜Š0Áü•ÿ>@ØLºë“ÔD%#%KÒÆŠÒü!ûP’tF-³è» K-ÉDN¤–‹£9õÍÔ®qŒÞÂc+³¥É&î¡e•ÐvËÛÞúö·À ®pé‚× ÷¸ÈM®r—ËÜyÿ÷p­«t§+’»Â ºÔÍnv­Û:Øín4tUÉÓÆÊ±j—-ÜE WŸ§–î¡n¼ÊÞH ¾ õ”|² ªz¨Ê´ëaÏ»ÆZkàïuÍyi=ïZb3…¬šFk‹ê€£—;¯RxyÈðY{£ÿNؽ ߆կßú²7+ ¦[[31 ó õ8ú}{8LâäX{C­±RÊãï)Ø®÷]±qÏfž¨"˜ÃRÝžT™šc¶%ÙÈHnŽSs|Ö¥ÎÇií1e<žÓW%éÍïǬ]¸Ð ¿,À.™×Œ:3Ï Í‚³œçLç:ÛùÎxγž÷Ìg*b]‚%­xYR.Ù"ÿ€Š}%G¡‘X`êùÏ”Û,g+‰Nm"Se§Ìl$/™È‘²A^à§%ÓÉS䣢ulœ÷*ç^bŽf%2ÚçZÛúָε®wÍë^ûú×À¶°‡MìbûØÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸ÇMîr›ûÜèN·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNp¾Ñ/¶6°l¡+률ˆVtJ ÛÈY*RÖ,eÃUMÀ…7Ú—½­oyhÊrz“&sR©6¸Ì–ºä¨Òã2mÊÐTå.eÂ. ¹ŽâÜä±ÿUø©±S“ì“¡u¹Ñ•pFOoz£Ÿ^&h5Ê$…D ™þÓk[™ŽISé )-‰.É#´é5m+ö—3=Õ¨uyÍ©ž¥¬&™U—í§}N÷¤çÂÖBÿPàËÊZ>0ÇBÁáÉYðÆ;þñ¼ä'Ÿïùü˜Ÿ*_qʃ¢ØeaqÐ?ΛÐô'¦}0_ö‚“¦>dÌ¡Iô >.ï£öü‹œƒÖOóuÿÞ VP›ƒ6ºþœ¥{ÑUFˆ½ëq{R ?ùÅœ¿Þúæ;h®¶ê½—ñ“ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøXÿÑGoã3Öÿ™Gx!Ç+þFhú€'€»b~ê°?8ÙWGEt[çI(uqwrp¤wXr3'IÄ€ÖFQZçt]ÇY:·2Äg2Æ—P÷vuP}^çpõF‚¹§i·OÂvS²$Ò·"ăšDsf'‚ØF(I¨o‰§KèO(m–wpTX…Vx…X˜…Z¸…\Ø…^ø…`†bˆ á'gjÆfh˜:ÍÐ fgg˜†pH!aÖg\ãbmb¼#!ÛC^â…aqsÈgÇ“‡iÑ=dÕð5_åõ6HAV†«–6Ö6eµ<æ…<•¸^Jua#¶ÖˆŽ¸tmXg¥ÿs‰¿s`ÜÈb¥1BecÓs`Vߊ+ˆ{6ˆ¦ø‰ÿU=ae;ºxd%fbec^_F‹ž`‹VŒ0¥Œ1ÁŒ´ˆŒyö†9匈hŒ€øˆ¸&Ö¸r…BVgkŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðèŽù7ôXöxø˜C…$`YQˆ'ËäQ‰¦xü1ç¥Â/Épk§oÇ@6òYÁ`‚Ï”)´#©¦ƒ<7$)ArgvÁ2Yj‡i,çtVÇ|–¢É§i¹W’W7u2¸íB’¡DuC‚"©)¨@{‰‚”qv'y|·×yúx”ø8…c¸”LÙ”Nÿù”P•Qù:!•Vy•X™•Z¹•VH•• Ü–þAŽ£¨by–VE–pf `‰–n)ØxÔø–t)q) ݱà…!8&_(á]uÐxuÈd¡1—¬‘ˆw¸‡XÖ‡³d4±–Å0ˆr5Wíå—Œ™—˜Çx—¢‰ˆù—'Ö9ŠÉ—}yš&±™ eù•úʼn†X¶e–dÁŒ±˜‰²8šgé°Ðš!P˜½;‡`±ÙeyHV˜ɉc§¸‰ÈY` Ƙ»Á‰Ö‰‰•¹¾I À9 ”y»ècÅi0ö‹"&a¹ˆ`Æ™ƒù`’žšx½x¨ØŠÒ¹õÿ©›â¹cÞqeŠ›ÛžÄˆ^ž‰ \3‰G€© ®ŒÚSúY`üõštÙžCö]é‰;Îiž¶ êia¾h‰ J‰çù¡Ï³d×)¡º`z m©™ š+!£lf¡$ð¢É™\A£0J ‘é•”€£óe˜‰¹—:ú-J:Ψ—GŠ<ššna£– ¤MÊ™X¤Ÿ÷¤Uê–W ‰’`¦b:¦dZ¦fz¦éhº¦lÚ¦nú¦pš¦H9§tZ§vz§xš§zº§|Ú§~ú§€¨‚*Q6㥃*f óq$qpq4ר r(Ø€‹êwi9[Ô‘Áà7„¦Fhÿ4#¥õP»P90§}YªRwƒåD$ Ú©%iXgG¬z‹}¨Åwè’v·‚ƒ1XY%x2A„3y}²µ.ÖWu‹“Qw|*膹*zŸ•JByz‹fËêi”Ö/¾Š},'jžÅ¬×Z­ÀÊq¥© ª7ByÄ®[§M Õ“§À-OW¯¶e«ËÒªÑ7®Ö[àä‘©…[ÿ8KçX ‘ š7kèz¨û°±;±[±{±›±»±Û±û± ²";²$[²&{²(›²*»²,Û².û²0³2;³4[³6{³8›³:»³<Û³>û³@´B;´D[´F{´H›´J»´L:Û´Nû´PµR;µT[µV{µX›µZ»µ\Ûµ^ûµ`¶b;¶d[¶f{¶h›¶j»¶lÛ¶nû¶p E ;httrack-3.49.14/html/img/snap9_i.gif0000644000175000017500000000457315230602340012572 GIF87aŠŒªÖνÿÿÿïçÞ¥Œk,ŠŒÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÃÜÝÞÜÚâã çèéáé(ï ñòïñóø&úäýSæ ¸®]ƒ{$ôñã·@á†þ"68p`Áƒ@Ü`ÿ^Æ}l”HòÅŠ/zÒ0d’?⤌Áå^D~0$MÎðd”‡LYey=Vg”y5 噚çefšÉœPÑØ“ÔÉÕš{Ö´Ów}‚)¥(…6æV å¥\O¥¥FžXvµÛvÄ7¤ÊùÙèbˆ¶‰£ÛuÚ› vˆ¹dls.Šê¨6©ó©k™v)œ¢ªºcc“GéPW«d›^Iê¦ †j_¢"‹ë]ÿÉB*ë±Á ÖlXŠZ&ݳ|½‰«oÀòž°ÃŠQìr¿²új¤8îŠP¬žFkkFçbFÜuAÉ ok©æŠe¸qŒ«ë¦èžõ¯ÀVÕjÙ\ÓVzﻯ¶߹;Ô ƒË¯þzkž·ŽÅmœ4åä±lÛ¹™žš²9òÉi{riâý¹òŸÅ™ÌëÅr¨'ÁŠ¡XŒ³)ó ß)>ÿltBE­ôÒL7íôÓPG-õÔTWmõÕXg­õÖ\wíõ×`‡-öØd—möÙh§­öÚl·íöÛpÇ-÷Üt×m÷Ýxç­÷Þ|÷í÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùåÿ˜g®ùæœwîùç ‡.úè¤o“â騧®úꬷîúë°Ç.ûì²ó\ºm0æ®ûî¼÷îûïÀ/üðÄ?|t|¬nûÅÏêüóÐG/ýôÔWoýõØg_=’ÈïñbîÝ«™BÒÀ]'QóÚ§¯þúì·ï¾úë Ÿ9Ýë‘1Á\™¥Ë¡ÿþÿ  ØÛÑoyƒ*¡„4&éÏJ§:¡HÁ Zð‚׫ß4Áœ:TŠÌx@v3ŽEPM1+  øD>`øƒ0Œ¡ ×§Áw ðé :@ØÀ‰¬aÒòU¶(&±úâ…ÿëà —ÈÄìÕ°~yÈ!¡vÈò*[½ÂßoÿâU3‰e‰ïSbÇHÆç=ñ†¥šb: eEZMkFäR5F™/ŠÑ‚w,£ËxF„Џ9Ô™u)A¾+T¿±"4N¢FrŠhd$•¸Æ?îñ’{¼®6F_{c©5DDþp9Ò`äWéÁ?®ò•–Œd+e‰ÉZ6Q%Iá$ îg³ô©e½ôØ™X˜/Ó žŒ%%cIËfê°’y´¥4+ø|èò:‹iäždÒr™Îˆ™ùÍišƒ} „üæÓ#"sœÊœ%<ÃÙÌržóžL§3Ä×o²RœÌœç?ã‰Ï‚PŸ·+Œ@ÅùH€”¡„¤A'Úÿ>„&t-Ѥ¨F§iÑ‹ân£ ÅgG=ê0†ô¤2)IY`R”ºÔ‚P WŠÑ—Ú´Œ¾ƒ"MƒmîTë ªP‡JÔ¢õ¨HMªR—ÊT£þô©PªT§JÕªZõªXͪV·ÊÕ®bLu>õj5¾#ö0‘ ±€;Åj¿ŒšU‘æó[+šÊ(Q‰ÉÁZçŠÃ;~PHx}ÙùÙKIé…˜vâ_w)ÑIÚÕ s—µr4•™…1’],!¤èØ@b$²Ò)À„Ù¦E%Œ;šÝ¬iV`N'N;—¥’µ¬¥Öd;«yí+b”:-RnëGrî6`Ð2×(}kÚRÿ‘¸Øtk³×¥º¯)m M¨XèFq=ÞÍQÃKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿”P€wAVíL—håQ^92`$d¬^¿ÕÁiŒ¯áÁUR&a¸Z˜fÉÌæ`V°iÙš;L‡±PN3û°s¤ ÙVev´Z<ØY°aÁűŒGðàQÑJ´Z -=ØuJûf[¤Å”I9äôÐø^Šú1l)ûYLÉv¹É=­Á´EØ* È^ö1‡uÅä/g÷br—Ì 4+·¹IñìÃH‰’Sp>$E`g‹Ìÿº8Q1r z)ÚUZf×/QV§A“ ›«¥A1ÞM{úÓ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À¶°‡MìbûØÈN¶²—Íìf;ûÙÐŽ¶´§Míj[ûÚØÎ¶¶·Íín{ûÛà·¸ÇMîr›ûÜèN·º×Íîv»ûÝðŽ·¼çMïzÛûÞøÎ·¾÷Íï~ûû߸ÀNð‚üàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã ¹ÈGNò’›üä(O¹ÊWÎò–»üå0¹ÌgNóšÛüæ8ϹÎwÎóžûüç@HºÐ‡Nô¢ýèHOºÒ—Îô¦;ýéPºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Ú×Îö¶»ýíp»Ü·;httrack-3.49.14/html/img/snap9_h.gif0000644000175000017500000000543115230602340012563 GIF87aŠZªÖνÿÿÿ„„ïçÞ¥Œkÿ{{,ŠZ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨ôW¨Z¯Ø¬vËíz¿à°xL.›Ïè´zÍno SÍ 1ÔíŒú|ïçÿ~z€w}wƒ† ‡q ”‘“•˜™™“—š•—‘žŸ¤¦§¨š¢¢”¬§¬«¤®©›´±­¶µ˜³²´¾¸À À’ÅÆÇÈÉÊpŽÍŒÒÓ@޼¿ØÀÙªÛ¯Ýß×ßâã©áäçà”ÄËìíÇÑÏsÎÔôõö÷øùúûüýþÿ øÏš»ƒ*\Ȱ¡Ã‡#JœH±¢EIä,¤ˆÿŽG<ˆ8¹ ä‘? 0àQ1—íÁ”)ÉeËš6ÙÌù²æK˜>Yò zShPe@&-ʲ©N-£2=zléP§@i:¥:•hÕªY¿öìöi²™cÑnU{°+DxRë@›—²n¿•óêÝ»Ì-ß¿mý¾u°2xæÚ]̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëßÏ¿¿ÿÿÿ(à€hà&¨à‚ 6èàƒF(á„vÈ |RR¡Ô‘‡úXƒÎˆ$–hâ‰(¦¨âЧ¬ób(öO\‹”Õ……ÜhcKJp?òh¡ɘˆœŒ¢d'”²¤6O¶bŒ)·(¹Ë•V6É$”IFŒ”Sz‹.Ü`i¥—ŸH‚J• \J)Z:¹å™I¾Ù¦›Úã"_0"c…9àeØ „j衈&š^hè£F*)w"uHG‡ˆ8 £Tyl*$§Š&¨Y1E•^Im5‘`¥*”ªL4Æ*•C©Å*2³~E#®µÂšëZSöSVE {(Œ ü9© ÿ‚ÞŠëXX)m´\)µ”´iAûªYCY¥­ª§‚[«¸Ó^¥µk‰u-¸MmËîº}=ëÕ¼éºã,CÈ2 ì²0Àoetý+ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7íôÓPG-õÔTWmõÕHªèÖ\wíõ×`33£þX ’"›öhˆh³]äÙD¹ã"ŸÊ ê†oûƒ¤˜ØtiN•`ªY&‹TBé¤/c2”•‚oÒøšdâbŽá賋àÿ—ì¹W¾ ì»Ù5ZÈGÞ‰h:ö¥Tz¦¤ ´·0]î÷—‡Çyùãy^9'æ~ÛN;'¶Ï©J2‘›)%—ÈÇîøà³ó-¹œÇ{‰¹îµg©Kã–—¢¹^pê¹v ´wîtÊþ;–®°Iæ–»Wo ôð¿ñôŸiÿáäÓþ¼ùüG‰§ñ±  òšd½þP{ƒáœ¾G2.E“CÜ'HÁ Z°êH`ÀôE6”ù kØ GHšð„ñqƒ WȺð…0Œ¡ g¨æ£RªC]@>A¼Fka ¢‡HÄ".CŒê ?px¡P9‘‡¨ËÔêH"*o±ë,V ¼ÿV…-{-Ä]Ó"ÕCƵEv°]å"×»ÐÕ-l±e\`¹ˆ&ªmH5¢ŽtÔ¶õñŽ YI°Úâž´±ZÀÊUY²…È7"å'P#Å"Æ+ªQUWÁÉ"+iJNR]ò £©HuHG"ä^‹¢‹Ÿ”h2 ñ•^|%OI+!ÎòE6L"EæJXúò—À ¦DÕV¢ð˜ÈL¦2—ÉÌf:ó™ÐŒ¦4§IÍjZóšØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚóžøÌ§>÷ÉÏ~úóŸ ¨@JЂô M¨BÊІ:ô¡¨D'JÿÑŠZô¢ͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔö8BVHMªR—ÊÔ¦:õ©PªT§JÕªZõªXͪVõ˜Ë{è±BI#0ÖÖíÃL«Z×ÊÖ¶n{yiæJWºÒÑ«9ŒAXO¡¼þa¬ö@«[KØÂÖ°p•c.ïj¯ÚAŠE¢Û >ÖAm¢Ë¬Ù2¾âIð~ƒ{_ýFû@Àᯡ­jûV8æ‚~¤9|×¥ÄZdŽÆ¼áGB—ˆÑíhnŸ:] ôøƒ@„B8„DX„Fx„H˜„J¸„LØ„Nø„P…R8…TX…Vx…X˜…Z¸…\Ø…^ø…`†b8†dX†fx†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆŽøˆ‰ä‘;httrack-3.49.14/html/img/snap9.gif0000644000175000017500000001135615230602340012257 GIF87a¨h»ÖνïçÞŠ;ž”x¹§`­Ÿ †„N§šÙÙÙ÷÷÷joe­­”¥¥¥µµµÆÆÆ,¨hÿÈI«½8ëÍ»ÿ`(Ždižhª®lë¾p,ÏtWA®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬v+\ܵ°xL.›Ïè´zÍn»AŒ/à@¯Ûïø¼~Ïïûÿ€tƒ…„‡ˆŠ‰Œ‡Ž’“”•–—˜™š—ŽŸ¢ ¤£¦¥¨¦¢«¬­¯°±²³´µ¶·±­º¼½¿¾Á¼ÄÅÃÇÈÉÊËÌÍËÃÐÐÔÓÖÕØÔÛÜÝÞßàáâãâÜæèæëéíìïîñëóõö÷øùúûüýþÿóxÁ1ç€ ,P¸ !ÆIœHñ!F2.Ú¨±Ñ£D–ÿ@nI²$©“¡R©<År¥ËV \ÉŠ ‹&L\8sÚÒ%¬ç/b>}ó嬨ѣǤa»6MÓm× ’›Jµj¹mð²ÊÛª5ë¼tÁ‚H¶¬Ù³øÄ!HÇ჆pÆUP±®]Aï\Ì»·#ÇŽ@ V$I¤H“ˆ1}:)iñbO_Jf¹*¦å›©^]®©³3Nž½v½âØO¢¨¥Š´µ2¥Ñb?½4[Ô§ášZÝ®ïß¿ÕaåJü=w^Å¢]Î`ƒyF \ ¦íB Þ6 p°!»àÃë­Ó·ù¾ýŽT8±ûL#Ëg< eä”-óoÞOËæLÏÖBÿ,¤LiB%8 QÆ(àkÍH“”l°Y3[mÚHNSºíæá9ßô&"ˆñÇ•qcUŠ_åÃbs0âóÜ<3Úq4Pu`§@ )”PB4xHÚ•|‚Qz­§Q{ì½÷^|ôMòXJöéç%eüeVÙM³ø`€Ž&š¦)¸Úƒ«5¡3"S!lµqèÔžz~èç8½ \‰]‡b‹Ê©ˆ\‹ŒÆèh=5îã7nà ¨%>™PDIGÖQ*©tª‡ª¥:ä«°Æ:*^æ%T^“èù5å`‘f寖ÄçXcö[Ÿ—/I&g¶˜yfÿNi¸¦hÓ"xkت6çQuVh!ž†«á¸}føg8Ây“îp#¦[軋*JÏŠÖ{Ö¤õÜXÀ ì;AŽhÊV y*äEžªê³öÁêà ÛÁj K2rä­OêJ¯¼ö•À’„å|Ãkl—!« Ma²²™LÏÆ|à,lNÛæ‚C%Ãàƒ:oË-…@çi›†Q™{î¹ë ê›pL›xhŠÇÍ+µ=/Ú[o¤÷èë/ûò+tïXP\A‚ª€³*<¤©ïñ£:Ñ’KÚzž“Pj¼ÞÞ!‡Œå–Äry,*“•2ff//Ël,ÎÊ|K´¡XóÍ© óSÎrúl'ÿÐ~+›¸}vØá¸G[¨ î¢N¨Óò'5‹ÊYm5ÖúLZi×]S°À<ÂÅB‡Ê0ª¥?j¬lÃqÜ­*¿v«Ïo÷ÅvgŒq”¬ýö¾ö½ àZ†oò°‚®,™-cöÌŽ?N³š5[«àåp:óæÏp.ômÙô_.é¥Ç镺ձ.9QK½¦V5ÙÍnø¢pW/<‡wc[@Êö*IbÇ{žñˆ'7è!„«ZžÚ.B=ÂV0t¡“2¢±ìIi‡éž÷àà ñq eæ›Ìùg¦ÄµO'2µ–(?Ê!cg8‹âýðg!Ï6 “JÑt3ºÿ’c€$R—ÒR/.QøxQxÚem‚¹Óؾ6°NqpH¿ƒ˜ñÔVÂæù1y(ÌÃÛ@øª>ZlHå±^ 7¦=Vi‡&–É'ŸòQYüQ…&×§¸#"~=i¢å*ÅÌQBwòÜþú—¡.vÑ‹‚Ç –FËw%ðP÷ˆÕØÈK|Üw^ûÚt6u€LTfK˜ ÷˜¶r€Ä4[ÅBº zl»Þ¶™·Fr:„ä÷ÄG¸ûNe+9úWÄuzÒ3JT“´$'J)f+[õ£b*;'¡jdC¡óÆ+aƤQuM+#r æ•y­±—dqcëa; Ä1ÿŽšÂéЄ,™¢r^ùøÇ2šÊKi4Mº—fl‘êÙÕö¼)Α”l’Œ9g%Q†NL®ó2F|§ã”šø9Q(ØâÙOÉŒ~bÑŸ«l%¹º1P‚R…³LèŠÆ©yõ«]N¤°¦58NàRa#¦-j·\ Ã*VTJ»£NAÖú£¶ž xÒl\I:Mºžt®²’ž í–׾”‘‚ÿ¥a {X’QÒ’ú¹¤:Çä²Å=v²ŸœçÌèyT{ZÎqbêÏB›Å€JÕª:p ¨Õ2âR—‹:#meÁÛf­íÑQ}*zIJ0 š„‘w„†Ýôˆ#AF]M€o’’<O/i¸L¾,²àE“<‰JÞ&šÆž¥ToþØË^p‘–hÜ(ja FÑ¡®~sÙ¨ï×n„`Öxºþð†O¼à¿xžñÇ;ÿøÊSþòŽÇ|ä5oùÌ{~óŸ'üß ?ùÐsþô¦O=èWßyÖ£Þõªo½ì?ù×Ï>ö¶Ï½ãG¯{ØûÞòH» îöð+Å7¾ˆŸ|6ð‹ùÍA01w ?ú#ðô±_ÁlŸûfÐ>øK0 ò㇃÷ÓÛõ³ qøþû-°–öDòŸ¿øçŸsÿ÷óÿ û÷P~ÿ%ø'€ø/þ·€b €˜€ÓG˜×7È5µÀ/ŽÆr(–LØ€a% ‚ˆ¤|o‚)8‚eð‚À‚b@€p~-È„€ƒ8„h@„ýbH(‚,`„MhÁ$…J(u(XV¸‚60AEFX}=XƒÓ·5%8„Lˆ[Hq2¨…Whi(„9˜…4°†]x‡$0vh‡5Іu(R¨‡7¸:x<¸|dˆ†¸5ý‡hȈxÅ5“8‰H‡3P†‘hQ5…H‰UˆQ’è…ŸHŠcðÿ„)x6Š¥x…’Š£È‰fhŠ´øˆ°„¸Ša€ŠnØ‚MøŠ·ø‹‰r¸ˆ”ø‹o(taXpPè5±ˆ‹ÈŠ–¨šÈˆiÈ„|˜~˜‰&ȉr‹¥(ŽÙޤ(ˆdÐ€è‹Æh޾8‹ãXŽŸ¨‚ôxŽ^U˜Ž˜ˆß8î(øè‰Å8D(Ž)…Ø÷—>…ãèÖ8F¨áX‘­X¼ø‡öh‘£ì‘Y‹ÊØ+€Žíx ¦HŒ"Ùˆø†òx‰$©,ˆ!™’(y‘8¹“—¨qÌx3™Ò‘C鈮8…ùHØÈ’}¸1 ‰‰ÿ” Kù‚èh’s”.ø‘1y”'I6È”(™”&Y‚ºHêø”7çøl)‹y’)Mi)?9|5¸‰D©—F¹’Qù•ªˆ‘N Pù–ÆØ‘ï˜^Ù’3‘™È•™˜_Ù—b©“éˆo¹,à˜ë¨†† ’~™Œ–)„©™'P¸Í˜—¤)—Rù…zyŒ“Ùšú¨•'P˜i˜ºÉ‘’I—a–„ ™ñ¨†´I•¼©“¹yœ±Ù•Mi›THœùš®ù—ÉYœÓ8 Ù}ª ”¬•¹ˆ4š‘˜‹•X™2À™OÙÁ艰G6éŠýHèI˜nYž’TIŽ/ÿ›îŒfùÔ(˜Î¹‚#˜ÀØŸÕY²˜” iš§¹ŒÛ‰—3Ç œãg¡m`j9szº¡úh—ZzqPiqó9~)š¡j·¢úpj¨I}wYθr,£Yê¡ v=Úk`ž3pˆ8p{¿×{J:{"ç¢Ø¥˜R:3zb8¢*§£h¤Íç¥Sj`Ê~FzV5*7ÚrÚפLÚ¦™×¸§‚WzK*§lj§|W{¸§uÚ§³·xjztz§~ꦫ§§?¨…ª¨90¨†J¨zzù'†%zqWuÏ×r™Úu›Š£ˆÈrª©x¦ZªÿreÚtczq©Zt«Z¡ƒr­j© }•Š¢\zsUšq¹zt»*«µq½šq§Zp(”ñÉÚt±:qËúsÍqÏ qÑ*q—Z”*”¢©ÕútÁZqÝtß:qáJ­¯ŠvFȃµŠ•j¬p¬·é®Ù ±ª®ÐóZ .ø£Ø*¦å ›Œ‰œòÚ¯ky–7é›'°¬ðÚ’·J£>YªéڂѸŸ²i°#°­p¢[ù¯ëߣ k­[¯‹‡+²þJ+}2y›ñ¯«)%б‹çJªi:…©’9²Z÷¡2ûœ-[²,0¯,ûD—0ȳJ+´£³*ûÿ›!«˜«°-p´S;ˆ1`±p­ù–Õ9±Ÿù @«Š¢(Šë›ß™Ÿíù N{”fÈ–Ãx«)ËŽVÉžÿêµo‹˜š“0·öøžñø²~;Úè/‚µH;žºi¸. ·äW³»¯t»’»©ìZ„Äh mYŒ'š™Ê£V‹”g¸—Ôù¸1ë–Y¹c¹¹D©³¦[´¬;—´i¹ˆk‹€+»Æ9´µûˆŠØŽ¹K–ªµ„+µ š‹L«~4¶  Í{»³™¼}»»h;»¸Ûƒ+þ¨·K–¯ù™}ùÙ»“— Ù›¶Ñ»ãúé½Ú›} }7+õxœŽ»—;ÿ³£)?‹¾J™Ÿ(ºÓIº¬ÈÔ{*ɽ«Ë¿ šðÛ¶ø —îYµ|‘þËœ\Á½IÀ`)±;« )¹ÉX·v»™>»˜ J—Wù½íʶ°ËÀ¾›¸"0¾ º‰*ˆîKÀ9Œ²¼Â1,Ã< Á„›¾*p¾ö[°||ñÂ0JÁc;›9Ü¿à½Ì̓כÄpÅ5<»´èº²ÛŠá»Å=Ü›þ+½d,Ä­ûÃgkÀj<º:ìº<ܰ´ÚÄØë±«–¹CŽ. Ž…Kž:Ú±& iK¤â[Æt[‰ÝkŸª{™f+£=<ÈÖ)º‡{ºy|Ÿ\É]k“ÌŠj{µJ,¢òëÿ† ¿X7­1¨ÁΪÊÐÊÊÒêÊA+Ÿ L¼4'¼I·¾‡Ë<§ËXø«¹ ËK‹–KLËú²ÅìˇÊJÌn ÌmàÌhܘ³Ì3gËHÇËn€Í¸ÊÌm ÍlàÍÍ<ÌqGsù˪܌¬ç\sÐLˆé¼®íüÍÓ,¡2‹Zϑʨ¹Çø¼Ïö|xýÌÏ÷üÏ®¨ÐMÐ ЊР­Ð Í‚è¦=ÑÌ,ȵѽÑÒ\€¥:¿Ò"=ҡ̰uLÒ(Ò*-G}Ò+ýÒ0­ÑeŠÑ1]Ó6½€˃ }Ó<ÝÓÉ7Ó¤ŠÌ>=ÔDÍt9ÔEÔJ]v@£¹KýÔP}uGýÑQ]ÕVªÔW½Õ\ýsSíÒ]Öb-sM Öc}ÖhMr_]¬iÝÖníqeÍÄo=×tM®--×u×zqMÌ{ý×€½‹m³]؆m´YíÔ‡½ØŒ=Ç;¨ÕÙ’-¢&ד}Ù˜½Ö«‰Ùœ}Ù}MÍÚŒ­Ù -ڦ؟-ϧ½ÚzMÚ°Ó¬ÛcÚ$*Û¶ýÖG;httrack-3.49.14/html/img/snap9_g.gif0000644000175000017500000000375015230602340012564 GIF87aŒŠªÖνÿÿÿïçÞ¥Œk,ŒŠ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐè@­Z¯Ø¬vËíz¿à°xL.›Ïèôx n[|N¯Ûïø¼~Ïïߥv ƒ „ r…ˆ€‘’“”•–—˜™š›œžŸ ¡¢£¤¥œl¦«¨qp‡t…‰‰±s‹»„‡³ޱŒÃ.Ž«ÇÈÉÊËÌÍÎʨÆÏ­¯<Â*ÁÄÝÞßàáâãäåæçèéêëìíîïðñáÆu‘Õ†¸µ¶¿Š¼þºáP˜¯|ÿÜ•0 ?E‚>”G±¢¶‚ Öi`0ÿ£>ƒûzéZذci•îU\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸Km]¢œÆ¼¹óçÐ£Š¦J:%•®­ã&%¹Ä_&¿‹[n½¼ùóèÓo¢®>vYØ0\ ±>Fû÷%ràN˜|ûÿÿ( +©´÷^>~$¨à‚ .h܃F(!1þðÈ{óá]$I°áN˜C†6qQ…¸ÄgBˆò£ˆ:͘‹¸HãŽ<öèã@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£F*餔Vj饘fšŠvêé§²§žŠ†èXPdHx† §_7œ‚*무>'jz¤bjáY`ã ¨>áÝ@þì3’9±Öªì²ÿÌ’r+z¹"²«5ÙáãÐB’¤­µ ϯ€$Ûì¸ä–;ɳçEÈ´qä2ˆ»×–tË»ùñ.Þ&®¹üöK+ºæ©«:ùþ…ã”lðÀ®¦ 7ìðÃGìZ0x`ˆ†ÜK‚Æ`’˜Ç:œ¨‡ºFÐÉîéè1~ú…$Gÿ¸Ê²/2Ó¬ÐËâÙRRC12“çWK¯:ó¼m¼Ä ‘¶"_Br(U—¢©áK´ËñÚ7ÐÊ,'„5~&Y­µµIÿ¼$×úÀÜêÌ>·ívÎe7mÉÓ/™³Œ‹`wÞ|÷í÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùåÿ˜g®ùæœwîùç ‡.ú褗nú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÈ'¯üòÌ7ïüóÐG/ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþù觯þúì·ïþûðÇ/ÿüô×oÿýøç¯ÿþü÷ïÿÿ  ¨)Š5è€L ÈÀ:ð\ u"x@ à‚Ì 7ÈÁzðƒ ¡3h,am„&ûò— W €•Ç‚Û)¡H“²ð†8”Ž ­Cô#F{ó@Á–P³lÅŒ#ä°a—ÈÄfìP‡ [ˆ.æ«ÉÐDÕR[Ñÿ²6%6ñ‹`tVFÅe,‹¼À–¼Ü64na`ˆJ@Ô¸ˆ Á‹aÌ£5ñÄèôðŒ² ÛØà¶vëŠï°ã¥¶ÇF:Ò}„Îi46®±g\|Uà˜D΃‘ ¥(¯3F\•1Š2Pä8¹<Žò•KŒ¤­N2x±€•zq%,w¹BY:Ç‚n¦0¿àɾ蒗È4—/›#0 :ó™ªT˧IÍjZóšØÌ¦6·ÉÍnzó›à g HÎršóœèL§:×ÉN,y•íüÀ;¥À)‹!ñ÷êP‰FM+Ñ0L[JàIÿÈ!eT,–±~XG—Ѭôâ–»úAÿ{ÍË–Y¼z’‡ Ä¡ ×2ú.r´£mÕÑ4R’ž”ö èqP”!ôž‚ÄiËrš³-&­’¯¢cFêuB±Ý3lùÚxºS…N4¡uTRµ¸€zÊTÒ°éÔ Ô¡êt¥×êÈHëå57 §Kåª&³”Vž%Ôˆ:=âªÐjVX•ž0ݪ,0jK†ŽäköÒâÇJúÓ¶4(UZXãXŒri¤¹øˆªÙ–T¢*ýie_ê´«A„*°c?½ê¸Ñž´ñL­jWËÚÖºöµ°­lgKÛÚÚö¶¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—ËÜæµ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝîz÷»à ¯xÇKÞòš÷¼èM¯z×ËÞöº÷½ð¯|çKßúÚ÷¾øÍ¯~÷Ëßþú÷¿°€LàøÀN°‚Ìà;øÁް„'Lá [øÂΰ†7Ìá{øÃ ±ˆGLâ›øÄ(N±ŠWÌâ»øÅ0ޱŒgLãÛøÆ8αŽwÌãûøÇ@²‡Lä"ùÈHN²’—Ìä&;¹7 ;httrack-3.49.14/html/img/snap9_g3.gif0000644000175000017500000003130015230602340012637 GIF87a© îÖνÿÿÿïçÞ¥ŒkÞÞÞc­œR¥œsµ¥Bœ”)”Œ9œ”!ŒŒ„„1”ŒŒ„Z­œ{µ¥J¥”„„„„kµ¥„½­{½¥ŒŒc­¥J¥œ!”ŒŒ„ƽµ1””1œ”B¥”÷÷÷{½­cÿœÎ­”kïïï„ÿ1œ11Œ{kƽ­1)!ÎcÎ1ÿcÿÎ1ÿc1­œ””„{Î11B1ÿΜŒ„ÖÖÖ„kJ)199)!!B9!”{sR)!„sc”„s¥”ŒÆµ­½­¥µ­¥))µ¥œÿœÿRRÿœ1cB!RB!RB1ÿ111!ÿÎÎ!))ÎccΜcΜœ!!))!)!{scscRR9)„skJ9!Z9c11c1cJ)kJ!ZJ9œc1œ„{91)œ1B),© @ÿ€.4S4AAOOVLLVd9gWm>TtEEY9UUiB99B@¡r..c]¤4RSa.Wofe7;6MMKJII-JK66HÁ;;7q77C,Ë,F,GGÊhF))ÞàßáàÚÛæÛçéÜé«îêíëìòôèóëöæúôüýþÿ H° Áƒ&Dg^=m ó Üç¡;Šð$ÊË÷n^C… CŠøñžI‡øRnT™Q¥D-ÕP 0bD& ØI¢OPf :´ÁL£E)]ªti§O£J•:áiÕU³bÝÊ!ëX»Nø:V¬Ù²0}0-lÿÀMûväÝû€Þ¾€ý2À 8°à }l8Ì ±bÇ‹+xüœ±0ûôZ‹|ól=÷Ð{~ÿóãkŸ}÷çoŸ<úËc_gõîŸo>û›—?þýóƒï¼òÒOï»ÙÖ„¿·ý¯€H¼k,ŠS Ñ&Á êÎT[ÿêD@ÖísíÛžøBˆ·¾­¹ëž;ø÷¼ù­ïx+Äš÷àV½ëµÎ…*!óbCºÁn»ƒáÖÖÇ>îi¯‡bÖ’(¾úÍ­†@Ä¡Á7C à™û^Ã'Ä"Ú Š'l eÈÄ&&oƒh3aÙ°ØÁ šMnÜãh§+Òqqs¼#6ì¨Ç:bqnh<¿ÇÆ>òˆL¤"ÉHØõlÖ°áIÉJZò’˜Ìäãy H–­ÿš ¥(GIÊRf’“_ [ðLÉÊVºò•°ôß#U)6PÆ’qÙ‰.wÉË^úò—À f/«‘Ka„–Äû##³H¾¡Ò“d³%Þ¤GÄ-ªï’Å\E<¸¨#"øÐÇ>À‰qnóœìЈ6¹‰cºóðŒ'1-Âsvä%9¦2»·Ï±Q3}û£@É×>/®™xœe$WyËÈeS$ë4HD’ÏxZô¢Íè?æ©QzÄD’Úëg"ª¸g"s’ M©JWÊÒ–öN¡Ÿt©LgJÓš†Ò¤…ô3m×9¶ðuÍ”_â‚jÓ¢Þñ§A´àívj»“§1Õi=×áTnшÅÿ{aA¹È?t SüªµJP/âψFM«ûJE¬F¬e¨þæWŠ­˜üpjà  ÒkHS­€ ¬`ûT˜F“°ˆM¬b+7¨–±¬dëX†Nö²˜ÍìL+[KÍzö³ m%_-ÚÒšö´#5,iQËÚÖº6~œõàkgKÛÚ:Tµµ­nwË[©– š«í­p‡K\µ6·ÅM®r—»Çßêe®t§‹ÚØ¢”ºØÍîi­;§èj÷»àM,wýÞòšw±Ç•íy×Ë^£Žºí¯|]ú^ïÎ÷¾ø=%nÕ›ßþúW¿ÎÍéLàE¦÷ºN°‚ãXß;øÁ l0ÿ„'Lá×I¸ÂÎpã.¬á{XŽ0í+|?LâçÃ&N±ŠÛ†â»øÅck1ŒgübÓøÆ&>pwqÌãÛ¸Ç@®ðƒLd£²§Q-²’'<ä%;¹¿:&ï“§\à&SùÊëµ2–· ^-sùËÔ}/˜Çüß’Y¦öm$'Ó¼Lé±ÙÀh|ó™I)çÕ¹¨'vó4CÈE®–u¬x~écÿFÄûÙïo¨ÄàœYZgD®Ù”.%* ðÜE[š½D¨ô¥7Þì‰( µ¨GG1åÔ—šŠªWMNiåÕ^‹¬gMkYw¥+lÁõª\Õ–¸Üå×À¶°Cì\[0ÈvŒ²—ÿݘË YËzÖf EmÓ¤æÚªÉöj¶Íín{{\ãN¸Ã}®t±k]ïjW»¦S¯v»»:Üá¿ÆCoð´‡<íÉ·¾÷­o„ù{aüi˜Ã^ ‚GlbҘ¾1…ìá"™Ä'Nq’¹D*s™Æ_¦#™yg? ¹ÎzFò’h(šÊµÄò–WéåKƒ¹Ó®ô´¨µ‰j8¿¹ÎÕ¤¦˜XƒOs€ H€‚ÄàéP‚¡@êQ‹‚ºR ÕEY=S˜‚ʦž²õ«4ÀRY‘ǨÒak±s@T¦BK«Ú2½¬Ê.mÉ‹¬ìB÷_󥨻B¶¯ü2,¾7;1ú e¯,ÿho¦Yͪ6i<ƒšjQK5ØÍ·h›né†\ãŽæ‡£®ápž]é~Wt 3zÙk^ÔÙW¼Uï€åk=åQ{ÊSŸ La ;˜î÷#p‚Sì÷«Â'†15èBºÐþ!ˆèC'BY‰DD}• FwŽnD#é¨GÜïÑ~4rž™ßgGÑ„¦ò)Y _â’—¶ô%6¥‰æQ³¹Íݤ7/…\#xIÀ(AjD x¦ÖP‘j¬Æ)[ájœÒXk_d·¶*]¡Èvªw³B½vwu‡+Qyg€§l}ÈRƒÏ¦…çÿˆ§xÑÂx‹× „«!y¨¡-•×-–ç-—ÇæBnž—ŸÇêâ.ÁzòB¤gzõ²Öq/ÞÑ/ü"®7{ö–´¶÷o»pÿÁ{¾÷0À'|’ !Å—|Â1ËqΧ!Ïw"Õw2Õwq)ƒqÙ#Üç}~4~6C~7’3’hr?Ó$ð'%XB4õ§%U¢4sd‚3§&pbslb5<•ЍiœÖŠÚ¥LÆ^yte³Ha‰6'°8A ¤Cפ?pE?ŃV[|Ä@?UWÿ”Cr¥Œc%ŒÎhVn5DnA`?»(WShu¥EéÃUÁˆ@·(eI¶ÿ`µØGØZåxT’SEàØL&7ß(9áèJÕxGé¨RõHG÷hAùØGóøŽq“Œf4ÃhEð¨EǸŒñ(VqÕ@UŒQ„$´ŒåH"U;þ4LTF‰>Íøg[õŒ‘a$‘ ™?u³ª3PØH_D’7Ä’-ùUBECÍ$M±ØŽ0À“>Ù“@ù“B”D9”FY”Hy”J™”L¹”N)”;Ù“NÙ”T9•VY•Aé“Z©•Xy•^Ù•`ù•b™•RY–Q9–h–jÉ•gÙ–kù–ié•lé–qI–uy—E9!\®Ø—¯åe~˜š˜‚Y˜’e#f˜ŠZ„ÿ‘ÙSF¹ƒ<ÁhÔXQÕN—™™š¹™ðÄQç0Q÷ÄMa™ÁŠ|$bÔ‘+é8$•8é8”É`æÔ(AõôS…Oº¹›Nñ NöÄ™Â9œîä™SuœÛ”›ašyDÞ“BdÕEve?=Äbì¸Wû…`³Ei‹Ù7À‘““‡™;Öæ™Yˆ)žç¹ž2õšÖ‰OÚtRlÕYå<‡&P yŸ3Ôgi<úég3I>gÅž¸ÓT yŸ2D“guF$¤ÖtWÅŠÎDžâˆH±ùV}s¡ÚRÊJ Šš˜!Z¢i•ž&š¢î5¢ê©¢.ªIú¢2 `d\È5ÿ£8K1š£<ªH(Ú£@ i,¤D:J;Z¤H:AGš¤LJŒ6ŽM¥‡ô£RZ¥þ8¤Vš¥úˆ¥ZÚ¥JÊ¥^¦NZ£ÏÕ¢bz¦…õ¤"f¦hÚ¦}³¤n§z§rZ§)‰Bej§zºa`º§~š¦dºP7ú§„ê[ ¥…š¨yö¤ƒ¦¨Žz7tú¨’©’ê¨TZ©˜j@}š©œš6”Ú©~ú© ª§¢:ªuz©¦šªuĨ|©ª¦Zª®Š¦°«b:«´ê¥¨z« *fºÚ«ub£¾Ê6p9¬xY¬LéfÆš¬Äº¬Èº¬Êú¬j‰Fͬå‰8hUØÙ¨¨³­€:¨~³ª ÿbg3­ÔJ¢¸#?Ø*®­“ßWüI‘åcëÊ­íÚVÐh¨ˆZ®–#¤ÚzSz&iý㪯±*Õ0—fI—«° Û° û° ±+±;±[±K±{±›±û±²;² K²"[²({²*k²,›²-»².³0;³/[³2»±žösP7è( (§fjPá€^w´[¡`A `h1k¨kRËv»Öv°rµÁVwváZ -˜+…±/,‰A,„—,Šm˜!ÓvxŠ'-p‹m©ÑÞ¢Úr·•7â.—×„ææ„PhRøë¢n¢Gzì–¦Gÿ/ñ&o×±zó†c†´£0ñA{j¸† Ó{ó¹ƒp¡[!u˜|S|¨Û1{˜!&ò!(c2(R}*ˆ³‹ˆ~Û'~;’#8s3‘8~“¸3$§~éÇ$Xr¼E.sKÓ%¡8ŠöGŠ;'m²“[Ù–Ö[è5bði5ñ'E'(éNp(Bñt3¾U‡( Ø€Ka)M±u_—)«æ)I»`!d‘vlñ¹–woWwwv÷|Qw·2¹’wÈö‚‡,W,ƒm춉ǃÖ·@(„ÖB„‡„¯¡-z‹à&néòyOX … ðyU8á7ÿz§‡z8o\(†ô†øf†âáðóg0¸g l¸ÄoXpq(‡ÃW‡¥«p¨ë ¦ëp##2 }¯;}…Xˆ"÷"Šø};²#âw3å·3ÂK‰Lb‰Xr‰*—‰™˜%]sc&/÷¼Ñ+5U35ÕKFMD=Û»c|bB· G—tå‹(NOÉ’b‘̾@)—ŒuB¿›<Wv\G*IK¥B*ü{vd§k èÜ*pwr‡µ³ÂÀ±²µxÁŠ,ŒQÁÍöò,9˜Á;(mÕ&-‹§Aèx×"yÞBy“—(¼„™§Â2|ÈQÍÉÆkÃðòn7œÿzÚ±/‘koýCæ\—K0Iœ{JÜMü{ÅC|c1c!V¬º2}躮ëÅ€¸"„X"0b»¶ #1“# rj<$‘È3mŒ~HR‰qœrS¢¼ò·ÑžHPóÑ~|Ò»sLFÕÙ5yòi+°°+Pt.^ðÒŽüÈ6í(TGu™\)ô¿œÊž Ô£œ)8üPÊdgÔ¦¬Ôú‚¼öktËÀÖµ]ÛÀ*hl¹œÕŽƒ½ì˽\ÉmÓÆ,¼xÓòƒŽÇÛ"µÁm³QÐ\™×*Œ.ž§Í 7Æ+/¤—…[ˆÃü²Ãã †±'ìq{ó!ÿ{—‹¹GÜÎKì†ñ ‡ó<ÏQl‡Æ×p¢|¦2þü|"Ðg2-»(ưqÞ37’i|Æ@ò»½»Æ&GÑ'WÛq\%î‡4œØ¼óç¼L#½!m5ûWÒiTȃ#=›Ü¢¶€Ì-´H´E;øjøëè´gASÀs±vrQ<Ë ¼Àâ­‚_¾2,œÕ¼\ÁÇRjû,d­ƒoÛƒŽÂg·Ûf„ÜbÂá‚„·á·€+ƒ«×y½×‡‹…§§…]ˆ/òÖìwoC†B0ùö/£Î pý†òÄÅt˜1 —ÏšÍ|ÿ Úш]|2µ{q‡x»,‚ÿ¬ˆ¼[#­ýÚG¼“èÆA#4@ŽÑôW4ÌÛÑPchÈýG5üÇsVóäON5©D® ªÇ]åXn_κåÐÚå\þå^î“æ`^æd~æfžæc9æjÞæhþænÞæk“‹¦’Efç v‹”FçÆÈC%ŒʧT9îç©é˜áêS “kõ­„’†Î7¹¯ôÕ=)Èf$&Y“Ä8è“Úéÿ xš‘49Wר“ºX;—¾éZ€®êtU@ÿHéFÆèŠÄ‘ŽÞRxÞê˜Sè¸äŽfæ¼#ìúê4Ö68IIó(Zº.›ÊNJ¿nëÓîF×^™¿“ÿ¯ìÚUþÉé:”èníŠ.’ß^ä^BÙž6ŽìZíIuëéùòÎ6ð^Üùîéö®î H‘þèø @ÞÞ6iUÏ ð6‰:ÕdÒ ë…FŸènýÎ’ÑYñåÞîßéøé‘¯¯‘OÄñ«É _ï6yñÛ  ¯©Õ®5¯¯$_òióì“³ï„ H׊D+Ä‘à* úœ×):&¯;š£(/ëo=ˆÎg ÿŒ=V jÒ*ÿFGïꬳ Ý¨óÌîîIŸ úóyóaï‘T¿DV¯ñÅÝíýêh:ßfr‚š’ó¢ôõuŸZsï£ÄþöXN¨¶ú÷Dø‚¤„_ÿøÌ¹sU¯›%ŸõêS䟉i5…Û˜ÊB‘Asÿ4ûä-gÄ”éöÕl72ܘcž–{ø²f´£žÜ³óç3e3›Œk9uÝÀ«ãnÌXqáÆo•¾tºg‡ÔûmLí¯ÄÐáà““½¾ýû½èG%о(zõ¶¸‡ß€hà\ýW"èàƒF(á@ :ÄÚ„f¨á†V€Sëq(âˆ$–(˜‡a™¨âŠ,¶xŠº(ãŒ4Ö8ŒŒÙ¨ãŽ<ö¸ Ž!ú(äD–è!ˆ©ä’L:d’MF)唇=YKƒTf©å–d¡÷‹…9r)æ˜dVåå‚X–©æšlÞ¸Ùja¶)çœt’c%-iÖ©çžuÞÉ Ÿ€ª§Ÿy jèÿ¡QŠè¢ŒNydŒF*iŠNjé¥3VŠé¦œŽ¨i§ † á§¢–jê}ÆyꪬVù&š­Æ*뉯‚䬸檩ºöê«V¼þ*ì°I¥z+±È&+T°Ê6ë¬DÌ>+í´ ÕŠµØf+N´Úvë­±Pz+Y›"¹èbËmºì»n»ðêún¼ôÆ î•õæûë¼úö *¿þ|é™¶†+ðÁ¢|- ÿk-’ø6,1¦OlqŸæBzñƆVÌñÇdz òÈZÞ‹'É(Ó)rÊ,+¹rË0ûørÌ4Û8sÍ8»hòŸ9÷¼äÍ>-"ÐB!ÑF'ý ÒJ7]àÎ…:-õÿ„LOmµsU_­µa Ÿ»õ×Kg¬*Ød?ý°Æe§ªØÇªíösY¿-wYqÏm÷Vuß­·UPïíw`yÿ-¸QnxP…®xkÙÀºøã]ž=6ä”óͶÁ•gNUâšw¾íå{.úQ„`ú騧®úꬷîúë°Ç.ûì´×nûí¸ç®ûî¼÷îûïÀ/üðÄoüñÀK>úòbÈüóW9}OQ–Zõ„]? z'O/öƒiŸøkSS°÷ú:©/AÓÉŸ×Ì¡’ãP2ÅIIp(dÿ‰£€TŽmvÂ=žñÏ'ÌKý ³ÿA¸éï‚?É ^:ˆµnïƒ ¤òVØ»²ð…¹s! gH»Íø`A)ÌáNÔ€CúP"4ø¡}ò¥!‘"3˜(‚4ñ‰NŒ"—HÅ*Zq‰  @³¨E,jq‹ cÇHÆ2’q @#ÓÈF5NÀà@ Ç:ÆñŽv|ÀôÈÇ=úñx€ '€Aò‡,¤"ÉÈB2àŒ$#%IÉH2à’ Ø@&7©ÉNr2“ `@(C¹QŠR” e*Q™ÊVºò•©t€d)ËYÚ’–¸ôÀ,=àðÒ—ø@0‡)Ì,ÀÇL&2—©Ìd:sÏ„¦4 ÍÿPóšÖ„&6¯ÉÍn&à›à'0Îr’3@§:Ó¹Nt¦3<å©tƳž÷”@< ~ú³Ÿýçü9Ђô …À@ÊÐ4”¡u¨C#ÚPÀ¢€@F7 zt£ 5@H3 R’À¤$MéIWJÒ œÔ¥05@LgSÈ´°)NmŠ€œ §<jN‡Š€¢æ´¨HMªR•4õ©NêS›zTõªVÍ*V· XÕ«`íêÀ:V±Z€¬gkZ×ÊÖ¶žIÔÅGðƒ” `(^Kðƒ½–W l·ØE‚ñ‹_ cbÍÈØ5ª‘ÿH£%+G4Úñy¼£9€8vVŸ í9ÚE²‘“„dj)‰Ij’—„í éÉKÖV“—4¥n5¹ÊÞº’•° ®. KY·¸Äõå,…ÙË_ö²˜Ãô%s)Ìf2™ÎÄn4«É]lf3›Û´æ6ÅNò~sœçý&<¿YÏõêSñ´§=ß¹ÏijŸ àç>P 4 í'BjP….T¢}¨‚/šàŽ:x£ý¨G30aRø¤e©H5\Ò«´¥2-éLC Sšþô§À©O{ºâþô¨?ªQ—Jc7µ¨T•ªT©_"èq«:ä®jÕ¬Fÿ.kY-°d&Ÿµ«Nfòþ~$€·rA‰Á`l *PA VPƒ0×à T Aª¨f.21 hbaçÆ&ŠÑΧh£d)+Y˾ñŽqýÇ>~Ö…$$#}HF¢µL­#UkÉÌ“²Åä¥7¹IRž” V%*Y9êàš:•í%-;Ë`¶:ºÏm.1{IÝëzÀºÐd&wŸéjN¼Úvx¿)Þn¢7œèE/;ÕyÎz¶3¾ò´/}é)O}ZûŸÝ¯@ àÿxÀF°Çàr;¢í(F¬î gô ©…7lR¯”Ã)uiˆóMâ~ë´¦à©ÿ‹Y,ð‚ǘ¨3®±Â‘zc?õÇ=vjU­êÔ g5«EöjÉjd&#ùÉimrZ-ÔÞÔbo=Ù\{PPÁ ! TDš ‘sœw‘Έµ³b ˆ2±E¬Ò÷üÆ4V³ž€ ++GÐÑ d¢I›HA¢vÒ”¤´ØÃžIØÒÖ¶˜äô'C êRžRnW¥o{êV×î·Ln«‹+Lçs˜¼<&/«;LÁ㺙¼þu5}í]Æ [¼/ozÍ{Np²sœîµ¯|ß;ÏùVÛÚÖÞ¯¶õ¹íXÀ¦ÿv J¢ M÷¹ÕáŒJ8ÞîŽwHïÿ­Ò{wXà Öw¿G¾b´Â0L«,HÛCDû·aí#fñ´f1?Ö \Ë Ùñ _9SKc ô¶`[Q ´iAÇ@ &q@ÌPrx?ätM[”щ¼·× Ûq?¤¶z;s[¹a·‹‹Zë·k« „[¸½q¸%·@{¹U›µôa³e;p‹@ƒëyì@zÁ·£¡ºykßÑ>²;%Q‡«º³ ¹¬»µ¶ëÿ¹ÛX{¥ Àë¹ÖºoÛ¹Å;Ý‘º® Â빡[®›»¼Ù»›!Ù‹» ¤»ÓÛ»¼WK·zë¼$¸‘c n‹è'€K¾ŽË×ki¹d~ñKW»H‰Éû¸?·{,½±µ $À«¸ô‹™Ë¸Âk½«{¼JÛ+ø;gK)» ¬!¼Ÿk>P'œÂ(¼Â*ÜÂ,üÂ.Ã0<Ã2\Ã4ŒÂ$´/Û/,,ÄX¾Ò{Ã6\ÄD|ÄFœÄH¼Ä6 ÂJÅL<ÅRìÄPLÅX,ÅZœÅ\ÃNÜÅY ÅW¼ÅFüÅdÜÿÅg¬Åf Ãi Æm\Ãß0eB¼·ÒÃsaÇTóÁvÇkÁÇtµr¼>ö;Qk6s ,z¬!~|¿‰üÇ|mû ‡¬¹›3ÂlÉ·1ȓۋŒ?‰»É3¡ÃóÑÀò“ÀaÉ\» Ê­á;ܵ𬼬¬,¶€;ËÁ -%Ü “Œµr‹ºq»Ê´L@Â<ÒË‘ÊùaÌ¡\Ë]‹ÌÞpÌÏ<Íå ÌÐ|ͺ|È£ëÉŸlÖü¼c‹Él±Ë¼Ð˰뻴k¾ÃL@™ëÀÛŒ½Àü½àðÍÅ\·ÕA¼êl'|ûÊÕ ¿ÆQ¼ˆ‹Î&@<¼ÕìÌÿ\¿ú¼ÏÞÜÏ£|ÿ·Ø½Ì@“œÀ»¿‹ÊôÄë³Ìó̹QÈÑLÉ Ï×{ÒïkÊŸ£Í)}@-ÎåâÒ/-Í{ÏólÐÍÑ4ÐrKýÐ=MÑ MÏ ÝË­Ó|ÀÁ¼l2 #<ºîLÔÑK¼ äÓ½À〾òœ¾ô£ÐÔð·áAºÕ›ÓYÓüìÊóQÓþkÖ aÏW@iÙÌÕ¤¼_m×ðkÔAλ€Ô‚ÜÌu,Öàk$†½º‚m&‰„ÜÑ’Ì5Q-Ù‹=çÑØrÙ•-š M“Í@N]Î’]Ø›-¢Ì!r  ɘ­»£Ø4+DèÄ‘=Û>ä'§ÿÛ~£Û¼­C¾ýÛ)ÜÂ}A]CÚÅmÜÛ» »Ür³3ÍíÜnCÜÒ =Ô]ÝÌsÝØ=:ڽݞÝÞý<ÝÞ™3ÞäM9æ}Þ“ÞT" 1ñÞðßò=ßô]ßö}ßøßú½ß´ümß*› OŒÂþÄbLànà¾à Þàþà á .ááÔœ¬<¶ÝÚÁÒ"â">â$^â¡ >âÎáˆÚÝ8ÌÒ,!ãaâ6~ã8žã9Žâ:¾âåpË%íâõŒáŒÃÌÝTý»Á|Õ´¢ãNþäPåüÀ㯰°`åé` >ž×8­ÊHDÁÞ½ÉaÿÁ¹ 8¬`‰@ j^åƒàìàlžå¯P €m¾y~k>çRþ瀮Tî „~ån®å8ûÚgž½uÀ0mÁ-ä]ã·m? Ý×`-éX±qžþæ‘ç¡îéXþ¦~ê¨^å®pèÞꮾ ƒnè¬Pê) [îÏÈܽ ­ëéË]¡éãLé;Ìâïáœ~ê«îæwŽç™°ê–ì¥ÎêððéÎþêÖ~í°¤®ìÛí¤0 ¸®è˜ÎëžÏø ×g>ÎÀ b^ë¾éi¾ìqÞæŸ~è³Îí“`òÞûþæò¾ç£ŽíßêTÎïó~ð±ìñÏÄîØ>ÿæCÑî‰rïòPëï ?ð¿ñžPð7¾åIä:ñdä1^&5Îñ*¿ò,ß)¯â‰N¨44ó«Cä:I«&/ßò<ßó¯í;žèÿ=ôDA¯áì·&¾ôÎôcüôNõM?õPOõR_õXõZoõ\Ÿõ]¿õ^ö`?ö__öboödÿôg¿öi/õ:ó3«Þƒ#ñrÿ7t_÷{s÷x7à½÷•£÷~ÿÜpßð4Ç-Û…¿Þƒß¯#B‰¿(°ãøMmò}{ þò±ñ¼¢ëði{ÊB4ã].¤‘âqï&µ{òÍÜì¡ HrÌ ä•K¹Î«¼¸ ÀsÿûlºL¹…›”½¿ä¾8^Í¿\µ¯Ÿü¿×?-Ò¹OeœîGOéO}óünð¨P0èKÐ;ÍýfNÕI]Ծ̶ÒIý֢㼼>þ»a ÓJ^Öéý„ÿžÔÜ#Ïæì ý‰»ýg „ƒ„‚‡†…ˆ‡Œ‹‰‘Ž’‹’†˜Ž”•œ ¢£¤¥¦§¨©ª«¬­®¯°±²³«–—¡·¤™¸¶½ŒƒÀ¼¡»œÈÉÉ´¬Æ¤̤ÍУÆÊÛÕ¢ŠŠœß•âá‚à¼äÄž“…äëÁâÁÃçðîô¶Øýþÿ HЕ¯|öÌá›$† 7%Òÿ7.á!mÛ–]+JÚ(jÍžÚ°À€&QžLIò?ƒ_rœI³¦Í›8sêd%s§¨”@WžlIÓ£(Ö|*]Ê´©Ó§P£JJ›QPHG­Êµ«×¯`ÊKvÕUNYEm-˶­Û·pãÊe{ÖQÚ‘sóêÝË·¯ß¿¨êB*’ÓZÀˆ+^̸±@Á„îvL¹²å˘C ÙÑáÌ C‹MZçæÎ‡>—^ͺµë×Ùd¢&¤¶íÛ¸s#>]­°gÝÀƒ î–÷áÚÄ“+_Μ ñ¤Í£KŸNÖs­Õ³kßžýºZîàË×ýÜwêñèÓ«íïú÷ðã÷m?Y¾ÿýûøÅÒÿ¿¿ÿÿLíw€hà@å}wà‚ 6ØŠ€´9(á„^$[7 V¨á†Bˆ!‡ †ßfƒ'â‰(Ž— {)¶è¢t"÷âŒ4¶c8æhÛ:öè£h<þ(ä­X‘H&9ß…&*éä“p å”T~%e•XfùÔ•Zvé%NFò÷å˜drÄe™h¦9Ë™j¶éf*l¾)眎ÄIçn†9 ž|ÎigŸ€zùg „V9h¡ˆ:yh¢Œ©g„F:墒VJ#¥–fš"¦šv "§ž†Jᣊj*Š žªj©®êj­¾*«|±Îj«z¤Êxë®#2 ¯ÀúWkÿ°ÄN7l±È.wl²Ì —k³Ðªè+vÑV»Ý²Öf»¶Úv·Þ†kٳ▸榻۴ªë®ì²øî¼¤¡Kï½o‘‹ï¾—ÙËï¿`ù ðÀU LðÁPŒðÂKéËðÃq) ñÄ5ILñÅÎÅ{$Æ[©±˜‡\°¯æA*òÉRYŒòÊ~¼'Ë0û¤rÌ4“Bb© ׬óL7‡ÔîÎ@#(S‰¿m4@3MsÒJÃÌtÓ+; õÔ¯} ==}Ø.›|=öÓôöóö WO-øKO>æŸ/gúêçIò÷íÌ~üiÎO™öß?fþú ú¾¼ýÛÿ˜¥ÐPÙÃÙû–@]-P[Ì{ ã(Á{°‚Jü0(® rHü ´<äšð„(L¡ WȺð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ ¢‡HÄî9P„÷š  ¦Ä%Œ0NdXÿ;wĽ@¦Šz¹"f6Cˆì‹yÑb¿^ƹpQ¦+£\Ä8.2n±'h#æÆ1ޝ2gô"îævÀÃ&lÄU1H«Ô‘#…,ä?ÎÈǹ5² ÐÄ;ÌtHhX›À‡D0AEž"¹äDâ‚0ò‹69ˆEŠRÉYHä°Ü¤0&iVÆÄ’d‡:’GTÖD•~ä™-aa‰\æâ˜¹ä‡'3L³Ф¤)Ù6jÖ¢!åæc¡ÌXâò!£|%-@éo !ˬ­y6v’…œEjæbz¹Ç7nÓ1ðÔÌ:}ÙÆ{ÆÓŸúœ&?ñ(OÅäsžpÔcíˆÈ%ÐŽ¢¡½áC#JQê"ŽQä¼—уù£½8R€;httrack-3.49.14/html/img/snap9_g2.gif0000644000175000017500000002041115230602340012637 GIF87aÝÖνÿÿÿ¥ŒkïçÞÞÞÞR¥œc­œsµ¥Bœ”)”Œ9œ”„„!ŒŒ1”ŒZ­œ„„J¥”Œ„{µ¥„„kµ¥„½­{½¥c­¥J¥œŒŒ!”ŒŒ„1””1œ”B¥”÷÷÷{½­cÿΜïïïÿ1œ11ÿcÎcÎ1ÿÎ1Î11ÿc11„ÿÎÖÖÖÿœÿRRÿœ1ÿ11c11œ1ÿÎÎc1ΜcΜœœc1Îcc,@ÿ@€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿`¤€€@D¢‰”³N.”ëíڙ͠|@ofô!~‚€ …†‡‡…ŠŒ ŒŽ‘–””–šŸ¡£¥¦¥ ª«¨ª ¯±°«¯µ µ¹° ¼¾½¾Á ÃÄÅÆ ÈÉÉÈÑÑÐÔÐ ÑÔÙÜÝÜ áâã ååæéçæç îîï ñôîð ù ÷÷ú"ô—À?"Œ€°!Æ HœHÑÀ‰-j¼È‘£ˆ òÀH“( 4‰á@Ë–\ÊŒ)³e™7sâ< 3çMÿ:"8 ´‚£F…"=Ê´iÓ G¡JEõ„ ¨bݺ5ÄV«°†µpalÙ Ò–kŒˆÀ2@@Zuɘ¡#@ œÖp `ƒ„ w pJìO@€8 e’ ®l¨'EŸ)H¦ú3é¢8|–°Zt ¬_Ç~­lÛ¯FåÞ-ë.X¿ƒÿR°!0`Æ’3†¬3h ®I›Fz¶mϾó¶}\8téÔ©kG~Þ»züàLÿ_@ù)˜¡?‡ø>¬È?ãÆÿ}¤QI*}¤Ibp`L-©ƒ3ÁdM7ñ´SPÿqŬç®û­®Û.pìsÏîð¾oüñEßDâtÕŽ|¼ŽG.ýôlöþ<¹Êó(üòÎ3:Ô i\ä]ôÐÏWŠz¦°¶ÏþûëÇŸúú»WkýõævóBd?²¸«Ÿuw¿ÿ}ËJà^ôgÀ:ð€c`ðäÁ Zð‚]P 7ÈÁÒe{ ¡E¨Ášð„ÅS EVº0 c @Õdè2Êp†8¬ao¨Ãòð‡6 â…èC"±j—°Â*ôÌ ßC\_HEï¹eŠ\xbÔ†ô¥ý-Q Mt"În¨¨=mi[ÄB «ÈF(`‹YcÐਅ.Êÿ.ŒFÀ£ÇÖØÆ>Ö‹¤ IÈBòˆL¤"ÉHB&qy_ô£$'²Rò’˜—%3ÉÉNréGŽ¡Œ(÷@ÊQ&攌LcAA â•‹p„,e ‰I\â–˜….5á‰ÔÀF¨8E)PAÌݸbÈ”pr!]8s8¸Î0£œc0£9Îh†2ª¡ êP;ÝÀ†7Æî”Ó;èXG:Å#òÈ£õh{ä“‚À§ ôñÇ}ÂÏüDd?ü¡HF‘‰PSTÃDfZ׋¶¶µ´Ž3ëJWãÜU¯ÉÁæ5¯ùŒèH㯕Îu û s"ŠýކÛÁŽsLö<ò¸eÛsÙ|\–>1±CöéOˆì ýÁˆŒ  ˆD@BmJ¤Ð‡BèǽɄ.JdŸXh(òЇ€²ä¢,%¸&"iŠLš"®LÀ+\aé‹Ì2£èÆÔ¦`¶épªGOšùÌXÚ$š×ÌæäE2 ö¢c@'çÿp€xγž÷ÌgHj†a›qj°ƒLa¡J­°F7«ÐŽt¤iÕõùÒ˜àŸÃèAgáΙµ¨ÿGMêÜmZtoö´ªW$ Æ9Ju¶³¥û|jVŸ¬ÓW s' fè^šÑÓªµ­G†ëa{±Ô¶±AVìe;{ÙÍö&…X£Ï‰Q¨³µÝ¸§=ÛÌ D Ç¶}í.‘ûÛ×7Â-At»Û…ê&YªëÖîwÛ›„õÖ^™›×mtƒÙ£Vö»ã]·yG0Hçá)íhJà̸» 8ƒ+.ß÷þ Ä!.qc<çwÆG®ð'Ýý.·’Ž·oÓÿ6Åòþ™üÞ.9­÷=ð›Ë›ç $9Èu^ê˜?{æ:Ò…Îtß-ÌMú°£-õª›êVÏz±®ÿõ®[P…yã£×)÷Æ[?RßQº÷àü´€½zQ,/øØ_Wv!½½|G²ãÓö¸Ï}cu'öÙ—Àõ¿y…?¼âm—øÅ;¾p¼ä÷†]¼ %€vºÓp¾=Øn*¿«JWŽ–±Œ¥"$ñˆõR–¹¼e(8@ BÁ´=l„IL¶¶"™jmæ[—œßèb®vµë…¡×æ,C}íkƒ¹ÙÍor³ÂÚáÎ…Ë™¬sìä0>ÚO{˜g=è7±{ê£b|²Ø³ùlüꨴ)‰RËP»–µÿ÷ °5QBf!EFdºu[²[EÑ[O\PVRÂeRÿÆå"\X¶\[ñR^Æ7BeÖ#וSg<5EuAÅ CUFeHÕJµJÞ^‡pz°d^:¸^<Ø^îµU]…U™`{»D{£L»×{ÇÄVÆÄ_Ê$|W¦|ʇ`ÅÐW &}VX„EaÐàÀ}‰µXßÇÖaãW~ï°ý0OïAabûT‡øZòZþAcucac$aªÅ ²8Q4!Q2!BV[ò!µd²"ÒQø'Beǵ"W‘eWÖ4âe6òÐÕr¡4Õå#$ˆ°†@55E•1Ø] 0ƒ0XM5Uÿ”1UPÅèE^Ÿáµ„ﵪh%V¯á»g¨°iÅ„ÉÔ_Ë`ÆG`ÑdW& y•`ÌqMZHöWÏ@ƒEa†ÕŽàá}gèXôØN Yñ bû@bõ„Yò¡YöÁOð×O ZAZ÷LJ€8¸P„Øc’ˆ2‘8!u€?q[IÆ€“Ø["¢ y‰$5\WA\ŵRWá\4ò\¢èR¦)0™Š#¨ð‹»"zq¬´“â…z™q^ª'Kïµ^?xKò5„Ÿ°Köµ{·A°Ñ{¬ÐÇôVà_q¥ ¾q ¾1ß(MV8ŽÃ€…Îà × –Žÿ†}íxNlé}ð˜aŒ%~öx‘5bõDO!‡ú™5wP0v£eUc!Q Òâ1‘)‘0±ˆåˆG¶€–éd"R‰Ov‰H’›h’X–R2âdÑe`1Šk#€ÔHÖu“÷šy°9›‚§v´y›„#›¸¹›·Ss¼ù›}§vc²r}B9GtÈ™œÊ¹:Fw®Ö/úÒ4Š‚w÷>9ó9I#D“F‚sœËùàž»ÒœÉâ›Aƒ4c3o7B3Ÿ“žìémÝÉp£lªÂh΂Ÿ•ök‹*öŸü¹Ÿâ9 ;G,橃wf¼F:šâ)³bŸº,ÿzŸà’hªŸ’F Z?äé7ÚuÞÙ¡$Z¢÷¡Rd›]WC,D-:C/£.:£0J£2Z£8z£:j£<š£=º£>¤@:¤?Z¤Bj¤Dz¤Jj * œNÊB!ú¤RºGæ9œQ7¢y†¢SšAU ƒâ9„b4§wCmÄkZŸ¾&¡פ[úÏYœÚùžqævðyž„¦jš¦ 7kÂâ¦oÊ¥€*Fp¶kê*Š¡z-Z¨Ÿ¥Y‡¥xÖ¨ŽêœjuIš©HÊ£• %ºÙ© J%Ÿª¤ú$…§mXpn,kpÄÚm~Wª½9¨œc3ñù¥sª3º*mÿðImÙ9GÕù«5#¦d:¦æã«î9§í)Ÿ²Úr¾©<º&¬¶ ¦·*ÔŠ¬DƒžÅz>wǪ¬®Ñɬ͊.O‡ry³m Š%±Z®Vr®Ïêsî:¯™#¯§töJ¯úš@ùštûÓ¯û°¢ø*°;ðZ°N°ª™$©&Ú¦" °®I;)¬É 0fúB[+ôù°ƒA©ª–°ÿZ±âŠ«ÙZEzŠh¾Ö§Ë ëi"[¯_@] {¨ʲW¢/;h1K±Z·±-Û+;Ûf=;<»lšª¤I»´›ª´FJ«¬V´Üs°T볯U›µ„'±èÚV kø´A;žP»jÿRË#>G¬ÔÊ­èé9ض›r:r›:s[*t{·v›·~šiCËfg»µ$k±Û©­'ûžášn{;¶ÀÒ·kö·ü*¢‰«¸¾Â¸hæ¸'w´Æ&¶’Ë;e²\‹µZÇ´N;º¢[ºMÛ¹0û¹ «µ¬{p)-ú6n3»²[»´{»¶›»¸»»ºÛ»¼û»¾¼À;¼Â[¼»Û¤£ÚºÊ[p¨»¼Î‹vϽӼÒ[½þj½Ø›%—š½Ü[]Ô۽Λ¼àk°`ç¬ã‹$Ûk®ëºn¾ù½+Ó®ç»'WdvÖV¾[EgD>â3>c¿8¿Fx@Ò­þ«DõÛ¾sÆ9k›±ºÖ$ ÀÿJ ÀaЭäŠj tî{@ Áb0¿&£wJ„Á}ÇÁCRvåsÂe”Â(¼Â*ÜÂ,üÂ.Ã0Ì' I@G=8œÃL†¢Ã> 9^”Á<°â;IJZÄFLªHœÄ ºÄL\©uÑHR<ÅT\ÅV|ÅXœÅZ¼Å\ÜÅ^üÅ`Æb<Æd\ÆcC¦KºM›Æl¼Æn¬ÆpÜÆqüÆr\Çt|ÇsœÇv¬Çx¼Ç~̣؅“‚Œ“<¹“®„z¯4ŒµT ŒÜÈ•KIɻĔ”\ɰÁ_Ö8|ÊÄMžŒW_¹`Ù4–Ú4¦lÊj‰}c¸}¦Ná7—°bæÇñÿ(¸œËÿóáOyh1¦Ò 9Ì'±Z«EÈœÌʜ̴5[i[™QºÕ[è™*¢¸Í()š+ɸâüeã uŽÁ+¢‡‹5^6ˆÈ©GKðÌ^¯W”?8„˜”½„{ °ÏùÅ P™É¹`¸ÐVQÈ Â!WÇŽÖ¢Ì`ÐG–ÝÄMâd}Ù'†¬œX—j¸†ö(bmYê'‡&vYuè—òcI˜3–ÄL -m ƒÈZ‰Ìe‘ÎL™H¶€ÑÜd“¨[ iÍLAR&UR,BeÛìÍ,¥’Î5¥8ŠiqCPÕPÝš•—A#Õ#Z=4@È:IzƒàÎÿ‰ÐA¹zð^>ÉÀK¸—¨ {O™„s­_Å|L8Ðz}•|mÐsŕȎÊá|ã8ÊíÉ ãNa¨}âÙM-möYnÈož ðÑYð—.F)-Z+ÍÒ7¦ é‹ùÚÕP3[?FQÏœdÅ[Ó,‰>m‰"ÔGQÔRQe-ò‰-Ò\IŠeÑR2‚T½ŠV‚p+ ‹3 /X“FåJ%֥דˆl^gͬÇzîeK@¸ ¨¡H©{¢ Ïu_J˜ y-|ö½ÝM^É|â¸ϧ…Ð}Õa}ÙAXª,Ùc˜ àaÿ•Ý6—MËï!è7™e-¾ Ì‚™ÅÚÃìÒ¢˜écÉ\Ó"™µ•ÓHöâR‰¼í[¿ ÜUA(µ‰Æ½ãÉܦù2u2ó¥"‚æ|8àŠÒ‹,HTˆ‘TÙ­1J `¤Ä‹N•‹ƒqW¥z›Ö¢ _¾§á ´ò”®AÓXVôÍ´ UiÐZ¹ ¿ñ×TÊþ] ­ ¢<}Ó‡Žž–^Ñãð–ÞÐàíÊõb±œm‡þéütøÄË¥}Úƒ Ì¡éÂü‡!þÒŒù ÅcÊ<€ŠèÌiQ.ÎH–[“ø‘¾’Q–‰7>R¸ãÿ¡¹3r¼î’05SÓ%G8¥Š4ÉŠ®øS+,pÝÙý‹¦´‹ªÄTä[NUÖ¾ƒä…^B(„¡±Œê}@{g%hUN9•ºa•Uy•P˜•Ûè×Ég`_ÉÐ^ØÑ× ÐÀMÖ'N©¬…^†o)q¹èã'Ëæ÷­~ödáîÇøDœEÚ']Ú¹‡ÿ~8û×Ú&þ(>Óy‘r€«®Q9ÍJë5>’9^ĥ㹾\LÝëÐS© ì§H]F^y—×>5ÝÕÍ s€Ý‰ÑݧD^ªtKeÕNUå•zžÙÎÈ^UõÐâNäNî¥@î¯|T çÿÿu•ÍŸœçƒM X(–Ò‹–NNÍ–“]†‰~öa>Y÷àèúPá(–O)Ú&=Úõ§é+½Ú‡Éø.íÚ;ÖPŽ9ÛI€7]d’‘E¡d(Oã²^"BÍòµÎ"ÊŠ*[öÍ¥øëA>äÆ:ì3Y€7(€Euûƒá¸ßìQÞ‹±J¢òTÀXüïõÅ„a•ŒAÈ eŽõæþ g¾æ^ÐP¸×îŽÐtµßñŽçÕDïÏþÕ MŠÑMa Žèv/ðŠNnð½Ù!é÷´O“ÎáßáŠâ†É‚áã`81Dbòp`bœÍ&4ÿÅT¦ìV«ÝrDeL“ш±š¬v¿Ý“·\ޏÈïvÄ„ñÿ&î', ï -.,! &)++0%! @CEGò:ÿä¿,Ãft¤Â ÉQGG±`$±DÈ!‰,ÒÈ#‘LRÉ%™lÒÉ'¡ŒRÊ)©¬ÒÊ+±ÌRË-¹\ò±.Á SÌ1É,ÓÌ3ÑLSÍ5­ü’Í7áŒSÎ9é¬ÓÎ;¯tÏ=ùìÓÏ? ôN=-ÔÐCMTÑ? ]ÔÑG!TÒIl”ÒK1ÍTÓM×´”ÓOA UÔQ‰ô”ÔS¡@ÕUYmÕÕWaUÖYi­ÕÖ[qÍU×]yíÕ×_[- MSQ-ÖKHIVÙe™mÖÙg¡VÚi©­ÖÚk±ÍvZ‚<“X"°$\4Ç×X21ÑVÝuÙm×Ýwáw]n‡ÒÉr) ÿWßIã·ÄÌý71÷åàq î7_€.ßs/AV^l%žØâ‹1ÎXczÑüvHÆò Yd&y䆯áým¹å‡M†8Ét5®Ùæ›qι]޽µ·I˜]Vya–a:æ—Y>褙–YHš E⨨¸jP¦¾Z«©îZk©µ®xj±Gáúë°ÇÆZçµÙÞ¸[3=ri•>ZipFøà†c¦»d’ÿ®Ûn§Tì¯ÍÆšlÃGœñ¬_œñÉ'‡Üñ¶1ÏÜ]žáöYÍ¥ 4mÃ%ûñ³O?}ñÕK?ÙÄ%·ZóÙißöí2ãb¨Ù•=Zß•¾öá‰wÿ»ÞÛuO¾pÔ«¥zZ矾øé©ßù1sWUš«ïÞûïßåwϵO~€òÑOTØŽÉOßý÷áß½ýøé¯ßþK³¿_ÿýù¯3ÿþ@ŠéL°èªõN*` Å=̉‚,Rº3ip€l-ˆ]ïHE3™ÞR&°€ùKp€+™¾òBî%fkУ¡Ô w-ŠP„\ÌÈŒ8 ®°oIs—·ºÃ)‘rÕÚ!+ˆApÌaB3¡ÈŒvDÎÐy±ëbãtHB(BPŠ#ØÊ†(7ž‘Šƒc ïH·D96‘ZOãçg¦¹Ý±Ip4]ɼ:Š‘ÿÌc!åA¶Ù‘|`#å¤Èµ1’û{d%ß$IQ“ö»d'Õt¾:-”üd)Q™ÊER•­t%£ùJYÎòP¬¤å-qÉ>Bæ’—½Ìd,}LaŽo—Qâ`¡tÌ)NI™M+a—š‰ÌaÓ–j " ÷8ÁÁÐ`saS¶·nño.ûfÈ^88+Nˆ(c#ßÀé·»MS˜ÿ‹Ó´ˆL-f‹H“›ÂÐÈOsÎÓŸú<™4ƒfN4¡ %h!Q‰N”¢µèE/JÊ>sH d*M‡¦1 jìgCCšÆ‚.Ô›'%©MÊÐ6”žcôh”ì)F éínùÿTA½ùÓ~­,ž*Uè6]êF„µ…?]cQáyКBñ¦©âèÓŠù©hÆôO[j³Zª«Z¢ª_5«+ËêÀ±^"¬gu«MÛú´µR"­oµ+$ëʤœÞ•¯x+Yç:‰¼ö•°=üëûxØÂ.ö~ƒUÒ^Ù(*V°Ýe%›Ùò9vf–å,c1ZÑ®J£šýl¥<‹Ù¯j|ãd_Ok$È&É«¸dmk'öZ¾Æö‚©]ÒN›*N¢æ³·e–줇[Rèö®¼ë_ëFú“¸4®³,§Üf1׮ѕ+tÛzE†–”¦ÅµÜè¼öÇôj7YÜ}«w ÞßþðœQiÿy©*¶/¦r­co(ÜëVø"V¯ª¥í,ýxÞ9*ø¿Ë5pMLWßj6b ÆX€ÏáÊʗ¶°kLO ÿˆÃ^Þ‡å…a³Žx¶¥ûJ›YOØÄ5®ßŒKlc»ljÝñÓ×ã™Èʲ—B<ÍÑ.9£6>òc“LÍä¢X[*^-f[üLg®©¶„».•Ãèd,ÓIWtjpYŠE¤¢p©ï›áÖà ÆÄU.Îtœ•§úä™…—¾ã©tOˆR‚*~PëÚ¡Ç–èÈ-ºjˆf4ñð á1çXË\o?³©Ð”ÚÍSs˜k¬g$EtCí&ÁðùN»ÅÓ›õô§ÿåzNÚÇ¡~5¬m'fœ’™Â_Ƶ´"-bZÙÖ¿Þ™¬ƒ)êJ!Û—¾6ö³‚­äa#ÙÉð‹±d•-[f™Ûœ6”»îseû‚Û÷¹ýDîR1™Ýív÷»áoyÏ›Þôþ6ºñGsç›ßŪf¿>nËœà¡ûwÁªƒ'œá™ZxÃ!.©‡Gœâ«xÅ1Ž¿‹gœãšxÇAΧ‡œäþÛxÉQË}§œå¡x,]úJ‡ï¨å_¦Å3ÉÌø}|à•uÃ/óeäe¡±´÷Ìïió¿5i9ÅxØ£Vô“'ý}¥K_Ìvõ÷;©«yÈßIyg<ê]êЖþYJªï½Zïz£îþÀ ¬äþ|ÖÿžõÃ|í³¯ý;EßP²<øå|ñˉü^÷~èñ.3õ¯Ní7”õ;›õzÏ›úôŸ¼Õ0p«ŽøüïÃdæpý¯pý 0µo)°÷,ð3/5ï8°».îA°æDpc®M°åÂŽY°]ða0epi°mðq0upyЃ;httrack-3.49.14/html/img/snap9_f.gif0000644000175000017500000000642315230602340012563 GIF87aŠŠªÖνÿÿÿïçÞ¥Œk,ŠŠÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÃÜÝÞÜÚâã çèéáHî ðäó†æ÷øøëò(ý ÿè ¬' ¾‚û¸ H‚a‡#þ±gð\€„ÆC·@ÿžû8’H!9~츒dI—cº±Wðº‹ìâ±l¹²ŸÆ/áýóÒ$Ï¢Hå 5Š´©Ì§fh¼‰SáN§G.ª³kK¢EÁŠ…J6TªU7¦ÛÊÔäZ­YŽú2é[˜e󆡈6mÛ¯ ü®Ó­J³ÖËX Å5õåTÖ(Q±‰±^f:7©áÌC_ylÐ/e¡*SM-lGÖ©Uƒ®ìÒg]Ѹ¥˜09ÄÜÀ N¼8ñ¿ƒ+‡•|¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûž¾éßÏ¿¿ÿÿÿ(à€hà&è_oø5bÎZF(á„Vhá…f¨á†vèá‡bÔ #¤•fâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ/Ràƒ§œôÍ1S"@)äDid‹ëWœ9"¢Ò™=bUÃPŸüxä•Xf©å–36YΫÈ%åQFÉ•ùEÆåšl¶éf‘^.À$ޤ8$’[uy4LJŦ'W%åÉZJxɦSkx𩇕o6ê裎ƩÀœa¶ƒg–)Öçg™~…až‚ÚÓ¡™¹VÈc‘©Ù¢ªl²ú¦EÆj¢¤PªŠ\åÚ©Wžéz[¥b*j¯Ä«(¨Ú$£«ÿ[2‹¥«SÉ*­dØš ®žþ©–U¾²õ+O¥Þ¬°ÆÖvÛ ÉB¶l£Î^ ­ºÓJK«µN6.¯ÃÆ©WÀúú­f,Íæm"Éö•ª²°Â ïTj¦£ìÃê2\ZÃT5lZ# k_ ·ïš ÝEo½ºzkrShª¯¾Ÿ¢Ü-¸qüÚˇ¤«êÁÕ¤3ÄCñA@÷œÎï¬ðÏ@çœ4«DiN©ìä àú©’©ª¡lõjÄ‚¦#Ìm]&è¹èâ|óÒh[\ôÐ#ÝtÇl_œtÜk£]ÑÜN7*b?R§‡5$6ß]÷ Ã}ôÎÑ}tÇkôvΫ}6Þy»9/˜ÿí¥,Iàt+n4ÑŠ/ü³ç‚/î8å¦î³ê•ëMg­˜«wp¾4醛ÝùÜo7ý¹ÏÑÞn7Þ·~åå´ŽX³îÏ|Û<Ì;å ]4ÆC¾;ÝÆ³‰üëÊÔýŠÅ¯«¢Úã{ÿzßá/Ÿ~ŠåÇX<úïoù}ûÆo¼þ.òÏý4ºþÁ(ð€üO숈"ð<Ÿ…’Ç@@ì¦1à«à”ÄÁzðƒ ¡GHšð„(L¡ K¨Áºð…0Œ¡ gHÃÚð†8Ì¡wÈÃúð‡@ â”A!vò„|S‚ŸÐîˆd) ñÍAq9VBƒÿÄ4+^18?²È»¢#ÔØfv¯ c“5`mí‹e¡‰ã´¸˜r©ì^cÙ¡ s©•í Ž‘ŠöLc®3ªQS|Lã!µÆÆ>> O9KÂÆ¸“­%vÄ#šs—¬AR&|)%y5°|‘Ëe#£) óIz¤‹ZTÜ—ËVF3ÚÐ’0'›e+"Å-òƒ#?)”¡øÌ«ÔÆUÛ.%rÁ‘‰ËT§Í]>±šØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏzÚó† ʧ>÷ÉÏ~úóŸý|æ=oð ô M¨BÊPƒRp 8p`'JÿÑ‹L`Scc)ÉÿUô£ãKRÙ7 /Ú¨1©Jß'ÀkÅò¢(õèJg:­–’Ì^AI##Lq¤”¦@ý˜M3º‘\mÊ×liœ:wµN¦AMÑPo•ÊLžr¯4QS¤¿ùÈQ5ÒT+…L¤jK YØê¸Ú?ò}õEP ë¬Ö‡QSlRXä¨6B©³ì1Îz¾#\ÂV½¾¶y…ËXÛž§ØAÊUªìY]K±Éq5¯ã°è6 =ÃÉuƒÞà&÷»¡á.t¸{ì‰0µÉR¶Œ9å“"ÿ•Ùçmµ‹]\`A·­ò®wÓã¬pU‹¢½}é¡7•ŽfK+¹Ñÿ•®¹Ãã,ÇG½à{qéX[‘Ô(Ú–¹½uîö'Ü­NNi«yµJÜÕÒ¹9ªÎr놾Çí6´¼õ,}Ó+¼òò¬½s­–k!ªƒW*ÖsÒ[kaƒ–Øû½ä¥˜t V8Ãò$%pD³káÇh»Þ°‡G ²÷ 4Ä1ø)‰W,#£¸*f±Œ‘¤@ø¾ø1ž±ŽQt!߸ÍÔˉÌ‚ùÈHN²’—Ìä%ùÉP޲”§Lå*[ùÊXβ–·Ìå.{Ù=Dü2w "_¾”[HjrœXîúcn3Œ5J½n”•h†’JÙæ@ÍrVB )%3ý¦ÿG€æ‡Í8ã™GNBéHÅ¥¼±OÊ4ÇfH°ýËÒ- Kžì2»‘8qPÊôd…éèH»@Ž£4+CíÆ}aíOb3¿BuÇa-²Ð$ùL{…O·ÚÕ,$UêlÕ_iëÖξš½Ðdd˜ÝíSr“šÔÙ¬ ¶aZ£ý*™N³%íy/Ü9àk>È-Ëfšf\ä"±?³EÇT? µñ=„´ÆÉ5±½,^)ª“í‰Ý³t·1.Ëx—ÛØ B/-5êKÏöÜ7©sÙnëRÛd³¥¡‚‰éh lÔ!B0äcÏÀçKÿzÎI0M29AèI@úÐ} ô4O_ºÔ§Nõª[ýêXϺַÎõ®{ýë`»ØÇNö²›ýìhO»Ú7æµ×6‰½Ib;ÈÀçDí#ŸûIrDß[w7{ÞóÌè?÷½ÏßfºÛM0ø~m˜´-«Wާ®ÍvÞWC£ªQ½­Ë‹z95ã£ÏÆãk.ÅFª¯?Þ늷üåçLʺÝS™·Ìk¤é)ŽKso»àeEx¿W{[Þ®‡ýßs_ݳ¬K|¹Ç‰yVËËæ’Ñ ë+_H—GÿŒ£g>œükŸ\W8ò׌Ȱ _••Tþ˜¼-þ ?½G¾ÿðñß\³¾Ú×–Wé¦GG[õWztö:rA5×i4·q‰Ry›¢röFjçwL§ÁiÏ7 èIËw€°s0dPçÇw ØE''x‚†—‚uà‚.0Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„Fx„H˜„J¸„”ÐvLˆ d¶D[}ÈAxbÂ!×7{$w‰¶pb·{3K^dRø%0àwp¶n8v`HMu$p5†X‡2 †Vx‰—uo¨œ×€gøxÙö|eÈ{µä~‚Ùæ5o´y)§2xgå×u`(.²g††XmH…sxzx3|‹ôûÿçlÉwfdȇ xgý1l…‹qÑI·T‡UÕŠÁg|´År£—ŠXׇ¤äiŠt¨gˆ“¸zGˆ°÷n¿æqÄ€ðFpʾxuÀøŠÂhgňŒžh…ɨ~ü—gÓ·gí·‹†Šgö‹«(†è·+e¨‰•öRdhR÷‰×zûwpÞ‡gÔ˜ŽÖ¸Žöx€È†±ÕFñìŒÂ¤&l8yhŽ‘¨Ç¸u"Ø$ØaØ‚Uv+¸i‚ù„v ƒ+†$™’*¹’,Ù’.ù’0“29“4Y“6y“8™“:¹“<Ù“>ù“@”B9”DY”Fy”H™”J¹”LÙ”Nàù”P•R9•TY•Vy•X™•Z¹•\Ù•^ù•`–b9–dY–fy–h™–j¹–lÙ–nù–p—r9—tY—vy—x™—z¹—|Ù—~ù—€˜‚9˜„Y˜†y˜ˆ™˜Š¹˜ŒÙ˜Žù˜™’9™”Y™–y™˜™™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂ9œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžd;httrack-3.49.14/html/img/snap9_e.gif0000644000175000017500000000660215230602340012561 GIF87aŠŒªÖν„„ÿÿÿïçÞ¥Œk,ŠŒÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÕ%ß ãã8äçå$ßá áìïNëÝÅñíâøöûý÷úDü[0‰;zà jˆÇPBù¡8BaD"ÛwŽÿAG‡äæWn»“!SŠ è.$DøÖ¥9s%ËwOÚ ÈS¦M”]²¤§Ë†ú„&çPãFx0y6ÅÙ”$Òt:¥•Ú²ª×‘Zo®¤5iUªYµRÄzö'Ø®jGfÜ*’,ÊNwÙ³ûÝW’c݆íøk?¤„ ÿM;÷ É|—í›s'b•Û*æš××Þ¨Ÿ7÷ÕÌypd¯èË5L´féÄmƒFMÓ*TÅ©áÍä{ÖoÜ¿q…&my1dÚÄIŸ¦ð9-ìÑÈùÊ.œu.^Þƒ_þ¦Ë±ìÅà­†?gšüjôƉٲ†ó.qÄÕ½ãMyñ×aã»uÙ9ø[ÿ¹-eÔn*íõÑT˜q%TW)VqJ(˜‚5ùGß{µéV’ZfH~bFÞwÿ•Yø†Š&¶¸Âe°Ø†Œ.Ö8‚kÙU@c;ÚøI@)äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–\vÙ%‚Ú˜d–iæ™h¦©æšl¶éæ›pÆ)çœtÖiçxæ©çž|¢ ˜ˆ9À „j衈&ªè¢Œ6êè£F*餔Vj饘fªé¦œvêé§ BÊÜŸa 0@¨¦ªêª¬¶êê«°Æ*무Öjë­¸æªë®¼öêë¯À+ì°Ä;ë ì²ÿËŠIj ¦+í´ÔVkíµØf«í¶Üv[+²€>àl¸êí¹è¦«îºì¶ëî»´‚Á¸¥ž ï½øæ«ï¾üö›­¼Ð ­½š*Áþ²Š0ª +l+ ',ñÄWŒ.Àâ~C®æ¼êÂÇ«kÈ·FL²Ç3¬²Å,·ìòËÀbì€À€t òÇ»ž «Î";ü*Ï8£ 4ÌDm4Å27@s¹Ñ¢ì0¡ CݪÔPŸjõÁW=¨Óö^]°ÔªB¼5Á…FÝ5Ød«LõÑl·í¶¿û¶4ÇM}³ÐaûŒ÷×+ï­vßg÷í4àY Þµá„û=ôÛŒ7 5w‡¶ßÿ—Ýðá‰oÞ9Ö ‡1â\—ÍõÊ—?®úê¬+ó;“óQyМ:õÖ¨‹.xî¼Û v⨌9ç{§ÞúñÈ'/kÒ Ä¾‡Í´÷¾|ï—{~úõ®O|Þƒ_{èʇ/~òÌ/à¼Ðsÿ=øŸ_ûèµ{ϽîQ“¾}üÔ¯ÿþª—¯Àùy¨œðÜ÷;ËÁÏr¥Ãм&6‚¯jYS Ù È7ù ŽÌ Ìüâavl[\°D¨Ášð]ôà@x4þÊ…'Œ¡ ¹•BÕ«q0ÌÙ wÈCwÕðY5«[‡HÄ"¶ YI²áÀBÅÄ&:ñ‰PŒ¢§HÅ*ZñŠ‘JÿËå£..ac}`–ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>ŽÑ‹€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVbÒ°Œ¥,ÝØ#W&Œ›p–-éKMèr—Üèe&~ LmÓŠ@-y@Ìbbã˜6@‘vªÐLgZš4Ïm¨¹Lk›3LZ2¢™… 8ÊA5½9 pÊ@œúAÏ9—ÃÌn²Óî<Ñmx#Oýa÷„F>a ÎÙŒÇ>ÉÄ@ꌾ  ÔY…ì9ÿ‚…2”}¨wâ)ÑúôÀ¢UFF¡¥´»ùI:JÑÞb¤ÑüH]z ˜Ö ¥B˜)M‹aÓlʧ;•EO¡Ó  ƒ^JªR—*% õ}ŠªT§ê¦§ZõªXͪV·ÊÕ®zõ«` «XÇJÖ²šõ¬hM«Z×ÊÖ¶6CIC¥\Ý:1•i‹­1k|3à¼ÈCQÏóÌ„W íÕAªbµ™#· *Q…½ Š`´W‚Úg›ÖY¡© FëðG0þ¤'HD×ÿmQ‘ݧjûJžÆž@´Êôkk(S¥6?ÀYcýÓZ§Z•¶‡º­A‡û’Éš+fï³\ôÿ–Pã`^fsmNA*M)rE¤\£×P …´ãÏžÀ¥Ÿ×i+4Øœ–ÒEéz{3¤Ô8¥±Ëy;*Û€~·PáMŽi†ÓŸ£€–¸«éM‡,4[SE¾ñ uG»ßy^6¿(ly§KÓÿ*ÀÏ‘­dúr.GŒéëu5ëÞs|¸³äµ®rª‹_ìb§:|M(C=<(gÖ³o!qŠ]‹Û˪¦¿rx,„{ ã"ï–Æ°1z¡<Í?¼Mf.ˆ(;e {tBÿrß‹åÕ^wÈ¡½0Cº¼á ‡”ÇÒåk†­‚bÌ̉Žë[-ÀY¸r‘zåKhÀN8ÿD#ÊnwƒZ€ ÄÕ=곟]Ú(¨Ñ ‘æÃ¥+= IšÓ µ¨GMêR›úÔ¨NµªWÍêV»úհ޵¬gMëZÛúָε®wÍë^·u®¾¶¥]Éäã`‡òÏ…‘±7‰l¨HsÙ̾2€alÜtè1&®K{«\ ,Ú»höq04™óösÍ›é‰ îXˆ[>$¾˜C¼ß`‡ÞíÎÅ»!´ž kXÞÖí²y¯½Ò|Ïb߬‘ç|JŒàßܛà 7¸,ž…¯û³N7jØ,q\PœÀɼ¶eÌnܰƒî¸--G§@FŸVy(6 ˜Ë|“ß‘ÐÍwÎóžûüç@ÿºÐ‡Nô¢ýèHOºÒ—Îô¦;ýéPºÔ§NõªkØV/ä°ÇTìšgÝWvZó¯#âãÛÈÌÎ ´W»( B®vÅ2gãä¹Ûu74Û)'í›Ùâ׌~G+d žð7Þ{hr3÷¾‰ß¸Ëíïuã[ñ²ë;“ï¼¢s,ö>°h.Ñóv@»¶Óž#ȳ§ÍE&÷½Ùƒzç2>ˈg­A×2\Ø£[öŸ<’kŸdÍGx£Öž¼àI^â;o;¹'÷vʉ@JSÁæÔGÍ¥€ýìk$ç{ö¾øÇOþò›ÿüèO¿ú×Ïþö»ÿýð¿üçOÿúÛÿþøÏÿÿ®±®gl=7¸'`ìe×K z*–€f€p€€7|BP€ ˆ¨ò!%}…fR 'h[¡z7bv¢n¬çze_û&È`"øS·'câxýzó%‘'€/8‚Æ×uç¦s¤ÇgsÇ98^;H8ƒ—gyO6DØ{*&G¸IÈ{¹w¾÷eóFOÿ6…aP…’‡rÈ]'·üÁ|&^8‚ÖÇR¸†v°}*ð†px tX‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆ?ÇŽ˜ ÿçˆowè‘(`[^—‰W°‰UÖ—è‰*ÿ°‰j(}eyç¬%wNX_ꥆ¤¨N=˜l%¸qý†‹^F_#¶|ôe°5‹3`ŠLd»¨Š5–‚7€ÂèÄèpy·èf$—fõvzÍØÏ8{ÆX^üƉºµŒ ˜ÚX‹2h…–^W(XE`3¶‹]HŽ2ðŒi˜w±øy¨{¶±zÈX!(ÚØ†–åŸ6йrè;syè}¦s9‘Y‘y‘™‘¹‘Ù‘ù‘ ’"9’$Y’&y’•$.‡’ HX¶~OÐ1,iZ1ø d·2©Ž59 X:I{úØ“cŽó…ÛF†X_h}öÿ¸Šò…wbø!I| òŽxü|%|̨‘V ––¢Å•»§{Jq#9– 6{Ò(oј–긦ׂè–ð—PˆlÙ•u©ƒø‘ˆq¢WñÄ…hù•çô•EH’$ˆX ¦h”—Xãq¨”ãeS¹”&Ér°’c÷xI” ïDš¦™,"‘«ùš°›²9›´Y›¶y›¸™›º¹›¼Ù›¾ù›ÀœÂ9œÄYœÆyœÈ™œÊ¹œÌÙœÎùœÐÒ9ÔYÖyؙڹÜÙÞùàžâ9žäYžæyžè™žê¹žìÙžîùžðŸò9ŸôYŸöyŸøO™Ÿú¹ŸüÙŸþùŸ : Z z š  º  Ú ú ¡:¡Z¡z¡š¡º¡Ú¡ú¡ ¢":¢$Z¢&z¢(š¢* ;httrack-3.49.14/html/img/snap9_d.gif0000644000175000017500000001307015230602340012555 GIF87aŒŠªÖνÿÿÿïçÞ„„¥Œkÿ{{,ŒŠ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,YG²±\B’P@S1]TN)ÕŠU2·ÜîcàÌ‚Ëà³${ £µ_8œ{åîu\¿VÍuG‚ƒ„…†‡ˆ‰Š‹ŒŽ0ftr‘w|xx~b€[o{’œ–a–¡si™˜•u¨y¢z©“­O¤š¶·¸¹º»¼½¾¿À€Ãµv° ªÆ£—̲b¢¬¦ÇÊÁÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëHdˬm¥ÏÒÅ]QSúZõË«N´ÃÏŸAƒQ(pBFkÏ=x ÿs6Å‹3jÜȱÿ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0oˆi¡À¿6ØÉ“§Îž@ƒ Jô'QŸH0šT©Ó§LƒFu:uéÓž?«îÔzUhÖˆK¶¬Ù³hÓª]˶­Û·pãš0‚Mº„êž(õN*Pd÷(¥ï*ÃÍNÜͳëR£_·JÞÊU)äÈ•f…<ùqQ¬Å½ÜÙªiÑž'GV s릡K»V®íÛ¸sëÞ½6°ïßIôN3Âb 9y+_μ¹óçУKŸN]¹€ëسcÇ[¼[òêàËO¾¼ù󹵫¿Î½û¶ïèãËŸO¿¾ýøëÕ·î^Âñ ÿðÝ'à€h ùi·ŸÄ™ð×oæÛ`±& ˆÝTÂ5 pà‡ †(∻%˜Ý‚E4ØßV ‰0Æ(ãŒ÷™¸Š+ó"<öèãËÙÈŽ9ú²#H&©ä’9‘Eòr$“TViåN¢¥‘^éå—`Ò—%”[æ2e˜h¦©¦uBjYæ.g®)çœt¦5æ›ÁÄYçž|ªy'ž¿èÙç „Rù' ½Z袌ò¨›ˆÚ¢h£”V â‚zÝEf¤ŒhjÜN†*ꨤ–jꩨ¦ªêª¬¶êê«°ši‹lÊ©"w ë®¼Úë¯À+ì°Äk챩Ðë²ÿBzë³ÐF›H³P›Ø”8¤J„¯Tä ÔZ»CÂhû¸¼“PèB›-†…2Œ`ŸX!˜'"Ö ¼§Ä½®PX½ùB8Ê„“¬ p¾l¨ë—ÂŒEÄñlo†Æãð&YØ,¾ [\ðÅž”,1Èó{pÊ)[Ì×ÅÒ+m2\¬û(ÍÑ“Ì||3>ël>°<Äî^æ¶+n»3».Ìóx;KÁQ?Ãí%÷5pÂkͽúÑ5×Ù~᯿_o̳…“,rÑùüæ±¾-Ÿq2ÆMç­÷Þ|÷í÷߀.øà„nøáˆ'®øâŒ7îøãG.ùä”Wnùåÿ˜g®ùæœ2Ûn[]ó){úA ƒ³éÿzíØ„±=°¾ žÅUÏN6Í2ó,ñé6ÏS1éLwnüñÈ'ŽòðÌ Ìº?ÄÔ }$¸ÒDË×3¿zíÜC?†Ö'ïÄc·ŽÝá7L»êÏ_ùí£~ñÉ?N¿9÷ׯ?ÒŸTßzÍþëžóØw:ŽL€ìsžøÀ¾Šeo\Gþr0ÁZð‚Ì 7ÈAr,dØ»M¦½•½/tò»‰ÉL;uQ/^!ÄÐ϶Fº·¹0mê» u×;ÕÉ/n'žÚÞçº樂@"H¬UÁü½ÌˆPŒ¢§HÅ*ZñŠXÌ¢ÿ·Ø[Ñ„V˜”¥ÆHÆú<Ê‹<@£Š´jýlhpLýã!Ø 5§™MjFCŸè4–¡LRHsG@²)¨aÊj63HÙ8ò:YYÓÈÒ€¥Œòi‚<55ã‰-˜ã§2ÃÇ«Å1R *?cI?âq•°Œ¥,gIKÔ“ç9Ôp–ÅË^úò—À ¦0‡IÌbó˜è#.—ÉÌéè’‹ Pf3§IMÞ<3E€¥]ºTÍnzó9×$‚'ר3pÍ8# ´‰n~óðÄM8‡0N^€òìt€4ãÉOxÎS8¦@JЂô ¾L¦;ûÉІ–åŸ\ܧC'ŠÿKˆnQ¢ͨ¥,ªEŒjô£‹âh= Ò’òI¤X$©IW*'”^Q¥,i˜\jE˜Êô¦V¢imŠÓž*I§Tä©O‡ê£YšÛ$ªR뜦:ë¢GU€®2*dYõªXͪV·ÊÕRµgªuÉçS‘JÖ²šõ¬…{W‡v¡"ìj~y›Ôrh4uì‰p•…<îºÖ¼vl ÉÇKXë©¡­/ôZAø±ƒv°…5Åb!‹µmµPjÓ¸Z7ËÙmÌn}©ëüÜ1XJLÖh¢ÐCö {=6²¬]\§62ß‘¶B iž\ñ?¾¦³³À ®p‡KÜâ÷¸ÈM®r—ËÜæÿ:÷¹Ð®t§KÝêZ÷ºØÍ®v·ËÝî:í·åo9щ‚6ÊÀ¼·¥,nI Bïz£·1-êZ»¯·†¯lµ¾"BÙ²‰–0ð]í_gëÔÙR£‡:ìfÝ»‹&ðw—åÚîj¼ÒAx¶ïëŠhá¯Om›ðÖxX@øÅ‘_ \ˆôZ‘ת“Á0ŽñÞ>(%nÀÆBÓÁÚl€c3¿Ѩ/ì «W"Û#µÐÐðkqä#¹®÷È“ýK²x 8fÎè±}0¯ˆ5eá“òƒ×û`ºá벉)Læ–Ä\s›Vâ8÷ ·ŸmÛ¼å>ûOŸ‰–ÿœ¹‡vÿÉdCpÀà·ã@ÇVn˜Ðp`MhÅ9ønv`õ²—çí™ØÅi“³ÊÜVá!¶||®´ªWÍêV»úհ޵¬gMkÎRšä´ R^›³[@»±¯wæØ[×úZ¸³rfÛÊè^™Í“¶cíÛ6›Ž±ý_ÎÞÈÚ’X²©ÃrìpYñ;N [±oÇ<WÒ>ìÖ…æ]‘NŸÀò–m„ûG±„M»}¦Ž\u­_jÛ\çN¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7^«®züã J&BGNò’›üä(O¹ÊWÎò–»¼Wõ”I6JÊZÚüæ8ϹÎwÎó[.u.Dÿ⤠bÎ.´ó·½ç‰a V4Æ+¯ä¹+CJUJ=¬ìJUjHÍÔR‘щÏN–¯êŠEQz Œ^µù’"¶|p²­­šÛÑ+†¬d+MãõJn½|?M×¥’w;‚=ð‹tdOxJNÅê¥\¼Õ%É“±“],F«ˆŽtçÃn5„›¸ŒçT‡ éhçúÞOKÕc½êW½ìµ>Ë_¨8à¼=É­ÔKu¡—¾¡Ú¤ûÿ$¾Wð…Ï|$á^ŠBm¾ôÅD|ÎFúØÏeõ7{ýì{_<Ï·ÈÇO~Ðüûè'Qøkp|“$¿ûé?8·¯v0ñ×èTzÿ½gðþåËÿÿõ±~4Ð~I×v§Cp3QãmãJç€hh|+0e zÌ–;ø¶o.ÐøÔg#š×è4‚*¨}"X‚.à‚"‘‚+8ƒàGg4˜ƒf1„ƒ:øƒMbƒfåƒ@˜ƒ<¸ADX„3x„”„J¨‚L˜ANø„…4…TVxAX˜…ÿ·…Ô…^`Ab8†èW†t†hè}j¸?l؆Ø÷†ú‡r(}tX?vx‡Ì—‡É³‡||~ˆ<€ˆd7ˆÇSˆ†¸Tˆh<ЏˆD•y0†þ‰chvÀBwƒ•h‰Y(‰Ö â+åÿWЦxЍ˜Š®B£Ø,“h†i7Uh§Š´X‹¶x‹§hvN犡ˆ)³ˆ‹ÀŒÂ8Œ¿²Â!V¯¸† ɸŒÎøŒÐÒÈjµbpä`ÞƒB}paÓh·hTCì†jj…gÜÈ€ADCd†ií(CÚ`!¤b·Aä=è£mÜØ7ó¨N@V/ECgé0ú×vz¦ª…`-V ̶[Pf “Fü[vEwG¶mØ–3øUd‹V’'XYñaQZöógÆ–K36i8esCòØ fö=);º«h*Yiiz àwGxzÂ+\¼ôÃ(\xÄ{Âú‹Ä,,Ä,L{«$¼üuÄkİ›ÉT'Èx(„Ø„ªÄÿÙ{è‰rHÈ!à·!ƒ¤Ü†¦ ¨¼ª¼ÊcØÊðÊ˲œ…´œD–Û˾üËÀ Zt”ˬìÉdõˆÄ¼R»Œ9ÈœÌ%µÌ—ÓÌÎüQÐl9Ò<ÍUÍ•sÍØrÞ}“ÞêÍ#ìÍ7îýÞ3ÿß{3ßô#ö­7øßê7ÝFÔßþ-"û7>à RàMsàŽ%ÞA ÞàRºëqºeá> ´›ÝÆá¸$À¼BÀT9îáöÁ¼ì¡|ÌÚ&NQΉ->QXœP+Û*DŒ8žã:¾ãëAÐ0â̬ŻÈãD^äFN‹™§Ï½xŒC~äNþäPžU_M¼× ž‰¿åZ¾å\¾Š™rv¬äV~ŒTÕåf~æh~(™HUó¼äŸ’æpçižäІ+çxžçPn¸m¾Yzþç€è£Â·„^è†~舞èÞ%¸-ëªõzk^)\9¦òÕèÊ—^Ðôšµ!9¢.ÿÀ°; 84ÐH“‘Ù´×iÓ‹éDêãõÒÀð—£¶ês¤ ¥›´Z 6œéœÖ“µŠ Oë«>jDÊë7¤ñ9쥵€ª >; pа°zWHKìª5j¤AÖ?¨Î7ni°žvžh3µðµ—qª@«zÃ=¦ÏvÓ.›•Àš¦Cv5sºî®ú•$«ÃǪ.‰¥$)ð߉²)¥®®7¶N‘Fë±Ù~hû²›'»¤SìLz§Bú´oWñ+íðFÉ©ø®Wó˜ïC›–½>¬/”<«°Ÿ:³ʵÈJ90ÿéoR“2ïc`)9¯è—jÔéø[mÔ³vНÈÙ›%ÊêÔÿ;µ[i¥íU‘þêP¿qKêÞ¢¯/ðHoô0ªé÷ê¦Ê>®åòõÇIë×®úUœ¯Nñ¥'‘ס÷h¾ÅÓqÿlöø–¯d ¿°vòÈ.°s‰qh?Ÿƒ?ñvzZrêî^jï8Íî^ü¯—vî@—ô^§Ö f]/qa™ë©Žlï’t©O±¹e—p¯ñƾtJß0)yñe ñ3j½hú¦3]zYôQ¹¿¯û;cõkDüÊü<ŸüÊ¿üÌßüÎÿüÐýÒ?ýÔ_ýÖýØŸýÚ¿ýÜßýÞÿýàþâ?þä_þæþèŸþê¿þìßþîÿþðÿò?ÿÚ;httrack-3.49.14/html/img/snap9_d8.gif0000644000175000017500000000670515230602340012654 GIF89a ¿¢ÿÿÿÿÿ”{JÖεïïÞ, ¿@ÿ8ºÜþ°À'G8ëmÛå`È})‚dežlë¾p,ÏtÝ^f!á:£÷ Pñûì¹RID:;ͨ°g|B}Ì+7ݧ¼¡3 öIä¢5å–¥]¸mN¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ+(‘‰G”Ž–"—r,›™ž¢£¤5an’o*qZ¨WUgKCj²m³p¯¨+§[°_IµTœ;µ·—¾DÄ­¥ÎÏÐÑÏÔÕÖרÙÚÛÜÝÞßÔÒâãäåŒàèæ2éàëïðñŠèòõôöùúû Û'H0 A \Ȱ¡Ã‡ JD8±¢E‰ ^°mÿ£Ç CŠI²¤É‰,°R‚Ê nbeU1hbaЦà? Ì80bÑ¡E"¥¸”éRJ£FmJêP¢N™bÍjRÛɯ`ÊKV"³hÓª|ɯOËÊKwlǺxóêÝ+R­ß”m7¤ë ”¯áà Ó!^̸±^¿jk€L¹²å˘3gÕ ];Çt=+Mº´éº—%ã±™ËUë>á+º¶mÛ§sëÞÍ;5[ _n>aSs¸ñ[ÍXÄ—·óçУKë;0†å šOßν»wéÕ­×Ðþ½¼ùóèëªfàó·xØ.!ÔL¿¾ýûøóëßÏ¿¿ÿÿÿ( €)Éç‰{ï½à“ 6Ø`F(á„Vhá…fàvx`‚ †(âˆ$–hâ‰(¦8‡LV4‘‰¬±†K‹0ãÚ3¶hq3·c A× (œÔ˜Ü+fؘ\.,"Ãäq1% %r*Viå•Xfy"’Q)G“=Ò˜C’¼ w Rê¢dšg®9$™pN"§‘`ú¦œi©çž|öé矀*è „j衈~¢&¶'ä‘J)g0“„cqTª!馕j&¦F6â¦q &ªêª¬¶êê«"Ü&무ÖÚ ¬¸þi[® ìÊë¯äx£yéû7Æ&Û£ÿÞ`驨F;OØq@ÞlB=•QV9¥USõT¶ßj•TSJUE.VÝnÅÕH^)+ïnëµT/$Š – ‡y¶dXça{X¼ó\Zxt¨ð 7ìðÃ;üMÂlÞ7glÂVÞ¦ñÀ¸},òs‡XíÄ2dëÊ,·ÜÍÈ0\rtv å°¬Ac '[qÌ@-4H3k²Úk0ôLñÐL7ítEEï™òÓTW4³‚NmõÖ\|/¿_KíRO¼4Ÿ†h§­öÚl·ívª1HØdÀÖm÷Ýxç­·–šŠLÆ,†à½¤øáÇ0AÆ© ^â 6ÊŠcðàÿ¬ä”¦”ƒÓRxN\“âÄ3‰ævæLøÞw÷ÛÉ>”¸ì¬W‚¹è ›¹º‹4íÎxàBIE ÌC{íÈó <ç´P„á¸[ò¹2§/S¹õž_ºsßC&>ú÷ÔWžûïÃA:ñ”’ž¸ãÉ ÊåöEê¸hŒÒÖ‰ç£hŠ'Ítî¿3›EZÅ‹zÑšÔáLZKjŸÍ‘?oŒ 'HÁ Zð‚Ì 7ÈÁzðƒ ü õh=ðábq\ÂÊTBô0x0L!ö€¡³zz‘cädÄ»(ÑDËó]¤â¶ðÐQžòŸ'85ÀNAK~ªK ç$©'B‘…n:b“ÿ°˜/&°ˆªzà«\'Fž Œ`Lc!\Ö25ºÑDlŒ£óÆ:bŽ×€­aÇ>¶`V†¤ëØròxÛ„&ö€ˆ9ò‘Œ¤$'IÉJ2ì–̤&7ÉÉNzò“ ,[‚ne­Ÿu4/;¥*òµöÌ Güß‘B  ¥]G`?8ˆ)ñ’®ì².ÛúåB¶JUª-`k– y°¨›Ý)ŠHzÀ[l9kA„\â2—¸Ú5“¤tk\Û g6sIp™!ݼÊ7OBÌbnm&ð ÛD§ÂP=“~Дe¯ö6ÙXD˜è»#P]Š¥î¬ZÔABÔRvZK¨i*ÿQª-4¤DYA+npô”m‹;ÑÎ&-fHAä™”†¥¥.­èJOd+‰Ö4¦8é>¨ òì¥xù)ÆpJÔ‡èTÆQˆÃHðùÊZJÝÐÁÌ^ó\¹5ït»ÀÉxqá_H8Ÿ¾›¦xàgÖ…ÜM±Š‹Õ81‰+Žqì—£þ:¸Æ ¤±=_s@ûXyÊî!¨«ˆ ëA¼?Î=¼_âáO8üu™€å%3¸¡ó³Ü ã[£+7Yʲø•ù‹3™à3ɤ(0‡=÷C%æ(Çû³Ù—·寱O¬5&\›Éª8)C´à=óÜç £9ÿÍúƒáœë™ª¢)89|ó“éüh oY¾cØœétì7ÓQ<´ l Q›:AÑtà©WÍêV»úհ޵¬gMëZÛúָε®wÍë^ûú×À>5—ˆˆC÷uV„1¥•ý@cÛªšè$¤fj#ñÚ.8‚Ÿ]dûB›cþ"4I\ClCzÌKÆ3ÏÀEþ½YЦZwœ¹ãKXÈÜ~¡­-nP÷{Šé1¶Aj?Ûøà°4§·ÛÞü–»‹WÌ÷м}FáÜK:ɸ‹3}?éú-Tœ©ÓŽ>.ât3ÚÑú”Ÿ¼%NŽò–ÃÙ} # ° s–¢æ¿’Ü tnóåαç@ÿw‹SñtQýèž)ú ‘Ît9*=ƒMÏc¢Îǧ³ÎéûÀºÕ_e+>u}ë…º«Äv¯roI/»ŠèHA¶«¥ŒôàHß.RaU3´xÏ»Þ÷Î÷¾ûýàùþÁþðˆO¼âÏøÆ/~´öÈèÒ>[’TRÞXòKiÅãætöò¹ èÑóÚâÖc†mH@VŸ­Æô2  a=ë="úÑG2 š›é©ú¬_Õ¡ýIë¿U.o!¥\ÅGgòs™rªÓ èrþê¡B|oDúÒWþõ—Ÿ|­L?1µ½tJ¿ñ5‡/L¦k´†3à¾úKùÝ>ºÆ °¬¤ëõóW'ÿòÅ ÎÖoÿü§M ñy¡~â÷Â0²-\ve’&p©æ Ó”zÙÄí2Nçt×”ØÔïòzèX]‘ Ø:5gÉð€‚öp0ÂW@.ÞÂ|Ï×|Üç.5X}[aƒÏçM8({Ú„ÛG‚%ˆ 'È`uoLX^áeš3%A-88€°W~u…h‚I8zus·Á§U_~^x†Ñ†â€z1¨†Q{pèl8ÜàysX•‡k¸X»y’ww|ØÈ2ˆÐ1SŽ—ˆ‰wieˆ]¸‡Žxˆ~X"øð~sˆ‘†“ˆ"íÀ…Põ™¨„›¸vµÿaY!Š(8ŠX2+EÅŠ¨xu"-C5³øŠÆ‹ëà~„ÁBÕMe‹ƒ‹æ ‹üBˆTwŒsŒ##Œå@Œ•ÅTȘ¨ŒCÃŒäàŒW(GG ¥Š3gFËænIS…z¡È.5UÜ£>c•~çµ~ãø†è8¤VnFfN¢qß&òHþ¸öhoêi-ø^I™§›÷'=ù“?I~±e”J‰f#7›ÿ•”K• Ñ[ºÇYRy•@Ù0 è'ÔT[»õ•`–b‰Z¾çx%CÙc¹–lÙ–n¹!Í’Tgi%›\üò–x™—z¹—ÈÄv)—œ•Y„Á—„Y˜†‰[™¥€[’u˜Žù˜©6¯•sY%±w‘™™š¹™²w¿õ'œš¢9šoCw¦yš¨™šª¹š¬Ùš®ù𰛥Öo¡FEŒ°‘t .g4vtDæÑE›‰–r‚@_âø øÆ›Ä¹\žV&f–g\qfPÖ8[„q=öxViŠ&`xi ¶$ræm*ˆn˜feØ#j8WAž_7X_¢¢pþãpÝ’%Ÿ7Ñ7½óž›bŸøãÞ‰8(Taxbé¥:O˜hÛÆfíIA[ärV_ÑéoçV3º^+&Ö‚ïž'ÖqµY>N2œ XC×yOì&<%*]²Y–³©dùò ˜ð¢b¸"(&Xf›4Šqå¤? BDJV¼W¤Ô€æÙe:óœI!ÚĹr©¤x“;httrack-3.49.14/html/img/snap9_d7.gif0000644000175000017500000001753015230602340012651 GIF87aÒFÝÖνÿÿÿ¥ŒkïçÞc­œR¥œsµ¥Bœ”)”Œ9œ”ÞÞÞ„„1”Œ!ŒŒZ­œ„„J¥”{µ¥Œ„„„„½­kµ¥{½¥c­¥J¥œŒŒŒ„!”Œ1””1œ”B¥”÷÷÷{½­cÿΜïïïÿ1œ11ÿcÎcÎ1ÿÎ1Î11ÿc11„ÿÎÖÖÖÿœÿRRÿœ1ÿ11c11œ1ÿÎÎc1ΜcΜœœc1Îcc,ÒF@ÿ@€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz‰$RÎv:¹P®¶kG®“A F]χ€ | ƒ†‰Š ŒŽ’“Ž“—™—Š¡ž¤Ÿ§§‰©­­°° ­µ ´ »º»¾¿À ÂÄà ÆÉÈÆ ÈÏÒ ÓÒÕÕ ØÛÕÛß àããäæçãëíêòóõòòõúüüÿ ø `A,XÀ@ÃJ„X€bÄŠ0b(°1cÇ-xÌ(²d“D(°²eJ ÀœSfÍ›1%ÔÔÉóOÿ$ bh Ž*M*¡Ó PJ#D˜!V‡ ÀÖ0cÊèЂD¢4Šl0¢Î;w@HP"=w(24èî#¿‰$é €ˆ°£ÀkJä©S§ ŒGiˆ¼ råËf9X¥V®[n‰îÌ×°]ÃR K–`2eÐb?£FûµlØr{Ó®÷·ßäÊ!@Þ»vñÜÁ«ÇŸ¿}Ïÿù8pàA„ØBD±;E‡#>ÀpQ<Çó#Až<òqU/FcUT\5#7Na#8v˜ã?¹âDi¤W`PÈÄ‹LòÈãŽXФ”NB)åŒPN©e”0rIå—Xn饓`>Ùc–Vfõ¥™Uyä›pƹE‹rÖiçxæ©çtîé矀*(ˆ}j衈&ªh….êè£F:d£’Vj饘jAi¦‡n•ˆU †€¡|Zꩦ¢:*ª¤ªêê«°Æ*무Öj뭸檫"`!±é¿ d–dÚH,—jºÉ©¯­†Òlª«FÛì³Ò:›ê´­>›í©ÓB[-´Û*Bí®ä–kî¹èžÚÿ+°I>ì²€.@òÒ;o½øÞ«¯½üæÛï¾þ ðÀÿ,°Á¬p #ìðÂ7 ñÄWñÅõºÛ.¼ŠnêÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Çœ•’J¼ËñžžVkÕ§Ú‚êìÎØî,®ÐâÍ3Ѥ=*ÐC÷Œ´Ï¦B}´ÓÞ¦kõÕXŸ».„×Èf™_¯y³¦ã’[ö«gg-kÚ±²­öÛpǽõ6m÷ÝxãYwÞ|÷í÷‰{ÿ-øà„{ø•g¨¬×]±xáGNÅá?ûµ–bÆXù™XYÙ9²UJ.úèPŽe—–Gù¸Ø` {ÅéI™ãêÞHÿ»«?~;ë¼÷N¦‹V€±;Î]ß#è¬[ž&ìi†¾¦í^*߸æ—{î¹óÔ?üïS¶6õ™o¯æñÚ‡úæªÎûøÒ»Þ¾˜W6?›ÉÊoýï#n<ùü+ªÿo’é/Êq®Møcßå·¤b%ðxçs˜Â=ZÐRú» 7¸¬ rðƒ |”CHÂj„&L¡ 넺ð…+j! gHÃɰ†8Ìa…n¨Ãú° <ü¡‡H·â-f%$bÊc››œXèe~cÊâ¾²DK5QC̃`ÿ @­AÑ £â•ØÅ=}qQI«Ê§ŒpÆ&ÿ±xüáóÈGŠ(.d)H¸²uId ê—Fâ €¤`$áˆJVŽÙD'6‘‰OŒB2£H*LŠR¶â”xEg:s ]¸’À M0TCËÔÀ6ÈÈ%4¬áŒÚ\ãÝàoz3Lr„#8é0‡9³u´cê Ç;ô‘èX“:Ø$ˆA²“íx“;ÁH8/‚‘‘ G=ê1 ÞSùÈÄ>6gKò³Ÿzöä?>AÊ‚ÂÏõÓ@MiÊ‚©ô …Ê2ˆ % Á‘(‚10\ìð–¹ä!.PD]ò²G†"’!Œ$ƒ˜Â@bÿ–¹„')0™”"¦Ÿ`Œ6cSž¢¢2<]e->£‹Ðô⨥1 jˆAË×$Ã5°é€5|y›Ûd£ÞàFVÅ1ŽpG8ìÎqš)äÜã¬@€>ž“~d:ë6­ÃMí€s;xÌ£‘¾v=îÉÈzÖ¹ž÷´$>óq‰MzÞ¤?=¹€ø™Oè@O!¨f%…ŠQ\©CÅ`ÈÒšö´ŠLí"ÙHFDòµŽh„`"AILÊt“2ídn=ÉÛ›Šò·©t*‡› ¢¶–IU*S…ÑæBCº4F3hS©RU7ØÍ8|ƒÌà‡™cENx㜴ºõšÒ©ÿNuÂÞº&Ä;Ý™ˆyÄCžŠüõ#‚UÏ`IRØþºó¿ðY,~ôÓXþ<ŸJð€ tY¤,… KI¨„ºÐ=öñÂ/´0†7lB6é~ÞÞ±ê÷¼0ί}bëžðÂ6¿Ëï{l^‰8cKNÃú¬w,B#òøÇ>Ä1‡|cùÈ62’—Üa%9gq‹²”§Lå*kaË Ž_Ü6þ ÊFÚµÀUªp9ZKóV¶Ê.mñìÍߪš•çLçr­ëBȲ“‘pEäõÙ|˜ëLèBúй’¢Vö ZE3ùÑ rèJÛÊm–ÎtÖÍ.N»ŽÅAns˜ÿÍçR³*Ì¥63©ÇEj5»ͪJš¦g=eO7Zò²ß(Më^ûú×rÃ5$ ébÑÆNv‘m­ìfŽr‰£õ$ â/Æê³]æ®çlc›ŒÚr·Ç Dd“oÅÒN^µ«7=Â8Ð*þÞõ@¼<ÏÝô¦¶‹q¤ozÇxÄÊËžöHüg¿Ý'vܶ¯]¾~ã»J°k±ŒÃhßyèÛäW´ñ"uœá3÷˜Nb~û™ÛZÜÞžîu'\â·xÆ]xÃgjwºž¹1®óžç‰ç>ºœ€.ô¢‰èFOºŠ®ô¦—ˆéNúÅE.õªß êVÏú©.ÿìJqQëz#ÇêÈ5f¡ëàæ3ž©tï-» _{¸ÑŽ„·‰äYñr‹H»4Þ-îrÿÝó”¶‘½ˆf¿»ÌÏx˜>Ǽä?65›wzðÏüÓÁ0€Î{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ç=Õ5Ï{BµË¡/@ `ÀˆBôÆ/AP›HÕ2’‘¬=Ä#a‹ÒGX’–Ȥó‰Nh€“ž¼i)?AÊTìT•¨@¥*‰ûÊö‹&¹¿8Ms‡1e¬FºOM/­1ÕÜX¼Ñ xLÜ5Þ•a5V hë@û VluMÓ1ÿê…tÕ^ßôx5NôE_å¤_çXí!„…*`)1OV`6Yÿ B BÁ`üt 8¸Y ÕYhZ£"5u•µÅQ"Ez H… !äSh}³…}“P —` ™° ÛG :U cè ¿e¬ ²°†¶ £\ï—T͵\¬qKù÷ø×RõKVuUYõ‡ÛÕ]ÂË4áEV xV8Ô$o•Më¥MèØQÞa‰ñ5_÷eN#A‚û¥NíT¤O,X-èXø$Y?á’% V Ea:¸ Âoâ!¢õGepÿ+°PQŠP) QLx*d@…Q8Ò7}®ƒ¡….u†¡‰AÝçI‘1 :ŪhÈS¥¢BåJF‡²T§AK÷]ɰ1 Ñp]¿„ ˆ[E€Àa€þˆ ØLДˆfÅ€ôЈn•^¨MhW ¡ßa‰AõUNœXè´ÉN…¥óq/1O ©Š;Q’@áŠû4•uEaYB‹EPIñ x¶vºøƒq1+Ìç„<Ùƒ}¬åZ¯Å±E ‘D[‘`IÙ— Ñ”âG~¡D g˜†i\¹€ŽE…Tï·Žñ§TµäTø–²QU…¸1€ÿºˆýˆLÄQˆï@VÆáLÑÕt^ W‘xîÅ”¸9æQ‘ã‘_é!X"¡‘%è_*¸‚‰Õ˜ôô˜ªYû´Š*Iƒ4ÈO ö`œµ™¢z>ˆu½š5³{¢Yš!Bš¦™šp‡šªÙš[Äš®›Rm0â&¤‹“sí6F9†;û#›)b@lWqÜfm ægÈroˆÃ@+6b,‡8k§xìÓ=âcoÑfpÀ 8°y"º™šÞ™yàž7žä væyžY—žêYuìÙžQ÷žðÙtò9ŸIWŸöYtø¹s“ןþùŸ : ‰CwûyA¼l º  ª.T¤g‰·cÿ”VF¸Â6eƒi š¡Êi:xÐói44¡ef4AÃ-¯¶j•×jh†¢+J¢”§¡0jgJuÂÉ@ôs*'cφ¡1Ú£>Zk3¡jA ú£Fz¤ps2Bºù œCÚ¤3÷¤T¤HJeʨÉnáºoù¦c ±Ä­‡E©ƒ=›EÍÙ:Û 2𠮪·v—£ö#F,†±ïÊ!éÚsåZ!1›¯òÚc[ª®¦ tz—r2‡"õг!·¥ë=öh<‹²ëƒ¦ TÄ)Ô ´ƒ²G3²'S µÚy³XË{/»µßɤ^«u]¶}4¶ÿd›Gf{¶m”¶j»DlÛ¶Cô¶p«G`;·J'·v«¦u›·ú¹·|txû·!ê·‚«s[¸I¦µˆkt~g7€×¤M´/ü2¹õB¹ób¹’[¹š{¹››¹œû¹žº–Û­Iиcó¸ù)vÇÖw\÷ñZw«™¬ª«8æZ³Ëw¾ú¿ºØZ“*W´srµ™7»áV±1gµâ2𬡻»$ÑùY«x³´d#»Íû›É‰wv'#¬BG¤Ë,ÌûwÂûxÄk(rš#‡7šáë¸ãxM”{ðëzzÙzß{y‹›q÷ÛƒŠ›¿€K¸þël‡À%4!·zÀºŠÀ¼šÀ ¼À¬ÀÿÜÀüÀ\Á|ÁœÁºÊ‹;ÙÁ‡ä|«}­5”CI &|¶åœ@ ,ÜÂ.ÌÂSiJé—~§Tñà†îG\9Kt¸ñøÃ@üÃýgÙ¥Uj)ˆHV¹ÏÄNìÄv¸tÕ| _XÐïKØQ{@6ÎÜ_RòÝ‹ðZ¥B ¨R– ’!äÿü¥âê®PŽtíJv­•æåèmÆ` ð×OEï]ÊXE hìÝUöÝÊÊ´ìIËýít)Å̱ôð¡Óÿ…ƪíÓ$ ÔB`6Ø`‡“¶Ý +ö¤åÁü„eßÕŽ$”$üŸ”ZHÖ+ì}ŒÜÈ]JãÇ ¦´†=×v½Ép¨\|}ý¬± ·ØÌÐ]ŠOß2ìöÝÑ HæôxMm…ùk‰ºüà˜(Ó n_]ÌàŸÈ_#xúí‡ÂÁB,‰IåÙt$Ìèzÿ¸L%ÙkHríJ*ÝKx .WÐáÊ8Ýv·Ù€@Üñyýžß÷ÿ !#%!çê&/13579;=?AC9+íDMOQSUWY[UI]cegikmoaqwy{})éJƒ‹‘“Yu•›Ÿ¡£™¥«­¯±q©³¹»½¿3·éöÈûÌË!ÑÏ#É××5áÙåÁí±ÅÿÞÍ÷÷ïü €Î?€ ,¨ÇÂ~xú%<8‘`E‹ïJô'o#Å‹R Qã¿÷PZËçg!Bˆ/¦›xò¤Eˆ3oVDWOgϘ6=ÖĘ3#Ñœ š’鵕óÿZ*ý™)Í¥TqfåȰgÈšI=Ê,‡«M©[6UÛì)²$£*´:•$ПUËä*2ëM½%¾4¸S®È–€Íþvmc`mmñt<™28È•1gÖêòfÏŸA7êštiÓ|FŸV½ÚsjÖ¯a¯u›vmo³mçÖ ÷nß¿ƒõ>œx-áÅ‘'Ou\ys磆=—>}sê×±²ž{wÔѽ‡ŸhûxóÓËŸW¯<ýz÷ÃÛs0Ÿ~}û÷ñç׿Ÿÿÿ PÀ ,ÐÀ\€ø²›#€!ŒP )¬Ð 1ÌPà 9ìÐÃA QÄ' ¼iN|EYlÿÑÅaŒQÆ;´¤ÔÄÎAyìÑÇ RC¿#2¯Û1B$dòC'+„rI!©¬ÒÊ+4RST%!”2&÷ 3Ì2—Ds#3ôgÌ3Ñ|SJ2çt³Í1ŒÏ8ÅÄÒÏ?9´q#r¸ÔÒIJܒÌ;§d4O e3RGíÊK×|“QMçÔÓO74B‰¤ž… L/T{(!ÉÔZTS69PÌIk5×&m•´RZqUØaK,uË.ÿpíÔ£®Â‹YÆ0“õV_ÛÔsÓLguS>{½VÛlµSWbÉÅÒPsÅhKsXCCÞùí¹wøÈ1Á¾4ˆ?­å#¥/_ýãÓ_ß}Ó†~_þoâŸß~|Ú¿_ÿÉêßß¶ò÷?Þ£4à/ x@j#€ t`4ø@ ¶"‚´ **xA ‚BY¡Ÿ#>¸A‹uPoîø—ªü"»Â0&`×KÇ¿tB6¨}<) HÖ¬«èM‡! ¼føº…,@,^»E¹âévA\²u˜Xî-±ž §W—¯ÄP`2t¢¢x /"bŒ_”Z͘ÆW QmEj†b”¯x1Ž,i´ð­2Άœø øö(ÓjÇÚ5Õ0Yœ‹5¥²U¹ò®JÔæGÿ‰=h*q¨Ñé9Ë1¤¶p¬½¬håÖj,Šr¯*u§&YêÕÈr#>¢MÆM;Zü!Uµ­%ÏU][«²V¶µýlm›Û©æ6»åí}ûÛ W¸"$nq5x\äZP¹Ë•`së@èFWÓ¥®­{]fW»þãnwõ÷]ðÚO¼ã•_yÍë>ô¦W}ëeïÇÜûÞ¯áV¾½¥oÿ}{_üW¿û5ný›\˜¹&ðs |`é&XÁÕepƒ±û`o7} €…1|a g˜Ãöp‡Aüa‡˜Ä#61‰S[Õ(®˜Å-vñ‹ac»øf‘;S*Ñ]@Ïsajnœ’kwDZ‚åly܇ £dÈ×-rS|\ã$óaÉ`©$R,9ð>¹]u—&¢L± c™‡…ŒD“©ËåMH‘±y4‘øÂì²)ï¡ÊŠX–¿º×3g9ªjÎDÒ×Däé¶?³Rë*ÑV fÏ[žs!£MÁêcIV5´'ÁÎËFÓ¹à3TýœéDEDÐd´Õw.ýè<ÔÙ2ŸNj¨}ѳuÄ}˜–«ÝëfXŠ_´¾­­ìhk¨­M¨–2!XM?\·Q×ÊxU±•jd¯ŒÚÔ^¶gœmmo›Û™jñ±',AB+"¾áO¹Íít§[>f7yÝýîóÆ[Þê¥w½ÛÛm}ï›ßýö÷¿pœà7øÁð ;httrack-3.49.14/html/img/snap9_d6.gif0000644000175000017500000001744215230602340012652 GIF87aÑFÝÖνÿÿÿ¥ŒkïçÞc­œR¥œsµ¥Bœ”)”Œ9œ”ÞÞÞ„„1”Œ!ŒŒZ­œ„„J¥”{µ¥Œ„„„„½­kµ¥{½¥c­¥J¥œŒŒŒ„!”Œ1””1œ”B¥”÷÷÷{½­cÿΜïïïÿ1œ11ÿcÎcÎ1ÿÎ1Î11ÿc11„ÿÎÖÖÖÿœÿRRÿœ1ÿ11c11œ1ÿÎÎc1ΜcΜœœc1Îcc,ÑF@ÿ@€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËív"H¤œítr¡\l×nLƒ@ z~{€ ~‚…ˆ‰ ‹‘’’–˜–‰ £ž¦¦ˆ¨¬¬¯¯ ¬´ ³ º¹º½¾¿ ÁàÅÈÇÅ ÇÎÑ ÒÑÔÔ ×ÚÔÚÞ ßââãåæâêìéñòôññôùûûþ| ‚ ,`€áƒ #>,0"Å1Ј‘£F:b I²@I !PÉ¥…^Ê„“¦M˜hæÜy`gÎÿ ‚ !´‚„ F“"•Pai…§M£†"@‘ªCx @k˜1"thAšD6H˜AÇO; ‚0Q» d×Q_D‘ò84¸à €3!êĉӄŢ4@Võ˜²å²¨Êü —-¶BóÖK˜.a¨ƒ!K ìX²g°M›mm¶k¸»eÇÛ›ïqäœ{÷Î;xíÞÑ[~¯Ÿ>çþúý(ÐàÁë |È}bÊ`°~£y‘MšiþäJ“(WΔÿreM˜/oêÏÙ³ÿÏ@%Q@µ”S"SLÅ„V\yåÅ„Vhá…f¨á†vˆÿ¡„†(âˆ$–hâ‰(–¢VÑ¢/#-ÎxU5RU„òx„?¦(äDÙ4ʨ$1æÈä/:¥ŽTÍ(å’S>Iå[^yU–MîÈ¥—:Jé$“gj%F¶éæ›[¬çœtÖiçxJ!gž|öé矀v¸g „j衈1h¢Œ6êè£). 餔Vji’^J¨VˆTåé§J§£–Jª©¡š**ª¬¶êê«°Æ*무Öjë­¸&€ƒFhµë™ù£—a¢Ie±Xi©)œŽºj"Ï®*-´Îžzê´b{m©ÑZ›ê·àj n®ä–kî¹è¢úÿ+¾òºD°Ëú¹Ì[/½öæ‹ï¾÷ö«¯¿üþ+pÀlðÀŒð 7œðà CìpÄOl±ÄÛ ,’ñ"ªÕ§ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,3Vî*oÇy6;mUÙ‚*´ «Ú\Ïʶ¬o·]îÐCËm·©^?ȱÙ|÷í÷¦{ÿ-øà„· váˆ'®ø„‡W ò…eSa#‘/nùåT4®¬˜j޹¤š`n¹9—eʘf•Xv‰ùê¬3øVŠI¦’•~ÿ:éVÄž”?:ù,6QûçÄûÙ<Ÿš‹¾ùì+;¶îc«.½‹Ÿ‹Í9²]’íüõÏ[½óYŽ}˜¡ƒ¿&öâ{o¾è›þ}²ço}õêËO:ýf’Ÿúÿ$j^ð8G@ØÑOXEâ]ë/ÍÅu£3Ö±Äg¿íy®€Äº úÒW¬2ðƒŒ GHBM‰°„(La_§ÂºpR'|¡ g8§Òð†8Œ sÈÃn‡> ¢UÄ!ñˆ²!—ÈD'4®fËòU+UDJ}lcPDB«ð;îM°€ÌÜò¦è§*jzô`®èD3a‹–’"!åÆG±ÿñkuœ£÷X%òñC”\ü@ȲoI$èÂH@Ðe/„#0ÉÀD¢˜¤Ä%£ NhžEdDŠS”â¨d…*9à Îpƹˆå.~1`¤æ–¨yÍkŽÁËgT£´±†3¸±›ÞðƘãpÐQŽrG9é`‡<Ò1wäÐÉæt¶9‚`;Ú çv*rrZä""9OzÒS ¸‡$ñ‰I}j2O–àG?øä‰zr”åŸh˜Â*QA¨Bú” é+d(A H0D¤@‰`A L—:¸E.x€ A¼è%’  ¤_ À†0ÿPDe,J H&¤˜©'£ÍàÔ§§ ŒO]I Ïä4¼H*iJsšaÜÒ5ÈhÍk:P`ÚÆ6ØàF7¶±Õpˆà Î:‚chÆ9öH«çd€‘N@äêÍê|3;ãÔÎE¾žòdä¯9O{0¢wªÇ=,|ZRûÜŸ6áO.Пò3 2SÊÙ=Å]ŸêãV*ðP1$ò´¨M-VˆHB’”dÄ" !ÛIdrð$MA¹ÛPú6§¥ .+[±Êâ⨰œåR™êÔ`tÀ¹ÏF/‹ÁŒÙІªVÍvqŽÞ,8ÃyfY3^ã4g­pÕÿft¨Cƒ¸÷®éw$RžðŒ‡"õaÓSØ‘ö¿ñ ð{{Ÿüû/|&±•f‡mºÆüž÷“H|,±upJÇ÷¿1(½Û¹tß›±¼'¾¾ý¥Ï|uˆÆî-ìxH7RÈ7m^s;á_j7¸#.ð~ã.Å÷7µMÁŽ÷Ð#_Öò|mór¼ç@§ÓσNôª»èH÷1³“Ît? ½éPÑÓ£Nõ M½êX·ÐÕ³Îÿõ5>úè’c×{ ö’ï‰ÀCÂÇYÜ$s¯ b»–.9ÛaeMì¾ÐõVö²;*îrçÝ µ÷w=zfˆO<â_nÅ;þñ)ã2ã'ï&­ àò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìe?xÊÛ^ïHË Pð@¢}ðKЃԎ!ldk]+ˆEÄv¶*uD&mÛKl ·»å„>Êœ¢Ò§DEO[yŠU¶Ò¸²Lh–ë Ó¤o;ÖAµy"¦ÉEÍÙqÏr7ÔÙuÖyY—ÚYuÜÙQ÷àÙtâ9žIWžæYt虞A·ž ô1Ÿò9ŸôYŸöyŸ^Vvî¹@ÀFlþùŸZ*ƶgxäwVimf+™ö6µ ú 0 ÿV¡Ÿ&Ç>êCúj«æ4›&k§†4uÃ6¥vff¶j ¡(J.jl½R¡d&ËÉ›5÷l š¢6z£R¶¢j ÖŸ8ú£@Ê5(â¢Å£ì©ûy¤è–¤¬ã£AJe5ÊiQú Dê™F HNZe¨†i…6¥—æ¥Z¥YÁlÕ›B4já2g'Šf±†*%º¦#z4"ª*?ã¡$ª¡ ¦*¦zF¦'ær€Ú=*„¦oê4¢Âf‡j¨DS¢¤F7iŠ4áB5u5‰z¨’z©WóŸzúŸ|z™³Is¦?a¶©OZª¦š+ºu97B“1Óª°úª²êª´«µ:«¶š«¸º«ÿ´*yJú«E ¬Â:¦W:¬¡É¤ÆšlÈš¬âö™ÌŠ™ ¶!¯Óú¬‹­.‚œøó>·ªº©q^„œÖz9ÙY­Â3®gê¬èÊxc/›Ÿ9æªqaäAój"¬i!µS9æºs´éq,w¡IBDšwÁ)œí&£&zbÁ‰›óÖ› :1ºnïJoØ6r+v±—°-';{q(æ­¿h;£¦sq¡Z<Ú*qÙs²»® rtR²0¤®2;v?÷šâZ¯ø69{(Ø ³Ã)h3ogœ§p/Ë´hòvA 8Åúe=Ò&ct¯Qëœ8›µÞ¹µ\ž^ûµä¶b{žÿd[¶êy¶hÛžj»¶=·¬n»Gp·s4·t;Ev{·L”·z+jmÛ·ÑÆ·€H;¸Ê&¸†‹¡…›¸ÍÚw}xG üÒ/”k/•K/—;¹–»¹˜Ë¹šÛ¹ û¹¢{¹ûi_÷¸X{{‹ '…çhŽ›v{© ¹ì¹ºõÚ;¸wv§+x»S±ç´Z@»éi»«°ZWº»öº_Pœ¡e°x÷¼>Âkž‹‹»^†wjwÈ{l»k6Ó;ž¶[yÛۢʋ3ß ž`0{껾˜7¾Áʸ‡¸ð‹Cò;¿4T¿ö+C^q«ü««ýË«þÀ<Àÿ[ÀlÀ|À œÀ ŒÀ¬«ÿµX“ŒZ«¥|Ä|{QIÏ7 ÜÁ›´ < "<Â$œ”©t«P~ª´Â°p†ê7SiKm¨ëXÃ6\ÃùÛÅUa¹‡>þ ÚŽÈÃmÝ lø\ñ—äì(Þìx×›¼ÃZ–꽇d Øðˆð] hˆêÍ^Ö‘!í³<ËPœ—x‰>à"¸îÄÙ)áÙ‡ ÚÃ\Ìa &<]ƒ=­ÆÅ+!ã™®{cQQGÔˆLíÔt0Œnq-î„NØ„-nÕRøR’ðR‰aã‹Ñܹå…Ý8ÕS¢T˜± eH .œ\jÃÜ ×ßý\Y ÞõWÞ\y‡ÿý=ÊHîmÊÔ4Mèõª\ßo¹Ä‹(—ÜA—ÁW 9‰˜æ–XXYྜà*¸àÅ\ŠüôàŽ©çžÚ6¨P.Ùv¯M‹;ˆ7(€õî‰àðn„¥sÁâÁ­ï'[Q “4*“`*„Q ‰7NÏÙ8*¦Þ ߘֱ´ÖQ¹ÝFÞÝòW ÅtUîHÞš¬UÓÀºþÐ_µÞ¢ÜL¿Þ©,ßý°–HüòJ\Wø_s©ñìøí{ àça‘œøÒ-!˜ÚNç VÌ•å£=Æ©P;íY>PžƒêQ³"ÇÈGÇ9©“ÂMÜÒ7ãí<ã4ÅÕÿ•°…Ý÷[¥~øì å×k~EÅêM•o=÷”<7ÜKNÎÐÄëÝå]ö(VU>¤|å§\M8ˆ†oì¬aÎÄ­W|ÕìåTË•=í¸Ì>ÿ/`^üÙ3í‘5}Ó &ƒÆç*¹Ú Â2ƒ>Á¬ÏHÉæ¬õÂ]IްÎU8}\}Ø×}£dÈß—Âc úŒÖk ÉiÈ\qü«¡ ºT×Ë ­]}ŸÞ%Ïëë-јåóÀ€ ¨Moµø`®ˆ¯œãô‘xÒÿ_Sà˜è_¨ùðÄX>ÛÚÆüà/8ò`ÐçÏ •Фr‘É£±é”Zÿµ^±Yí–Ûõ~Áañ˜\6ŸÑiõšÝ^?£nùœ^·ßñyýžo‡÷  ÿ!#Ó%+-/135Õ(7=?ACE¡FMOQSU¿:W]_ac#[ekmoqçhµ®z³~}ׂÙ~‰ë”±˜›s¡¡w‘‚­­¥°µ·““¯µ¿©¶«Ã½³Í½¹ËÓ{Óûי±ß§Ž»íÕ¿ÝïåùÕ9‹6ðÔ´gà®Õ3§ \À{ðØé{GL`¿~÷AÔ8Ž#·‡U$n¤¸‘`IW…[ØQßGŒ G²l·ÒJ9‹4ÙÑ|æ«¡LAv49Êš.f³§pßR¤Jÿƒm‰ÒŸçÐÍã‰.&Ó„M¡jõwQ Q³–Œ>*{–m[\iÝÆ•;w\ºwñæ=cWo_¿­ð<˜0]Á…'zXqcǶ?–<¹h)Ê—1ËŠœ™sçG›=‡=ôhÓ§ï”F½š5'Ë­aÇÆ£ZvmÛWhßÖm;÷nß­{ÿn:øpã‹Ë°œysçÏ¡G—>zuë×±g×¾{wïß¿/`õú¸—'ЧW¿ž}{÷ïáÇ—?Ÿ~}û÷ñç׿Ÿ?{.½âè"¹ØÎëÏÀLPÁl°> Àñ",‹ÌPà 9ìÐCù Ìâ‰Í#ÏÂ-0LO€õVÄÿ¯E÷^T/Æi¬ÑÆIÄmÂ+‰´uKö@}rÈ>ñÜsSR‰õÒT*PÐÄ-jꪙ2 /I‹­ÖÚkm± x_±¥8]‘A^cåÕ·@’; õ>–7„¹Z™K>Y”óE×F—í£ÙAŸIÚb›'ƹޕõL:SLmõ´Ó`¾òR¥{ô×7«Ö´W¡Eåš]¢‘8¥Ö i`§N;S1ŸÄTíO£Ö’S«£S×?Ùõz]°·[M "Kœ±\-ì쪗žUjºÑf\kÅ“TÖs¯ÖõÃÄäˆv°·ÿ½÷ã‘ÿÚè¾—_F²$Æ ân›Þz¿<¾^{i`ßÞ{úÿ^ü¶²ßüTÊ?_}QÒ_ßýMÚ_~´ÂŸßþ“ê¿_ÿ‚òßßPâ÷?"€4 S¶6(0 < …8¶€€‹+ùÜXz‚Aµ$|ÔÁfPÄ+áê Ib©‰Ã'¡oDÈBËUNùÏß -8ð…kÊŸÝ.²– +ãà>–fÑ…=¼M™u:q^P¤âË`E,n |ɉHRØ…/®ªæ]Í艊HÑ œ¢ÅxÃa¤Ž_x£bD’PpYHD:.€ÿ!áÄõ=RPx|´ G4” ŽcQTY¡ìüÈBAZÄ‘Šl–£4¹Dº£‰•TÉ%7;R–뤤dïÈà9‹v€t–[ˆÉ3>¤Q6ÌH 231&ÅåKcÞ2&¼T 3sY;ižP!'¼%w8»cΚ„#!fYHœDtÛ|U©¨qšK˜Àüå0eÏn®jx¬Re6qéÌ⹓ƒdüfš|Y¶€j³v,§7qKYö/ÑŒ'1zήøq“Îdg$‰G¼Rzò™×d B5ú’b®3£Ÿô(FÉÅ F)ñ(L”&"ã!ϤD´ˆ”¼¦G[ N†rñ ÿŃO÷`ÒZh‘§E5“Q‘ªÓêõ´ M¤ã!ÊÔ¤Þx+Ý'/GyH®”é©/8ɳ™SK ¹¹Ê Ú³ˆN•g›™É”¤75k¤~ˆÃ~Zs£QL(6ý‘ÖeÖu—w=KU“xձʴ&såh;ÁÀóˆ‰|©aÍR©Šâ›Å,þ–úYÑj´¥uMhM›Ú›©–µc jkAøZØP¶³`mmû?Üæv»åíý|ûÛùW¸ï#nq×w\äžO¹Ë_sû=èFw{Ó¥îõ¬{ÝèeW»ãnwýõ]ðªl§ãÅ¢xÍ[Åò¦×‰èe/×ûÞØÆW¾´¥oÿ}o{_üêV¿ûímý \x¸&°që·(˜Á vpƒ!ü` G˜Â¶p…1|a cسEâ‡Ab˜Ä%6±ù2½’Œ¨¸†EµâÌv˜§.ÖÄPœà#ׯ™À1i» b5|Ô 4f±p{\Ç]Ò¸c0>ª„ÌT4–ñ LÞb’%Y ÀâÑÉM®^”Í(–(s­ý4Ñ‹åŠBò+~è2ʾ榒ñ ¯üê$¬ŒE5'“+­z'—süå"û¹ÎEgó|E5W¥Ím®Ãñä·µª€tÄ qU/FcUT\5#7Na#8v˜ã?¹âDi¤W`PÈÄ‹LòÈãŽXФ”NB)åŒPN©e”0rIå—Xn饓`>Ùc–Vfõ¥™Uyä›pƹE‹rÖiçxæ©çtîé矀*(ˆ}j衈&ªh….êè£F:d£’Vj饘jAi¦‡n¥ˆU Z€‰Ê©¨¦ªêª¬¶zª©Ÿº*묫ÂJë­¸æªë®³‚…ĦG+$Y’ic±\ªé&§¿Âjk¬£–ʳÎJ mµÖÚj*¶ÓBí·ÜZ›í¸ß’ îµâž›ÿ.¯ì¶ë®¬¾›äÂ2 耯¾ùîëo¿ó+ð¿LðÁ'\ðÂ3¬pÃ?,±ÃG\ñÄgŒñÆw¼/½óÚ«h¸Ó‚ê­ÉΚ,­¶£j«r´¢¶\rÌ¥ÒøëMúÓ øç®tÍë€ô”¿Z˜APQR¨ª'¡y±n-¨ z…2´ŒˆŠ)QNlÀ¢®ÅhŒ3JãÙvôÆ$uÅHwœ à¢t¥Å5.r…á"CC55F3hSçBW7PÎ8|3Ôàç¨ßEN–ãœòªWªÒ©NuBæø&Ä;Ý™ˆyÄCžŠì÷#þUÏIà:§õÎð90~ô“`þ,x® ô€ 4a¤,å¯K!¬¢ kX{æóÑ–‚£#MéJ7+ž*ŒÒ57HMduÑšàlÓÿ½$Î&­pi›–"ÙRFPkQƒ–žå¤k(ÃXÛÚ³¾µ®ñ™ë]ûz½þµ°ìaû–Å~´§Éìf;ÛUapØù@¹ái¶Ð–ËÏ̵À¦Ky5ã¶DuíìUÝ2÷·Ã-=?²ÌÛÏnàƒj=ms.!œ_”`«ñíE\/2ÞøiïK£óØ0¸ÂnF‚Ó¯Šóœçît×UDÇH-Œ[\ãïwÅÅÍpy'áæ+8B]iÑ}øå0¹ÌgNsšÇN xøÁ¿yK—¿Mn?OЇ.t¼Ñ­è‰+úÏ‡Ž·¢}éI¯¹Ô§n:j¥Ns²“Î#Þÿ„—üë Wà¸wåpJrýÞo7·'r¶oÜãé&y¹2N®Ü½‘e¦ÊÏ.ñ»ûýïTË{9!Ž•ôå;œÇzÒ{4¬+]ÑQqÌøÅã®vÊ]ä¯{Ú;ŽîÌ\ó —^·¿*ÁÃsçRçÊk)¯“þõ°G•éSNø*.^‚ŽÏ}ª·Øi³ñ›ŠÃJËwŸE,DäÅë|¸0¿.æCó¢þÐbÏl52që|oõ·ÏýUY_slÔ{í}üÐS~ôm7ÿç׿îîþs1Bù ÷žýú÷2ÙöÏ%ñ¯ÿþ¿’þþ€ª€X€¡Ä˜€‘‚€ Ø€ŠÂ€ƒÿX~M·³M˜"í$2òwr(¨ARmX„Aµf‚ª7¸"˜!Ô#Y¡A1˜!hpO0‚ ¸‚-X!/xL&‚µ'|DX„Fx„H˜„J¸„G؃È„P…R8…KhvNx…@è’´…\Ø…^ø…`†b8†dX†fx†h˜†j¸†l؆nø†p‡r8‡]‚Xx‡âaeP/À‹µX1ˆ%ÐE} Eb%vb)FZQ,æ—À/c°•Q³RŸðQ©p[%… #UR<¦R¨(Aö §QdÃàŠÊ°J¶\±SÖð\¹!] ÀÝЋÿBEeÃaeéÐ]ßUŒö°ô°æ…^R5Î(fØ_e¦UA_^ÅflVr&VýÕ"`(¡ gy–nÅg}ægö" "„vW2VX¦w†XeðŒ5•u‘•“µ–tˆieyÁ~Z„ÁP* U •ø0v‰´U ¶U 7f¬ ²0’¶ £dªX\E6d¬!S´ø³ˆ‹Î¥SÒ5]Õu“SVeÂF5Y^È8^Ê8OÕŒëEUcVUÓèØQÞá”i¶foV#ñsVVhU\ÉVçXè¨`så`?á& ÿ„V E‘hõ¸ ‚#†§4ù(‰u+°YŠ@)PYr“*˜åY 9˜Ÿ5Œ`b‡ƒ1‰ªu†¡‰AŸ[¤£`[Œ¡ ™’¸u*šá[)%\(ÙR¥q/%‹H– ±Ó O¦SØÐS8y]¿Áx›è€ŒHµTA)^ÇHE©^aUò¥ÕøN9äÑf`E•ü5Vë1g`*1÷ñn•b¹Þ fiWCaPV lX•ó¦,K!pXt¹Y³9š•ˆ‹¸ˆ$v˜Žˆb(‘ŒQ–@‰Q ø‰E ’!™c¹šÁE\ÿªHš¬h\0¥\³ˆ¡²QÑ…¸á‹º‘“¶9TÄÑ“ï^Æ‘TLµŒPõeÃÙ^I)fÆLiÊ9æáœãgéá_"1àhgåhŽV¤ou¤bÉ`v5–ãùŽïxW„vh6¥B†\Ÿˆ‡Zz"Yº¥^J(vø¥bj']:¦f"az¦jJ$T>A˜MpZ#K"F¾ç#N ><¸¦,¦;ÂigM¤E‡—,njB1Xƒ§ÆxÂ'ƒ*X|D|q)NzŠ'eªy:© X©˜º©Q ©œú©§ª¢º"ž:ª¦ê9:xªªªOiºª®j¥úªŸ«²º©´Z«“z«ÈF…ÿ¼Ú«¾ú«À¬Â:¬Ä:¬µ§«Øæzî·¬GpÇڪ–mG¤¬d4vºB­ÌÚ=Ϊƒmjm7OÒš|GuX›µZ»µ\»8L0á7xËz`‚&ÿt©Ê¤6J§t‘öL÷¶]·rKsW«:›ÃDNt°$8Aûö¯8‹Ju»¶Aç7‹ótƒû7sA¸„˶B׸¡ ¸{£¸ˆ;·”»:β:£uR›zdKË6u`¸ô©¶nñOw³7o±7¦»tK§ºoÑ‘‹Y¥‹8•[»¨S?§S0Y§/ë¤Pý¼ÿ$¼vS¼ÄK¼Ã›¼Æ«¼Ê{¼Í˼λ¼Åû¼Ò½ÖK½×[½Ø»½ÚÛ½Ùû½ÔKw‰¾Ók±››«±Sc­×ú´ Äy³Ç‚#+lå§;çgyçj.ŸwõZ®ÚÆ~î;+êz+ó+„õûkú³C)r̳ÿ›×ÀôúC>;×VÈ£†ÈOì#,Á6 w˧Åʇ|ªBÅ.ëÇh¶™¶¡º·¦6¨2,&‹<ʪ–¨|ÛoP|%ºÆ8"Åe\¯êzy?kCt'DLÛ;ÿºì´š,5ß·FžL{ ìk}ÜËÆì*¿¼F$¬&¼±YSÌÇŒw²G ­ üÈz”¿Ì¿¼Ä’—y¼Íáã+qI̓¬³°\y\?_Œ´èÊ®ßÜͱ,Î$Ǩª³ÅšÏú¼ÏüÜÏþüÏDx¾¸:аjÍ}ÐçŒÐ MȺÐ[ÚЇÑX8Ñí„}Ñ-˜ÑmÝÑøÑ í€"=Ò XÒ&m€(Ò¸Ò,í.ýÒúÓ2mø)½LœœÌ_ÛÓ¼Ó@íÓ<ýÓB-Ès¬ƒÃœK®,ª?È)æ|Ô9ÈBqzÈs²Ô ÚÔjEÞ:NF}ÏNÔU —2DÊÿJŒ{ÚdÕŸŠÕR ¨ÿjÖ^ðÔ^Ý`½zÖ³a5j¨–‚¬šÓs}oÁ7ƒ…w×hºÌIÐׂ¢­Ö—×%T{†(ˆ­ÑËD‡”]Ù]ÝØ]ÓzJÓšÍwœÝÙ\÷Ù pâ1£1¦Ú¨½Ú§ÝÚªíÚ¬ýÚ²Û´ Û¶=Û·]Û¸½ÛºÝÛ¶½O1‡ŸŠÈˆ ÕPŽH ÈÜÅ ÌM ÎýÜЭ !5ݬ@Š"uݱ`’©HêR,¹ªÞâÞ¸øšQf]"ª“êÝ]»¹JÅð ß.GIœðeœ4ŠfúíU]å_þýßîß?:àv¶•+ñ4‘àÝég=Q–ÿBñà®W† éi•náòs#+Œ£Y )bù¹Ÿ†‰˜þ9 “( ” .&c³… Š!u °€ ²Ýú¢y’¥i¡¨‘°¨\µÈd®y‹ÒU“ç TÀ(T·É]ìZfõÎÑ¢DùŒHyßÇ9£P)LÙßRÉ_ÑÉs¤¾^ju¤|–8Ñ9±Žf–ÎWNahÖ O‘ak~šs¥^—dA50†>/pè#P#Ü5âÅŸýù) é—[õ‰ õ‘¢xc³`ã×íÚ­ã<ÞÝÄÐÇ‹­qdªYS¬¹¡Fî¡!j]ÿJTë›äPŒ(ºú@åÏa‰åìå^ÅyUXÕ”ó•föÕf8ê_5æaEàgu/¡æô–Hºà žuõàæ)áÂW®çJ#Ÿ^gÐþ'°{92P—EP Y˜úÙ&–Œ ˜”°by š® ™Îé—)[™[ÔíQ½EãŸyã=¶Ýd¦¹ ®Èê°adÊ%ë³QÞ¶ŽäRF›À!TÛ5ŒÅ¡›ZÖòæ%^çóô=UÈ~VuœgÆÜ1`íc^•ïŽØ®kE¤^©nWÞI–gÙ¤"áxE†áêØè#—Xª‡"€wïz)ÿ”ŏРïvÑáÕáþž˜œÕPÐY©u*Ž*˜¸ð/ž™™ ’œÙž™ÝŸùc*•’ÅuÅP ±¯‘øDΡ"Ÿ‹Ô5›ØÅäN>ù뢼™+jPuåÅ^ßö]fñ•ßYõ×èóå!æp&Ö^gŽVHô{Æí çJ*âa„æ¤{%xX‚…F¶ìÜfwùX,`ïÙ7iusÁY…Ùˆ‘IZŽ  …¡ ª* U±¥™æ ™ š>ÆÝï +Yd°ÿ«©ø«)òG~ÞÔ%¢’¯“%ºòñ ‰0¡…ȃdid>Ë(4Zÿµ Õl‹Íº`ñÁ”ÑgHælÈà𷜞¹ÀïyCþް_ .ú  &!%%1&,C&.',.;1>C9-@-LM TZ]WLcRDbZFNV€\Ndrs#’•˜¡€ª­±­·±+®¼+8*Æ+ÄÉÅ)ÔÏ(*(6âÛã)â)ð7ôÝûó=xïA|áB† :„8ÑÁD *:¸¨QÁ=|ôèQ£&Qžd ’åÉ+W¾d óeÍ™3ä‘“§ÎœC~!rdˆ#H*á‰)Pÿ˜H©UË•-]¶dýâEŒ™2jÒ¸g,³wììQÛgO·‚)B4×QÝHw1<¢„ÀÒ£L–6YŠ'§§RÕ cU²hɺ ŠP 01š› ¦ Ú3jİF½­·l¨ÁµþF¬\;ØíÈ­gOÞz½ííƒí/à@Ø"O¸yÈ¡S´ˆQÁÆ‹!Cvü耤•ÜSšü¾ÒL• ÊǼi³fNœ;{&€/Ÿþ‘¡Hæ?š_i*ÿ¯‹£ÈÊ 2¼8‹¯Ò`#¬9Æ‚P¬9ô¨°­¶ØD¸¡k»î ’¾4Ék“5ùË“MHéÿÄÅÃ@1Xh\2 j™,—áx$†´˜fš ‰,’µ#e³Æ5o˜d’sžŒž |ó‚ܬ¬‡·-¨·. ¢ ‚ S!…*ȹ‡¢‹®"ˆ.ªŽ:Ž@Ún»‘ÂO<ñÈ“)½õnZ¯=œè+ÔСˆÀ(ý˜bʉG¡šBR©ì¢@K¯à ¿R0 °Ú8cIµP „>8<$Ald’JöLEK+Œ°Ãx=eW€ 6ØÈlÁåÇc‘M6— ‡ÒH$•dIÙÊiÍœk¡¬-·)ß™GË-3Ÿxº¹‚ò1èÜ4×tH"6¥ƒ“º0ª(¤:Á#ÿé$îô$%>a”&Aqz/¾C᳨"Šrb©¦˜zê ¤¢J@«°Ê8ÓÉPÃŒ5ÀB£ #,ùµÞÐCU>9A\ý0VHô2‘¯5ÙDE/ÙÕÅÃ|…±¡‰.%ÇkLZ饙nÚé§¡ŽZê©©®Ú꫱ÎZë­¹îÚë¯Á^Z2¤Ã.Ûì³ÑN[íµÙnÛí·­î¹é®Ûî»ñÎ[o¶åÞÛï¿\ðÁ ŸºïÂO\ñÅo¼êÃ\òÉ)¯ümÈ-Ï\óÍ9ïœFÌ=]ôÑIßôÒQO]õÕ¹>}i[j„]iÙcïšöÙ½†ýöÛÏæw¨}g]øÐ]Ÿÿ}wÙ]̱äYaùÅœoŒ±Ý¡oÞ±æ«wžúìmÑ={è_Y…y™§]÷ð½ç~zñÃW¾ûï‡óâ“~|öч{ìÓç¿1ò«÷<ëýwïK_ÿ¾‡Àí©O|µÛŸAùM°sôs ý è?{l 5è;êƒû“`ðô§¼P€æK¡ )ÃÌYpƒÄÝ׿®ðÛÓá ¯G@‚|AŸô–ÇÂü©yëË!‰(C).ކ€C᱘EÔUQ‹]ôâÑÆE0Ž‘Œe¤š͘F5®ñhltãáˆF8ΑŽñ“cñ˜ÇÑÝQ}ôcåøøGA2ÿq$ä!iºb%’‘Tœ!IIš ’“´ä%³VILn’“OÓd'AJ-R”¥4¥áHyJU®2iŸdå+éJXÎÒ²ì$p™K]î’—½ôå/La“˜Å4æ1‘™Le.“™Ì\@ÔlÉIYôˆšÕ´æ5±™Mmn“›Ýôæ7ÁNqZÓi©tZ479Íq®“ítç;áOyg2J#:1©Îyýôç? ›z¶ÒœMÃç%õ)€j*4 îd(CÁ цN”¢ÝhîYPZŠ ¢%ÆC?êŠá(´¨ÖGPÒ”Jô¤!õhGQJÒ’Ê”G-e©HWªÒ”®Ô¤:ÿí(NwêÓŠU›õ Öc4ÊÑ‹> †õ›dBk ¢Ô¤TÍ©Ja*U­RÕ£U%éNÁ:U°Zu¬BkX¹:Ò­n5«Duë5/J»Œ.µiÁ#!úÚGÂ'q…Z„ªZÑJͬ²t­ƒµæKƒX±"¶¦†ìYÙºÖÀBö­•(Ù`1WÌ2Í®Ì` YØW/þ6‹ªU:Ó²¢ö´§EíkÛêR±*¨m­­l_KY˾•®£ì­=“úºÚÖ„<<¡h»¨ÏÝ.—¹Í%êoÛµ;ŽO€üË+¯[ÂävÕ¹ÝõîwÛ `— ÐÝhfÏëÆgJ—¼éÍ¡°à_ùΗ¾õµïÿ}ñ›_ýî—¿ýõïL_h¶×½Üïœ`¸  `°ƒ\Y\ñsNoj[ÕÇ*Ø¡‚å0‡¡;á›·Àd=¬†?¼M§˜Å=ŠkfƒhP ŸÃX­êdmÌÕ—N•°<õñl[Z¯Þ8Ç@f+¥Šä$·x¨FežˆÙKâ ›X²J>²MkäÕ^¹¶:¥r æÂF–Ì’er@Cc¦Ô’±%«•s\æÜŠyÌg òµJgŹÎwþé™)*Þ_ªY©›u¯øh<+ÚŸ Žðƒí` ÃXÊ4f4“3|é~FšÓž´o ý;Ï‚RÊ2õ©QjU¯šÕ­võ«aÿkYÏ:Öît„?ÔJ#W{ôž˜k0–Z4Ì0v¤c)ÕÌF–³ImZO›ÚÕ¶öµ±ÍjGoÂŽv ¯÷Ã!6µŽÄ&MhvôjiÿhÝ¢Éö»áoy£ºضõ½üí‹v‡ÚÍ Í­ i†ÙgÖÀ—Á,wS#áËhF^pt‹æá _†Ã1¾pˆ |Þ÷x«jí{wÛÛ#µñÚ7@ã/Šn øÅ£íŒt;|ÝÌFwÅÎñÓ{æ1Ÿ9´m®óœ#£ùøÑ‘~,–RûÖÛηÉí&l2¾|áBzÕžs˜_â=_øÄ±îu®‡†ëUOúÙÞUÿª»ßN/€¾wM˵£îu·{Ú{4wU7Ýép?yïxÁ>Ûj¬¹íö§GùïSÖôã/ýÐÙ~óÝvðå¡ìÉ}ËýËî§Ú¹¹âoŠòí4+éÌQ¿úuT^è>'ïMÔ—þÀ±ßfšWÏúúuþÇev3˜'/y2ÿ>¤U^rïí|d3Óž¶Ï&î¡®ûØñ~°^Îé†ïœVß[?ùÝ·­ñqÌ|ðBŸñÒŸþòý¬}Èê™±a6ñŸ½?g>oYüÝ%¿æã>ËÙןÿÌ¿ÿ97Oÿúo þOÆò–ö¯ðÌpÍPyÅ>ïПVì0°ÐÌ|\ÿÏó0Ð4p)/Ô2óO궆9«tÜ,¬”ìûMøÖ¯ø¼ÏµLëìÍrpøæ¯ÈŽÏ´L°kʳ®kyž'»´§ºXî×msbÐϬϵâÏÌô,üä Î\jÃÀÏý´O 'K·úÏË«ñ„(v̧|ŒË„ú-…àP»D§ ûLýË÷„lçoËè̱n0¦úÐÊö ·¯Qp ÓPjP(ÜB«ƒæ°å’°„\°qJпë 1*á+“Ç~Æ­×ÔÇÉ'Øä 1‘±9±ÂÐl*ñYGWñ—ë)M 7Êó.ôš )MAí#ÿQ›lQÃ.Ñ›‘›Ï¾¢©j踲¦§<ˆ¯±¸ÖÆ…þÚoyÈfðý1ý¤Ñ²í»-÷€§ˆ‹»ç|è|ôQ ë'»è‚^÷Ê}¾FulÇ@þ¸0 ±¬Ìªß oMç± G­¸ª«‰–ˆw ð½è“ñ³ÊÆ õP!r!Ûo ßOý¸0%’(ÒÖÀ"­#)±†ˆk'yòãP‚ %q µF&g2)÷©&#LÒª1jþq(7ò†Bh‰À1%+‹Ò'ŸŠrG)Á²¹˜òòÞî)?)Ã2-×i,qÍ,Íχ±¢2P-7ÿ±®pò-•1.å -é’ÅŒQ×x‘óÐYró  qøfÎø²/ßé/£ Yú²´¸/!SrïÐÍ1wk Ú'00p093%}ýº037ÓÇ<3ñ.¥¯1YŒ6_sœ “Í&É6,Ón³²îË-%s8ã(‰ó8ýÊ8‘s9eH7™ó99Ç9¡s:I9©ó:KG:±s;É:¹ó;5G;Ás<ÿF<Éó<ñÆ<Ñs=çF=Ùó=ùÆ;ás>ËS>éó>ÓÓ>ñs?ÛS?ùó?ã3t@ÝÆ= ô@ËA4o tAIóA%´ktB´B-TA14CtC9ÿt@=ôCÿ3DEt?I´DïóDQt>UtEß³E]t=a4FÏsFitÀpQ<Çó#Až<òqU/FcUT\5#7Na#8v˜ã?¹âDi¤W`PÈÄ‹LòÈãŽXФ”NB)åŒPN©e”0rIå—Xn饓`>Ùc–Vfõ¥™Uyä›pƹE‹rÖiçxæ©çtîé矀*(ˆ}j衈&ªh….êè£F:d£’Vj饘jAi¦‡n¥ˆU Z€‰Ê©¨¦ªêª¬¶zª©Ÿº*묫ÂJë­¸æªë®³‚…ĦG+$Y’ic±\ªé&§¿Âjk¬£–ʳÎJ mµÖÚj*¶ÓBí·ÜZ›í¸ß’ îµâž›ÿ.¯ì¶ë®¬¾›äÂ2 耯¾ùîëo¿ó+ð¿LðÁ'\ðÂ3¬pÃ?,±ÃG\ñÄgŒñÆw¼/½óÚ«èV¡–lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍY)©D½"ïé騠Žt¹ïmôÑH'­ôÒìÆ aÈ5²Y¦Ôkö¬é³¨b5Ó\wíõ×`síô<[möÙhãYvÚl·íö‰k¿-÷Üt{÷•%g¸lSÖí÷ß,BÍ7ÈJ­¥˜1þÈdá€7îx‡qcÙ%ã_ÈH&V öˆw¨“_þøçnß}yâT¯)&›¤÷mléU+ë¹æŒ§ ú옊Nÿûí¸3k{î¼÷þèî¾/| Àoüñuüò̯¨|óÐGÿáóÒWo}…Ô_¯ýöUdÏý÷à“-xøä—…÷æ§Ï}Ü:ë¾·ú Ð~íj6Á~7‚Aºéžçø>Èðƒ”ü4$¹Ö­NG£²_ýž66%Ì/S_  £¨¨­•ŠQ _%ÈÁàmë|ãë Ó'¢¸üá„@! áÂÂ>Ôå…¨ _fˆG0À†‚‘„#vX L8fØD&>1 ÉŒ"¨0*–ØŠ&ràéÌ-tAE^ƒ4ÁPSØ ã‹Ð°†3jsgtƒ7¾éMÉŽà¤Ãæ@ÎrÔÑŽy¨ÿƒïÐG>¢ÃGêø‘ ÉNv¶CHîX#‡¼FF‚õ¨Ç$xOIä#ûØÄ’-ÉÏ~6Ù“ÿø)Š(4J5¥) BeT¤²ÊVº*@XÈ ‚”€#HD T ÄÀr±Ã[æ’‡¸BuÉË^hŠþ…0’ b ‰EXæD¤ÀdPŠk~‚1Ø 7ʼnŠÊˆ3еøŒ.BÓ‹v–Æ4¨!†_“ ×À¦Ö ãmn“nxƒÿÇ8ÂAá°C8Ç™£<’s†úxNúéÄ¢´Ž µcÈí`<â1FFÚô¸'#ë‰äzÞÓ’øÌÇ%ÿ6¹~6y“þôäþå'I9 =E•@eT”Ä9"D¨² —ÊÔ¦Âð©1¤á qê:¢‚‰„}ˆÍ bsˆ_%¢X»‰Ä²>ÑNLk.Ô9E+¾žòFä a€ÑÍ Mmð©OÝø57âðƒC9&9‡=ŽsJÑ>J§:Õ9ˆd7šïtg"æy*RÒ T=)%ÉJGKÉÒÂ'¦øÑÏLùSSOèµ*PO‘²U.啸}e,Ñ7ÂÞöŽ·¾ .í(Yij©C–ëLWÀc¡ÎKûãåêwÜ>×€²cî'\ºCEí®xõÝñšwnå=ÿ¯zÙ–Þõº×jí}¯|9_ëý,løÍ¯~÷Ë_U…Áaq³]x5ç"ßÝ×däÒÖ«¶•®m9Ø\ê"·HÅ` ­KÁêªp¶*Œ- ƒËÃý ±«â•9!8„KØâ`—,¿®m÷±ŒgLã·jƒ&Fq³p<ß7®¾Õ‹ñ¬,hã"ùÈJ㱈ۥª­/\¦0’§Lå*·KÉÄ2 Ld+{ùË`Æ•–µ¢c›¹n@>³š;Uæ5»mÄÍÛuŸä\0­xL^îÿÞÌçyC{V€ûLh>pXTºs˜ÚDµØ]it.¶®Ž5håºØÉ…f^š3Íé#mºÓ v^›ÿCMj6ÿ¹Ô¨öÙ¨SÍj=}ºÕ°ÆÐ«cMë.ָ̺ÆÂ­sÍk>­º×À.Ñ®ƒMìýZ‡¾T‹ ŠŒd†~B²¥¤ðê/q%ÞžAÈì,8[oNÎÜ⊛!h;á~f[v·«ðíCQ+ æVà©qFïzÓ{ÝW°·¾í 4QõeÑÆ·À=ô•üàO¸ÂÎð†;üá¸Ä'NñŠ[üâϸÆ7ÎñŽ{üã yÈ=ð’s[©exAJØÒ–/xy zàÔBU†2”ê!jhUg>‚‡”°Ä5à˜OtBB$b7—ø %¦"œPD…¡¨Ö*Z]4oýÅiæ:ÿ ®+c5x­glÆh|憟àM7ÖÞFÁ‡°é8hBçnuÐc•h§ÃwÈbG£“-äC<šHÍjv‘ mäIÛ#•¢D%@íiS’IÕ®–µ9ý€D ¡ÈV” }Pa9Ôss©%, n9`ž€—‰ðå‚)Ld’A0,„ Ž ˆú…÷?ÏjÐ'Q‰KX"› :)ÀY æ{¢¬–aE*dA}[hf4nÅú;çWÖtQì¯ »ÙñYF~öóŸèì`…ƒŽ8Žã° µ{Cñ>=î½¢Œ, ïìTÄ;ÿwY™•ÑYŒ4Z4IõÑ€—Ty5ay4åIÿ8õ>S"[R·5z â 8"g9&!óBKg°k»¤5ÀT{¨Btº§{ƒ±sâ‘&Ú¨™;‰Ÿ§ƒ\"ˆ˜6¹¢Ð³”ëé¢6ª=%º£94Úš9ºmD*h7©šFJ`>ªlCIn59g¬É’5Ú’J:]‰y\WŠ“Ù¶KJv§:<’:©ÁS©–ú[š©î…©œŠ;è_CŠoò0sªû‚ªù¢ª¦šª®ºª¯Úª°:«²Z«ªªŸðFrÙù;ÿ£ºníF_¸ºcй«ƒS¤ÍÆêV•¿z!É ¬òrjÄšb.ZT1º]Èګݶ¬•¥Rºž{o 4¬2`œã¤ã–®ÆêkaÉ­*z¥Y1n˜æÎ">᪫g“¬R鮀²59"®D®é¦­Ì&?"w°×a ­K¶©ŸÊû³\åœ@ D[´FK´½ÈDR'uMÔ´±p}WGƘEÝ·ZxµX{µf÷…PÔ¸~`{Pk¸uÄÿfk¶àøG‡e‡æhYp›Hˆ„Rt[·vK·ñ˜·¤Å€+ñ4ñ·ÈZ=aBQ¸†[J<… ™Hz¬”˸¡¤ÈT¸wŠ0´{ªˆƒUų¯¨U=ÄCœD_utD«‹ºx NÇD§ ¨ OŒŸ!…ØW…Ȉ©áuô4vzå…eÇOæ×µkävmt†%¶ÈXÆQÉáßX}—m{‡å€Ñs;€&ˆìZóÈ·ëÑ·õQIù¨Zˆý‘™÷Z˜¸§ä´T òCµª§jª©gdA40þ;0ð¿#@¥ˆŠ—›s™Ësƒ€C΄U[õ¹ÿ[¥|ÚDM÷ºhDÐue5 ­Û´žµ±;»SK ­O^×u¥…`Ä…ÍØ»Ð8¼l¶iHs§ë Ëûö ‡ÏkQU‡‚4Hþ×Q—R›¥Ž¡HÚËHz+I‡øáK¨;¸‘J…k‰ˆ{ §¤¸ñ«Qᜠ˜¿gЭ'°,82@{µgЧxƒ»GÇ LÇŒ°ƒ°(‹Äw ¬ \ÁGÈMÍ7NJûtç´ºOèºkµÅøVV¸ \W°AWô´Â³±µ/ü»€E†ÀÑFwÅ¡†ˆUÊÅP•ÊjëGA|t‡•ÅÜ1כĈÚk€ÿïáxQ¬–d¨åËIŽXø‚¸£$zBå¸cŒ9”Ff$8Ke€(˜Æ+{¿Ôp1Šr{váÍ1äÍy¡ÀyC0‹ðƒÖT¢ M`M—„I}LÈNø´OØVU¤}ïtÅP _¯Qл댚|vþ4†5¼ÅûÐë°l˜Ýh{ä¼>¼¶l;Yõ¶„ô…gË命ž%ˆOHM–áŒAºDç|ÛTNÜNô/A7ô0Ö¢‰I8:ªÉXJ°Å’ôš©‚ÐÍÚ–h[²@âÖd;ò¢Ìe]Mb¥ÿÛ9 W¯bž¥[¯ØFnN¯¡LöUO91™]@9¥]¯¤Ãö¥£bx]^£ØŠŸóJ¨‡©÷BÚ?HÚh\ÏšX iÅeiUúb/ö÷.yøG?øŠ¢}s®ZÊøh¯‹?÷°ƒ«›¿÷2YõIJ\¯]òª®Ð,¥„ôàFô0/û´o>Cûùjûºß¦¼ßûpúûÀ?§Â?üvZüÆŸ§:Ÿü?ŠüÌ£ÎÿüšýÒ<¹_ý–rýØ/)Ú¿ýÒýÞï(àþ#Cý䯩ËþÁŸþꃰîÿþðÿò?ÿ"·Ú©ñùŸú?—! ãáX4‘Iå’YQé”Zÿµ^±Yí–Ûõ~Áañ˜\®É'º)\§Ûqùœ^·ßñȧ™ß÷ÿ¿Øô ›Þò!éö¢ °* 1)5Ë.3=?A£ÛJ#QSUWM/;¥*]f« hag]no)s§~a‡mi‹­rcƒ“‰;ƒwq{7C­û “N™º›¶…ÂÆYÍÏ#'£k7Ÿ©t}™‡Û…ב£méí_Ý}çûá½ZpÞ5ƒ|Fû¦d¡’rCEKEq1Vœqb¸‡è@2R'p`µ{úPÔÂ_I—öL.ûw¦>‚1æ3Ê "8Š|Êù˜1ã¶qF9-š4dÓG#ÿOÊêUPj>xû íšJ•ëUiÊfjFul¼«`u¦å“HÃCl’#ŠT)Sºç:ÕÛHZ¿.ô“TÐVp—$³›T1Þ¹óÖÝ;¨`Ë—1æ6€sgφ"¦<š4ßÒ§Q§VÍhA·«aÇ–=›vmÛn@ßÖ½›woß¿—¼>œxqãÇQ G¾Ü›gçÏ¡G—>zuë×±g×¾{wïßÁ{n}˜0só­2§W¿^­èÂîÏÇoKr%{û÷ñk?¿üø}ë¡)¿ \¯?Üô9¹ ¯À!Ô)Aå<@°Ær0 9ÌdÂܘ(ç® kƒ*,M4ìPÅ*ÿ!;‚"‰Ú¢F$Q•IXÒŠ Õ€± —ÂË#Ç$ÓqÇJQÈ)©¤âÃë¢kÉÈŽrßa§Ê1É<ƒÈ·ÎLB"$RÒ.™ô2)ˬÓN+Ó|/Ot†’ó)? ”ˆñBÛSÐCMÔ< mÔÑGmcÒI)­t/I-ÍTÓMÁ”ÓOA µH,E-ÕÔM==UÕUM•ÕWa•ÓÕXi­ÕB#mÍUWùfÝÕ×_KÄØa‰½­×b‘M¶)OûT¥Ù9žUVÚ@™•‘M–´Ɉ¶½±Û"f¼²iÉE´Z$ìÈ¢-“tS©¡ºl·Üy©ÖZtÙmÿwËxsD÷Zyé ØIfµiSÉpÙ­ñ[uóÕ(Éh޹c#X(‰1–ÕÞŒ9î¸'R=™^LE÷_‹ãò÷bÉâØäEŽ™¯_Æh_w9Òö¨uuÖ¶#!˱Ï~½ÕwÜqeNúcCMΖ±8öÖg–™’ZËšÕÅùÞ«ŸVÚë#R5Xl­#“—k˜Kî:í“ã|ùl•¿öÚÕµ®9áp‹Z·jlmn›áºÕĹ1‡ãþšâÂ_õðÄuñÆ!G•æÈ)?õñÊ1ouòÌ9×ôòÎA÷óóÐI'qôÒQÿoóÔY}õÖa7ýõØiWäÚq?îôÜy§m÷Þ_í÷à‰/ÿmøâ‘¿töä™‡íøæ¡gåù詟óöê±_vùì¹ÿrûîÁòúðÉêûòÑÏcúôÙçéöáÇcýøÓŸŸþòí¿?üüõïžÿþ³÷?VO€Œ^ Ø<&0y d`ñøÀàEP‚½£`swA ÖNƒŒ]=Ø:L-€$4a QxB¦…+ta aøBƆ2DÙý –Cî‡=ôáÈC׬ŽPæº!ýð>ÿ<e#lÔB˜ÄD1qˆ *â¡ èA)±‰DLÅàPqÄàˆ~[äSʰö¤.Z±br #$²¸A3šÃ`nLc*¨Hž8\‘ð:ÙÛêH´;ÄÕƒs\EÔ*â˜t©±ŠJäcüØ5—Ìoƒ$cû ùEJ¾‹I—\d‘ÖèÈ7JR_äd“,‰(ÑÛ]>y$Jx#–hÚã/ɾLç/ å-EÈ îÒ8Q:Ä/ÛðH@ S‚Ä,}’ÇBsйLŸ3‰%0J“–V Ï7Á k¢/ˆå4ç9Ëé±ì°‘ªdÞ¶f)’ó¹“u±çøèYÏx¦’•ù¬ß<ýÉ=´s%hæ zÐÊ1 uèC!Q‰N”¢µèE1šQn”£ ;httrack-3.49.14/html/img/snap9_d3.gif0000644000175000017500000001636315230602340012650 GIF87aÓEÝÖνÿÿÿ¥ŒkïçÞc­œR¥œsµ¥Bœ”)”Œ9œ”ÞÞÞ„„1”Œ!ŒŒZ­œ„„J¥”{µ¥Œ„„„„½­kµ¥{½¥c­¥J¥œŒŒŒ„!”Œ1””1œ”B¥”÷÷÷{½­cÿΜïïïÿ1œ11ÿcÎcÎ1ÿÎ1Î11ÿc11„ÿÎÖÖÖÿœÿRRÿœ1ÿ11c11œ1ÿÎÎc1ΜcΜœœc1Îcc,ÓE@ÿ@€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËízB‰$RÎv:¹P®¶kG®“A F]χ€ | ƒ†‰Š ŒŽ’“Ž“—™—Š¡ž¤Ÿ§§‰©­­°° ­µ ´ »º»¾¿À ÂÄà ÆÉÈÆ ÈÏÒ ÓÒÕÕ ØÛÕÛß àããäæçãëíêòóõòòõúüüÿ ø `A,XÀ@ÃJ„X€bÄŠ0b(°1cÇ-xÌ(²d“D(°²eJ ÀœSfÍ›1%ÔÔÉóOÿ$ bh Ž*M*¡Ó PJ#D˜!V‡ ÀÖ0cÊèЂD¢4Šl0¢Î;w@HP"=w(24èî#¿‰$é €ˆ°£ÀkJä©S§ ŒGiˆ¼ råËf9X¥V®[n‰îÌ×°]ÃR K–`2eÐb?£FûµlØr{Ó®÷·ßäÊ!@Þ»vñÜÁ«ÇŸ¿}Ïÿù8pàA„ØBD±;E‡#>ÀpQ<Çó#Až<òöˆOR ¥”TÖ(e•\N)£—V†©e—`B)f”?n‰eVa¢YÕIÆ)çœ[¼Hçxæ©çž|RagŸ€*è „–øg¡ˆ&ªè¢Œqh£F*é¤F>J饘fªiKn*éVŠX%ªUˆ©¡¤ªêª¬¶êê«©¢*¬´ÖÚª¬¶æªë®¼öZ+…I|Åd°>$›[þ˜¥›Qbéé žº*ªÔ†‚k©³b›­¬ÜJ»m¶Ö‚[­¶äzëí¸ãžûÿ­ºå¦{­¯ðÆ+/¬À"!,´Å>ËèÀ¯¿ýþ+pÀlðÀŒð 7œðà CìpÄOl±ÄWœñÅwÌñLJü/¾Ô«ï¢[ªòÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎû)ŒôÂX£1šA›Ú ´ ºIlnÄá›<‡8}¤(r${çhô£ˆ”NuªsΚ4!ÞéÎDÌ#òT¦™©zhJ›ºö“°…Oñ£Ÿò¨©nT ¤"e)µ\Š.‡«K^²Ð…È=ßq“Ë\ï-—wOÒà™¦„¬fe ƒ“ëÝ•`ÝÜPºe‚\å¦KÞêFîrÍíÿÛs‹Õôºwn|¯|©·ÞùÚ7xõ½¯~5—ßýú÷oýmá×ÒFàøÀ¦…$v/'øMü¨¸¯­Œ]¸º©´•áSQ ]á"W‡Íe*t¥+i æpˆ7ì.vëÄ Žñ¯$*­€ao›j§µ nÀg“±‡Lä"¿ … F`|ÿËäÌ™¯¹®ULå¥M¹ÊEF¡£®çìÒÏÂ+ו±Lf^¹Ì1Örž|ÁåEÍp޳œÕ†c.7ù΋c3ž÷ 7=óùÏúò3„k¬]ë.KL”ƒÝçí,@;Z ‚.\ÚûèJ;ØÎ¦îyÉû¦NsšÇŒ^ôtÿ1H¤,QzÔ¸Û±¥¿éU»Úzm{µ¬3ÕêYÛšOµ¾µ®ï”ë]û|˜þµ°qìa›×Å>¶²ëe;[Nòá³§í¡hSûÚz[2¤ © bÛ $<™ /Ý¿&p»IIh/8¨nB« ÞþöÎÍ£wרIY¡pÆ­är3Þ(Ó·¼…pDñ»ƒþnRÏÎðž Ü ¸Äiv‚?üâQ˜Ð6ÎñŽ{üã ¹ÈGNò’›üä(O¹ÊWÎò–»üå0¹ÌgNóšÛÜæÚÆ¸Î9åË2¼ %€‚̽=Ȫ·ÚÃvõ@ k6qDJXB‰pÌ':¡ÿ&>VüDSÁÎ-¢"‹[¬+×.½þâ4~FÜ•±šÁ46n´AssPð¦€Çcc‡óØtH”¢ˆ·Ç:è±v‘Ó‰üf±SRÏBò!)¥diKkÉÕbR¦íIMQ¢ ÌV¶)!emm{[¢þ@"PzÛÊÙž©»tê¥%Ô©_Â@˜#Xæ Ž™ˆd.€™Íœ&ô°ÃBBš€ð¡_ Ou²Z}•¸„%2±‰¬“b¥¿'àjV¤Bè·…fF“×¶ëÓ¯|e ïþ»ï} p<(BÊÆ:V8èÀGã YµxÕxóPHRŠÄY‹dyáÿ(Z¤•Z—4¢ÇZ›äIõ‚¢¤z5±z?•JCõ>1TÒ[RÂ…{ â :¢2QÅSCep+°`LŠP)°Lɧ*d@à|Î7Pu_ƒq}ßt†¡‰A[÷D‘1 ëĪå×N©¢óôE÷Ô~cT§QFuXɰ1 Ñ€Xp„ sÔ %xÀAx|ˆ‹çGd€¥xô €¥Y“·H”wR yß1A¦eIS™´˜ØI6¥óq/AJžx‚;1Š@±‚¬4FuEqTƒ·TKIAcÈr@REUbµ¢tË·‹}0ÿN×U_VŒ V” De Gtu™ÐÌvb'E¤@~æg~r• fhOùÔviøvûdFÿdwß(µaP¸§þ·‡yDøe$HŽgH˜…ˆ"倕÷YÜ™÷ˆãa“8ª•3%˜8z¯…z©§S YJy‚AÅJ(ˆŠ²'{­Ô[ÀÕTé (‡ƒ¶¸s i!’$ i9W’(Inj–’, 4 ×’0i’/©a¢v“à–i[Ðh—“žÓe1 "Ö# Æi?Öc:¶i\R“6¹n¶Sh©¶22bƒžönå•T™”AÉ!#¹"=¹•úÓ•`¹sb9–W–ÿfùph™–ò¶–l‰mnù–Ô—rùltY—Ëv—xylzù>)3q€˜‚9˜„Y˜†Ycu6“ïõfsÖ˜Žù˜Š€d7Vqþf`™ëâ+g†™œÙlGd·’ŠAV©=–+/f4!¦b™Ù-¥¢2¡²ab†-)æš±©š¯¹-°)b·™™¬ù496’)šB0”£”Y¹idÁÙœÎIdÙ˜ÄéBŒùœÖyR#3ÓiB·—ÎÖkÞ9mà¹?Õé*›‰B†4HƒžtF2Ó)`ç .ìgñ9Ÿ¼²É–n§†“¦9b¿I›ö)gõ SSgžÙe5éiÙU^_y<ÆbÒ²žÿJ 6¡J/úž^¦jŠonf¡¢"ŠŸ $î–<#2 “¢,º¢.ª¢0Ú¢1ú¢2Z£4z£0êžÝž|™Ÿú£j¤BÚ–DZ¤py¤H:—JJšÒ ¥¶¤ôÕ¤¥Y•:&9Q9h6™¥U*¥É3ž\¥Çé¥Ý¦dzk‚Fj\ê“Q ”öÆ;Fy“bz¦yÒjNi#‰Æ]ʉj‹¦¦»“#»C:ÍÒnsJ§)b¦†újˆš¨«¶¨ŒZiŽú¨Ž©’úg”Z©{v©˜zgšº©LÖ©žZ™Tª®ª¤z_¦zªó•ªªº˜£Úª“úª°j©²:«™Z«¶Ê©´£ÿ¹ª_ÖÖ«ºö«ÀjkÂ:¬²Ö—Æ e'Y¼º=…úmT03­ÿB­ýb­ÒZ­Úz­Ûš­Üú­Þ®Öº¥.9Í*(ñ¶•áhäú™ËJçšj_Àé”ë*iéÖ¦rpUó®C¯C’œ¹ãc]ê5ÏŠm÷z!Xº§k’Ö_ñ:h5˜ojjøö]ôÚ°Ô–°]P:¶c«!ü*“æÚg;m«)#K,ŠyÛ'õ“ts4[³×®[Ö²É hȺ³ÈÕ³> Ÿ:´x6"3z´6Š´8š´L»´N«´PÛ´Qû´R[µT{µS›µ6ªƒºØµ8Ät\õt^%ŒÂH ÿf{¶gåœ@ lÛ¶n˶ÒxEgwvXT·±°~lGÛHFñ·oø·€û·{G‡ŠµPéøˆ+Q€¸€ÄŽë¸õ ˜ˆ%µˆûZ˜KI“4SœÛ¹žË¹º¯‚+ñ4qº¢x[=¡‚BѺ® KG… ®˜{·”µK»‰‹´‚UÌÇ‹;ô|¿Ø„`E¶ÄXVHtDœ°DjÅulûŒÏx cwE§ ¨ wkŸq†ì§†Ýˆ©1wÿ„w…5‡zwPúW¸v4xx㥏È1YÆQÉáô˜€’×€•ˈúX›{1e‰ìÁZIºëQºõJY[&ˆý‘ÿ®§[+»²ä¿ÅT òNu­Ó*­à‘:hdA40&<0pÂ#@ºØ‹¿ëtÁuƒ0DÙ4Vfu¼få}åÄDb÷ÏEäWvp5 Õ[·ž·Ù»½{K ­ÁOs×€õ†k‡âX¾åˆŽ •¾w”¸~Hˆ÷Žë óûöpˆ÷R#¥ˆäHˆR¢µR¦õQI|I¢ÛIœø L%ø©»º¦¸J­»Š°{ ²$»¬QQ@µÂgÐÁ'°A82€|É·‹¼È„ÏÇÉ3ÌÉŒ…ÅxŒØw ;¬ :ÜÃ\xNáçNrKvò4½dh½v•·Ú¨Wk¸ ÿq×İñWÿ4ų1¸W|¾‹•‡ÀGexÅñ‡“ÕÌuQÍ’›Hi|ŒÄˆ ÅÜ1ÿÇQ‰¬ï1zy¬¡´#¨ |J£˜‚,H‘»®t{Me»‹|9“#Ü{e€=É@X|ÊÔpñH¸|3”~*M˜C´ƒ±TN…! å´V‘!v^è…å†0†wK†xFî§O§Q Å@w±ñ,=¾ã(Ì|—PxØPëÛ¾6½ðˆÉ!ö`HökÆ“K¹žeR—ûHß¡yÞ\œZ—xÇ®Uºž„ÎèL[}üS‘BqŠFÕ[KµwÁ·„KðTÿ'ª$¼×s"܃ÅD|À–ŒÉ }„Ìd:ts}žüÉ}!ʈ‘MNŠQšÐŒ¬bE•aN_˜Ø°à…exWz‹Ë¾~5w” ‡- ‡Âl¾…›PéXÓÿǎ˸Óöàx ˜Y’—Æ›u ÁÆá¿þ«¹›·ÈÔNMz,ÁIç¬éüëìÀ¼ºÂ[CqÈ·‡È´kK"•6vÖUåsdAL’Lɉ—œÉu€„oÑ—y½×Q…Þ4 Þ¤ÍÌ›uâgNðtNì´ÑîÄg—~µ€·xå~{{Ò»¬Ò~Ž+}w0MŽû—Åw¸ì[xÅ‘Óñ+HtYÿÐQ¿@}•û€úØü+‰èy´­4¥‰P݉2‘ÀTÍzV Á)¨JZm‘ÅíÕôŒ{¸$‹5ØÜ9ÈÏ(p€(°L:®>°ãÈçL{@wMÜmä2Ñ‹V©B «R– ’!Ø?Ü…©ÒÞ®0†´üE¶œ&Ù(MwÆ` ðË%‡/]¾ E ~WàZìP6ݾ{¤àH¿=íó(¹zN¹$5Ô µŽø~Z>Kš‚zì Yâ¿[LT?áέۂ¯dÈM•ȶ4Ö»Wã=—+¼»t.¶bŒ_5DÕ‡DØwuYç}–à}PEÑ+vCü óMÄÿ!ÝØ÷½Äܨ˾þ½u¸k”ÙWGÎX¥‡Úäð¾¢-¿ƒ¤xí~¿“ÇÚ–«Í)µR>I Î>À‘èð¡Ç°…ºêìǢȂ¬[´ç[ÇíŠöÜ 6ãÜ·èµ^Ë|£ÞÉ?ŒdûŒ×GÊkËuÌÛ¼@lEaÇ W„~E<˶¼½í·W¼\ñ¬± hḬ̀wVœXÈNÓp~à6ÝʼnGÚôàx‡Heí«í€úÛˆ‘(ÇJ}ZËÔØZ¡Wîž´SSM&ÎάձGâ[€Ü ÁE\¹d»I´–´ROAT_õäé¯Xï«Z¿õöuõ^_?ÿ`ö/Ôõdï^cöécœp:¦úʦùº“t²4é¦?ÙªC9&øœÏk;]Ân!«”‡V±e¥jj[:„v¥‹ÿcˆ±•²tÿ–ÆÙ]Z:°yúi‚Ú¡K$N)^¢^òб›¯ù«•§Êöw*]Æù®?÷ËÙúoúùPyúu/$·û¾Óö[©lOø÷6¨HéøÁ¿ûd2¨Qšùx ø[ UŒo^Ër± ËüqŠ©i?¯jdC›ý®ºýÜŸ^×ÿý¬föâ/´ïYþ*þèŸ=ê¿þÕÓþî?=ðÿÏ3ÿôÿ¡ÞÿVOþú¿BüáX4‘Iå’Ùt>¡Qé”Zÿµ^±Yí–ÛMB‚—\6ŸÑiõšÝv§Áâ÷œ^·ßñy=>ï ³úþ!µ#)+-/1÷&39>ACEGIKMOQSUWY[]_acegež6;s©Àz}ƒ…‡‰‹‘“•—™›Ÿ¡£ƒ™Â™pu³o¤»½¿ÁÃÅÇÉ—ý¾ª·å´Ù›xËáãåçéë‘ϑ⬗°ÛýÞàFl ½p >KhaÃgøŽèSñ_Å!öBèK@ÇŒÜ:þòX$„#E†É‘eI3ÂTyңƚa¦$Éñ¦Àœ85÷gdô£FÄ葦ÿ5í ¶Ñ'Ë•@eδZõ$Ö©>_rź°«M«e¥~ôJµªP·É(>EêÎè¾%O™³·£‘Cöêì°Þ¦x¡nÛz•­°´Œ·6v ìeXªR§<;Ù+ÐÆlc¾ Œb‘¹×êBAì·°`׬_}*»uâ]˜!ÛTyµ-ʰ½yî–É8Nܺ?{î‰yypæGG/Mä4¿ÔO†MÛÈaØÛkÛ–0zyóç¥Û½˜.éuÕ„¿{7Ü7þ`ú±¿‹ožÿôŽ:…=º˜N?] ‘³ëKÑE9nyÞ|—BbÑ¢êsõÕ×pþøf]îÙÃÃ3Ø›ñÙ;žg³Ùç¥õºWš“ž/ÑÚVÖל…Ušé­ëp žïäZl|ÛìG½>[í-ÆËmXÁVÔ¸µŽšh§@^{i¯½Vi¾ze ¾Á7Ì)”óúµ¹U>yf–õ8míF^P $àË`@.p dà­à@N0 ¤à«å? nP1äà•`A‚P„#ä` MˆA¦‚+d!]øBÆP†¤a xCP‡;ä_}ˆ?0ŒAYA|á=hÄ €ˆJt¢™šøD#"±ˆRü ­D¥d‘…[ä¢ ½øEºGŒ]$cÁxF%,€ltcáøF9Æ‘Žs´cñxG=æ‘z¤Û‹HA’ÿ…4ä!™HšµgM „ú D&J q £¹ Hq’ªäDª€L*h“Aì$$!‡ŽF2a”X¸šþh'ž2 Î:R™5&¡•U˜,¹PJÒò ”ëÞÐðIF–©—›’ÜŽ–—Ø3–$f0¸ØT³‚¹ŒÈ.‘ÐÌ)8jšu[$7u9ËPú2®3.- Î#ˆsœ¼sÕ°ŒYº+s‡×ìÂ-“w2x‚ò ôÌ:)èOñ(“.«\‚A-ÂO*Ô6 EC×x!‰Ö¢äò&@ä‰I"t‚=h<1ÊK­t¥$… "aS™ÎT‘E£SzÓ ^R§äiOøS .P¨C=`Q:@¤&õq;httrack-3.49.14/html/img/snap9_d2.gif0000644000175000017500000002141715230602340012643 GIF87aÑFÝÖνÿÿÿ„„¥ŒkïçÞc­œR¥œsµ¥Bœ”ÞÞÞ)”Œ9œ”÷÷÷„„1”Œ!ŒŒZ­œJ¥”{µ¥Œ„„„„½­kµ¥{½¥c­¥J¥œŒŒŒ„!”Œ1””1œ”B¥”{½­cÿΜïïïÿ1œ11ÿcÎcÎ1ÿÎ1Î11ÿc1„ÿÎ1ÖÖÖÿœÿœ1ÿRRÿ11c11œ1ÿÎÎc1ΜcΜœœc1Îcc,ÑF@ÿ@€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËízÀ` H¤œítr¡\l×nL7z~?h{€~‚…ˆ‰‹‘’’–˜–‰ £ž¦¦ˆ¨¬¬¯¯ ¬´ ³ º¹º½¾¿ ÁÃÂÅÈÇÅ ÇÎÑ ÒÑÔÔ ×ÚÔÚÞ ß ââ ãåæ âêìé ñòôññôùûûþŒà‚ 4p€a„ #>40"E3Ј‘£F:b IÒ@É !PÉå^Ê„“¦M˜hæÜ‰`gNÿ ‚ !Ô F“"`a©…§M£†"@‘ªCx €1dthAšD6H˜h@ÇO; 0Q»d×Q_D‘ò84¸`€3!êĉ…Å¢6@Võ˜²å² ¨Êü —­¶BóÖK˜.a¨ƒ![ ìX²g°M›mm¶k¸»eÇÛ›ïqäœ{÷Î;xíÞÑ[~¯Ÿ>çþúý(ÐàÁë |È}bÊ#d°~£y‘MšiþäJ“(WΔÿreM˜/oêÏÙ³ÿÏ@5Q@µ”S"SLÅ„V\yåàVhá…f¨á†vèÿa~(âˆ$–hâ‰(¦¸aˆOXe„‹RÀ8„ŒP¸HãUYØHU7VØã?©âD©"‹NÀ¨äŽ32)£UK £“3Ò8e”X6É£–RRyU–\2éå”;^I&V]j©dF¶éæ›[ çœtÖiçxJ!gž|öé矀v¸g „j衈1h¢Œ6êè£). 餔Vji’^J¨V têé§ †*ꨤ–jꩨ¦ªêª¬¶ê*©_!¡U¬Md*$WŠ™&šdîÚ«¦Npúê°Äkì±È&«ì©´1ë„KØ ¬Ÿ P@µ×Z‹í¶Úv›í·Ü‚ëm¸äŽk®¸è–›ÿî¹ê¶Ëî»ëÆë®¼ðÎko½øÒ«/¶OH;-Ÿ´õ–ÛqG\o±uGw¸EðÂ}°ÕÖÁ C,pÁ}dìG\qY\±ÃêãBX,ççy¹äO#¾÷Øg÷èïÝ¶Ú‚ã¸æ´×nÿ»§ {î8´¡÷yùíÀ/üðÄæÞøƒ ÷ngÛŸÚ=ûàw#wéÓËžöß±gß¼õÎ_û÷¦SŸ·÷Õ—>;ñèƒúíúØг¢É+Oçïé×_9ýö×ϾµÙVû~Vñ“œXW·Ö•nqsÝøx@é0{¯{[ݸ—¿ oÝòßÕx'ÀåYðƒ ¡²0Ø?÷m°ƒ¾[àøÄ÷¼èmOz¤K]5*0pŒóXx=úYìÜñ¢@ ?L¢“Ø8ñ‰P¢~fÄ*ZñŠq*"·ÈÅ.1ˆ^ £ÇHÅ1šñŒò+#×ÈFM©±pŒ#£Þ(Ç:ÚÿÑOt¼£÷§<òñ€DQÁh©Y²w„¬”!w÷„DfmKOÓ¯Ò´¥8ýï“r$¦¸E€0 gËY'³J -yšB*uJLþk•ŽjåµèÊZÚ2C~¼¥.wi…ÁÅÀ @0ƒ)3>Ð嘀 Ë^– G8À™‰D#¦I‰K4FœÐ& CÑéXt Áv´ÃÑíTä"µÈEDržô¤§$pIâ“úÔÄ¥ÿ,Á~fÊÿôä(ŠN´Ó1…) *T¢2Ô¢õ)èÊWÆ ‚”€#@D TÀÀ+ƒË„™‡>üA0q ôÂLP<Ó/ƒ‰`C˜G(¢2–àf$RÀÕ‹Ù€fêº×SPf¯é¤…gr^–4¥9Í0äéd´æ5¨?mclp£ÛÀl8ÄŽágÁ1ÎBã{˜ö ȇs4À€H' ¯Íhu4šjç"ß Oy2Â[Žœ§=QOJÕã–ÀG>-©‰}î3S›ð‡'èNoÊSÈ)BÍ-¶ùl+Pj¤V>˜7Ì4ÿD3ŸÉˆE@¢½“ æ&6͸nÓ¾Ü̯]ÁÉßs¶ÂœÆÅ`×éNÄ&v±Áð@‚Ÿ |ƒ³¡Md'›› ã&½1(p†£PÑÇÃÆij[[ÑèP‡:I1mÒîH¤<áE|ë‘à¦G¸#!®ŽYÊã÷(÷>ùaî~œkÓÿY@²îQ”"T¥õÉGMj.yIå*£ÒÊXÎ2Ô¥&õ*W^3¯$i%'‰™K‘”äÖ(I0éŠÍgö²š)9f®µYËhœr‡¼‹ç>{MÏ~´+-èBÿ‘ІN´­èF·‘ÑUÖ'Mé‚a]Ï:aø\ÉÅQÒ•µ¨ÿ‰G+³eÅ*«|cšÁ´j;kí’@õ¨gMëÌ–¦rÔÈËë^ûú×À¶°f±úÒ½¬hùüCi¿ù꾡¾ï,ZöüüèO¿ú×Ïþö»_ýà'ÑûçOÿúÛÿý?¿þYÙD(úÿÿ€8€X€x€˜€ ¸€ Ø€ø€8ÿXx×'~û·sâKdP/ÀNåT1P‚%ÐÅ4æ¥LÊ”^êÅ^îuVŽ@MñÕ–Àôe_œ°ÚÄMv5Nž N¨ Wèt æ„NÖNLæ ¦¡` …É æX°±OÕ Y¸QY °Ü†•a±aèZ¢•†õ ó ©µZ%rxb×1[*ÖQq[!c16R7VRÀÅ!1\'‘ðc>†1dB6dÒåÿ I¦Sr‰Ú…TÜ,à%^`!/ðT#€U'@Uˆ`U  l^õm]µ„€^bµL}1VƒñLï ÕD 9èõµƒÿwE yE üU«€ ±pŒµ¢Q`NˆX †`«QOXèWÈ…‘ÕO•eY˜µ¦aÁq %6ZlhZn(‡®uQ(†QwØ×AÝ!.c4FR"1ˆ8†R+EùR‹HŒØ\6]>ÑÑ IF Dád™¨ ò%œÖèe+ 0U‰@)€U ó)[Vu¯‹ëµ^‹ ‹Ò¤V…ÑVˆ1Š1ž0W£¢W‹‘ ˜AŒ{Õ)™XìTXÌO¤aòd… † °ñÒ ÖO×PܨYcøeØ•çÀ† åPåXZk8éØZÿ&F‡U‡µ•yèò(ã!c#…¿eRê‘—*E\)!öá1õ—©„ù ™SBA]@ÕE ITB…B|Ç!áåS*4ÓŠÈô‚/˜^-)ƒíEƒ¶xƒÕT 8Ȫ„CøM£0ŒÅXŒþ… GIX‡å„J …‰5Ou…½´AY·qb˜ÝÈ•5áè£U õPo8Q$––°ÕŽv¸bÛz—âQt)6†ÁyIˆ;–ˆŠˆ\ê)SìiÏ•S™˜“8‰:•dL¶]øÙ x‘¤ÇþÙýùŸj$´7 jJz  Z"º Š)c7Dÿ4&†ïÃ|[÷f:—kú "Âee¢5kv#¬æjlV¢j"¡RÔe]¦¢]cf‰|œÖ8&:g«æsp¢vÒ _ãè£@:¤uG¤FJ"Bz¤J ?¸¤Nª' ú¤R I:¥DZ¥V ¤Xš¥ º¥\ê ^ZGä§}çn·R¢:êfk–¢(D¨†:©„¨Ejy’J©šš>í÷¦Mše»†n¢:ª¤Zª¦z4L0¡G¦r5x3ÍvªHCmI«²z«¸ú2!—qÿš—l.³måÖm“™Ò¶Us2´ú«}0ËjnÆZnà6¬Üö¬äV­ ¬Ãš«JSè¶«”×y®ª¬áæU%“2Ü&LØ6­ÔJLmñmu ®ãzmt Š“¬ÎJ®+“¯íª¯"óªÑZ¬ÚJ4Ólî÷§7£HO3LÀÔ°Âä°±‹®{0˰{±[±»±«±K± ²û±#{²&›²$«²%K? ‹²+k±Þ:Kûv|fv³ªªbäxlGo\·©¤’C?+s5§³>¡ï†£®f´^ij-—xgpÎóoHxBµ,Çsn'xU[¨'÷*3[sxÊ¡6ËFÿNxÖcr:ä=j{C§SC}CAf=…Wx dµ@«*a»}ŸŠeC›·€‹9{»ªcë·=;uA;x»¸ 2¸å×·VvvQ·tOµ‹§µowx˸öã¸G ¹U&¹N‡@·¶ƒ×@æCµ¦‹¸œ BžË¤ž·¹­;»W´¿»BG¹‡Ûq²K»«vÖr»àš»X«x wrT;µm[¼׳u«C\»µÆK»À«ÂÛ«¹»:&gCÚ xÉ+Cªë¶ ·¨Û¶G·fw¹6Ô»y·w×›yìë»ò{*îk°v'º·rk7¿{Z¿‰ ¿‡;¹Í{¼šk¼G½—;½ü[;þ{©•‡¿ÿh{tr{·n{À d>êk: œ9 Ì«¼Á L,ü­Ø‹·¼,_›*ñ”siå2y4‹»Þ›¾P»¿Òkx¥{ÂŒg·¨½,¼*±¢£0,¶ «kЋÁRÇ7/¾4ºFǽÝÃÄvƒÄJ÷Ã¥òºTÄÈÖ¦\ÜÅ^üÅ`Æb|~öû¥f¬zÆšÆjìŸlÜÆøÆp¬r<ÇàWÇv¼{xœÇµ·Ç|{~üÇ­È‚œz„\È¥wȈzмÈ×ÈŽœyÉ•7É”lw¸9äׯZœ'› »NÐÉxòÉg,ÊwBÊÃ}^f«Ì¨ü¥¦¼ª¥ä,³JÙ÷¾KPÄÿAÒ¨(ª+“ÔKº¤±¬(ÖW̤ÔòI·\ÆFÐÉé]/JgÉ—|®ÌJ:ÌØç3¢D}ÊÜÙlJ¸¬ØÜÖ|¤ãÜGáœçü&¯Ì¥ëì&¯lÉ— tò<ÏWÏöÜhøœÏ‰&!û’/÷òÏÐ Ð=Ð]нРÝÐ ýÐ ÑÑ=ÑýÐèk-Ÿ ƒ‚M28 "=ÒÖ´ &= (Ò*ýšäÔÒ«€„åÓ° ŒM8¹OШP¹Ó<½Ó\X•–YÇéD Za© µJ­ÔÓ 먖³Å–ÙÙbTR \XÕZÕäÙÕ;ö*á31Öÿƒ9d<‘A‘ÖjÝSÕu ©‰D…q מ¦3]Å‚™L‚ÐÑý×¢Ù¥yƒÔ„š98_÷eW­)NDHN¦ð § 3M›ž”˸”»y¨A…•…F•[XYÙÔE†Õ•ŸeÔÇñaÅAÈÑÒ‰ŽsÈŽQÝ–ØIWm¿u—ëcæ ÖêÖôÑRìdyühd ÙÖ?ÕK¦] âÜÅ?ëã-Á!KEf@50â=/0Þ#P3³Ñ.Ø×Ìš¢éîeš…“;8WÙ4„ŽÑšÞ4ŒFÈ_²Ù1Ý4]Ù—}ÓÃÀŠE…¬Á`P‰OÿR œ¡=œÆ™Y¥MPEý•ã†Í©ùðÚÎQh9Û¯[k©Q¶åb¹%cÝÙ"åÛ$åÕ*Õ—.QÜóAíYÖg}˜8•ÖŒÉÖòSn]ÝI©d™uíÝc1Šp+ð‘3 ªèUz­×´È×|ñU/Y‹“_¹h ö õß=YWÀÈW.N€õØE)ÙVÓ¸i`L© Rˆà¯±`åà²ñÓ>Ú¦•¿QPžu†Ä––è©UZªÕèNmQ$nÕ–,¶Û!»Íâa—¾îAˆ4ž.•ž™ÉMS„‰ )ŸÂÖ;…‰Û%×F®3m¶3ü9^ÿd€ÉäyŠW«™yLtLx±Šdµ’\.ƒVlÕ)á)e‰ÓMTE…ÝU¶HŽ‘f°‘ReŠÀQ®l32uqLv!ZŽ1H‹^~geÎ^Ï^Wšà‹ 2N”AW@ô¯ð“F9`6Mç½ðŒ F…L•æ•~.ÚA}YÇéîÞ¨œ‡äHïõð†éXbsHâÿ'f qâ¡ÛºmÕ|¨úXð_ˆ+‘R£ž¥Þž§®ÜÌ}Ö‚dB!ä˜8äp=TÒsŒÃݸ. ØQÕäOŽp å#ù®aåwñU0ó…ì€á’`ó’‰A÷E_ÁØ Ô^Wzuú~…«€Œ´@ÓÖŒ7 îw>î ö›äŽ…é.œÚHáb8Ô¨m†Ä!ï­ýP5bÏÛù^QíŽØÉÚ ¹—öø‡lŸÂµ— ï—1QÜ ßˆÏÜySOŸ}ñ°ž‰E5™Æwj†(p€(€UôŸ>Pÿçú‚Q’fŽA€Xtd±¨T2)”Xÿ!r*”*…²éZ]±6¼¡R D„\„tÖoÈbM·ÏçöÅžÏð=þ= ÿ> ''!2!00A?EH?@HSOSQQ%4^%bim5n%l{~u‰‹"€‘“‘# š#¢§Ÿ ª3ª¯ 2 ¼»¹½¿Ã .ÊÏÍÓÕÍ ØÝ/.Þèíëñó&ðù÷0ð›0þ€† HÐÂB F|h"E dÔ¸q#€qÀ*'‰”T¹Rˆ-_¾l‰„&M%Gn:IâK,=f©°ah,_¸xIº” /ÿš¢aÓA*ªkà`•C§Ã=yú„h!A„-R«H$·•4eÒä©S¦Pž@å5µŠo_Y_Õ ,!a[‡q&Œ±±bÊ–)sv€4ÊϦ]¾¦mÚ6pàÈ…ë.ºsíä©‹7µ½y÷ôÅøà>~  ‘aï‰&RnA@qãÇ‘)’äJçÏ¡?w s¦Ìš6±ë”²3¨”ŸR| ¥ žè˜¥OѤOUjz9oÐd•Ç«°zúü);Ö좇­Eyà¸,y‹¹ì¥A½J!Uüš0°¿pe\^éE—ÃÓ`a[æ±ÈPœ¬2hªÁÿ,›m`Œ´qDÇœsº) 5uÚ¡Gž}¬çµØôñç¶h …:h7‚ ò-ÊŠ"‚ˆÊ+± .¤‘8êÒË/Á SÌ1É,ÓÌ3ÑLSÍ5ÙlÓÍ7áŒSÎ9é¬ÓKæìÌSÏ=ùìÓÏ? TÐAßÄ“ÐCMTÑEmÔÑ? }TÒI)­ÔÒK1=3ÒL9íÔÓOA 5ÍME-ÕÔSQMUPRUmÕÕWaµ#.e­ÕÖ[q­”Õ\yíÕ×_ãÜL¼$vØcã46Leá4–YžÝ3Ú/§¥Øk}–Úg‹Ó踌Œ7\h¡UÖÙr7 —[pÙí–ÝwË]^bÏ%7ÝxÓÿ—£oí}—ßzûU×[}ñÛƒaÕ¶Ø€þ^o!¶×܇åø\f«%—^‰ýÝ÷Þ~AÙ܉=fXdŠQFXåXîòâŽ#6x^˜9Ž8æ™k.âë•ã‡]ÞÖæ›iÎùc WNúÔ–u&9Þ%—d‹†šè©?&Øf¬C¦×]q¿Î×ÝŸŸž×jÁƸ[™•nÛS¦)ÍØí¹éæîºñÎ[o>ïÞÛï¿•ÖÀ /Üð2û>\ñÅëNœñÇ!?ØñÈ)¯üÖÉ-Ï\óT1ßÜóÏ;íôÑITôÒQO}ÐÓUoÝõ úC~Q3—ÿ¥:ŸÓˆáŸ*)EùéR–›ÝLªD‹ªO©æ“ªJMª8‡úÔ¤vÔ©&5*DÏéÕ¯.•¬6½ipêÏx‚‰§£ô©Ë€ZT—^5 $­*RÇ:ו4®q}jUíºWÁº”¯J%,PÊW þÕ¬îÄ!ÒêÎLfž´§ #ÛXÍn–³…Îc‹Ùrþo¡th=›ZÕ®ö¬T@m2YÚËm²í%q›[÷Ý ¼å_l{ZÄb­McíRÔª7К­Õíý|Úç>p¹Îe pÝŠ&FšŒ!{\uw;ÝÞŠW‰8|ìy¯ÛPÊV½~„ –\¿-9ÖE¯ÿt™Pûæ²ç½ïmïÛ\þJÀýݯ€¬_û÷Àh.yQÂÛ#»yÔ.¿ÚE´†!7ràï‚ë;àØÃþ=Nh,bü6ø¿$¶îˆ<áCX~î_…Ù^?Éwov1‚ãÃXÈ@°„ù[à"˘ÅMŽñŒi¿SX½mµð[]åBYËÄq=uŒÍ.»ðÄcÖá—-æ{š™ÍmvšÙ:[š89A¶óIÌ;d7ïÙ‰U®lœÕŒY×~Ø~Hæó¡[gÊÙy¾•p‹‹Œ_HëYÁLv°‰|gDkYÑwbtóMè#O9Áý-óŠ-]bSgÓnît—LÿÛºP‹xÒ†žtÁ«dU¹Õm~µ?­<.÷šØtüõ¬}Âa›Ùb<¶ƒ¼e7›ÚKœ,öþ¼èdÏÅ!Æó·{=ãiW›~Ï”æ3£)Möb9Ëz~_tÇmÉx“ûæN÷½ °nv§«Û¬æ5‘+MâG7ĘNõЇœgICZ×·o­çÍl{OÝù…p„ßšÎuÂ_œkoû[Å _²Éìd%Óû}?·¹õñŒ»ûߣFù  žòœ‡œÐÍmx©%Ís€‡<âÅvyºŸsŒådz¯nî¤_|ßOo:þN}õ“D]êJ¯ºÖÁÎC®Ãœêìîø‰g ?ÿqƒ;ìäûÔ³ûõžkZíïf{Û©ýv‹ÇÝì8G1Ðq}ó'£|à™fð¥ ÷êÝë}Ÿ{®»óŸë:Äi?¸Ðë¬ø2¾ìXN;æ…tÑÓWð´.=ä5®ùržïžWýë7Èú+ËÜê°·}Ë+ž{²·þ­µ¿ýï¡ ûË\©_û?_ãúø ,eã]OóðRWúõc~óølkn»ÑÆwøÐ)-ðð#¾Ö¢Nõá/ïqìßOû %þÌí¬s’›Úïà=ÀI]óŸ|ô©_¿üG_¬løˆÏÇTîþ ÍÉP‰îôîÆ ðÿÐÏ ¯÷$ðç§ýbMu®¯•:ÿïýD°p6pMe¢íU[Jp]ÐTZðeðSbpmSjðupRrp}Qzð…ðP‚pPŠð•pO’p Nšð ¥°PRp ­0Q¢ð µ0·° % ½0 a­ Ű ¡ Í0 ©ûÔ° ƒ Ý0¹Péð Ù°ñpöòp×ýÐMÀð0q ±ðqqo°q!1_p)q-ñO05qûÆ™@QšBqE±IñM1QqU±YyŒ_Ñiqm±qñaq9BžTf‚:Ñ'©½D%'åÐYÿ»D¯5Ñ L¤±M0¬N…¶Ñ ¯±N>iÑÆ°O¨ÌÌäÓ$ZºY‚eÕåD$ÂÖìˆîMÊ1ÍΑNÒ(kzæ^ÖhNòÑáNð$E™¤#²’™±ùÑZ4Œm’ijÇÓ° Ñz~‡„ì1$ä)$ù&"7‚#Í$ +eT²;q­ø&‚ä1€’Dé!K’Oò4Ò Q’Mô(€@qp†ò5Å$5â'ke Q)e…)=-Ùœ’ez² §2a2#®òU ²·ÒUºؤò|Ȳ,Ͳ*ÅPÌr-Ù2|²ò%ñáRæä4r.÷­.íËð2/}j/ùR—üò/A)0ó„¨é–31s1³1ó1!32%s2)s2ƒ;httrack-3.49.14/html/img/snap9_c.gif0000644000175000017500000000477315230602340012566 GIF87aŒŠªÖνÿÿÿïçÞ¥Œk,ŒŠ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tª!X¯Ø¬vËíz¹ªxLÞ g@:­V°ßnÆZo°Ûx´ã>¯Ãóxw~uƒ…e‹ŒŽ‘’‹a‰•‡š›œžŸ‰“¢£¤™—g–Ÿ«¬­®¯°±²³´µ¶%_¹º»ºª·¿ÀB‚}yÄ{„ÆÅ‚Á<¡¥ÑÒ¦¾ ˜ÕÍÎÛÜÝÞ*ÐÓâ“§×ßèéêëìíîïðñòóôõö$áåhýþzÿ H AcÊ ,(!¡… ïIœH±¢Å‹3jÜȱÿ£,^ CòÂæ±ä( üÃç¡IùÆÉl´ÏZª—8sꬢh¦OF5œÛI´¨Ñ£H“*Ý!²©S-$—J½qNv²òû·Lá¯nPö““òë0•]µiëó§ÛHA'œ54µ®]Omßêõ®ß¿€ L¸°áîòRÂÖlØd 9.{ðá›±.•9lSÕ+âÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾¼ùóèÓ«_Ͼ½û÷ðãËŸOf´ÖzЃ7Åÿ{—CÕLcü@DWaݧƒAad—ݧƄ6´,HŽ/whàˆNtè!\_ÜDâŠ,‚ç_-E€ /eâ‰úô%b‹µÌ¥aƒÃ0VW–YXcQ7âHˆB©ˆ:£V)]e1©jä+ÿÊ* ­Ì$ä­¸Î׬³@[í¶Üv ë³kÆ9µ.¡E®·Þ0A¨è¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,Çpm€Ùh›ò¯’á阒º9ídvH¨³U|ä\•¯[]'‡±b —Ž™¶ì*¤i½£©Oƒ5¬‚Q#C¬e‰ JÒJçd‹:ÝË{)Ú´Ùgƒö’”ͶuêÁîÜxç­÷Þx¹ý6%rɼ²}.¬Ö@ÛÙfÕu¡­—Ú‚-2á]SMafÿ¯ž[’ã³Z’¬Ühηú‰îçnA~÷èÊ¡þ“ê¬WW7«Çnûí¸çNC.µëNŸšZ?MÙÐCy›™sƒtø| fÊG¯á±¾Ó¼×é*¼ŸÁoæ*å Iý*Ö¦WïÌ觯~úæ·ïþûðÇ/ÿüà¹îS̽›÷‰Ï2NΈOB•Ø1ÆhTb}êËhæÄ˜•ûyGAK‘ÿÁ¹’%7 R¨Váì{Æ¢‹CˆÈÑšq±‹ÔˆÛ†Èʉ£ü3¢G«vQ˜r…‰„,"õú†R¾¨ÔŸ!C¡FuZj>åg|wy+¸îªP–Ú W,`$»´Ÿ&vd>ʨ#WÉDB#œÍVXO¥Ä£1ÝÚ‚&é¤Vl¨øâN]+[Jú £ÇÃá_nëˆr0¨²Ýk£f‡«Ö°ÿ±•”–‹ls•ö\Á’uºØª®u½Š]giw»R n#âÊUðÚm¯èM¯z×gÞöº÷½ð¯|¹eÏ{~‰Žaº¬Oë^F–‹¿¬ÝÀZ µÓ¿†d* EúCA:•|½-Ä‚ªÔ;µÁ”ÖKŸŠ_ßVÈ\Ç+¤FcûTÀb˜´K5*gúÅ [-ÄDUpéW4:à³óͱŽwÌãûøÇ@²‡Ì£úöÈHFìÞâ(àvWVµ+rg†Ù+nðɉZm%É‹˜RX¶”–ó–áØÂÖyƒ•jJs‹cáTÂPüòjÄëSæH®Dî§Êæ<aÏk6žý¬@—ÿÐ90ô˜ @“·ÍŒVÁz'Mi¼FúҘδ¦#mä${º°åu3›VÕOý6¶Ãšc£Ë @kF60¾&¥B‡>4Àø±ò¨ã4`¤©ùÕ¥)ÆhÆB?‚‘ÆC…°‚ IÏ0‡Â=é¯;û$üʹaC„skÁäâûAÃØ›äd tC„,KÚÓÆíc‘úˆ=ªÁí¶Kenz ÄÑf¬&\ V\#QÖäϪ|np…à¦$‡Ào³BzÓ#hø‡ Δ0£4ÔÄ žqTúã xÇGNò’›Üš¼;y,N¬ëþt ×-ç´Z¿Ô= eTN¡µ¡ ùtÓeAy1Èþ1†™,î +;ÞE—G•ê?!³œÝOô±µÈà¿XÆMòÓA,’»g:¶ä’D;-\ž{U¹Ú×Îö¶»ýíp»ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿù¥I;httrack-3.49.14/html/img/snap9_b.gif0000644000175000017500000001051115230602340012550 GIF87aŠŒªÖνÿÿÿïçÞ¥Œk,ŠŒÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎmÑÒÓÔÕÖרÙÚÛÒÏß±ãäåæçèéêëìíÞàò¬âö÷øùúûüýþþÞÅ›gæƒÊP¨!‡ þ©÷¯¢Å‹á ØÈ‘ÿ£8xÏ@”ø†dƒ&ùPÄȲ%F> 9f\›vR>@ih¥ËŸ@óÁ| “fœ –S ðOœJ“2Õ¡S”ŸRÝJ•œT§S‘v{ÓfV¯a«‚êÇgз.‡:(j´&×­<¥rÍ[uê]¬Ló&¼7°á»{ùò|“1bÂ…»úä®e‹rЭ†,ÞÁh%ûͪ—ô_½¨M 6=º´kÔ“#·~Íz¢€Ë¸3ÎÔ,³­²ÿªN=y5ìÓ³Y7-ÎüqãÒæb/ŽÝövîëý23ØìÛ pÁÂ_#Þœxró³eƒg¸1ìéîûTÆNftÜ»sQ.ý<òÈÿP¡W|µ7žc©­w€ÇÉg}Ú3Thùé§™µœáqÈžyŽ…¡rfTb†¤…öYz*=a}3)T¡…ÅètR$ó½x™v ÌHã06Bä 9ê øøc/Ku0¤ E’øõ¶ä•ŽD)åOT*‰å—Pº¸¥e]Z æ™…h9&KeR‰æ›z¨¹¦nx çuÈ9gEøec&ž€â¡çžþ¸ãf ˆBƒÅn‰6êFGF*餔Vj饕:ªé¦œvêé§ †*ꨤ–jꩨ¦ªê$Ü´êê«°VÃ誴!Ž;¸æªë®^ÍZë¯@ J(? ¬ #að¤ÿ&-Ë€³y;¬>Mjç±)$‹´4Ûu=‰9-›¾Vi,¶'ˆ%ÚÜÞ讲à¦)î¸tÆô'º.¨«Z¦µàp}™ hXEµVS¡Yu¢ˆ_©…Wm”ÍK/Ÿå^‹o ž‘ÕÞtØñsþ)(ÚÀƒ<ðhäLˆ´Ðf¹§{ÚY “w`z··®ÈŠžs@—üßÊ·œ]Å÷ÆŒlX,ž%žÍ–ÕäÎ(žlspAß'4ÄaMnI+Âwýý;`s=ÇKu|ÿñ 2Öe‡HdÑ^SÏ}‹ ˆφ âaiíÎâaítÖ´5ËOˆTÞz{ÐóRbiŒÞ‰ÿ3,¸æm¼â³ O}U¿,F\w½±A¹&í.N÷é÷¼¼:*­›û?²ÏnJí¶ÝŽ;Òçê.<ŒÓ›ûðÈPü¸Ç'ï¼ËOÛüóÔgý°ÓW¯=×Ú'6ao/þ\¯ßn(ÌãOÀ¢é·ÿ¦ðÇ/ÿü’ºoÿýøç¯ÿþü÷ïÿÿ  ؈Xð€ì“w+^9ð Þ±Õ½ÛIð~ÚÚ x÷¶´ ƒm?kLotµ™¡‚°» Ï8H« }ëà‡bÂË=# RU‰Ô{$-)ªNº'ªôT,“K_Zª˜®i¦4•MDŽӜ†j}WH©OEE¿¢õ¨ªR—ÊÔ¦:õ©PªT§JÕªZµ ̪V·!Ô«Þ© «X×ÑS¯¢i§[*ëö\(¹ þ@˜ê¡- qŽÓn>„%(Í™‰¶u›õ,]=ýº´JÉ™ç\{@؇˜sŒ «¡Õh×»â±ýÔb5·Nxrnj¤,XFLÒVñaÈì(G&$Ìv™•µ¬„H*ÅáU2Ž×,ȬYG$æ±iH è?”"É^’ŸY0¬‘ ZPÿ·j«Î:‹Í@¢-™nó g’ÊVº‹š™ Vle‹Ùêårºï,¥^…ÆÛTN·Ò}ìËHÅ47 ÊÕQyYÌjfT=fn ×]n8°”ì¯29¶†ü¾h¿Ï‹æ1oÖ[W˜?ÂîЊ¨Ú9Ⳛcpp„ ¼×¶©s°lÝ·É9RŸ§åZ†±ÛNAªgÅø¯e™‹c³bÌ"†Z}¼4 ëø®C&² þk‹ ÃHÉ r2v’ e Iù:T®rw®œ›,k™3\Æ—¿l”0飼d¦‘™É„æ4ë¨Vh³›}ƒÔ:ÛSsγž÷Ìç>ûùÏ€´ Mè:mõÿÐˆŽ†œ ½ °ŽõÑ3£‰±æ#-Z{‡¬´,à†E2•î$mõš¼¿`Óõï-B=%ÚN—ª…è2ÌD\°($.u7ù…cϪX‹‹ ØÃ¦k²Uyœ¹.µ¾4l`f'‡0ÔT¤ŠÂ ‰[siÔ÷EdÊ;ÌK“ÂÅ~o“ÍÉd›÷Ù÷õìcÖ{àhçì–¯°v\\ÝiÝÕnÝš·<áw#7òn‰¹aýaL‚[ÀßÞ¶¸4‹€ ^õ¶·èÚ¹“× ØíF£;m\ ‡¿Û=tDmMnJšÐ#7¶l~éIÛÚ8*¹ïNîr`xu5ß²Ì-Øòœãæ˜ÿé¹ÏƒtŠ ]ç+øÑëRô.éì{ºQîLõª'UêXϺַÎõ®{ýë`»Ø›è²kUèc7¤×i´§½MˆÛmKêSk0šþ÷Ü’þñ¼fÛ¶¯^§oxw'U"îGóaàÑÉW þ "È;%ONÅG\±õU7ÍB[qµðÚ`R“v0ׯ¹Ò—±5•[˜íøntˆÃ›ñÕõXá.¬áe·»^ô&|IF ˜kòûà1“ K­ÄÐ¥oÙ[y¼8ŸN8ò«Ãú [þõ˜Om»³8Ü‚›rÆ¢ü ]•ßãîvõÕO¼ëõ~1‰°—Ö¾”&[7‡zïêžþ柾ÿƒÒïôˆ,>û݆2×Å] v|á¡K—S{ØD2Oã{ɵs)DoØM'qz’±y¯å9‰ôY'z ˆ3Óf"8 ®•Xr|x¥,u÷vv×5ü§~,¨ˆ((sƒcr{Pƒ—uƒ8h <;>øƒ¤„³E„”P4„H Fè2LØ„Ÿð„4'…N¨„l…VÈ pVZ¸…š`ubxg`X†fx†h˜†j¸†l؆nø†p‡r8‡tX‡vx‡x˜‡z¸‡|؇~ø‡€ˆ‚8ˆ„Xˆ†xˆˆ˜ˆŠ¸ˆŒØˆmhvx@_èˆnàhlw‰»R…”x‚X˜V7‰13ë÷Vñÿ"ŠS؉‡U)ªc?¦yE°| 7—=´Y£°˜o£0‹ÀŠíYœ5M®%l¥WELO3G³N§Èz´xPÃÇxϵ5ªö1G:}$€›NiÔŒ|÷Œï2ƒšr[ÉwDƒs5´§€Öe8Š#ŽwÀ‹`ƒX˜¦`è•jö´O»W5!ân¤ty™öâR:HptUÕØlˆ{ÚG¦Ix>àŽ"aô•Ά€/¶‘¥eO¢ì”$©‹™(é¤!Ü5,6Z(Æ[4~ÒÁqWèŒ1²#ÙZ%Ye$‘“t’䣉\·“¥à“¼”A©}»ˆŠËÕ‹›( Dÿi“FÙ”uE“ñè‹RyOÙ#7y•DC•i•\ [Ψ [–®Ãzçc–ŒÐ…T–j c—Gõ–tY—vy—x™—z¹—|9‘ø—¯â–}I–ˆ‰†ÙQ9˜¿§”úõ‰ÔŠ00ƒ£Ó}s4I)«ˆ&ˆ/‹5D Ñ‘~Ä“e•"Ib¤ù%¶è éV)šîw ¦i.¨z³YÑ}Î7q©'ZH:‘äy0¶pÓf ³™™á’·™M qC µYÍ9`ø¨’“ǘÆ”*ZrÓ~Ùä3ѵ¹™‹Ì“ü‚|þ†o©9KØ9bÚÉš¹œög XŸ\„2¹ÿ) öE™¹µŒþ¨ÇY–ܶnë©ç%ŒöHð'WÉy‘ ªž í)dwÓ$ÈY]ÚBÍÆú6€ä_¸E]¥59Æ9¡OvŸ´y}'Ÿ&†’€´ŒÎ§H â’ï1‚Å(m*£œ›™>)#H_5·ožYm&:eïù™bG¤ºx^I?iÇ-ÊžOú“‚©˜Q ‰©¥WÀ¥Yê¥ u¤X–¤búŽdÚefz¦y’¦bF–]ʦRpsi)§ïuvZr¹§ó“§~ú§€¨‚:¨„Z¨†z¨ˆš¨Šº¨ŒÚ¨Žú¨©’:©”Z©–z©˜š©šº©œÚ©žú© Zh€ÿ9ª\ªsz˜¨Š+qjª)0‹Ž¹@IŠ®IUj+nzf˜¥÷ôŸè«/466P«D¦*jpÄW%35 ¬C@¬£ÈŒÐŒù)FÜgZ¨õZ”:ÈèŸ|‚½™OþrEØ“·ÊfUY¬$¬FAŽÓé£êHwV~ÛmÐ×oà¬Q|úÚ«ß™ià—7#Xàå¡H ¢kŸåI®WZ”µY°ÙWJO¦Æw¥È}9ª þ%¤”õ°P±â©®4q  Ò­ k€ š] ;W¥˜èX™SùŠê²(KÉ¡&{ñ:Ÿ-+š« ï—¯ ÿI!ºzoKË™—sbatq®+™1šwEæ­0c3*£mz¥>*|AÚ³/…¶L[®–v®…·¤®À¯Jʪ2 ·t[Xl+jn{·•·­¶·|«v¸G0¸„k«cé'«z¸!@§ˆ¦Œ«l9¹À§˜‹g–»¹œÛ¹žû¹ º¢;º¤[º¦{º¨›ºª»º¬Ûº®ûº°»²;»´[»¶{»¸{¤º»¼˜«[˜©¼Â[§©û„öªÅë·ÕW-’²Š–k¼î ¸ªâ«º¬Ê*XÕK}/ØRkŠ*ÔË,Kö;Ú;Û+SÝ{*«éPáëj;¦åk¾Ò›*¸yž}tfÿƒza­£ÃyÆY6ö'¹wïËSçk*ìê}€C¯Ö胯kó®ÔŸÁeä[À©¿Þ°*¶±B»a’t±ÇaÇÇÀÆŠ~œÉ缜¢²JËoü8!ü³úHºu±AԾͪ¼Oê´‹Û.|€0üÁéIij7³|o '¾v½úI,¼)4|IÑd54–gÁŠÂ(œÂOü•¿r’ö[¿S;ÄÉY‚âµí¨nçøœ:,N|¢PúÃ’:ÇHªÁ¤‹ÇeªÇ£ËÇjêÇ¢ ÈbvÀƒÌÃ8+È¡KÈ;§•˨ŒlÄ‹º“ ¼¨™›ÉšÜ§¹ÛÉžüɠʢ<ʤ\ʦ|ʨœÊª¼Ê¬ü ;httrack-3.49.14/html/img/snap9_a.gif0000644000175000017500000000477715230602340012570 GIF87aŒŠªÖνÿÿÿïçÞ¥Œk,ŒŠ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯X! à º.`ð,Ì ´š¡n§ÓhÀšý>7âáz}¾§Çõr}trs|xwvvn„Šyz†g–‹Š|‚’ˆ‚Ž“ƒ ¢Ÿp‘‰™ª©“ Y±²DŒ³#µ¶a’¸0¾+À¹ÃÄÅÆÇÈÉÊËÌÍÎÏÐÑ@[_ÕÖcÀ¢£¨¯®µ»áŒãfœ«˜žwœé„ì”äÞƒ€îßÙ¥—«¡÷•íçøZiôH?V¦Þ•“ư¡Cdáš {H±¢Å‹3jÜȱÿ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœIÓ5k×È@ˆ§N«ƒx,ñ”7´]½BÎ;•h[·˜~úGÏ)U¥£jjÝš‚W“‰ÒÀrK¶¬Ù³hÓª]˶­Û·p¥ÜÄùÛ¾ñr[Ç7+^±e0ŒK¸° t^̸±ãÇ#KžL¹²å˘3kÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾¼ùóèÓ{Þ".¢â¼´dœL¯`÷{117#?þÿþe7—ÕØ¥)GõäŽ)èÌAý@XÔ=G1¨ %Ka•`<°ìq†JmƒU‡ nøaˆvx"S $a>öh z4Öhãß±×^ï±± ಣ_ô½Q¤."̨Ÿ_õ}µ“8FD‚’8n0]:øT‰( ä]{¨MRîã„%¡ƒ>%u"|jÞš°HµS`LBU/Tòf™U*è „j衈&ªè¢Œ6êèI:ÙãŽ^uÕä‘€5_“œJ@eŸRê£W\‰S–`žI!‚Dy’rVãš]*cŠzjØj…0ÖÊ¥ªi‚˜'©Äkì±È&«ì²ÿÌnejNðEùc˜l®iÔ¬pH)d@ìðÙi³à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿,ðÀlðÁ'¬ð 7ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lð³]€êO\‚0T¦žf Ö¦K^0ª 7Û| 7 “ósÔˆS`BJé§Ñ·îêâ„EwÓÞž±þÚÓ´—|ÙôŠPêúg­mˆh'[Û)£·ú‰f˵UÚþÜb­‚ÛÃÐmŒ/"ö¤É|÷í÷߀.øàˆ%ÑVãYBâÜŒSäË;¨3›hZÝÿ–¯j·âÌ¢\âÜfÍ“ØY1níª­tM5Õc#½ëÓm«eƒ!VºŽëUe”´OYˆ:ÔÃ*+@+V½ºí6Âܶ͸yÏ.ýôÔWoýõØg¯ýöÜwïý÷à‡/þøä—oþùx®2óÁK^yÌ”Ã,ªÚðO~æÁl¯þÊ龺™t*Û«ÖFÀ0aÍqVƒ]Bp‡ÀãEBtIVyw¶øMOy`¢ÇfÁƒè ¡GHšð„(L¡ W8“H=yÚ²ß"(E¤oÁŠJ°’ 9²?ÐÝÉEW«9ñ82…­E]á±ÐCÎm‰fÕàïx¥4ZÕé[KÌ¢ÿ·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,gIËZÚò–¸Ì¥.I€^úò—½Ôà.KÒÄÑe`²Oýt?ÈEk~EPâþóƒž-³<Ï Ãúît¶iµmwÞò&Ÿ¦‚¼u3[Ùr„9…ø?éŠè”“7Ññ?Û­Ážª [=¼ÂÀL°Su>Ê!ëÔ´¥ñ󠨸á¶j¼†V­EOи°ÿ‹Ï)ÎBÀòÔb'Á«0®i «ò¤"1õŠVÔ*ž×6aÁcžÇ4L!:S½hŠÃë•®Æs“Š-ZsÊËMÕ–7áÅÔtØJ*S5M^”v)5éˆXŠ ‘®tRÅPI¡Abuiœ’¦pŠy ¨´E-ëzÎ"ÔªæÜhñÜ §µ60i^ʆB#T§´N•žyèMÑT4­Å•¡…E+?o×Vt6¶}Ü€d'KÙÉþ‚#bÅÞ,ˆ³½ ó³  ­hGKÚÒšö´¨Å%0WKa¦#dÝ5“Ôd¶ì/(ð™ ![3÷émJÊÜhÃ[Šóê '.ꣾÿà-°/M.>ÝxÆð°Ö]k:¹õN¼ê¡¥«©Ñ깉€¢M¨ÀsèH͡ψ`÷žÛ}¨ ŠûŠ'Òtì….Sý€÷yÔ·u]G¹ Ž.¾¾•]®v';x‚tXÒ]N ø%ßIp¾†;•½zß ~5Šù¸Vê°8:<©j¹ .ªŠ§Ö)ã¶ ÅëU“‰© ¿Ž»âÜè»ÝÇ®4¾;e®ŒÓ¹X™JWží=,uºrb÷À/bl@Ãk_ƒ:øœ9¤àÕ¤³~)ݯ *KfÉF'³<{­š×Ìæ6»ùÍp޳œçLç:ÛùÎxγž÷Ìç>ûùÏ€´ MèBúÿй`-0]‹h+ð‹ Ì5•43úEš÷[\þ´÷h*ù¬Òò’~óû²ñÞ5¤}h¯|µTS+ÏÆO<.ËËåï1¹G†tà:Í4!w3¨@y±æL;5Cy­bÔŒßÖ4£æ,áxm[;uÄ76œ,m‘¦Ä9¯UŸtÔ®ÚÁ;ï3 -cª±¦‹+Amõ\}6t¯Øn0>ßÝ8UKùu^vöHÜW1ëpe&3Ьé0¼Ñ¸Ä'NñŠ[üâϸÆ7ÎñŽ{œÐŠþ%£?N{¿ .k‹«éà>”ôõÙq)WjÇ…uÔï¶+λ­—2æSÌ6ªµMô1-õ¶n±šÎUa;}ŸS¶»žï×>Ú½9§9ʘV‚æºêõ¹'^Y’›ýìhO»Ú×Îö¶»ýíp»ÜçN÷ºÛýîxÏ»Þ÷Î÷¾ûýàOøÂþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½ìgOûÚÛþö¸Ï½îwÏûÞûþ÷À¾ð‡OüâÿøÈO¾ò—Ïüæ;ÿùоôu;httrack-3.49.14/html/img/snap5_a.gif0000644000175000017500000003522115230602340012550 GIF87aª‡³# )“Ž^`X‘ŠzK¤›j°§¦«™¥Ä»ÎïÖʵÖνÎÎÆÛ×Ïãëçõûùÿÿÿ,ª‡@þPÉI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ï´‡A®sèB.ð匋F.©Ë”Í‚ƒÐ¬.¡Öl@JÕF§[‡0<öšµ‡G÷ùø9ÁÙnNN­Ïuò@w¯ï÷퀂u€…z…‡ŠŒ‰ˆŽ‰Œ‘•–—˜™š•ŠŽŸ¡ ž¤¢¦¨ª©¬ª®©¦±°³²µ®·°·»»º¼¿ÀÁÂÃÄÅÁÆÉÉ·Ì̵ÏÍÒÐÔÏÑÖÕ×Ð ßÞÞ éê è îéé 7ógþÿç<ÉPÏ8g !p`A-Š „臞‹~*Þ!4¨#ÇEþ†‰ id#J“6©\Érå§K¢H5ZŪ•̘«rÚÌùª­X>qéò4h.eH“*-†ì¶iK³IÛæ,Û6©T±Nµj•Àº¯`Ã~í$v¬sÄ3`Á7¶m §6Ü7ø @¹gåÂÇö†¸‚½åmK·.8æÞŇî7v•;Þl·qgΞCƒvÜù³iѧG§^­µkq¥_³n z¶mÙ¸i³Ž ;÷·Ûµ}»> ¼øpá¤éïÝš÷òçÊCïFnÜî¼äwÓõÕÍœxóîÉÁ{']/8÷óÐÑS_¯¾}úßìß»Oÿ»xáòåƒß¯ú|çøáþà|êg`}Ö¡C`6¸ ƒ >(a„Bhá„Vˆá†v˜á‡‚H¡‚†hb‰(Ѝâ‰+¦Èâ‹.ÆØâŒ0Ò(ãƒí óÀŽ<öèã=6N†u“€‘µ£ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜d–iæ™h¦©f“Ýèä›p6à—\tVÆŽ‘HJ¶Þ|Úèg€ö蟂J衃&z[›Àéè t: à™¢ˆŠé¦švšé§œ‚êi¨¤®Æè£¨îéðQj©žêجmåßy¶"—«cµ:V™g¿Òöë¨ÄŠjl©Ç‹ì²Êþ2xjª®:éÞäùà¥wÍu©=l÷ ` ”GŽ‘ÉšßÜŽ7àŠs©Ý² ظIÎÛב{+ºäÒÃn:äé³ÉLðÁÍœ0™> mœ’öæjµØ®Ù\j¥U¾ÝBÖV=áà…qó5ð¿£ÝYŠÁ‹$`—–LO;|ó²5kŒ$^zÉ*+’”Ó[Íûæ oÇ8«ó3Î÷2ìôÂP+,õÓSßèðÃ@J+1µGVŒ!|`GÇ]u½ÝzÛ†çÚU·MõÛQÃívÜ©1º€4ꀰϨjÝ*×ÖBw1»}¥uØ‘æœs2;Dç|XZoEyâþàƒW>nÝ â6ß0²âx-É™~V^)ÿjXÊ“EŽäYéÀÏäÚ ºææÔœWé}Ù“;¹Ó¹ïÒ†mž;díà<@º«Ïîü\q)®Ï•Y^íϨÉ}׿m̲ⓥ+4éø˜-÷útÏí> Wcí£àâLÜ5¬2ž-6ÙjøŸÿê»û¤Ó¶´µo€< ‘?ùñˆ~o!œ×Ȱ@ôá_ÕGà |_E8·:ðDK¥(†¿õ°C/ÄÌÑâE¹”ñvŒÃ^óH†ÙéÅ.¾‹L9ØâÛEæ/‡3LЄG²Ã•Œiz¡Ñˆ×˜) MeÚ‰¢þ7Â/ÚÁ®aû@8š±Œ}2¡Sh¿Â‘G ò ÷ôF4Ò±g¬£óh"5Êl!£&G ÙqÄã!¹GFêÆXä ï÷ ^†\.+×v ¸Ew «uGË óòÃé…®fÜÀÒ.†:o¤2Ú‘ ·„WDU–,\+› ùàíðë[ôK(Ï’ÊÆivå°/1Y$©Ò{|é¢ÍºÕ: (s/ÌÄØ5ͱ³hÊJ;ÜZ>¨Y½seI3§Ê„Kuf]èð,•çÈz6òžTƒäÃ$ùª¯EGDM>2˜› ÔlCÚàqĶ ÖFO ýƒþÂ&À°Yglø´'"7Z,}B‹Ÿ, tê¡0Ç¡#½`@9zÒ‰fô¥,©‹<š*RR£ U‘IÍÑ”‚q0#eÔ¢=4 \Ä7I7ÕS;%iUªH£öôŽ8µªVŸª€¤Fk©õ $W‰U¬µ¬,­PVǺVGzÕQ6uj[·š?ª¢Õžj¥«^Ùª°·BŒUamê÷:W†Ýõ¥yå«b ›F´œR` `ÉXÂZv€‰­ìb/!¿¾)®ƒÝ¬h5KZΚv´ññlÖ"«Â~–µ°}­lO;ÛG:ö±AbmC[ÛÞÒö·±.cU YÀJÖµÂMnp—þë[æf”¸óÓ­X›K]åV×¹Øí tskÜÖ†ôºàµ®x³;Þfm÷Ò,y×^ö–÷½:¯ªÒ‹\÷Ú·½ø…o~'$_Ò÷»ú ð}¼ßû¦¿ ¥,n$u#½ŒŒi¿Ô ÑnÃYiÑSèØUÌawDýu@"5âX½ÐaðŸ°óà–9ÿ¤"iZÌ© SÔÃ8&°Žb“¸Ä(fO †Ldl8ÇN2’ûÓc›8ȃÊiE:e)¯ôÊTƲ••¼ã%wyE§ª0dà#UÀw€D<Ö3ÀÇP6ŽŠ¹<¡ ?˜Î^Æó—Ýâ7;yÄ]°zæœþ"¾ÔCÌï:4ºnpsŒ¹©G’ÆQ³vi’nK·$ÝÝ’ÚyÏy5¨Ôg7›8Ð7]O4wÆêV»úհ޵¬gMëZÛúÖ¸~µ*õÌkQ÷ú5¥±ŸIŒj¹ÎH¨‡Ýì–Íl_8ØÃös±y«Çü.ÛÙ£n¶x¡-l ×ÛyL6¸ÇíµrÛÇÓV°¶×Mnv—;CŒzˆ¼çMïzÛûÞó¦Ã<ÂïxÄß„ ‰"þ ð”´äàO¸Â^œ”b'ï‰-Š•Š[üâϸƇє]<å)ÕŠÈ£ ;ã'G9ʱ¢ò”«<.94ú‘#èC¸ ƒþçÀç;×yB¢ Èù˜‰”Ø O@úÎÕð…ÁêC'BÒð†-,DÄ%š›p:´Ae?ƒ¾›>XÄíüî·ÜCbp‚›%—DÞAÂð¾#ü%ŒüM8ÑðÁ;\'ˆß‰ÄÂø£øâñ½8ÊÆ'¿ñŽ{\—WJU2¿•«xó\ù<Ê—ÁœËÑ^£Ü; xöò™7(€@¢àX´l]îoïƒÚ÷í.v šP<¢ô> å}cãûÝÇù1Ωòoüé;ßú×Ï>ó«}ªÊÿ«*‹òTŒÚçÈÄGŽhÔ²™‘¦öäKK=„¹ÉÕþ„ËdŒ‹­‰9´Èxˆ³s3­ÁJÛ“Dgq9n1aï&RåWWˆtm-eVá'nS5ÈS (~è÷èðf)‚ 8‚ ‚%H‚&˜‚(¸‚'Ø‚*è‚,ø‚2ƒ4ƒ68ƒ7Xƒ8¸ƒ:؃9øƒ<„>„D8„F(„HX„Ix„JØ„Lø„K…N(…P8…VX…XH…­G9 Øn^Ø…`¸Xµçndø…e†ä&¸5_ Ç%h&e†rˆ†tx†j``¥ÓU‡sh‡}ø‡ž‡Ýµ[êˆ~ȇˆÈn‚8-qæBðACûÇIýÒCªt16T‰ù:óE¨ÃNس/þØ“ÝòžóBóbNOD<žC2Ôvˆ®hˆã¶ˆ[Óˆ5RVúSU¶Ø€ç—ˆ°È‹u(‹LõmøQa‡E6DÑÔ;—Š?£-æp<²2ìrhæÔLìpŒ,s¿Ñ=ƨŒ&‰—V„zÓ(D³ÒLçR苯莌%ŒÜq8÷ç³R?€±¥Ä€Ñ†ó’>ISûWó:îPŒ3™MŠÑC’á´cm‘ÿ˜²‘¦ó"lÑ<™4«Ó‘à@‘Ô“УCµâûV™ÆçБÒÑDd+îà’D”Ù2¢‘é8:´سÙC=Ùþä3=)£<ïø”æv[eöGÿ•jptcÕ‡{ñ´”Ûw+ûâbåAGÒ÷}Þ$¾‡•Óѕڗ•Ûg{¸/ÏG}ÍÃ-M£–à—|ð˜—%oh•„¤‹»x|8T·ˆ—‚9Fä}½•R×Þå—  ȇ3˜Ÿ1.¶a¦ŽŽ±”ÑTëà-­¡€_”eÕ–˜íȘ¬9SR¹† &!ì70P ° Ù]'ób!|;¤$¸¹E™S1ÍÓ~ÊQ| ^yAb£œÊ¹‹‡z 󚸛äVH«©AÓ @€I­IŽIˆá‰‹†Ô„ùè žÀ1ž{8–dŒ{þQa!ù-ŠÆŸäI‡fs12Ã)5“L|Á CΓi‘6Šü÷‘F4äCc&i–Lš´ŸúK=Ô«H x!45“<ÈS27´Ê8vá¡ÁE–¦hÞ’ŠC9x1¡“šC†6¡Ý‚£‘±ŸõWžìIBîI‹™uX"H©e–U¤@ºžU3¤ô¸@R…¤ê‰šp„š¥å¤Aú¤¡"¥pؤ:u¥h¤X:W\ ¥^êšj›UilïÈiZ¦Y•¦kª¦Lf…xzžþ¤¥bú§]:¨ ¦y§˜uVêRˆJ¨£a¨pꨕµ¥~*©}ZÚŠ–Ú¨þR³©Aš©…x©ž*ª¤ú4 Ê©¨:ª©Zmzoª©¥ªª²«„rª³ºª¸z«(b«´š«½ª«6«¾:¬ÀJ¬Ô!¬Åš¬¿º¬‚¬Ìª¬Æ­¶á¬ÜAhëùiÒú¬ÚÊMögr2¥ v( ¡*i‰S¢Ø"9ÿùÆdC˜ó2ö°+1bc‡¹­Ðº©ÝÚmÄ®­a­Á¥¤Õ­÷j¯ë ùjjé6~ŠÊ} ˤ ¨»e[° ¤¤f<Ò(Û#`ç­ ›bÛI‡ó a[²¾ú,°†0l%&müÊþê!†¦ ³jœæDäp3«†.¿£¬ôJ¬¦iÝD¦$þ°&[±²l-ëmaZ­Ÿ¢Í§{ÈB¯H{´Ëª´û²Þ‰—\ûSc }`µd9¶mé°ÐiµÙz†çödZ‹)Üé\tжU»nkË´‡:·º7±i‹·úµ¶.Û´|+¨r;¸V·oö±„¸Š‹§ŒRdŽû¸¹’;¹”[¹–{¹˜›¹škdè€ožû¹ ºj‡fÐváo‘º7wÿ6‹pw§ x &¡w~w»˜àp¹x¼[x§ðp‰¼ˆ7q´ðGyÊ»¼$W MrKQr"7½[¡Z‘Uqrs±«·½ð«ƒ5ç€sB·s PH—v:þÀn;J`sðIR` R'(·¾^ÇY€uXG ѵ€t<ðVG °ü+OÀ¿O`¿ç¿î[ºl·oªÛÁ±º €tu cptcì1ÆH§Æ\uDPÀ; uG÷¿ L^œTðÇb°ÇxpvN@uÌÁ‘ºûw‚Àº!Lw$Ìw(Ap¶Ëwþ{·Âšœ /x. úKÁkä¼xF¡xEÑé Ä¬Ì –wqD, &wyÙ zYÁĶl ÝðÍ”>ÝÛC’vhÔ“Åñà•;„û0Êky¯| MñÌÙ€ Ò,{Ô<ÍÖLÍUqÍ×|Tl ÒÌ ÝLÅߌ ÜìÍÞÌÍè,Îé¼ÎêÜÍ(GÎíÌÎòÏô<Ïö\Ïø|ÏúœÏü¼ÏþÜÏýÏÏè¼ÎMÅýÎ mÐÝÐ íÐ Ñ]Ð-Ñ­rMÑ=Ñ MÑÍÑ-Ò"=Ò$­r€r'}'½Ò*ÝÒ,ýÒ.Ó0Ò2Ò-}Ó)MÓ7mÓ9íÒ3ÍÒ8mþÓA ÔD-ÔE=Ô1]Ó0Ô3í…‰Þ‘‡Qi®Aš "ÕìÂîr¶õ*¸zë€Ej(xµ°OžfÚ'ä×Õ‡õÕÕŽ)bð7Pò‡=9‹ €cöCE”#à^à~àžà ¾à Þàþàá>á^á~ážáý=kˆ^/6Af}"¾–#^â$~â&žâ(¾â*Þâ,þâ.ã0>ã2^ã4~ã6žã8¾ã:Þã<þã..ˆåú<äùÜõ­ÞôÝaýµû©höЈÂ}äI>å—%zåRžåH†ÎJå[þåØÖåZîådþ^b.Q<Ô³ñ‘Á9QÝ}jañŠ`>æG~æÀŸ1ŠK‡FJ›D¢è–Š—ä<—F<–茇£ 1ƒI}Nc;ÚmçþuŽªxnÝR…–½‰•Ë×}FŽ™”^æœzéª1¡çã8f3Žt¡¢TD€@î L‡±Œ–š¥“Œ>:ŸéP‹êÀ®ˆzzB|Z¯ž„?%c£ª®1K“1Ú ÕÒ8ǨKª¸”åà³¢˜£$µ^E›ÄNÚÖ0w&êè^n¤n݈›Ý˜PÈI}³9$g… нôN@Ÿ!óœ0V|Ä~Ý][éé®mëŽódÕ³±Œ·ÑŒÆ†3¹2.ä’Ý›íÛÅ]!æÂ)M3“œÞ 7ä-Móñ¯Œrf;‚$~“²7_5ˆï¹Ý.MëêJì:—Óþ ŠC)-C2ûT¢¬ zøà®>¢3oí±>Of<ÇÓž£<ôôBÆØ£Ÿô!ª3T´–Æ­´ÔÄ=ÓÞhDC 4ŠøI3ÚDÐôIšó=f9íJdL­dŸ7 2Á®¸vƒ7‹pÒø+óň¨?ÓxÀü<¡MJŽ3“í\¸ÚqñÚþÉJ¸} øXùßrÔÓÚøHÓ˜>Ðø¶.ÌE2°Ý†ø Ì`SÛG™> =“•±û9bú¿ñú9™ š/“¤mùéc+ÌöIÏX‘ϳ yú»iù° Û™A²O¸W @•4åfz|Æ|Ý–þm~OÙ$„˜!»ýwšðVº‹Ð=é/ÿŸšTƒl¿žðUÈ I))é¬X_nsß¼$Es<ËQeÅvuÓ¦_[Öæ»Ö{þß}BàÐXD•Çe’Éd( €GÕzÅf¯hN HDôt¦_èËŒýyqmoÓ?«ñh·ÞÿÛ ,4$<ô‰šÒr||àš › £ 3›ë››00 ›ýTP@`UÀ -«} 0˜u=•me Ðýžpí%uM}ÐX$žœ¨Î}Ž}u-5àö@€«;GT÷QLDy_wŸo§—¯Ç¿d¤‚ôþ·’䥒Ly‚t’0MmÕ2dUM€„kœºec¥p”°ia @€A¹®ÌÅb`Ô¬ D-ü¨*#µW19h‹Yí¢FbY0'GŸ=ƒùm2št¨R¢L.…„ß?ª)!X¦hÔ§y\  RteuEËUíV:MצuîÜ·¦Rõg5ÃÀKZ5Õ•{Þß|tVJ1`Ã?^Üá.ÞGz/ðã׬ãÈ‚§í‡óhÈ|—FÝ95iÕv&SÖbyÖ¾™6¯Æ}ötÛv¬}ç& \xëßÄq¿†EöK™mó®–”t°?V… Õ h[’d™jþSîå_ m4›Uѯi| |9(ÛâõÝ}nßø~ýø'¨‹«š+ˆ<‚©¢Pð§]Ê€HJy®)z2Ç¡R&üè»îèh–’DJ ¤IqÇ&1±»P.X%•Z&ÌÈ C"æ»Â ñ¢È…ã%˜8±)!“¹°D…†Ž‹œbÉbÅ•X²‘î“f.ÄqC¢ñ(4þòCóL5û+â?#p/Úœ£8(1=`=±ùÓ ‹èðàB')ôP ‚±­Ï>90‡E¡«ÀQHO°t«@½´HC+UÁPH½øÓÑø,µ*eP%­þ(]3M6c¥uV#Üp9Ì ¼mâ ë)O+ŒØ^mM£ØZeevYg‹Ã59]çäºøÌdÇX{†Õô>m±mÖ´kÃ%÷Ùr‘'Zئ%P3k…Mö[}¸ýÕÛnß=w,{Ñå7_sÿÝC]ÊØÍê9pc *zËR¶^|Öw\ˆ'î—b-/‚k«ÓbX·=V^Ýî=¸âl%6ùb•=¶/ãªâ¼ŒZwK^yá&l>§a†Cfy7Ïjºg¡çrùŸéÄ9è´’Nz yS¾y_¥§šj<ŠÎ æÙÚ5¸jˆÅ¥Ù×§­¶Sj¯¡F›l@°†äèjÃN»ê¦Ovn u>[íþ¸÷æíÊ´f®àŽùÎ;T³sæ™p».\q½©öÛ·gnüñÅ~ØñÌã­¼sÍSŽ<6Àw¥üsËí«ûôxL÷\õZCÏbò®Y§Ü¹UÆ»öÖw7 våF—yv×uï—øÄ#6ž÷á¡ò} à¹|yå§Gýpé“Ç^æätkÁo§þzñ{Î>|óÙØ¾ Ù£?üòßw?~åÓ‡³ûÀ9þö÷׿ùAÿ›b÷¼ïÿCàè¿eÑo}ùK %A .P-$ þ 8A vƒ¬àS0h?Ò Ïƒ!Dá UB{ŒP Ác e˜Â®†?pဠ¸9ö°†þ?¼¡C9A‚BD"“ÄÚ1fFÜ ¥¸D**±‰ óHÃ#ZqŠ^¬âUæDïi‡`D£øƴ‘ñ~H‹"Õ˜F9Öñ7n,a ç¸G;ò‘Ž-ÃbÕ—A8žÑ‡ìc"ÿXñyOzò’ŸgÂOQx!ä&˜¶„§ESzÅF(óóÔh=óM©@æ#½iNqºSö”§?õiP:T¡•¨G5*‚‚R•6õ¢|³DK• Ó˜âÓ£Qûâ²J2®¦Î«;ÛêWºR²v0£åèLÍÈTÌiÕ­]ë[Å*׸Âu¬w}ªøÎZÕ{êóm™«]éÖºÖ°,k^ñZ³»Ôb° +€ôC xÀ-bšÖcÒ ‰ýÁl–ºXÒ*–uSd`,€¢/ þ‹À ÈΓ³öl€_K„iªå:O"@d›j’¨ SHÉbNÚKÓ‚¶´þ’gZ¥›[Ïò¶.:H´¢-4´ô†œYŽLDc12C,š ’ö˜è-Ëe«s›û\ZE­½êgã§T)¦ ý%b“_úÎ×Àj³ïFq«[¡·æê"jIÑX¾JKpU;»V±•ÊTz²T«þ bVñ×Ä"Fñ‡O¬â—¸Å+v1‹eãoÕÂ7®p}2¬`êrøg†Ó#s——:_¸È‘Iðm{¼OÀú¬l'$rŽ,åZ2‹à(gûZ]。Qžr˜Œ–$ã¶£\NÛþ Á0œÓšß6ãÆÎtÆó”á¼`4÷a†t¢ 1h«:ÐV4¤3hŽÊùψƴ¤5-~hÒÓŸu¨E=jR—ÚÔ§FuªU½jV·ÚÕ¯†u¬e=kZ×ÚÖ·Æu®u½k^÷Ú׿Võ€a›ØÇ6v²‘½lÛÙÄ~v³-mjWÛÚׯv¶µ½mnwÛÛßw¸©]€f“›æFw¹Õ}nu“ÛÝì~w¼á=oy»ÛÞç¾wì½o}÷ÛßÿxÀ>p‚ÜàGx¾p†7Üý~¸¾#^€‰GÜâÇ8Å1~kœãÿxþB>r—ä&yÉ9¾ò”³Üå-‡ùj[rš¯Ü6ǹÈo®sœ÷üæ>?Ð…ÎóÕè?':2°t¦7ÝéO‡zÔ¥>uªWÝêWÇzÖ«>ìc/›é\ïúÔÁÎu²3ÛìÊFûÙ™mh·íio¶Û£-nº×ÝîÕN·¼×Ín¾›»ïí¦wàëý÷Á߇×7¾¾xÆ7ÞñçxÊ%ò”Ÿ|â,ï7æcžy}Gæ’ÇüËE~jb˜DA7õG ð…¨/ _¿§ë™û0} ¸ýÒ €{Þ; ÐzÕoß°O}÷¸?>>‹/õÝ/ëKÿ½¹•ÿuè7½øÎ{õËþÞõ²w_íh‡{²çŽì·¯Úâ?ÿÝÕ¿þ½g;Ý|‡ÿ»ÿ¾nù¿ßð÷‡w¾óøÄ\ñŠ×¿ÇÀ$¸‰+ÀÎC@ÐCÀÈÓ<Ïã¼ü<”ÀÐK@—Þ`fr& ˜‚›ã– h 8Öƒ:¨½¥{€×#€ Ž[: zZºÜcºp€å+€ˆ¼a#·<>®ó·¯K<ÝsÁªÛÁ×KÂÙ#>É €–+¶$–ƒ>(dx=èãA¦;€Ⱦ°»¾§Û>¯Û>e#Ãï;;ðs»4\Cð›6¹“68ŒCö£Ãm{?¼k¿q›·ùÛCüóCÁÓ?þã?~‹·~Äþþ#ÀDt8ˆ8¬Àœ@$9H”¼¤ÀHü¼—sÄtÈ@ð$ANgb‰) ¸˜‚¨“AdÁ#|Â\º ¾ßKAW|º%ÄÁsÃÂ\€>`\º{zA¨¾'„ÅH+§ÓÅHÀ'%<Â0ÆôÂ$$¼ÆÚs€_„6i´¾-œE/¤>îÇ2<Æ0$Grô>¸CøSÃñsÇ4|CwœÃ:´G»ó;ú»6½›?û¼ôÃBDDü?Ë?@€KHEdÈ…sÀ3ÀGÄDtDô7ϫȌ„Dì¼NŒOl'…@ÅH.RX/3X¨Pº¼ElÁ×£þÅâ³A €VdÆ-ÜATŸ¥£Ae Æs#6hÔÉ,¤ºf$J#ÌBi¶.<·lÁÔ·šäÆÎG-¼E¦,ÇcCu<Çt4¶3lG6¤Gó˲tÃyœ6nK¿{¬Ã|ÌÃ|ô;~ìGÀëCÀ»¿z D‚ÔËCH¾lÈ¿üˇü7Š|DG¤<ÎÛÄ€ãÈÅ,ÌLŒpj&­ÈÀïÀŽöè@N¼\(ÁU´º8ü:Є¾¸G¨£¶¦óÆÒ<ÍÑ»%DÂ#t¾°ƒ¶DÆ,\Íôͦ£MjüÂ1´>êëM°üÊ´ KvD¿x4Ëó#¿zœ;k[K¶„N=äCé¤KióGÂÈìþÈíÜ¿½4HCôKDÌñD8Á¬D‰¤DƬÈ<ÏÁ”HÂÜ<\9°àé°ÏߺÏüü„‹ü´O ôÌà#P« ºØ¼º ;õ=%Ð)<Ê%6 NÙ”ÍáÌJ õÊâK²„Ç};³¤GÎÍCé¼Cël¿ë¬?íHîÈ…ìKñüNò´Ñ†3χTO‹¤DƒcÌJL̉ŒÏLRM,Ò”ûþj•%U”&­—ƒÁ†(•Ò)•)5Þà“ ÈÒI±€@/ÓS9•/S>1SÛh'0ýÒ5 Ó6S5=Ó8%S3}Ó2eÓ:uS:Ó ØÒ==S èÓ2åSþ1¥:-T;E=Ó9T=mÔE!Ô °ÒIRø®HU)‚(”L­±GÕUYÒQM1?1US9Õ&UUHåI”:ØÌ!JM‚W]Q±TZ¥ÔI¡UdòŠCaœâq2û“` ­º:´ÕA¬‘*d¥Îù±K3Vø@©#VkÖøšÖÙP‡jò‹U °0;ø<0gŽÄXÖh½u2`„bW¬ªÖc2”ÙÖ:›!S ðè–Ø®°“‰`ˆRX†Ì ƒiX÷êõ€ïÂ-!ƒY€ˆ ®tÍWº¨Wm•W¹WzÅWwíXÑ@Ù“ÅÖ“eþÖQ¼€öXˆ‹x°Ž-…~Ù†Ðîêˆ(ÉŽeБ‡i2% „‡Âˆ ûXÕpœ5#Ù}¥Öv…Öª Ùgu ’E ïZ ¹ŽX(lÉ.O¨šõ&aX…-ùÚkZ‚m'(ג艰lꉴÞè§©Úl-Ù”½Ö'»Z{\§õ[§@&S?É›]BÝ„ÿzÛLÕ±QÜ,]Ú·Ú´Âm2‘%VÎõ2ÂeÙÁZÒm+‰:ÜyéWxÕÐí[ÁŠ×’ÚÜØíÜfý\Úuݪ]Ýõ2Ó™¥IÝuX¨ú$Þ°(^›BÞãU^ãeÞämÞåuÞè…Þé}Þêþ•^ë¥ÞëÕÞìå^ìõÞíýÞîßñßò ßó%_ô5ßôeßõu_õ…ßöß÷•ßú¥ßûßüµ_ý¥^f@¼Í4ž]5KÒÜàFà~_àN`®¢Õ}à V`~ ®` ¶` ~Áà Îàa“ù`aáš)áfána…a`–á¦áÑÐÀñÂáÖá†& 0Éâ â!&â"6â#Fâ$Vâ%fâ&vâ'†â(–â)¦â*¶â+Æâ,Öbg2 5¾‰ùpá1ža2F"ª0Wü0ã6.ã7– + IY“9Ycuuã†cv!þ=ÁŒ<žZ>&ä=¾%úY€õ†-1d»1ä>–ä1óbPk€@¾¦IŽäBæà?>.<ÎäÝåäQÞd%Ú%GåRÖäUÞÜSöáT&eVVeúråncYÆåX^¬Z~d]žå_62^†e_Îe`V)a¾å'`dW4 »y…@·‹·[p/Q6æmîcd>‘…Oð'ÉT(œµ‚Zf:‰r-px“äT‰q˜zgZƒ{ÎsÒ n&f>öæ8šÙ˜µˆ´M[ ¸†jh†ùŸM˜¸Žb¸íš%¹u¨ÑÙŽ¸X;‰lU€éb^¶p>þè‰èÏ X蟀‹xè’ ˜ºÕ†ìú’ †™ÞéÙiW((Z¢É%é€f“¾×T• X\¥•¥¾\UÒ1ÞàU©ž³¢iFjµ–• ŽÍ ë¨Ýê².ã®fì]‰vj <ƒ´ ж–¸ Å © ¨q[jX^è‰ÁFè‹-q(V³6j²êê (Ú`è×  %aº†Qè°µ&h¸&)1‡ÉvkϦA1Zj·e¶­h÷i$ñ×ЮìÖmËíÐÖg êÅÆí?BëÆåŸå†VøÚ¿–ØŽP§6‰nH œ¸†…‚Øœ-m0!pþ]Žì…Pd2`éXSxfU°kXX†k_`i™Øi è†ë¸P ð–`(U˜h h¨ëgX\^8‘ —†Rñnˆn ø×19EƒÕ\Ïm)*ïxÁ”¬ò1¨Ük¿]ÕÛåñ%'9~“£ée6ù#×#¬o&¤?ì¨O·¦ÿ­í˜oXã~Æõ• ^ÈïØÍ‡  Þïvd¾U}.—p(þ™ îqfp#Ðø¶ð‹pL0XQPdžÈg‰øWíR¨HO X‰RˆÙ_t†µo¥ñ2 “óRd°Ø¦V°õnÍHõB…Œ¶!áhÍÖØ ˜‚¹ØO?gq¾fÆ€Xô0A%ù…u¹q‹ÅîQЮõpóèé2Çò£þ‚x¬ËbR˜­`jÏš-jŽ^‚Ñ®OÙ@õ2§²mˆ™¨tZi i¦˜¨cƒæÀ¤•÷€r¦ÿV…{ÿ`¨c<¹c¥5÷r’†âóù/ÿÞwQé1w`(€Çï`BmX0Å€'î“lò‚óöØøK((Žç7§ðÐþ€žj½r æ‡D~€dêÁFÈúoGe;¿‹%¨ÌHèµ¥(ElFï iè‹ ìOŒîuwÛáêÚkìaH[ ×®õH(L° Nõl„샑œ%Ø»­uøT?ç`OuÅú žÐhTðxnàø‚úz.ô2{_úìšðhŸä•€H0'*h€Zx­¶!$p· 1§6n¡F .=ñó+õ0M©ÜÇgUËGíTÊ?ƒ§VÕ$7U`0Ë÷óœyŽÓ—i°t¸Wò”oeK²O™×˜Å‡e“ýj*ÕØRÞ}‡Ï/Ç—Û0±)„cþò¿eþÀýóCvò\áý[v °ݤö]7ÿÝ|A²¶} t…ù[ßí~í7ÖÓµ˜ðGrÀ.-Ÿr{ÿúÇÝÂeÿ”qÿ¬žþ²*PII:+¾ÚòÜ··ãçU¤)–i‰’jȹëÌÚõŒÓûÍÿ/ØêˆÂ"ò¨42“Í¥3 Þ à¡Ýr»^nÃ*»ÖÄ@€>Û¹é N$§±{®åûº¸ßÛ `aà!!¢a"ãŽÖW¤äCÅ–™DÚ^£"‹`ÞèÝbª‘'k§ëg+¬j,í¬­,®ÓcÖdïVåæÙ&‚ññ1“ñë§(MQtŲD²ˆþt32w7çõÄ7PmnËmã³ùzy;ú;;¼{Ê®¯=ðeÙ°šŠ¥€¤ñ@š©~ÌV\QC¡ : œQD b.ÀA€P ã)šGHIy*I¦d¹²åŒzözáC%L¿=e*0 èi@Mš 1@R¡j„í¹Ç£Nƒ‚Ô à Ä­X*HzT"V€£üê¶§¥Œ *z4h[\7-]Šê”Ks0å<ØðËĈ'’9SRÍ 7±ŽkÕÀ2i¬´¥ ¹'Q F[;±s…‚Z•’ö*-ìÀ¢ èHX{vÀŒ¨-zŒ8qþnoŒ!U›ôë—>|Rq)…Œ¡SŸnÝ9tÇ¿Dž0™˜N ¶ ø:KDC׬ÿJô‚§æ¥ ¼V>iQD*%ßt€{Ѧ\õåføÏz!\\Ê×SWnq¥ PÕa—†; Ôáu n8¢ˆ…h·]Ý‘‘ eÒýsŠD`?œ…Ö*|øáŒç";–ä?Y$'¢ø‹ù°‘ñhã‹Í‰T’Q’Èã‘ZfÙ%˜/)¹$%MÚ¤N•…)X!BZ™ÇšqRÇå—uzy§œyŒ¹¤Šßå„§ ¹™N …Jy ‰æ¹¨¡5ì‰bŸþh¶8£!J)a•jš Š6ú©§A>º]¤Oþ¹i¨‚"Jhª ²ê¢«±¶:«;£>Vê>jʺ饠úk›«î:,­ÄzbëL¸¦ l±=t±Ñ^ k³ÌZ+-ÈÞc¦d’BI% £‰KZh2^ÆSê•…¡m€îƒçÅnåꀗ^Êqp”½™;—3˜V[è³Ø{ó2ÏÚ-òÍØHLÐQ‡Œ3ÕG^‹ðþÖ] ¡0MÜzçí©–í4AnüÈ•ZpÞ©aš³‚&s|pey€Q©qÞE¹ `l„ ØYá heœâJpɳuÚÞ}[ ÑY[¡[FHEUÔÆ6u`ãúXÞh[ò“iŸóMÚϬ@DDœJ®^îhð>š]¹;õ¶Vü¤ P{͵òH‚= ÃßRq¶Z)õÛ¹‰ãšõ;ïâÉ^`ƒy5…`m™#$¸oN­±xZ‚¥WÑŒËæä7u;H(T5F ÔTo8]W„GºùÉîtCÁÌùB²þ€îqL‘]¢©œ/bûk ýHÇ”Õþ$å A I¾è¼.¯…CzdĶ¢\Q ëJÍVÎ Y+éRÐ{Ð5޽ç2Õ(WP¢!.„„f>³ˆ4à5±³ ‡ID‚n´º}¡ï<=ރΚáýé uã!ÕãÄ™¹ ˆziãÎóûFqñšÙí¨8—iÑwìâaß'@ÚÌñ,–€×~äøš:b…‡5l !éB?À0Ñ+œ>rÇ0‡ZåÉŒ¦å!Ô}EW2PE0¥#g¹â "(~œ6ŠUÖ託P¹”P‚+’¾œ$0oQIîÈÐO¦ E+ý…—<’C­xF3WÉ«Qö2𒼿/±é‚azþá’•‘…5Íõ¦W=!œo¨¥8³ùLm²3›îL7STL²“S»”;¬iÎQ¢³šÍ[ç;ÛÌ€!ž`˜§©¾™döÓú¼§  Qæt (F3`P&YâL Ýg&Ë)¬|N´“ölèEǩ̔²4£Áܨ¼y-‰²)4%§3K­Šº´§ÝLËÔÑn}T§–é;jÓ•64 <ý©O[Z­ Êôš ­’?›ú”bô©RýjT?EU„ÒШŒºj”šUhåt©‘ôjX¡*×÷·4®1¯Ë]‡êV”ÙÍëv½«Þîn¼‡o±X«\×&w½ðeoÜ‹×åÞ·Cò=¯Së‹_û8 “<í:݆ ¿7E¯€û[à°ê·¸îƒ{á sx°¦n‡/¬U«n¸Á"þé‡â·6À=±‰¡šbé­8Æv1Nm cHθl:®qgµ[â™V=V(‘\°Ï¾¸ÈþJŽÖ‘Åëä°j¸ÉOžò¬¢œä-{7½Wþò—´ìY0cù¢^æ2™+K'ذûE3œË,,9ÓùGbæoãlâ4ë¹HwîsžÍgAwèσ>4 MhëüyÑŠ~t¢#mCKÒŽ®4¦ÛÐhKs:Ó¾ô( êO“ÚÓ¦ÆÀ¦O]êQ«:Ò¢^5¬[Íê@§zÖ±¶µ¬ùüê\ó×¾Žq­o-ì^{»þ5±“lÑ[ÙÅ~¶³1zlh/›ÚÖÎh³«mmsû¢ÓÞöµ» nbe;Üæ·¸¶f6sÔÍN÷¹ánf•{Þö–7¾ôí|ß;Þþ~áºÙ-Twƒøßüþ>¸Áå´ï„÷»á‡G½.q†OÜ w8Å3ŽqCD\ãÿ¸Ç¥pqoœä&GAÇKr•³œ#_ùÉ[ó ¤<æ6ŸùÆ_.óßüÞ5Çyσþo ç@÷Ï®ô¢k›èf`Ô£.õ©S½êV¿:Ö³®õ­s½ë^§zñ|ô¥ß:éÅ7Æô±óÛéb0÷üèµv²;Ûìoɦ/ T\yO’v¹³½ðó¦j¾Nˆ4é­žUHLÅìó &¨°©c\‡âxºÏ]ÎAuÖÏÞx6ÜÝ%‹ÃÜVv§L®7pÐ@;ð!NA¬‡<ÂÁyÃÃûó hþðƒ†ˆ^zH(ýBÓð°ÏHä)ú YȾ¼y&|ik¾îI2øÍwž÷º8»A/|àÿžø¶eò_2GŒ°g>xœX*˜ÈÕE€qQcêKîã qÙ÷þî›ï_ù _ñùؤŸ^a×9ñi^ÁÃöYvœ àðßÙ©ú}Ê‹l–IhžŽ °a`_&Œ^I) ƒ½Ã æZ4ŽÀiøe ù™ßC`Ò¼…þ ¡!¡!&᪠6!¯™ ߟjÍoY!ž×jašT(Å Zâ` Ò9m¡¦¡_©!®¡þ†aÆÚ _"à‹µ!v¡æ!˜Â!¨ÍaùM!&•ò!¢"öa"â’Ú`:^- â.b#fâ%R #Æ¡ˆJ8À0âÜ`ùIâFbAýÔ…+Æ",Îâ+Ö¢,Ú"-Þ¢.æ"/â¢/îâ/ö"0£0 £_xb'.Ú¨ÀhUl/Ø`*F¡ªØñ!•Ie#/åÈ6ÚR7ÞÒ7z£7J7ÂÀ "ã#zZ=…4;nAÜ4À,€Ÿ8€P8€>æ ðýÞ"YA›Š:¤±­¿ …)B£P<=2ã$äœ "%~þWb܈\ÄBØ}zÈÝGò_Zc2¦cÉ* €(–âlAPØ`Jòã N"é%FAL Z€Pâ½ à]ÁÌwÌK„HÃ]XQîœPƾ°Ä@–¤A~ß \;â ®âEÒƒM>P`‚„1ø ~L„WˆÓÅ߈%ëádUHH}¤¤IÎe¢}?’¡UÖ¤KÐæ8„‰Î&Íß(Ç‘â< õ€ÞÈ\"ASÒ¥SN™]Þå ¾[¶ddó9ÑÙGR¸ã!ž$‘:šØá‡‰!‰:É$/ie’2Æw$•Wâ'`†)æ˜Ç`æ™8#7€“fpÆ)çœtÖiçxæ©çž|öé矀*è „j衈&ªè¢Œ6êè£æ À1Ò `饘fšékÑÙÔ1ݬŤ¤2Wdލžªê“RB¹ê‘KºÊjª³¾Š$¬²âÚê®´êÚë­ÀÆÊ«­ÂþZ¥hª¬²À&ÿ]Ÿ"#¨$–z£µØÚHœ±¹Ûm±Ä~+î°µ–ëk¸äžk®·é²Ëm»à®/cÈ.kï¥Í>«L´¡²ˆ-YO p–|PEÕpdÅY°¶ _Ûð¶è¾+qÄË;îÄÃ{qÅêvì.Ç“Vï½öæ«¿Óú«%uE@È)—5âÄ|ÍË0€sV0#0_ÞÀŒ3€•E@x…ÃÉÝ|M¶G õÔ cìñ¼!_½qÆVgí5Ö`o­5o#“̬³'wjÊ£>ì¶ÔZÂ-7Õs¿Í5Èak¬w×yó-ö×÷7”e›½)Ú¡œWÛu7N÷ãvGî¸äO>øÞ—ûùÿÝœ­ùçõ> VñÉ&'®¶´‹WKùë–W.;ì³ÇNûí¶ï×9à›{žùï»ËT²†kš:´«÷Ë8} ?5píÌ?ízîÉ$\ÕXaÏ×X|= §\ÎO=íß/³ðUçïÚù¸Óm}õ×`Ÿs_ìçþ9ð¾qáÅ[zü¾Éc›øÈ# jà.Ï0“Î`FkÌ,9ÊZr$€œ® €)Ê@è ­à‚ê Ž3¦•¤! /_y  ‚¨hœÆËTF½·µ©aéÙÏòâ  g`7´[˜v€ ÆÐ+ZÑ ÏÀ µŒ‚Ýè •Ó>m-­iI”àW‚¸•ÿÂî~úë»ø×¿ÿI@qÔªÜü¦ÂÆïÙ(n¬Š£Ýær7ÖðŽ³«br8.I†Žx´ÑÂæ'½@’n`Ì|ÈX<3vCkkôç 5)ñgG¼$ ý“#9Ö(ƒ*d¡ÒYEíüÌ.B‹ðÂ2¯@…ÉY˜ÎdHš]’:LÌST™&šùx"ÎfÈÄ*g†^4Ìâ è³å•2™ÐLä‡×¿Ãé댔¤ Û˜°BÖÎÄM‘<)›÷í±Tácõ¶§ó=ï™ðÔu¢öERöÈžÑÄ'y2ÇHÃ9›ì%gxÄgøŒ:ÌDa»¢Idðaùe& 0uÒÿ>-#âTv†A鿀|ùÃá•ø±ņ̃JSŠÑzîj¥úŒiÐO³ý3›id©Luj­–îô§0 *O/ Ô¡U5EâIÖå´¨PjT*ÕªRõªSÍ*ÔQ€TªšøZ*›ª¼j«V=«ZÓÊV´ºu­’ãªW‰ÖÜ”¬|œš„6#š…gÓ2ZD8ô­m…«bËXÄ:v±¿Iê½îɧ ‡)Ü˜Ò ÖXÈz¶³ }lh?û¤1œ’™5ëjW±b¯Ú¤ fJZ¹™•jf"gnooÚez¹Ýãh‡{Õ¾”!K«Vj3[´qM”ÿYt±‚áaòV”lÉ\ûÈÊÒ6³…MX(ØÀ¾Èð£E|Y OøDª”ÔrÈxFÆû3¼ g¹ä«XÂÂ4å¨e–…] WFDœUðf%$bX¤ÑÄ<þæJš ìA¦‚ pVœò•¤1ˆIš.Û´`lñ9+ð5„æapøðÄ~Ê3^ö …zåFshm‰ 7ãî è¥s¯Â]ÊÄ0Ä˸1 À×¶Ç´ß­j¿ZWÊ:5Êá½í‡àOøÂ¾ðØtd.^äÔÄ›Øà¥w“øä|Çíã¬Mt^¥Sr{>=û$³mièG,möòää¦~§$  ÈR°?Ó~µ¿=2rÏûÅfÏ¿Ç m#ÌWùß8Åòšøsr¥­WÒ”b3Ÿï÷áÔ Æ ¦ó‹v˜íœ*B{â àÂòél_01®ý[OXîM§ú¯£¾^§C~ÄÇ6±Êµîmÿ¹_[Á`—^b‡DÏ03È!é}jòK9–JãVAsIy§3 Æh×w·zYuné&xˆ ‚å >Œ÷n”ñx†AaQo¤7|ZÖÆço"—|·| ÷yf¦Y÷„Hâ¤z;˜pW"$÷4fafQ>8Tn¦s{P0´§ /'Qø„R…VX…XÈU¿—qÁg.xƒÍ5W §y±uY6ø ãb£`ç'c±æ3sЃv>k1^íg_¨Æ3ü•ÄtãGL€8òçué5k†tk¡t)º¶mVaRç ögøWbÁ¦3,Äua ô ØÆu[qbE¤Dqçÿ‡¤n·^÷•Dßð~Zc$63‹HtÒæjá€c=s@†P·èv3s_ŠÇfˆx‡—nHd¸*Íe‚Žg@Ä6o3Æ‚Nvm–×"û&†™‡|°u“Ñy¬—L׃/È8@8NÀ•z¦§F䨎åøV®WòX °QØ%Ø…Py51XMdèŽIRÃf4‘vIdi3†¶—Æ2v˜‡{—sÞ×_X~.³b^ņmh×~Z±wì—w–k±øˆýÕL6KV+¹&U×&º&,ÆtHQ®d^±“J7z`èŽFøƒ8XŒ„×8xˆ”ç°”M©”O)ÿ‚©‘®3 %b*ø“÷!_X5ÙxhÉÞUƒCŽf)”^”ì¨pÃØ$6ÔŽDéXNáÇe·g—xy—z™—|¹—x)*ù¨ÀÄw#ÿXFbyed©nçjLƒ€lɯÔiqXX±C‡™ŠHÃWz¨_‰Š¬–/ós¡ø2 4™B$’ˆXagw’ý¥k"µB’y•¿¦3sÅ4+“–hl5Ù›2–mP‘J;çB—¸‹V‡cï…ƒ<ÈYDh9>•M©ŒÕ'5TY!µùtYiýø„ùŽªq˜”˜ŠÆygÈœoU„ϹUB™1A¹žgÙœð‰#Iè pŸ~y—©ÿŸüiûéŸýy{)˜ðj)W`‰˜3ØÊW–©Ñ˜µ ™¤™š µ–yšàIò%‘6·}÷š}Ès³da9`§ 'Ú’qhaÌÆ‘Ôæ~#*›aA›ÙPgDÙ¶› œ¿ôBãðŠ³©3;* F`‘Hš¤Y¡ÁÉ¢Æ1v±Éa4if"™ãFšS!I@#™óQSZu1J¥é…N¡X0{Ñ&i±ˆftºtGÑénI=û¶… ☢¹/µ‡Òa ^Éo¤ƒ)¤ãà>äC 3þŒÚ¨€k±y²už‡Žô_pYzoipsº.›ª+œºŽ¸3Ÿ¼QÿŸóX}™{%(*:~J7âéO¦Sà¨j] Ê|Ÿ¡^G¢¼j¡Ó›_VŽši‡Ù—ŸÙ}H$š¶Xš‚x¢Î€‘3’±Él:Vkl ›S¤’ù -)¥‰¤Bʬ—¨ÔZcAºs¨¥>zl$vCÏðÒ¶‡“f¡Q ¦eJ¤]áJ6ðTXª |JD“‚U‡)Ä¥ñùF •Òyxû°‡÷,„vái5Ê?zAK¯Êž±jSŽ:«Z&à „AL³2gT@|–È‹OÓt–ÄvFhø¸…¢òÄ= Å;+ÅTÅVÜ Ó[˜ÖRÃ%S»HÛ¨·Z²¹ú½¾½Jµ,ª^ÂZµâ;³™Q¬»jspñ“|˜Æw¿•d¢ßWµò†Alt/štè;·œÆ.|›/¾||ÈvuÍ$¦dËk¥>ê€(‡à€B” ™Äu¯â6¬"œÿR€ç”!djJ*œ«ë­/|ckoÌ»k½‰½Žª½cIr=<ÄP…U㨃êi„Á뻣¬OE|³±šAÐ[ÅS|ÅÐ<Í=;´þhËetÃI‹»’j†»AѪk÷ëvÚ—D4Ç¢ÐÀ¹:=òe¬+Œ¡ÖDhG“PZ¶å»jKQál®lûÇ å¹n»ˆè ¥t˺v{a~¼è\oºÔ£—–ÏF ŠÌ–aò+Ѻ֮i¼ÈLörŸ,¿›[Ïá¶CÈÇTÑ®Ô3:y@¨¦d@#Ï?ì0$,IYº4}ŒÞQ§‹çŒŠ¢6ú£K¶±÷6ÃfÆÅËR«ÍòÅŒz«ÝËËß|ÿÌRõ»ì™ÊCHzCWTýÒR•ÌÊ Í¼ÄÓÍHÍÑ<Öb-ÖÖ\hØÜH¸ŒÃ]ŽyÁÃMQm¶¥4CwηèÑëL9í|4^ ÏíÇWÂfÇöL¢¦™Ñû¼DÔjÇÿ ubñ¿v\ÐvлäÇEjÈ í›{a+ø“5¦&ò[K” ŸÌw¿¤µXíËÁQÊ ‹3]ÓGiÌxf§UiÈ+y¸AË4œÖ²êÅ8Æe˜(«Úé©Î‰©žÊ.©íÔÁ|ŽÄ{©/åƒf¼ ]EíÛ¶ÚU¹ëÍm¹ÜÞMÜÑÍÜâM”îéR¨÷R]Ôg†ÉÛ ‹Ô³º½f²Ôß=Þà=ßö]ÿßøýË_Ùo·ŒÝ¦£Ô@ß÷Mß>à.àõDÔÌâßI½´b,Õ^à~à^áË PÓL•¤ëÚžâó0â"þz&¾„€°Õ*¾â,Þâ.þâ0㇠)qœÐ8î§ðP°W;€rîr¾ñ = ç\`WŒÊ@pz~w^è1çp'k€Œ.ã’>éAã‰pã1$±"Q 5^ã7®ÿ㢾 £þ¾¨Þ< ?µðꪎ»ÐêCn kãn±4â[HkwÚÀ ÌT@V' PÝK]Ëû¦¬hžAámz¶'Fq9¼JìÆÐáÕméGÂ+zž%S£ºá½ä^îÑ›ìՅźô^ø!H$n¹äšã°‡3s} 3F_å”K¤}B|Õ޽‰:ŽÔ]Ì‚Ãp£ºí+’ÜÞN ŸƒÔÍ»-+ª ?ÌlÅ`àÎ’ñ¯ñÎâñ ÿñ"?ò_ò&ïñ%ò$ò*Ïò#ïò'ßñ2ÿò4Ÿò5ßò5oóò8oó7Ïñ<Ÿó*óB?óDô0ôFŸÿôL¿ôN¿òO¯ôP?õ>/õAßóRoõT?ôM¿õ3ßó\ÿó>öbOöUoö:?ö@ÿó;_ôjOômôooötÏñÖõXQâ1[²ðéX% Ï÷ø¯H€¯9/í¶Bøˆ/„]RøŽÕÝÂí¿ 4BákÉ#àÞøŒ?ùï÷ƒÏ;ÝŽ\Î-Êžù OÌsŠùœ¯úÿ÷yÏù :žÜà '„AkòrîÆÒôù¼ßGÔîû»üøsú35ü½ÿûÈüÉ2 n<ÎrŸþ9r–ÿ»Ê_ýÆ/üÅŸýŠýÛ¿üÚOüÝoýßÑüÖ”6 áÌ×ïýá¿þâßþßüïþôÿ5ä)ÙÝÑ“FsB% pKdÞYa‚ 9â:‹9 JBøª+)$Iàý¹€Ca1x$"IæÒ©„6£OiÕøÄB³ÉíUû傽aòØ|ì¢Åê2û LÃ×ò6ýíŠãçú:ÿ.Í\+hˆ8DLTT|(( ‹pp‰ip›Â´ÊôÃÜü¤úÓ Ý4%=-E] lݽ´‹å”­¥½…µÍÅuíÛýíý ž~&4\T^l|䋜¨$fMµ®ÆVÕ¾ÞÎæþöï7.÷ÖEç5f'V/>wOŸ_—oC>XÞGl†D‰6M—8pä4˜°àB„ 6„øÿ<Šõâµ»‡Qã;‹3^ÊçÀˆäwÈß3€”X(Ñá̈4eÖÄyS§Mž9{îôæq#½D‡Ú;zd!})—­Í%L\AcÀJ‡i4°ÀàC†°:‚̰cF ^E;- Bø\5¡… |…Ì0€Ád `ðãjÖz€>^@× H ¨q@òŽ´*ñ!@Ükc8‘Ö0ˆ‚S 0ŒkÆx!ÃiÛwðìbEñÃöL¡‹"5ž4M>§Oý“4•ÐW²ò5\ûmî?5aç”t»÷6ÝÇ×,n4ùzõÌ›3{Î2zWªxÿKð>ü… ±ƒis¯“êDÙ °ÑR8@0´>‹‰<ótš ¶Îhh ³ ñ›°†t(‹„þ»,³Ò(+³þ4`Í2×Üòj°tPí.yrá>œÎAÏÛ&=äÚcê=øœ‰ª%úrô©G$¯pISÎÇ•üΚ”2»ª°Ì’Ëî|LÂ=!û‰¯ÈùÚ’!{#‹÷£à±@Ø@N 3®F4 -JÔê‚ð¬½JÀc3ÿàr“Á € ®ÉB£ÀË)/MRGKi°KL7•©81Ç4©L!¤:²SP#ûô›R†YÕSYc¥µU-m­uÖ'ÝuL¨N5M]ÿ‡ÍµX\%Yc“evY,èUÈ_ ö%'›U6[l·uVÛn¹õ6Üá\ˆö½i»:ÓZUÅý¶]vß7^wå…×]rƒ$U%S©M·¾q` D¸·{,DGØá%´Èê‡@¢^‹éÅx^/ÞXVêk(€I’É÷\T…ýW€GÖ͘c—[†¹c™_ÖXå4«†¦JÞÝ€Ô½¹€céJAä²…æóƒ>;ÃQÇÝ {+;¡/·:°,ÁרæÐéJK ìiPAN³•‹m¯:›mÌä\k-F<ëèÙª ´ý$ô­n Ììï§?“­¾ºÖ5ÿuðšÁ™cöN PÀ€ÄXÞteh‰¤¢«Hû^|Ò…Ç”ÐYi`äI5¹Ú×IzÝ%šÜJ‹g Š=È€Ÿ¼xdF>yå—g¾ùæÇx!$aúÆ®§ûë«÷aûî¹߇So€r›«½ßk¥W™èŒ¾³é½Û¾/uù÷ÉÅÊ ÓÌ‚Û÷µÖôi0d[Xø†•´<ím{r[iøšHÔ mqÂÛ L³·»éçkmë“ÝG¸ < 3b[‹W|¸±!̓b›€‹&ガñ‰n(8v@3˜ËùÂå¹#ôlw$ÝÛ‚0Ó¡3«#Bë>ÿ¶>Ï)éû™­» ÊxÖqñ.A¥‰jFbì†î¨H96zÂyo„cw 騎A°^øðè½=ö1zÝþ†'»|é tüÊâú¸È„¢)°÷!_lôû GŒ£ÀÁ¬…•ªù k)×Bd–:í€cI`$ß¶¶j%…3xà9„çu` áOç·ºRo0á Yô"a:Ð7†A €½i u+TËٙ –M˜àËiH˜ÂÂTM‚méM+¹ÆŽIìr @g:Õ¹Nv¶s g¡`D5 JÜIêKj!®‹g¬˜,J‡s‹|V“BVÿAs^DOŽ|§ª2Ò㌻zè%»ˆ19vÔ£q4ƒ6^%é½Àfè!d! šª²ˆ»{ „9‚bæ‘ÿM%ÚÝ”ðQUKÌ'5JŽ6¥DË­i@U΀•J}e+ç$· †…O¶,$/Ø· üí™ZeË`(øl¾„•¯¬_TtJ:M~xÒÁ– ÉðéŠ%8ßöÀÒI”Š_´Ù)XwfN ¸@O9ØS8ø4Ý> ˆNñ¡‚(?VвT £m¨½¢çWˆ.L*-¬úù#䤱¤5clA{±ÖÖ¶SCÅJŠGá4€°„ ‚«[âZÿ’¸¯=é uVÈRÒgm©g‡ÐÈ«R’6µ.N¥Q¡>­¶'ú»' ãI.s–0je¨Tš²º¤koT}ÙÂXÂpnîÅ.Wo Ö»uµ—4…6QËÀÍ”Cnš]Ë9¹Í8M1}“I8U€f-Š–z™†µn! ]ï{WŠ´-ÕU`ß™NÁ¶›»,9K.çzÁ±À…,'©:[HQ‹LÊì>6 4VHwxkH(ÎF«d&£Xljí­Èˆd+I¹Ê§Ýiww[.zÓÕ-p«0æ0#¾5i7•K2ÚõìdDNÙKÍÓ÷^—o°%‹é]ˆ€W“ÿˆ²Àÿ´VQzm2­±PXØ{`«æw•Œn%.÷*AûVµÃýݯ„_“0ým»‘h¯YìZ?©zmÒcIí5uå)ǘ]?,‹ekZ¯¸ÖêD,´æYãzbåžRÕ 6Y,TöÇ®2¾xæÜ7» Ffµl[EÒñDiÊ¢#§®½j,w¶Ãêr¸AÊÈÕ•[æF÷¹Õ‡äÒ(¥Ë†N"Ú¾ZP7¿Õ%뵫ç°:™§›üÁ]ý—5Ô˜·¨".«Š}J­Ä·Ñ t*¤¡ša©:­½´¼4ãvìæÓÊÜîjâ–ñ&’Ø,qq(bv\ÑNµ½`NÂ*€×Yšÿ±ùn®LV‰.аíBl–À²-¨²ÛÌlÛ)’Þ-·¶”ål#µ¯ry§¬\u-g+êxwØßè»t—}ÝgwL¢¤ÑϽ{éñ†n‘ŸÎH:ß»ãuÖ®^°+#òøGØÇZy-spUá¦ôÊ6³ð÷>:Ñ‘þÊ©)µiK7EY½»£;MÖO骷n¢ƒ­`‡ ý‰MÝlÊé¸y|ŒVMÎh‡)õÙu}obèz XÄxÌÉOîÝï‰5ޡխ1sÃÂóÛ·1ß®éÑó¾è©úÁ–ì8`ì€z¡W `"àD Cv¶ å4ˆçJàhÐlÿËÓýhÏTf¿ª©Žâöç–þ°à±Àåù²×z­èI»á.ábÀÑ2À´[@J`»+‘ð[ Dpðc‘h„ hBh§“³éšz$FÃ;Ñ;ßK‰ð³ÿñ$­¼B+<õb´R<‡Ë8ø’8ɦIÛ‹›%üjýÂ<ű¼Ä&§A8Z½ÀpQ¹×½Ä‰½Äó ¾ð¾Ê7¯ø;7IÂ(8MB“S9È)Cãy>(`¾Y3,š“C£Ã;œÃ<4,ÜZ‚œc,žû$M¶ Ë>>+îsµ¤c3_qlÄ8‰˜ .nX¿Vc­({Clh2ÿA(ŸN¬’ÐʺɂRŒ‚ ü¬SŠ6ê ä)³LžŠ;6³¨D4C3.\äEN@³3‚ð-J \.•zÄ“HFœDH?Ö™»íK™JÂÞËšp‘Þ›k|Ÿ™Añ <­1¸0¹„+¼¤Âsl´$t¼‘ãÂ!D>­0ÂûZÂ+¾%Œ›Þ;4ä3 ¨aœS¸‘ë=1¬.ˆ¸J&ÅI=ìZ0RAß(lQ1[ËC;,ÉYƒ'‚ é[ÿz¬A4¼a'.@ÄÔƒ {ŠF ÁlIŒ»8£?Qüº$ÛÄO¼:ÿý3J˜E´ã6UpÅ0H#V X¤ÊzÆ«ÄʬÔÊ­äÊ®ÌJbô?‚ÀIePFGôÀ´ÎÂhT‚ºKBºF ÈF¸4ÈÆéF¼øÆð"/q$*rD8´K¤u¤Æ"Ìw|%½“G}¤ÇuÜÇÓ ¸$+¹âB}Ü®Ý(±t”Lj'}ôÉ„ Àl½w<Çß‚¬i½Ò،ڀK¥¥°ðÀ:Å8ÄC;$uó ?Ü9 pIA¬‹ ‰É¡ë+.ð±ÿ»I¥cD³ A´,Áy;Á£ŒA—)³#E›$—ƒ¢„R-©œ„‰ïüð³ñOñ ËðôÊôTÏõF K™KÿfÐÉ|DŸ¤Äl¸D·ì€Ö¤‰A´ÝãF±Î$˜AÀ³A¾ÄAMtÜÏÍôL LÄlŬˋCÂÇœ,ÏMÖ«0È{,Ì› Ðt°±ÈC˜˜L ‹=AŒ¡Ô¨Ì¸YJÙŒsª9=TÐ4ÒÍéK’z›ÄØ ¡ã§2(ÎDô>䔄Ä|ætFŒ§L„™ýS²¢Ì2+Ý6ÌR,åNm1³é‚£ò Ï2%O3%Ó3õ.ÝbÏ6uÓö4)TTI·KÎ&¥O´d)¹{N'bÌÒ&Ê¡z|K¸¤‹ü9C4PJPR HL…Ë]Ú4wÂÈ‹Ç =BAÅPÿ̳Kƹƒ,L_Š0Ss%¸T8Ò@˜|,¼OeºËÔ¹¸eªWL¯ŒÆ! ²0).Œ¹‰G/¥Q­5“4Ö:DÖ;LÉìŒNøCáЋß$< Ä (R,8Rë¼—E\RetRB˜DíŠ.¶\ESdÅèŒ?!Å LW®Û:sµ?UcÖ/e–§$Àª7:xõ\ÀÄJô-KpS8h·¶;Æ’aRomDæÄ©„ÈÏ>…K  +ëJ}Ðs Ä€ ´pTTÂ{½U4Í LÆ §Ã¬Ô £Ð ­ iU.ÄÏ ÑO½¼ÔÁL]M¬iœßƒYGi¥Ñ %b%Éÿc­ÍdÕœ…èѪ<óMj ÎkÕ‚l]¨ød„e¼SŒRç4NyÕÄÊqþÃ?Lô¿A1E±ýˆ˜W¡¥×›ˆE}•Å0S}u˜0ÓZœ?[ô×\ÆsS;€Ý[½ Ø€-©£û¿fåVs™ÏoõÉ<J$íº¶•ΰžÈe[K!ÛZy?ms"5s·ƒ¥„uRâ$.b$fb"þá'Vb!Fb#¦â*¶â+Æâ,Öâ-æâ.öb.^€ cc".c1þb4®â1fc+.ã7Vã0–c2¦c:nc;Æã9Öã<æã=Öc9d@&ã?äB^A>äC6äDfäFväGfäE^ä@†äJ¶äKväÿhxň1³Š‰`ÅBÁY¦0€pPcÃb€˜Cž4¬ØÀˆaY®a“e0‘0¬²$â8äTâT¶å €U®á>æÌYæaãCPd`–e]6`Öb~1ÆfY¶æ>æ^ZŽb&ç)žâ!†â%6âs>guNãw†çx–çy>ã36c/nã9.b8Vã~®ã|þç:îã8h?hƒFhBFdIFä†dE†hL¦d‰Žè‡~hG¾hŠÖhHÖd&ˆT{,je"9Â@¬¸æiváVfáp^áÈæÎæd6‰ÔåÌ ?dæ]Îå1Þ@‘ðfÿdæaþæSNâçÌÙ@Yfc–ã ì@mžæ0ÞÀ$>êÃZê¤æjwgtŽâ&çvây6ë³Fë/¶ç-^k|Æã~æg¾c~h€~ëº>è¼Fh;vè„^芎hÀìJ¶è¶äŒÎhÃVlY–ž×ë=Þp‹´0Ù®é·5) c¦HäÂìÅöìÏíÐíÑ&íÒ6mÒfFNmUfíÔvmU~íØ†mØvíÚeÙ¿ÛÖíܦíÛÆíÙÎmümÛæ@à6nÜ&îØVîÝ>îæFn߆îàVnéÞmêîêfnéîÚÞnÚÖîäöíâæîèžnñvnìþîíVïõfïÿövoöîŠT;MK i€‘ª¨où2©á:¾{Wìd×[²¡ìÒëtµ‰ÊÄ‹RùƒÜr^²uðM[— ! ÉÁ„ ·H! ÈŒ^U‹ŒV¢óè‰å° / >V¤TÉo»”7Tp¥PÅÚp9pÉÝR W[ w—÷1 âpÊ*ÁøoH @/§âHÌð GCTl $Ýè½Æžmð¤ÄR¯q ÿ’)•ñíì¿q+­Þ ¯ðçRbù§µý[d#påøñ6‡sÏqõØqÎ ôÍõó®ƒó!—ó5Ï•:ÏswåñB/pçºtÿKt¡¤t!ßtFŸô=uIõ2ïñROóT¯ôNÇÍÖÊsRWuMW7G96_5ŸsYGW]ÏõXsLu>öE‡pb?uÊ sB÷õUgv^vm½õewv_§u¡uAöf‡¨gïtn¿v^OöOGvNws ?ö_÷tiƒôsŸvm—ôNDõu÷ö1ªv<7-ro÷]g÷n÷õo'vqvwï"W÷çw-•ö}Ÿwp|ßw†”H8š‰§øŠ·øŠw†‹×øçøŽ÷øùù‘'ù’7ù“Gù”Wù•gù–wù—‡ù˜—ù™§y„ÄEG°[DbÞ¯xaúÿÊýy¡ø€7x£Ow¤úp/ú gz¥oz¢‡ú€GÜÙñ•çèPÿŒŽæìÝAz§?z°Oz±_ú°—z²ú¯?ûµWû¶7{·{¶ûuÈœwŠ‘plÇn‰û¤^´Ÿz¿|¹{¸/ûÁŸ{ÃGüÂWü´?|t¨zæj†% ¾·÷UYü¿üË|ÂgüÄï|ÍÏüÏ}Ì·¨Û57ÛûièûÊ÷|ÒoüÑßü×wýÖ}ÚýÙý0ýœgº­W}Ö¯ÞˆÂ}Ø¿ýÚÏ}Ù7~âçüágþv¨{«—Ô÷ýæ­œÎð­±0wsÃX Y}‘T~ä/þñ_þäo~òÿòGÿFÚý+’þp¥~ôàš4rh¢@ªXh€— ¦¾@p°9¤{˜P…Q„l€Ê®.ÜÊïÓ·×;Îë=ðÇÞˆ6ã ¹Rº˜*§°(=N“Õåµ™}n£Ô¯ŒkÉ\³7¬[Ž€à0˜Óëvû£P(ÇoøÅ !ÖšV Y#ÂÙ#ÕZá`Фe%&¥æå&Ôg(šè!dYi›ê骩k*kì+i+ìl(îè À[ÜÝïoÞÞYß_gr¦2%jgórô33µtõt.*­¬m÷ö­n¸vví·79·¹::— 0<0ß_ ²µ>6ÿµÿþ¿~ ,ÿ8N\9vç¦S¸Ž!¸ƒB\8±!C^ïâÁ›G¬ž±@G$i°$Ê“*M²LùðbDŠ0-ʬ‰qæK›1o꤉¨—ŽÀ<Â(vïØJ—J“2mÙt©Ó¨P§æäiu'VŸY«nuèµb" 0p0`¡D[Å÷ô­T¸SåÒkwîÝ“\µòÝë÷+NÀ†€(p €í¨‡ž=·y'ã­\×2åËš3sŽö¬à«}Cw%£1‚±Bñ<þiç͘gË®û6mܶ1} ú·ïÀî|­¾³6C[ØT)d@[ƒ€Û>¼Ú:  HáÀ=è x?úÿ"BxGÛ^·ÝÔïY™ß­c:ûÿ¨\å˜@—ŸHbÓÛ‚þ5œƒpÜzJVÙ °XË*04 hìÖŽ€r£æ]4F2+’\‘¢•0–¡‚‡§›™*˜arB8Œ„¯Ui*ÕêÌ¥¤¦jª']4Ú“ª(¡*æª ÿצ.pzú)d!åó– ‡ª—>§òIR$ ‚²=æ§h¬ú‘€ƒ•r­*C\øj´- É£&Ì×-­²jzk, î:É–hØcˆ|X¦–KP³,¨aÐY[®ªxÈH=ìm€Â…©9‡‹(Éì’î]h^•üœa™;×ãtß™ â¸QÌÆB’»2IlŠöD§»¶k§rrÈ£T¹:ë3‡ò\«l—ц!­æ¶—bË2Á@—v‘ºëÎ,ê¯Nø”±>{–íÎM{-ôÖÄÚüµÑV3=h¦ºJ![4¿K•°ù—õ¤øþö4×ewÂ.’0yG’ÿç]X–y¶Ù?_-•Òe{8Ù›F-3Ûȹ]õ\ñr9 “ŽØøaÌm\Aj+Ô§2Ã"Ü›s7úÂÀœÂC"\À €OꎃxBtû~w¾¸-øãµ®£6å ¶Mõe Ü⨟ã­ÜÂãïÅkŸ}'ÃoO<’ÛLîéÔ¾r~K´ ÿ=ûç϶¾ûXã‚<ù•×É<üù·¯üüûßuÿö7&ŒON壿¨Àÿ-P€ | ×§‚4€8Éë!èÀn°ƒü 58Á ÆéA¼=ª°…)|¡ñ@A ÖOy–ß YÃòp‡>ÔaúdHÂuÍÉ~îJÿ I'þL d=â£øC)B‘iô3 /'þð'ü¹Çx>ô‘H@æ© ˜s¢`DO`½ØÅ9±Žr¼#ñhÇ<òq~Ô# ûÈ? ²„<ä iHE"r‘Žl$$)ÉGN2’”¼¤%3YÉMb’“šì$(ɸ˜Õƒ(Lö 54M÷È@{ZWÅYR±–S¼%|Ph)ãŠ&Ì"§‘Ê}u/l´Ä¥-©ÌdÒfD8;É KXœÖ •º$æ2‘©ÍlBQu¤ã7¿)GpŽSœ\4gÓ9Ÿè¡î|'<ã)ÏyÂSx–R|9M`šÃ\eKÿT¦¸ðI ßy¦T(°ËƒB"eAêž ¤ƒn“™1ð¢`€"T ÆR%;m˜ƒpaàbp’èX €U"ëÁ§I øK‘±ÿ4Ű³1¡‘?нˆäÅFÌkl} ØXQ$+ -Aˆ £™ˆ<@º—‰vÚ"Ag—ÍÒ¶êž#]çŒ>UI{´P¡ÕªìIY *Ö`M`§†)jêŠdÖØ¥ÙuÂjQn6£å(/ÅôDØo½ó˜“ê¦$Á¥÷Äf&dºOšjÑŸ×|•6ªõ'2N ‡€*4ˆF=%8 lÃØë¼ÃªRª¢ ä@è©ÿÛÝò¶·zXl;ÂÔá·¸Æ=®+8ÚÄR"šD¤æÛ6qSùÉ2r°aG{ «–aÖ¶ÿó¢'ÃJ<Št‚¾=/zi÷Rª‹œ ¦5A*¿™DJ ¯­Ë}àû&¥ ­¸f Äl«QÛ„hCÖ]Â˰…i´äë‚Æîâ%ý+xB %4‡¥ƒ°,„‰åܵ½·ŸÖ˜n".ô¤U§«Ë«|‚:£»µa4™æT@U®SÕÂθ1¹èD9ŠÎW÷ú×4•»,kN´‡´v•Y\P˜Ç2v;cŒXÆðÇ l¥ÔyÇc@&R– Jd*µè=(5£†¶»ÿ2˜6@ˆk%aóúì±`ŽlJóq-@¬7»­ñ]cba~ÖP³JÚ‚hZ®¡v`ªµô¢24ÇÔn­ºî 6D83¿µå së •ä6½®~õ;o \äÒºÖȽ@© ýD—RÑô¬|UM[ƒÒÙu©Þ—±WZ] hà…ã³£ íiK»ÚÔ¾¶µ¥½PÀºÛñ´'>ûÛÞ™š²šË@q>a8í6AˆÅD—ƒhƒ‰ú`ÀišÄÖÉ:KÌy)Xè–ë+ à?8®pƒ h•á (,àVæ4Ã(åp¹“ÁS%$Ÿ¬KkÝžìˆ3úhÊþÖze·>=Î>ÞïÊ f².=ÎgÖú‰Ìd¢²¾5»Áé†|±{…ÎkDè~ŽÔöüH]O“@IÛB‚/¼ï~g¸¹€» kÁÏ!cd±ÄKŽ3[ '·¯OyîFgšP›~hã×ôiATZÒ“¾ô¾O ixzŽÆ‚¨¡CêÑÂ"`ÛüC1v³Õí”áôPÜ`÷íô½îÀ{oÇSÖ¶>>òƒŠëå&åñ› 9eAòeÊ{¶Çö^õW;iícß\Ü7¦æû—ml“üæÿ/ÿµË;|âwÜìÝH¢CµèøvÒ ,¶öýÅ\¬ôƽÙÛô[1IŸL8TÀ× þp€dÔßýݤ[ìîù ˜@ÖÅÝh™Çeež8ßj@WôÂô5‡¬Ê  V@Ëý͇Àœ\È\@‡—ÆQݾøXw|¨ÝèFx`%Ùwœ˜ùT‘PYï€K¾åÛéÄUÐa@Ç ™Çp]ÈŒ™Oi¼h”TÞ‰Ye‡#dáb\š¨Ü\m E%øÑÞaÇö*ÜN`ýa‚IâýÉÈ1^ÿ ª?ýÚ‰Qè± Ý¤›åÿ9@žíB÷mk… Î\Þs„ß35¨¥Æê倽…âó,)V€©ÅžÞúØ^·­ûÍædGò墭-%D"r„ Ú”#þ™ ²-âV—hXM(£æß&2àöœŸ5¢ß5^#À½@-ŸûE£hV .¢äI×0ö—º%cì_¼!cþ_ h™-À#'”Ääב\ ˆœÌ!‚c¬ð]Ü»F0¨È–hà†MÖJå":þb<#°õÉ ŽN‹½à™™¡ B‰eØ ¥Fz tXU½äœYñœU Ù‡dÂhGzUÑ)ÅŽv]^UÜ¿˜Hÿª Õ… ÞÝèÌ(KÆY~œÎ—XaÅÖÁŒÀF®èˆ¤Ž…H†¼™¼h×i¤ ÀpX`ýÕcÓ¤F1Zž¥p”òaÄ©_áùäáYUJaDr—D:F‰1"£fy3R×$¦Bçù‰iÔc*Vó•æAËy0f8ò× à˽1_"x‹¢@ÂêUG/ŽTd6cíµZ¬ßíuãyÉÚ è¢j/6¦>äåP£¹™£_AZøQ#nV4coföý¦9ˆ_6b£qgµá-šæy}c1î¸=_äÍf!Ö&w)“²‹ d!”É4„HÖãœY ±9N¢ÿä&`öc¬8à¤{¾gßMà Þ„¤+$äÓ±”v C ^¢G  ÜtŠœ¤œ£ ؈‡LʵƒÆ`Q¶$ë9E‰Œ@HL xI=ðàÈHö\„zˆK ØáL²ÒX¹Ý:‰NÒKOfÝ„]PfeçðœQT*™^Q}:RcoF¶gÁA ’ú‘)6)“*€|€à=º æÛídå+ñÛî!Àf0ȦJ‚*ç°DÏxfó`b'ÆΩDºô¢©™Ò¤i!,YV¦b2c÷ݦ;¦çùÈbîé^i>< ÄåÞê¢*ê ®_ÿ †åáâjVªòšzŽà‘ô £u¾YBN$~ßz.à¨~§Î) Â«§«"竪‚;EªÐ*µ“­Þ*®îj­òª®þª=m£¸Á_¯É_Ò_[î)=§0ÙPÛ5„'xg $Ø€ªnÏŸrZ¦V†Yœ M¢¸¶é¸&Äq›}Ò‡J‘ v`¥yðg®ù'¦F䦯ßòÌßä}ª‘üÔ‚¶ 9¨¿:IŒõk®½E…ö•….•ðŽ žd†z™a„Ž(#Æ‘É$ŠöœÜäv¡î$G±ÕŒJ¡š¹Ç\e¿vYÙÍ›uìÛ9‘Ÿ æ¶ò…}¨\>鑾ۥÿô!\þ¡ hಸ¡¿lÂ]š ˜‡˜žà:–é fvÖ†v¾é`¦èÍÕ¦œ Ây\ft^+^m³y³¶Œí!ª¡ºï-'s"Pª¥¾mkv«-kìe9V§—Neœ'´¢pn—ØÈmØžªR´*¬î«b›¬žíÚö kËDç8Ú-u¨¾vî!m2´ãæ‹´¢Œ×•š¢ ùhs$Eé&^ „ îÂèÒÀF‡»)ˆ¨‰ÍiÑ+ï–kï†bA¶C„<Ô»ê¤~šQ~hØ„.AÑŠX½ë½k¾¶‚‚nLF€õ ìò2ÅÁúˆHÊÃΈÃÿVᇮ¤ÏMì‰,èÒ]ìQ]” Òi¡’y!Ü®È~PºëAµ(ö¥#ŒÇø•w´ˆ€(‰ÐjáœY[)XĪ|U²HÀudië²á•œÙìWÙMÆD°Å.Œ–Îü~lÉ.a uÈ@î.ìªÏ6‹4p zGo©'4/ðÐmPd#^îXÞ#hrWjž%Áœ ±ž-&£© `æ+ Â’YÚ`²"çn@÷ÍÄÍD1×¶C•q<¾Nˆ  œs zî ãÞ–í£ž-îEêŸ-­æñ îq¯ö±3.j¾-!Ç-½ÆÔAv<ÀÀÿEÀ$†#|Mo²¢*á†ß²Aãö½pŸBãÓ~®çý('›j¨‚ò .xµ2‹¸2+¿²,Ç2-ò-Ï2x-f¢êjó÷*30ïê§@ÁF. ä À¤ÅˆÇŒ»8€äÁP36G* €¢ Óbn)§j/í¾ÈV´càæ@èv¬é¡ÀáéRoÖ€†H¿à¨  2 OÞî·Â'@/ÜFim ƒ^ñ¾U/ É13o—fò„=¯U35_36?€6OJë"+N]$û¦ÇtÀGkoW~qEhÂ÷žHøÝøVbd(Œì$ˆìúFh‰VYÄÿÒ$“qlý¾( „ìÔ5aÕéH]2IÐÙÿŽ@Ž °“è\Ë’¡ÕåhçøÕþz¬™åtÕ„É7AXÚݰ!äòÐݘe’ª¥Yß!Z§åY/\º²Ó[Êz´К,§¡… ìŽÐ€šP5€E÷5FSPtóÒ~êÔJBë×=`Ÿšižz T­1h%Õ²qg†1ÿåÐZ±ïêdjñ»Û*Öõ#lÈ,Œ¢Û‹¨¦-ï# \3Ðq¢2@îÑv¢Þ¶£â¶nçöÐvïòc´mjòjâakËEW´_Ss,RdW Æ,¶ª2u[W8ÿ­Öìæõq+à"«Ýr-ÿã2y·y‹w+›s äžóò Q ÷ò­Â7}ëª1wïÝH®Z0÷_;wHd6™±\äÞb,žXV ó&ó@_m÷¶ f¤LxÉ*Ó?4ž²·L) ï}4‘€‡B;”ò¶‚KZrOs3÷sS€{óåR$µ%öÔErÇ‚R‡ÁtG.…UB øb(K7‚IâLŸoy¤¯ˆÖ´‡ÜtÔ½o’çtÒ/:Éý>áÔÙ¯š ¢V ˆF]•cXˆ¾4k‚ƒYÿ¦átŒ¹Á,hVaŽ™u9Ž’Q˜4AP¥ïòx?G ,iY§5Î ú‘ö3}ògî‰N*ŒÐÿŠñÎ+^J4_[36g3Ú‚M7Ó†ÄHqK¢“HÏ)Be¦e‚1¨“«&N±_qm%¶hoˆ§ñ¤ÄÈOŸî ½¸™å‚þŠlˆ†ÕÀŽÿoC£©­.lãVjÚöoïö³ïö/W;{_;‡cÇp·.wŸsAŠÏ Wz`ˆKyê·×Ò‚‹­v~rv‹²B\wФ{·„7.§÷+㻽ï{-ë;+û{++g´¼´¼ÁC\ð:rKú4-7¹S¾Ò&½_Ÿ‹*9K×4(8*óCƒ‡ºDl‹S`DÅÌ;D××…³5Éox8}$/yˆøS»< Ní‰h¸ÿ_3¥Wºd47gú7˸HG輤ÇûzQÎÈŽ³H7E…ЇˆzÉŠ¾´%^ŽG”Ó4;9Æ¢¯”o,•G¬•CÝ’d¹OS!“9Ç‚¹Ø¿ü˜×•˜y !KbïÌÏ ”¯¹›á:­ë)?Y?i{¶5¦ú&º\?£çèb[Ï]·vÝü¸_4Ïo4&§be‡G¼‚1)ËqååIéñ»¦cöA´6*’¾Àú¢È³¶÷}m •ª·Ášÿ/”˜úz$»…ºwy«5»ojm3êÁÁïv¶»-·w{AþÖHþŠ÷u‹¶Ï xØŠªÞ­©vïí\^„7øÿç{zÿ;ø—¿ùŸ?ú§xïÚñ¿ûK{¿ß^7|ÎWº6S¿tseô¸]üÈAÐIñ±õÎÎAìAIÂQMÝ0àh@9°É~õY@á,I$)Qé4ÊP±J@Uà~x@Ç8A —Ã5²F@ƒe“BCpü öæì↸î8v6 vÔ*Ôt48ÔÒÖ–ðFZ:ûLÌLD0Õ &0iLÜJ&B P4LYs57Y Î~‘•°e*Άو·ËÎJ*dltPÆ1¥»Ûû Ísiÿ5JYˆ¹]Æ94¬‚¶¦;2P ƒ˜Bp°®D„81–ÄŠ%8Be£+r0†¼°¥Ë!d.0ô†`Ÿ |YL¢I$ =|ü Ò9¨¢E‡ö8ˆÙç\$"“*݆Ã'6b†Xj‘jK"x`’5ª¨çbÝÚá«W³SÉÆàú¤Ú0<’-•µv$ˆfËzˆÃõkß¾W/®*¸fá"MPTâÂÀ Hr‘™òdË•1_¶œD^@‡=štiÓ gÔIØÆž>;aê™è§¡F ‰®¾‚T·áÞ¬g"œ©oãJ‘¬8±¸òß5'>]zÈ×±g×ÿ¾{wïß½ Ñœ™üxó™ Š•@èëØ°!òÉhLâ¼S?BJˆ]‘‹.­X4Èk8Œ>p! 5áç6`‰—ðBB$.t¨:ý®‰'¨QÄI,q ”àŒ‚ÆC¨uÎpœ7Ø'?¢TËÁ-pz¾Cjª¡d¢!0üö"㮘>QHR>©æV"gu”t£lÁS$0d¬ÀÁLLI†Ÿ—&‰K¥9UZôQVÖˆ¥MÔ”<Íÿ`N G­ø{©ÃYµôA£7ÊUŠŽxÝÕ×(zöÄKÒqÇ ]©¥dMξüG÷|ä ¨ùl«ošbAÒª·¶ºJª©jM’\½6ÐÊ/ øj ¬¿Ú¥‹-K.KF’®æ…ᬢò…ßÕÖ­Ëß”NðJ/üE ÝxÙ¥•Ãr“¸.2/[ ²Ç*L±-<¹c‘kŒ¤òaÁ³ÓFû,´Ï\fY´ÔhZ¯½œª%Äù~zà6Uƈ–,Jž£Øè‰!L:9‰DÚ&Ý–³ê覟žÚj§EO뭹溷óÀ.Olͪ™CödÊÙZl…ê‘¢é%ÚX¦G©ÿë»Ïš9#Ö¢š‚ñ¥—4ðB¯ïÄWîV!ÅÂTÔä\ô3ÆOöl€8nœ nªn¢Ví?fcû¶·çÆJî$%drÔ€ÕÎr¦d¥¯Ì0{Ö0Ya¶{d~Lƒf,æÐ:µyS3•†IsŠ!”Ï:ãѳeX2•?9ã9‡PçT…Ùn’ïg“WP=႑᧕¯Ÿnûµü°£_uÖ‚ÀaQ®XZƒTb¾eñ‡jC]ë`2-œnñ¡Í"|æˆ>pË"Þ‚½8.µŒn=UëÊ»ÔÕ0·ŒÐ`=À ^ÔãƒzÙk]1 XYâ"‹†ÿ]ý —Þw?!Ñ[Lcƒ±#:fcMdb™è“ìc£bÇ*7 LÄL4\„Y'xÁE™™‚¾ó ÚLwºž CŠÝ(âÁ!âÏC&œUsö&­©)-pù¡ãIijýð9L1$óXG©Å‚@„ÉÍ((›kég¹A¤W^'È@þ1ˆù#Í¥NŽr“¥„N"Iˆ·A.R ì3PM\3A5îì‚;«d³º•IRj’—»ô¥â fÇ^šò—Då%¶JP‚Z©Ô$#YA Õ¦DÚ H&±mn“›Ýôæ7ÁNqŽ“œå4ç9Ñ™Nu®“ítç;áOyΓžõÿ´ç=ãLè@3’©£¤¶‚6L“ Ä4è@ZP„.T¡‚L,£)ÍIbðgÛr&CšQŒn´¡í(G=Ò=J0¢k¤fPЮT¤,éK]ӖΦI(,ÕæÏÚ¬îšÈ¤©LkT õ§EªQ#ÑhZp>üœJ‘Õ£N•¨T•jU±ZÔ›zÁë*W½V°Žµ_-«XÏJV³®­lUk[áúV¹¦•®n­k\ï:W»î¯|Õk_ûWÁæ•°~-l`;XÃ.±ŒUlc!ûXÉ&–²Ž­ld/;YËn³œíƒ@ZÑŽ–´¥5íiQ›ZÕ®–µ­uíÿka[ÙÎ6´ ­mA‹[à–·¹õínk[áw¸Å%îq›\ä.W¹Íe.r…ÝÝJwÔîu§[]ín—»ÝõîwÁ^ñŽ—¼å5ïyÑ›^õ®—½í ï>ú @(ÌW¾õ¥/}í›ßûê—¿ûõoí;_ð¾-|`'ø¿ –oÌ`O˜¶¶ð…1œaÚêö·ÁõðrŸ \;—ÄÏ­.q©kb—˜ÅÓu±v³ûbë¢8Æ->ñ­ë^“·«=>k`¹¬nXÀc~œdhc·2à" ß8À¾S¶¯æ[›cÙÁ]Îï"Ü`€YËVp–Ãÿl`5ظóƒ Z ˜Âª¥óhé|g ï™Ï}>moÿ|[ÒZ¹"ñˆ}kÜã"šÑˆ¶ñŠ!]ÜߘƔƱŒ_\c“8Çå•ñŽËë6©\©˜Ç›ðч#s¡øRݪ+ ÊÀÖðàTP¾»@Pë^3€Ãgžò|âd〿6p€g[gCá¹Õ-ŒÈaeCÆc¶€i][g'XÏwÎ3iõlÚr‹6Ýgöó»á ÛbÚ´×®í‡Mo{{¸·„¾·¡‡›h?šàÉ5x¥¯;éãxÓ Ç´§Ç›]Po×my¡5$ä93½è«æ8=8¾[ÿœÌ:ÜÈž/®ø˜Ýæz·ÈÆõ}¿mßpàÛßž²€lT{ç.7¹‚i-å7ƒ[Ú?‘6o½“;ûÛ4·­!n;nÐÎ|åg^7žÙ-gÖ¶ûêñöú×g;oz—Öß‹&;Àÿ½è€—ÝÑj¸s#wIgÚÒs¿ôݾbK#üÓà•¸Äa<ñïVœ 7u\þÆq·àMæÈ”È?ôh åøÍy}•N_Cèw ˜zhw­sž‚À€þ¹ÔLçi‡ûÁ3yÕ£íôßB=Û¯'0Õ_ïî:ÙÂíÆ:j}váµû»¶ñmèÑîíko{£ý ÷~ËúÇ{Ýn÷½7ÿ÷îvÿ´¦Ã xÁw×m¨Ž‹áka‚ÁÍÁã:°†*>¡‰êÎaÝç†3´Íí_¬+àåùÿ}Ö%¯¿¦®Ö´.ÝÚêZ«ÝrÏÿÒL÷‚ï´PëÔø(ÐëÄ®Þþ­ì.úÒÎøÎíBŒàª¯ú& ºøûP¹ïú»ºKüÆï»È‚_¥«¡uy°ã€n0mp`èÏËÀìæ’Ð¿ŽÌóôÎ~ÐóR/ÌLÙªpάç~PëO{ϵ p+° ÍpìÎŽÑ.Pј/àÔpàøí§O7î´ÏQ°Óènγ¯ï\ð»`0 ±¼æY@ÿè]¬`‘…±!ñ¥â#(±*Aè/1-ñ>‚E[ˆ[hß%†Ð‚\ÜE ^RÑ= !dQ<'dñ5.u±i1!¦ÂÿbÔlHGªc„Äu„FsDñ‡Ñ…B©±­ñ±1Ÿñ?Q½1í"è”ü|Š•ÊѦôÉ¡„)jÌQ”¦ƒ”Þ•ıÓ±æ)f™v_ñý1 Sñ\ôq Ò™òñÒRˆ‚0¸áoì@à~@V<)ˆ¨çœ‚õ(”€é—©$ã±”R ÒSò Y)%É&³ÿjG–f%Cè&ݱ¦ ¢ B#@Ð@Q ´ÁM@ÃPCIŽ~Ü¡ LHÔo‹VŒª‡Jšä¢ÆQ$iR& ‰%O2q¸'ÓQir’ER•ìѪ¶R%ÏÒŽÈ’ê!ãÇOvC8å.HÅ ÀAváKN ˆ r'j'0EA+I1I'-Mr,¿ò“°r!S,-³Aê1óª"“-/³2õ&,G)ýZ¡V¡UÊÑÅJSÊÀ4M!SL€AžÄ^é°ä†Á4µ¢v‚Ç<óŒ(s-}ê1Es35óÛÒÜÒ3Íò3…“$93&s8“+sj,‰ÿñŽ`\ <Ù— &3¥1KH‰Ó‘Щs¤”S,Ó<Û“2ÑR:Õ2+«S=¯!'Óh’†“i&f˜2$s>ãsA”:´+çÆ%ß’Aƒ“=ó9—Ó=54$ª´Éƒ0D‡P…ðCMTDO´DQ”DUDGtE]4Ec´EIôEm´FYôFitGwTG_TEWHg4H‡´HeôHsI‰TI4ItIqôI}ôD›JytF«4K©4JtJ{”KÁôKa4J¯4LÅtLËTL½tMÃÔ>ÀsÞÔiNåíÔH4®NåôMñ´ó4{ñã4õôO5ÿ.P÷”N uP µQý”Pu±NuNo±PíTRq‘O%UN-µQ5uQuR5Qû4TIQá4TKuTSuUSõT-•QùTVõQiÕUç”TcUU7ÕOwWoUµSaT‹UT!5Yq±W•uRõN15Zu‘QŸ•Z9µR‘uYµÕT›5SÕR™ÕQ¡5RÉÕQ?ù³>mòA™3]”]ßÕ:AS>›“^çµ]%Bã_õu?˲_×`1Ó>ë5CíÕ`³sB÷µ?^Ïõ޼ò%ûu>óuaéÓbÝ•`ùUaëSA7”_6b±Ó?3ö`öbåÕbUVcs-9ÖaWÿV=T“þucEv^cöeSvbYvgK6_Aöc7foVbQ6h?Óc{VgC¶i ÖA 6i—vg6«*öf¯Öi£–hm6`ö^…¶c‹aÇ–CõhŸ6lk–aÉVks¶3™–mM–)ªv:ÏkyVkç6oß–c½VmËVi1pvmÅök‘VoÛvq÷–B¿vp7êöBß3m#·p¥¶k-7k m—sÁV]Öd5÷sGrûvjw$‡¶gÝ$&w&å‘oI7u3—q÷d7p·Vw1?7·wC×pA×v7a£öu/ b×nµJuvu‹×g[iwwx…·sIÿ64©×uµ÷r•÷x¡n³gYöÔP-}Õw}ÂmЗ}á7~åw~é·~í÷~ñ7õwù·ý÷8€x€ ¸€ ø€8ã—hÒ(§è c4AÜw Œ±‚F1Ø‚£Qƒ3ø‚9øƒ=8„7X„;x„M¸„Q„OX…S˜„Yø…]8†WX†[x†m¸†q†oX‡s˜†yø‡}˜„oª¤X¤3rÁšp #±w‰=÷z›˜w™Øw£Øz¡ø‰§ø{±Øt©øŠµ8‹XŠ­8Œ%€Ÿ(®æ@‚SŠƒ’SŒ·Ø½¸ŠÁxŽß˜Žã˜‹¿¸ŽõøŽá¸‹ý8ùØŽ¥ÈÿXã 2…¢W™ÿXŽ÷8’ñX’y’!9“-™’ûX“+ù“²ÕÆÄÈÔØMÙ <¹“7y•¹•a”_Y–19–Y™–/9—ëS©úiH”L!Še—ugù–¹˜‘¹–q™““Y—]Y™š›ÙtѧrÆŒa€"¿À’,t˜+—™¥9œÙ–§ù™Çy™ÍœÏ9šÏ™Óf©Š8%Ôà ¹›,ÉYœÕyŸÓ¹ŸóyËùŸùY ÓyŒß¹ŸâùEæÙ5áÈ›š !#šZ¢-š¢ýù¢§™—Ë8¡•„h€F˜ïù¡¿9£1z¢Z£õÙ¤Sú¤Uÿ:«™ˆ/G¡Aš›)—¤%ó¥+Ú¥yº¥}z¥Q¨uú1ݹ¯Ù£µYêù¦G:ªXZ¨{ª ¥ºª©úª9@”z¦?z›šV ‚Jö!0PÓ <V¦©AꩱڭwzªãÚªçú­í‘£ ™«“:¤ÿó0´‚8‡J®¤ZB°‹Á)U!h°»PÓÔÚv¥Qt‡­­6¨íz¨1»®9®=Û-µºZ°™öÚ¦“)¬Aà þ²&…HóT¸GI8u <ÑN´â/W hð#왩á3ª3[¸;{³?[³‘»¨­Y´‘z¡ù:•1 vâ¯_%"Ë1ëÿaN… db³°¤5+dhp,û¼éú¸‰[½åš½Ó{“ Ú¨™[¯Û´ç¨.FÑ€^`U‚àM@*‘½qºB‹¹×Û¸\ÁÛû®{žé¤—zvIiœ ·£]üBÝ{¸ÜÁß[ÄA_BÛGF;ºëû«kÊo“ÉÀaüÃ|ÁI|ÆCœÆ‹C¹e:›»ÂaºŸ¸/»Æe¼ÈÇo\ã{¹Q¼¹kšÅ;<Ê<§‘|Ä«¼Ä±ÜÆ­ðÚ'œž¡Jȧ|ÌÊȉüÈ“|ËÕ|hOü=R\žŸ\,¤\ÌéüÀÍüʵ<Ëï<¥u\ÂyœÂÃ|ÎÿÌýÌ Ï÷|ÍE·ÍcãÍiÚ«åœÐ%½Î']‰Í=ѳ¼Ë·úÏÁ\¤)=Ô }Ô ÓõÜÔóÜÆcÚÏI{Å#]Ô+=Öaݘ=ÍO½ÖÛU¹Å  ÓÀÍüÓûZÖI}Ö‹ÝÂ/×o¸—ü :¯Ø¿œ¡_ý؉=Û½©5=Õ»]icɱsަ½Ñƒ]©]Û±}ÛÙÔ¿Õ÷¼šÐòÚÓ­}ØÛ]Ýõ=ß™úÝ•½¢û¡«ý¹{Ý ~ßžß“}á§¹ÙY]Åãß`*ÅFÒÁâKé#C* @%SXÁ"w’<#xŠ¡'CáœÈCJAÿEp)¡6rªtT\M *þxRâÑ“á3}“9}¾íàk%1¯›hgT;ç©aj²9Ž'Ëû’ñ ;:’—Ìûo…zdàQî„lþ%ëEå©!±;"ËŠí³¤RÌaæãb±[ű_á4fæ{§¼×`å*¥Ä;gÊßy~/>Ε Þ&þš0qÀ\Bý¸‡ïÅé47¡¢„%tÛ`hÇ•†éKzÊ ¼ÞzŠMƾñ£X¾Ú@%ÔZI€ÓµsÐë‹óϤ"¥‚ 6™Å’x¤Ñ@+Dá}T¾mÝÛ#6à;zà}|=.ÿ„¶i Ì >Neî¯È6±DDaû€vvçÕDŠ0Õ¡F8òÈa.{ ¶ìG=öEÅ v`\QÄ͈` |e‚$ FÝv4Y+©rLOµjçø~÷º¿ót!Ñ)‹ÀæïɃ:£TZõÚÃþ´<®5 Þ†©Êa€N«×ëG¡`à 4p³$>ÍÇ9÷XBƒÐàb3øe¨ââÒ%1H˜8Á7X%eY%¸(xG‰S7y‡©Wziš*F: :KjƒôÕØ8›Ó7sê«ú»*Ù÷ŒŒªÌ(lÛ ý,M9ÝZ-UUÐðÁÖÝíV—3'P‡Cÿ½ ,díŒí…Ì,OŸn?_íŒþ~P=vó,Áxü*dø® 7oÑ€ 4®ÎYó$¼†êaCIv,‰ò侕!¥‰Tir H˜)c¦{ˆsÌ?ýx¦"Å‹“2N0wŒ¦Rž¿^δ¹´¦Ô¨0K9õ7r*Td,µz¥ÊâΑ9É*tèŒt&l|šÏthXÒñcÖ®4˜«õ½¶~5 • Šm·3€ `Û°Q…9Á•;#NU–eè±,µMLˆ¨¸¶ÂJñŸ”,ùcwòº°-÷¾®w  f¶ì¹„sÿd®Mׯ DÌÅ+as‰€<¦>Ç»1®`îI{€?Ö'w ŸÁ·V ˜|VŽßóèžû­@‹ZjkÅÚ[=I%[ ÝY0G¼–Sª\$‚iÀ@møw_r01p ‚10*h0ˆ. Èœˆµ¤€Ã9-@sF`Ö¢uE,B °a&,—Ä:Ž%g_D2a‡NæçQXý=6 €ª¡š¬¹Ö$J 6°`DÔ‡]„¼ñE“Gˆ¡ Š=é¡@%Þ1Κ h\ˆ6X£šmçA}@öø#x|V°#xcf  &¸¹‚˜P*#è„M'¦[M9åÿV^iÑ€«‘ãV}GÖc&ÞrÌoùHxj\±€2IRpÞúª:Ä’*.³îBÃ#Çá±Ã(9l ›Ìke²ä¢i´™ÆÉiX¦j¨áhIjkç4¸h–ë|.‰ë´M4š@ú¥û”ºÒÂ{Xµí| j–e‡«òrX/º]²KM¹ó,n»5½‹poÿÒû0¹RN,¾Wê+f·\‚Û°¦åVu®|?LpÉ2)7²Ã¯Ü±Éüiq€ók Ç¿ÈUWnÉd(À¥¨ð¸6ÓanQXWK†dˆ„ŽtÍÅœ o¶Ì²Ðþ®ûYÊVUÍ5ÕT~Í6Øf;ó–ßâ'[mÿàÖÝ·ÍÅsEç]yˆ Æœ r_GØnMº|ŠŽ” ‡D†µHa?r ‚X·æÀ]§,¹Ê7¼µ×”oN±hVÄŒZÙÝÖŒ¶à­]ÁÕ&©%ôè` ŒÒ€Auù5&fæ@öµÈw˜³AäÖ¹bxˆo—2=¨k>9¼ “Œ5ôÖsnïOfd›†èåœ]Y‚pÈ8{ƒKà™ä’â5n),®/*v½'ŒJ )ÒÊt'KŸÞÚ†.¦ž!*׋^%†¹êqî€ZëÜ @—#†éÕxd ^CWÁâ‘+lõ²ùÅ Z( ­^‘ƒZäBpš¸ ¸@ÿ«¡L0¬á¼¦t-îi‹-ß­ÌôÂÌyî@•‹¡ øÂ\%‰êͶ§C ö«ˆG¬âßÈD+fq‰YÓ¢gh–ŠA‘{RÜÏ8½mq_dãÂÚGsí‚B‘"é܈G®åqÜ£ûH%–Fl:@}ÈÇDú1‹T$#ÉE/<ñ4d·4b*Gj²‘œ„d'7éI+j’ù²ä¾ÌÂOª2” lå*]ÉJgѱ"vÌä+oË\Âr—¸ä¥F9¶Rnë”=L¥.{‰Ìc*Ó—ÌÜ#0 YK 6s™Éœ¦5«‰M>3Š¦ÌØ÷ŒyMjŠ3œäÌf9m²M2vÿ“f¶§9ßéÎxžsžøHg%‡éÍ£ žô”'?ÿéÏ€Š‘”[gÚ©•É`‚h?êЈÞÇžÂäá7]ˆ ù€u í(D=*Ñ–$‡ÜÄ';¥y³¨t¥ÂaLPÁ”tàÖv:âЈ,í©O Ô  u¨D-ªQŠÔ¤*u©LmªSŸ Õ¨JuªT­ªU¯zÔ¡-c–j1)*ýE7ˆ“$L‡á?ꥧK“T0Ö¸Êu®t­«]ïŠ×¼êu¯|í«_ÿ ØÀ v°„-¬a‹ØÄ*v±z­Ñó–2É`Ô«£C¨/ÂzƒÙÈ ƒ9ÿã#ÎÒ…1ÿÒì\, Ù†tµ m­HÁâžzqÕ‡çBIU0Òˆ+¬}­k{ Ü'Åö8!©:)‹I”N³TÌíM~ ]ßJ7¸_!‡V­2Ûo´˜`ÅíuÝ]êŠ7¼äE…ZõÝ]dW@È`wáÐÜñN·¼ò­o‡†®õ¶a»-"sÓkßù 8ÀªÂŒd¼¶#xÁ n0ƒìà?¾“`¬_‡tÞ/Àĸ÷´¨{ýëÝyõÌw-‹€õP¬èF¡$þ…£b05rOÿf`cú¶Q2P€ˆ ÀÍeø)Møž§Mæ*`š£röVbÅa#Ž/8\QqĆÿB–æ¶ÈĘ́=Ÿ`F 9o™£>HÀv–`Íôn“ATŸ ¿ìÈn¶Î¥ 'ž0ŸÈ/nÞ³tè|hÉ0 и!A/4hŽãÌbúg•ƨ&:z®h7t! øåD"퟾³™;UgÍ>"}|â7>]¶A7Q7à<ËNZmðblPÙ¶\¡5!Kêá)Úì¿bˆ³ t—S÷¼Ï9õÀH„"Íæ=³žäb§AnNCÐ38z8þÑOûÓŽ`;ºìu47~¤R¨Ùe׌l„ Y H‘˜ðÍ&G9q(`w¡æP̬‰¦7‘ýÿ|¤ƒƒˆÛÞ fzüã$Ö®ødæBôüÙuYÓJ†Íñ/`y²É6#3˜Íˆæ )R+ð̧  ´†DKR”‘£4Ãåûí‚ÄGüݤÝûƒëü íÚ}#>ÜÄE0§´Îà7ž ~&‹ FÃ0¸À#BÝû//®€Ù7ö#Ì%øvP¯¹•ñ3rZ—<õ±‘ J”‚vÞUŽõ f.3þ~xÙ!ÎD(-&¡Z80D$&uÁlô3˜14`A+P&šÕ¥ž­BÜâŒÓÄ'4È ðh‘P{.†ÅÓ׃Ïàê,/ÿøñ؆‡¾W‡¤2ÀªH©|~ÇØa-÷—ó]–ä †~ÅÁKhì¢ÏÂ¥ÛËY¿ã³pbðX|¹¬üï¿ÿÿ€ø5‚^RAQ4'~›w8Wl¾‘E¼=2ñY1×jêç\ï&§F  žwB¸· ®°[Öeú…%šç-Ä è15Ð#A#B²6Ñ×!’!a;a=ȃ?8a¶`|…a¸0(Ø=*xG¦à‚0aªÓÀjž‘bb±b3È;ýS •c9ð&¥à6]8 Ä€ Ä9F0ñq àcÏ‚=ÚcdÄdæ dE i}¦7u(e½s‡—ÿ H¸C ¸‚ïU _†mœq"gÖ#œ±Ès7Šxnpz&gc×7uh"òf†Z.r{ViéÑ€Ægžè‰6œèfzòh–ZëC”fñƒižFp›³¸C`‹FŠa(Btq‹íqˆÕ¡8KÃu¬sZÞaµ±…8ø\¯æc,ø0EÆ·öõá»ÖkI w[ЇÖw€™×^ʶ€÷ÎÆm6"ЖwWo8r)7xÞöd$"câÍanåVoñ3o…¢6ÆóŽHs P4òæoioµ¸ñ4ç&qh‡pW@n‡q7%°pÇsthÿ…b‘!ò# &)&ŠöÇ>/ySw"vQ{B#—×b:F`ð‚4 °"¢rò#-·*ýPŽ^qŽ¡£‚6Ç„ìˆ:‡}3“Ù±^9»³8Û§Œï—I'KWhºñ>Pµ}MÕ}Fx€hHW¹O¼Y~:ñG|´’‘…‚ô\F•ðó°nØ-aœô CˆX¸e¥!š(€Ãó%Š¢&Ú(0§€›u¤›Êu Mx2‹ƒæ7¡ô3C&B¶[;ê¡AÄ çÂ!G¤CÄÓðÀ2 OZ0&YZ[„è‡Êd53˜¥ Ø)hi0=Ú¡i˜ :˜`eªƒgj`ij¦jЦkê¦mЦ 9¢zU„›B¥3j¥7øÿ„É4…úG26b¿p…rt4ÈCbH$ËК ICÛ¦®vŸlˆ©™ª©›Ê©›j4„ ü©x{h( jçd3Õrh¸‡¶I1JKªšÅÒ›g˜8‚‹Ä«$ðŒ”æ¥ò0jñQnC7v И¸/š8‰¼Ø‰Hó‰5‹Éº!¤ØgkâתhîhÞâh¡H‹’?²x!áúŒ~ÒkÒŠÕAÝjê*™gŒ‰c‹a¦ƒ'Ij50¿Zc¡¥®œè# ¤¸ˆŠCm)r<ÓYdˆ…l´†lØc>±+±±K±Ÿ …–€}®„м¶h¿6°ˆšÿ®j€yšŽK¸ 6ª ùŽà’ µ}1û—D°q Ék@Fãömz‚?“‹Bu'‘×nw²8<§o~Y—ãCmë¡oF “Ç&Ëá‘=¢‘“$9&©—-§’O‹xwv1Y" òl8RjþHAŽƒ#4i³·XJbí3¹6¦Cm•I$_ù¥U´—š±‡k±ˆ‹±>& (Ak=”$øœy?àeãHvà}·©²5— 5Z«²¹])‰Ä ;fù•œÆY ¥Œùa“‡ uj—¬ƒ±ÿ¼p‡»÷&v’v”‰¼'šs²–7Ò? B=áa 7RŠØ¶qÛW€¢!ðb%„³Šñ#nÒOFo °º˜E›¸ý»¸ÿ›±– KD°)ž19½£¹³úK+ˆ,{Yµ*MÀ2zV’Ë+Hò{Á:’Á(´þiшÈÊgq`"„ñ|`м" „7|„7 ›Åg]ž ‚ÁÖyÂ4œù|‹H³¯ B£'á‹G|{<{°0| ÌÃ|ëâ>”A4}>rYŒÅ[ŒŸ]¬Å^,eñ¸FæŸH ,uÆKÕ}ùç<*ã·Ž ZÅ] %Á~àEEŽjÿ¨*“£¡¡EÚáK£[šÇWƒKujX"J¢&ª!%ÚÈŒ É(úÈ’Ì.z¥ê~YöÆ xsL-NR44z 2é§QbÊ{ü£4¦¬´{¯ ˱ÌH†dfQË´œ¤¤Ê!ø5n|IúÄÀ¯àÉ8˜†LC¡|*ˆÊɬ¿BÚÊ­œHdÚ¦eJÍÒ|ÄÖ¬¦Õ|ÍÛœÍg*§O€Èxu§²•ɸÉêØÉrì„TŒKjƒ5b„)ÁêÌ‚‰ Šj§"|œîÜ ’ &¬¥ÆœH|f¸ŠÐ™ªŸêcœr(ežuªwød«*À|HyÁ £¾LLpœÎ…x«–«ëªÿ±¬¬s n–¯‚ó:H“¬}²¬ÃÓÒ{¦­ ®è¬¥­§è"©è¬Þ*³Hâ™äú´±6•®HÍ®«Ö‹ãj†Àhʈ«Ëˆœ¥ˆ†£¼KÃŒ›¨´&rfKp°"‚m,æÌ4ÈEÔØ¿þK±ù9È!ª‘{Üè<«Ã­$«…낲'«]•l¬ ç‚4m+³€¾u‹>9km;›á³ý©Â ³Rwp@"“ ©£k€Ëÿ_)¡Ðü€n½¸Š«© }ÉUP׫AsA¹Oy-ÇÎç÷רÂÑù4ˆ\v.Í‘¾¥Ë­aéÞŒ¢™“áfã]]^×kÙtzËQQWÖ1—¹›nR‹!n–u'ù»f8àgkpbçÒŽy™Ë+šlw éÚ_+wµCñúw€á ’Ü{½«û"Db†ûc>W)$¦ æ°Å[™ô›¿z1ÊZDݘ±qÝã»Ðž±ÝL'±‰À´Ù,åí¸ç}R{:k¤ª/l°Æò+ ûK!ȳ/;$ŒȺ[ ]Þ *Å{a.È¢P£U®Äf>¸YëѸJÌg8 Åì¹…µÿ8 Â Ä“Jæ¿»ŠC„Gè5L MV,á¸+¿² ÍÏBZ@W r;é•Né>äÙý¡[ÆN•ÆJµÆúÈä_¥ÞPˆã* % @"Ìl9¥ ¤ zB<: wbÔU‹¦îÃcßÅü课2$΂¥ÈµñÈÅ®‰Ä><ÈžìÇÎìË^VaEÏÁØ´¥§¥^©},ƒ#Ôêxìë5(멬¤€ ÈÐg2ÒmC±ŒîªÌÏ…¤·ÜX_ЇyV™ŽXÙ²Ãü‚DšÊÞÎ¥ËÌÖƒ.}¬£¤¬ÊïïTC¦ÚÜÍܬð Í¿ÍßL,ÁnWã<¥åŒŽƒ½› «Îѧ¹´f_ÿ?ƒš… ëËlÏ>°}_“òÏÅ';*´µ~4â ‚éºÖN2nМڸ¹åXáÐH¹x< ÑKf!}ö”zôJ^Ó®]õþ¹·ÕñnÒ–†Ò¹X®CçˆüŠÏJÁÒÄêÒsÖ4Êzg¶Hv¬sÓ;Ó¼ºÓ7íÓHÔÝnC]®JÿJÔÞÑ3L‹#`!¹qõÊ‹ÒâÁ3Þ‘‹ ¢‹ùèöYOtG1‰nƒVWíÉ8f‹H˜á{íiuO¾¬í9Þ2;îã<ž©1 %ìIâEÝÓ[²˜kNŸ PÏ^?×-ºC R6;³&9n;mF÷Ø»^“íÕÐa˜—ýÿ"/å4`²ÙÉ(J ¾·³¡]u¤]¼6uò…Úä0›l~eñ(Ò‘®@Ž)$“(Pž¤¤Rå «)Ù0óJ=D .¨Ø41ÏHI îü,©§ ƒ”*-´è‡ E8@4‰êË1Vq@C#%4$íàZ”$—¬>’ŒI‹WŒ¬p ™[&lÝ$_¿pÕ»jmZ’Æâˆ³ãk4@Æ >¼vÍ\v%%ž\Ö.ºu#›ðj¥ å84]}¡°2|’üb&ܸÏwû¾1³Gs¥O§^}º&ëÙ­7j Èfo}’.%ÿ§é!¨‹¸_ueµ’Y´¿Ù3þD(Ê߯Ϩî"\N¤þ|Øe¿«|»A„O>ð"¤o@!°ðB 3ÔpC;ìX<Q—K$ñDSDQ—]†j£ü(¼ó‚HO*œüS,ª%ü¯Ç üQA å˜ð#s{p™ÒÇ%‘0É"«„2È+²ÔrK%LðK“Àì2ÌJ¨‚”Ÿ‚¤©»ñfdª¦§QÏ‘ù@rOG5­Ì“Ì#«ìSH>ŸDH' mrÌ=TÑDõt‰DÿtRJ+µôRL3­ô/*ôðSPA­ ;ÅM<7—ª1Ψz©·;¯4bÖÄ11šH$kØâ¨191^³¼“Åâäò8eã¥.}¹Ëàdñ>[„Žv¬“²ê`ǘË,#-[¡·4ª±‹ü›Þ–óÆZêÊ–SãÍô3ÿ9%ú(–{z±Ò$¦p2K–é¤Z6·yµ´…Jžóœç·r·"åŸûTQ ìy+4¦±oÔÄQ»® ÀuêÕÛÕ8mÅMu.4¢öÓE+ÊDFeo¡[âhG=úQšQçüæ”sÒWòMë @@ó7Ð|ùo–Ø”¨F—XSq²Ó>Å©—Ê Kž£U³é-5uT¤&õ¨ ðWsèùÔP ^ðtéÞ`*§‚5 µ­ÚÓYQ¦¨6èCCa@Ÿ:“˜ÛÚ*„íiÖ“’xS¼Úõ«>€"¶(RÀ¶£èT`àÔŠr í\Ê€ƒ[7'5ӉЌæUû·¯™ÿru#ÈÀNá°š%ìR)!h÷J˜ÑòÇªÅØÎp&‚Ž1âcùÙ!çœÚ{|e$|Ë=BF¸mfªè¬jƒÖ»fÈ‚S-TJa´D,î¶ÌE%lƒÑ Xq.ða6µ9Ö¬Eéëø’^ÏS b[(Ü&˜É­ŠdóVÕzYv€ËlSÇ@¸ÅqhRãxç8Ð-n|¤\̘ë>Í%‚sÚ¸Ý bÇAÓAu…£]ò’ opà è°íJ÷rà¶ä°V²RÌ;uoÄó°nm6ÚŸ¡ ÜMA®¬Õ?ÕUÈ@FïN®>'øw¼„•Ãþr€ö¥Áÿ«ð{ìüvdkN‹²]#Võ•åªhöœ[avÀŠ(ЀÙm*° *ׂqXU'Æç #Ö¸í'†ƒ’â¶äà0¬ÁŒÕÊwÓ8.`CsÄPw§@Æ@ ÂfàD#wÆ1ñ@¼CàŠõ´5UgzÍ ÖíM Nyå¨Ï†¾i>ù‹3ä ž§dß[mù¥]na%æ, ‘…av:SHÓœ@…y§X0Óè ‘ƒÄKW½¸rÙyQ%Y¤ÃÊhÇ!,®¤±•P˜k‡Ò5‚Äj9š8²6ÖÖD´7@GŒfY¬|¶(‹üà[Àe/Ï»äö9ÑÿY&¶S†Ìë,»áÇÄ2‘Ÿ‰ßTé·˜ýµ’§§S‡î5H"ÖÇõ* ‘š:£ˆ}˜ÊO=p˜_4ä8…jÍm~!éSçüäy?éðÏiaÜMwiúм6¼š¹M‡ìÎvá®9Èÿ½ ŽN¢)å:J½ÞõL5‰-EJ4¥‰/Ë´ã׺Pü¬¦³4éì¤+^ÛNup¾ü«‘Rjßý¾TÿÞ\ðzœØEvU–×ûmãA=.+¯Þ½«¢ž(‚Êú_ ×ê=Ú€CÎW.Äõ=cÄÇ!›§AAX½he5L -(‰…w«‰@kÃQ‹`}ï{0Àº$‰¥ÿº›*?Í$¸Ö²ÐgDtµ»Ø;à,Ïâf°‚‰–CY‘—ÁbÙŒb1t­‘;6±ëÓ6ÒÚ˜®,Œ+3‡ñ6YÄ]pãËÝ}¨¸ñ¸ÇmOP°år?·8® ¡¡†™1æ¢Ð.›2÷³‡Ÿˆ0Oˆƒì¸¹ÀîC„|Ÿì¾¢@‹Ñ@炇Ô2­ÀP³S8ÓМP,sP°–sµTK‰ó»ÿ ¦XS œÐ4ør!œ`ƒýx0{]³ªÅ˪ÿñ¸ÜÑ„;¸QœHi„IË)Á[s?c‰›ð«0=³‡+<oà° ñ0Ò!¢âkŸšÛ1–c³ÿ %“4P1™é1DSó6[Ò0dØ 6x«GëŠnH…Ç4˜ÑPœÖ©´‡X‚ÔðŽ‹Ú±J{, oˆÄØsƒüÁ`¸®P˜!ÐyœÈ³²…O ñ1¤c’Ë;–ÌóÏu|ø¼Ü¼ càt¹Ò‹${œ»í#EDz«3 ÿÿ¸O˜{Ñ@InÉS=Í–qØ…£ÃÊâS1l;> H>´XM(™µ—6Aœ?ÐòDR%u&ÍÐN©ƒ"l)¥€yÀŠI?ÜR‹1ÉÍã‚eȸ©@pxòƒÕóc-gH…/ì¾ý{¿ô#!c¡¿·pšS•™ü @ üÌUcUAdO˜}P@÷cÀ š xÖf]ý#¹ ?ÖùTú‚3™1Vީ܀Ìh«ŸÙˆ}€-Ý U½ºùôŠ#ûî!{›{•‚.Êd¯t›ãÂ,ù…!TT,iMBJ­Ô$-'E < £ ?È(6(D'ÄØÿb¨3Ì€TÝ)-t¿Ë/„‹mÕnÃÛQ0 »ÃÅyCh Ú%‡3HCƒ:”£àÊÃûŒÄ³?| c¨· èÆ¦]ÞÙ¡ÂaøšCHl¡zX4P }xumš‚Ð1ž•u;j)¯ÝÛSµU5Y ”–L›Ñ£(ÓÅŠŸÈK„µ’#܇}ØhÒL%Æ(eÂc$L3KÃ5Åõ.ÊÓÏ=¨Fg¸Æ ª3ml„8@ÚúF>C†Gº@€p!=ÇEë‡`G‚-]r4r¸!Iû0Oƒ¤õ~¼6D%â S0†‚”Ý j¨ƒ$½ÿ­Ý—·r£í1MìS/-Û+Q‚#K[$ÓWëÍ×­ñžƒ{5[t’ÈÈ!™”¯sÒ"œ×+PX¥XÒ¿­ÔˆåÐ0{¼Ø¨ bûnö¢T6ÇÜÍ]a6¦Œ_mK6\h·Û $ªl¥ÃLKº8ßqËpûJt+LéËÊ(ÄHÒ‹ÚÐËÆ¤‹µtÂ`³#¸·Ê(L}³¶ÅRp$u¶¿œÌs%UÂK¼„Ì®ÊÛ(JŽ rÃAŽ„Ï& þ%!âáPÉ`y[.Â6fZ‚u‹8eJMéÈÛÙÛzé[¿X_“¾Ç£S-©â”W’ƒ»’kÎ09Ñø˜ÆÞTN“‚ ñ!4fNÿK˜ÖgB©Ÿ²Mè: ¡Ð0ÐcÅ=æc™Îët?BäB®CÆNCö€)€*;³+VÒ€Ž/3ºN5[ì©»v\TËÒ*ýâð²S4YÉ»c¢ø=UÖ¬»ãìÏ/ù:9X©ÉAßAP߆mRKÎâØ|ÞMUTNQxå÷åx×:&åNÆ»¥Qgî;$îã›ÓQ§³eA°Ôõ]Ò …ŽÜ÷5_³`6™û7,ª’ØRéRïR•©áu>ã±ãñݘgö$*-‡ÕiÜe¶šX\[n1›­„Õâ‹•M—´[*-)¾H6»I†XôÔT ñPÞ¢ÿþ£3U0ÕUÝ@XxA„Ù¦¦·4òƒUó †D…õUeÍ-QµÕù;†pšëÖÎÓÀ­dåif…¯à,7i9³0å ¿Š,…Xpi¤F1Ž¡Öo8Ք醌ãG¬…rð’;s/bIé­~V[…Ã/ f‰E|]ë}µÁ R’‚~¦€%±à_OÀ±ß(_a¾k„J½Ô$­d<°èž ›‹ŒýX•i 1½@Uø,ÙbáB”ݤ˜Û‡x´R ‡@lÝi ÚqUC¢ÍÙÑþa@1Ÿ]1;TG«ÝCà²1d ž Ð#lð3®(†:CœÐÿ„‘!V"nÏÎC¶@È|ŒÈx@ÒöºÕ]‡|0´v:´èî_æˆk‚£UÄi*{ƒ†®ÉØÔ„èhrXÀÆbÂ,E„tå"^ãÙ]Î¥oâÄ¥ƒ‡£™ åbäÎÍF°Ü jYâ³éhr]Z9GCëØç‘D{¡w_ÑmÝõ«Ç¨µ5ˆ$ÜeÈÒ­…ÈjxDj̯ÛÔ9pC$9DLñæf·™Xãu˜óCnžÈö婳–)ê–¶ÎWa’ð–¹Ñðl˜I8Ƈ†‘¾+fR'ífõ¶“NÍJé­ ì脸<Ê«¾ÊÈÜë ¶þUSA2 [06ÿW2M­øJ&>K 6ʈËÛ¨‹5—J‰“àa#°¥œ ÓD¤:¿L'Ì£CR¥¥D®0œDù…/IPÀ|#¶”‘à¬dâUB¦dC࣠áÓÛê6MO$Î\K™Çìâìg” ›°ââà=-M¹À6B"$I¡ÊuCÍuËõ_oâ(ç *N•¿ÎfL•÷= Œý£MÝ$5 㑺ç36Û9-cùå\M/xö·[I‰@$¸‚J" ”±‚S®:?Þc ùczäèœå‚©w{¿w|Ïw}Ï÷ê™òH=vJ…ï,'ßLövXîçwþåQ¦É »«WvQhÁOmu[ê£ÿÞ)¬#æXZår>©ð÷ù,v7©ò¿m_oföƒ_w„kyM>놯ϒ“x…Wf–W½g}fGªh–暣æ„xIÆeJ®h(ýf3× q¾yW(çwBg.Pg3.’vÖ_V·gj„W>1žt‘פWxÀ¤^mùŠWcY~á3èÇBèBí‰C}q~\›òóeï4rïlFù‚'Œ–ÚËI êèüøhÓ é:øê„*iä9t-© \OðVRØ„[m@ž†?—VGúƒò!9æ*‡ž&®6AÑj¤q×Úêj­ ¤–¸Yjî-šæœ¯£i úb„Uü–)H—ûÿFÁÓë›í¥º$/÷¹–®ø¢»«™ûÉz“Ü'5¨ÁÃVœÐê*R½\´ÇžAp’ls˜î‚HÙÂp–-ÍÆÎŽë†‚ÑVÃø‡†G±7Tm®†€‡"&8à'ÕT%W†*zzÀ‡-T@j% s¤¾Dà×Ð|4Œ‡ Lh&œS÷ú0:$ÔˆI?S1YW›ÓèñúìV¿Ûð¹¼ú¼¾ïß3±ÅÒ•¸$†Ñ ÕL,M¸ØØdÔéx4n¦8t¤ª®²¶:¼:<<À6˜R€šN&î攈¡ uZÿ 4 |áÌ,‹J~TddAi¸0s» |$#©|8%!u'3$ XND™§$æ*½Ètì4#`Éœ•@,êmøD‚%^xÈ €¹-ÒÁ‹&Ñ!¶r”N1cQ%¿240hðL6“üv Ù2ñX0ÓxÝÌI çNkðôáó'¨ž_x"-c”Ì"`p"™9(NÜÀPuNyÒuÔç!S¨Z ë•,Zliê*©_¡Ô0 2c&(q»Ì-Bä]\'øÖ'½bLÞ1#W |'há[˜1ä‰=â=Ž'Er\Ê}å‚, ‘!&}XÖ<ƒ4fËw$«îÿ7†æËc[f†šÄ)¾:Û³ëÚ.àÊqõ¡ã®ÝË3мîÒ¤–Á\{b·žýúy¾Ý£€@Nµó\jfÑö¥Ýw_^z~gÒðß㿃‚ÖíØKa–€«ŒKYháÒRnGò`°•!‚½…woQÐ ÀØÁá„ ‚(aR’øaˆnLa öT¢f¤£ ‹»¸Ó†"^蟅:æˆÆ"‹8äA@d‘?"™¤’K2ÙäkXƒ”SRY¥•Wb9å àÈc^0 ˜c•U‹))ä2ãU,µ£›=Ây¢—ožH§…8 rcœ¶Ø {:'WhÿΟ‚æèˆb°¹ÕŽ~%fX–yÖ™j©ƒ]Ú©¢Ÿ º§<â ê¢¡Žšª©:Ƀƒ«¯Â«¬³ÒZ묷4⤮»òŠä0Ÿ|˜’ X Y³ …¦‚7mŠ*Wré鬴kô3­4 !…¶Oª·}¦¡BµmäéB\¶eÒ·ªZÛ.»u5Ô潋""Š0RH'˜ñÂ/x{ÉþŠÒ ™z i˜ÄŠeà,f¦E›¹j4»EBÐàB8ÞøN 5TX°j<íxLN2&ÁóÌ3 }Ó %NŒF‘ 'T &¥Î7Ø,;­J0ÉCÞ*ÓPHNáSü|ÿôŠé ¡uÛ('291>C‘8£Í° Ì+Þcp2ÜÈc8àUƒT3cO´õºk²…85^x Ðk·½¸2•ï‹´yÍvL•Ðv¶ºv ¬œl)ÌpÛ•¬2ËfWñK”Ѓ\\ q GXv }ÙXw[âÖØ6ÊT 36F;6UóœPTNøàÄÝYÀ —à³{ñ0Ñû%%ßNË` 7ïÍBô>;ýFÙÄ~ÁìÞ[†AMâœb@¨×ÖĨPô^˜pÎÎöªN·ý9u'TÞzómhýÞ Májj xPE`1ÙIã0÷¨aIޯв.%1iŽÂÿÈGä!\ ãr‡CMöÁŒÿ4ˆÂì¸A‘mœ# Ý`;Ðñ}n‘@R@‚Ô8ô]?,Ä!R±Ç?¢D äbåÁöÐAŸ1md1Ú™E'’d *‰[K̃—œq"óûïg-¼‰ç|0Ïã‚  Î^`ø¢Æç“" rŒ *Èô°W Su¤›Ôtœ"ÌäÂÁKôÉG†à„†Aa<³8OÊh1ÅqÌ_ž3—»ÜF 3QW&O-É­8Ì)ŽjB€JäÄc9´Dek&’ËR.f/ÃdNIIÒ$ˆÈsdsœðUÆ—}Ñ ÿ&CÀXò8ôs#7ý¶‹x‘'%j]ÜJÔ&Jå!ÍíC.rèA;ÚMÿ IHA2’‘zeÒ“¶IdYZ)K[*¥-‘S'ƒÜçt EÆ´-Ä'%êQ@½é£Åß6‹j"seÔ:BõæRŽBq€©vähN·â¸rΔý„˜²yJõ§ˆ‚SS3 .³Æ­>­ªWÅZV¿µÊVr+]m8 4¯&ýU¬%¬í3”:d²pŠÁ²uZ‹ +zÆÿå·má„g qª¨Êà-j@«§”h‡£*´XC † %‹C°SZÀðÔ­ŒD¼äåÚ×Â6¶{øàÖsN7ìk`.9 ÀÀ¡ÀÐN螉}QV#XÓ jârmíb ¡³”Ñl®kFÖŠà„Ñî !°UÚ’Á©=O‡âÄÛ.;5nœìfg‹ÉÛΑ¯‰KxÓUætßvÂç‚QiˆÙ{S'޵7eY»,^~æµxÔ ‰Ëu‰œª¹€Ï¥DÖÜv~IE7­Á㺓$@ñ\(8îjëǽéÆ2Ž#ÿjœ7â¶üá|«œ™U¥M ‘pÛ¥ÏÿÀn‘ôß‚šK¨è%&0ì Ty.åª_®«IB׳ÛÙm'y‚ï®ÌáÕÀÇ[F'"‘¼áabÍÎ{ÈØÄÄ…Ì¥$ˆöÊ÷Ïy ’(?´%0‚t¦|þt Kð¾ƒPùlõ‰/=Z|A?‰®Au8gBtÎoU­hb,ÛWÃZŽô àvÜ¡L°DÜòNÈÀ¬,wG¦i’-—¦Ô¦%¥jИt¹ÃxD#}åJ› Þ{lOYc…˜ÝìîÁºh¾‡:²¼¦àï â ×Ñf}(äˆ~, Ÿ9»&¦à‰?ɪ’¦©ÿh{&¡'´%„.:QÐYHSI8è]—™ƒ®‚2`€* ‡†Áhséß-.kk÷'ÇÛ宯ñE͉/9Mš%«“ ldbØZ5–M#VóÌ9ù-™ìŒ|<'ËÓs% ñåm¸ëI°2”Œ<²šÈè2•#ÈL+%©®™4G6¯1 c’ŽÊ»üÒ•Å ÌÐ;ËÓì[§ñŒPs&¡VÖý/ÌÌ+u©²Kx%sÑ$¨g€ºïe9j'6íÒ™Èh"Ò±‘Ѫï—?§œáÔ|7ïyñ°¼³µE§&JozÓ·’–ìÎ3Ûrú×—~?W5rq%—dKàÚÿ‡Uv‡’*Ñ¥²%¡-Ÿ¨UZQö^³Ã/U1ê|Šjtù¿/>ó«/ÊB:‘Hºýî?üG?ø{už(¹4ýêÝ)üç×Ú3l°þŒ@wìµfÿ Ç¯£§ÔêWíßPqÿåö©ÎS¹FUTÍ)PÃS ñYŸñ=ŸŸøV’ñr%Èý%›`:UþÎUó០*•W` NC\ÕU Ê \ÝÕèÕ êJ9ÌÞûe ±‹Yà^W!XyÔg¹ 8–³Œd!Œd½‹¸\Ì\V`˜¡T‘àjakÅZÅXžöICnõC?@<øÖòÿãÜ‹5 ü‹ü)ýy Ž@̬—ð”…]VÆ ÙÏl¨tWÊ€Ÿ×Ëà€  ÌwqÁ|åa5àaÏ<"ÑTƒ©XÈHM~åF$ÚÌDM€Q¶˜xB7Ø—âz™‘͘ƒ$ôL7´ƒjÉ¢Âɋј«e^.ÞXŽèXqK!=øÑÆ ™ˆèœqmà›‰>ÄoàEeÃí½F–͆ûÙI—}ëÀŽ˜Õíd84À¸µÙÀÝÿ\.AœÏ¨£,„ ° ž ÌIXÁó”@ÜL íãCô#¹íŒHhŒ=ŠCL\™6!O¼Ù=(ŽÒâ,ÿ^_.ᢾZè%L/6®YÄ® „icœ$£íQW™ÍÝ²Ö ©ÞÇN¸ÝPÃéž‹©ÐìXœ¶À·ÉíÔ¹¥I4¨õHÁPîœüÖ5™aJ`QE”öŸyj†4’ ò9Tò1Tòá_A=Tñ§Dê't†ßHqßø‘Ÿø_IÝàY¼ú­_‚®Ô ÔÜ›`\¤ø a"éÞx‚`~ž ïÕÿqè…®`} Qçˆf¡( :`Š¢(ŠÞÉ}Ž õ ÊJŠ!¦ †îg7¥'Ίª çô¥ ‰b¨ ZT‡n(Y)Ÿi5(œ<èÂh xÞT…2KK镊è’fáTi(q")–i‰Vä®JPi)iÿ¡ BèwJ(WfUéh˜Ê)–ÖKÚ'™ÎéŽê)ž*Ôj™)eµÁJf8Ðè˜&¦‡î)˜2ê˜ÞiŸæi¤Ò©£*ª*) –Œêz¨”F(å4cZ颒ª¤–êP©©ªª‘Rª ^j‹b*'¤éŒz§2þ JŠg•2‚˜žëQ^¯žž¯òjé k±ë±k²+².«²þj³Bë³Jë°N«±:+µb«µFk¶2kµv+·^«°N«·†ë·j+¹n빂kºšk»–뻲+¼J«ºŠ+¶¢ë½®ë¸æë¾Î+³Ê¨«’B¡ˆ†*ÎáàÁ"lÂ*ìÂ2lÃ:ìÃBlÄÿJìÄRlÅZìÅ&lˆ Ê“–`-cxþÜ nÔÈV ÉšlÉ¢ìɪlʲìʺlËÂìËÊlÌÒìÌÚlÍâìÍêlÎòìÎúlÏÒ,ˆ’ŠÀKJÎal£®ê©2íÒ:­ÒBmÓFÑNÊ¡bEýEíÓJíÖjm×fí×6-`ÆáÇN©3z-ׂíÙªmÚ²-ÚšŒØÖ¨Ñá›®­ÛÖíݶ-ÞÚmÞ ÜªÑ†§ÙòíÞ®ÞîànáNm­¢¤”&•&nä"îä*nåJn©úíÀÊ-ÈV*å^îçznèZ®è~ÕNέÎ-ä’îêŽnë‚®ë²n˜®+­Ïu.ìâîëênìò®åfnÑ¢.î!í¦öîîænñ"ïñæŸÂD;httrack-3.49.14/html/img/snap3_a.gif0000644000175000017500000001374215230602340012552 GIF89aH˜³¢hÕÌ»êæÝÿÿÿ,H˜þPÈI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËíz¿à°xL.›Ïè´zÍn»ßðS`N¯Ûïø¼~Ïïûÿ€‚ƒ„…†‡ˆ‰Š‹|q*“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«š’¯&®°³´D²µ¸·¹¼½3»¾½ÀÁÄÅ%ÃÆ³ÈÉÌÍËÎpÐÑÔÆÓÕk×ØÛ¸ÚÜfÞßâqáãaåæéièê\ìíðçŽñhïô÷ZöøSúûþRýþ9 (° ‚“ €¡Ã†JŒHq¢ÅŠ/jÌÈq£ÇŽþ ?Š Ir¤É’('f›—° –¯ªy ÓË2kêÜAs'„‚•SÆC$E§ÈLš„i™ž>},„8áè §°ÆÐÚƒë¯0¡F唂U£À¶P›ƒmÖ'nÝÝËonˆ³G…VJ4§Þ 굺´0`¾‚— &º¸¯_¾C +Fìø±áÄŽcnürR‡EAïµ> 0t^¨Ž:Î 6Ár£‚à«¡ÁiupƒÎø ­DÂdU',!1R8*ªPê{azbúÃ…‚¢a% ìÙÐ51üa«‚¨ –ô#€8|a]¤Ã È‚€â‚¢8Å*N‘P¤"þÀÃ*rq‹_c¯(ÄA•qìÀƒ»ãN¢‹oÜR·48Ö‘Ž`ä"õÇÝÑsìã%ÑFFòˆL¤"ÉÈ9Üd‰Jã%œ¸C-:Ò˜¬ã<$É:‘%šŒ¢&Û8J.ÖÑ“·%YÁÊVºò•°Œ¥,wIíH·ÈäIiÊ'†’” $7©JN˜o|$ÏX¥a23·|Æ'MEjfÒ—™¬¦0õˆÍcz³šO¤æ3Y§Ìqòj†Êå&ÉËNºQaL•ÅbÚ3ž…|gÍ)°rò“ѼÀM@ ¯y[ðJU0+°ÐUbkŽ%Bþ *ÑöÓ™A@3ê=rôý¨8h¹L‹†T¤ô(J7pÒ•rP¥.ÅekÓ#´¦ED'.³8„}îšø)N¥‰Ñ¡†o¦Õ¢„PQàS–Š’¡.€©Qƒ*Õ©¶t%Íé6e*ÎÐ4’U5êU åŲŠñŠcÌ£} G/~1¨i'<¹iÉ|Rqª]Í+^õú8+ÍÅtcËÇ?2¡„¬ZßHXNÊq˜}ŒcdEéØd*Ö”Y-ãM÷ºU Ý$%!{‰JPÞԗ­1á9Í^òÒš|\-ié J±†u¨c¥*e¿éÚ]ÕšÄL-o}úMÔ®V¶Æô­Uoþ‹ÓÜ‚s¸ö §tˉڧvs‹‹Ý­8Ã)Úáò5¦›åìwµ¾zâ³›Öõ#>çªMó:q»¿|§%å¸Nù—¶çͬf™[Ó–N”¢}hEJ`¨:ª5¨2 `ˆ:x• >èr»Wÿfá« /g-,Þ\h¸ÂHí° ù Þ‹¸Æ+‡O¼ «ØÄ,öEŠ'Ü2ýÆø 3¶­NáÚÈûøÇ@²‡Ü‡¿’Ø¥'½Ò°–Ìä&;ùÉP޲”§Lå*[ùÊXβ–·Ìå.{¹=Fv1A«,™ùÌhN³š×Ìæ6»ùÍp޳œçLç:ÛùÎxÎs›9À0wÄ;Æ¢¯ôLþèBúЈN´¢Íh4CøW’çSÿüâ@;qÐδ¦7ÍéN{ºÑ’jŸuKé1{¶ÌŸNµªWÍêVo:Ô‚uŽq ãKêR®Îµ®ßŒé]ûºÐ°¾´¬¼Ò$ËêØyîµ§•ýk<3»Ùжs°£8êßb8*Æ6T–žífnkÚÛÑŽ3¸ÃMn6O›‹Õîìµ}’mùêØ‡Òv¼qoi{Vî®7¾é£yêßú>Õ­áMð[Ü̸¸½ÿo…+¼ßù6–^jXÔ¶˜u\ãð!ûÞÏ·»í=òA#[â$O9ÉO>ò…Ë»å*ßvÊ'þò’Û\å,/9Êžsþ—û|á(¯¸Ð1%Â/õm[çgîúÏi®s®#ëdùÐÃ-é¢DÚÏ“o»Áþt¦§=í0ÿ¸²ƒ.õ±_Í=‡¹à™s±ßêg—¹ß¾v¶gêí¤Žû†kMm»[Þò_9Ùß÷¬£ýït_|Í=Ïwľç‡ßùèÇÝxVŸòÖ¶ñ3çþõ'^óŒ‡xÞw†ÿ=áUÇô×ïoxÜë7=îmsz¾õÐ~}º%¿îÌúØÏ¾ö-ý£KÐõöÇOþò×¹ûp/­-]yó»ÿýðצŸ×êþëäúñÏ¿þ[/eï«¿¹”Ç^7Æég5qR²”€ ¸€ Ø€ø€¨yÿ×_8€-†të~Ø Ä†R+¶ŒÓ"õ س€ìW‚"‚E‚*Ø4ˆ‚¸F{ {/hF1H)¨dMvn7xa,ÈQøw-vÁ=壸r#âG˜CA˜QCø+Ò„i,$pL¨B'¨ƒ3Ø~ŽV„Ç‚j*XøTÈDOhRX)_x/Bs<ÊÓ1E÷1:2ƒ1e"Õ1¶SZ˜†ÿ…D1”ã3EÓ7!:Ésˆ~â1…s:RB[Xb;Èl°æ9š3:QÃ9{saÃ9þ˜(:rÓ'gV—J'~iv‰–³7ˆ˜4$Ò *‹2<®ƒ8µhA“ˆdkh‰`x8¥9¯H7šX‹ø$¯Xжˆü$ˆp‰b3;oB4¿£&Sˆ'±³53Ó&z²1´‹Å¶†`ƒ?hSÌhNØ åà踎ù3”Ø…ðÈí8‚ïXÌsŠ2˜Šúh‚ç8N.øì³—©2ÉL™.±gÔ‰¹_)8‘ É\è )DIÖY÷Ø‚½èd>8’8ø}•FlxfÁ¶&"à,72Õs…òÒ%f@ùCÎÈŠBó)nXàB:B‰w±þ“ãS’BØ‹j”a.©£”‰Èg8 Y¸”=iC?ù‹ÍÑ; cú«À¬ÂKý‰Žïˆ‰·Ó«Sé§Å*ÇÚŠt¹è©õg¨6š9ƒ›ÕXªÔ*¨zúÙ­-Ь‰¡âÚL@Š Gz®Ïs«&¢ìúäÊð¯ãê®ý®özNéz¡ëº¯é£¢…i®Ëó‘XC=$ õ N…E3$€KµTó°(„¯úã_£”UòE- ©‘×±[[ße×@±Ë(°¾y¤á@)µ¢N7c& 0ß*Ÿýº¢,kDØeVktWñôVXtVØuþJ4HƒŽõ\AF¹Ô³=+±¢U´d$X ²VB[M…ô³,‰†*;ð©N 6XÕX’õGˆ5¶ƒÔXƒ„GÑuG‚”L”ä¶fQÎHouGÖ%YvDXÖ…¶x{³¡‚±–¹³ÛTZí„-îtI…¸¦å.œTZÚåZvpOy¹º¥Z¥„IôÔN¿t¸›ôP[ôZ-$¸ZùµÓ¤X”[´˜¥T„B}Þ¤\È¥IÈD¹Àe¹u ]ð\Ù”MïÕ»%Ên¤[@ù(³èÕKJ;]ËMŸ[¼p¤]Š‹¼]Å»²u¹Ðe_œ»»nÛ^𤺫r°I¸“¹Ö$XõE_pEOì”^ú„_U_ëþëH…›¾Ä_Å[»ÇÕ]C‹¾›{±]ëŸõ9PL&af Å`F` F·À %O,i²`À uÁ‰2\ݼ¼Y¯R"ë„ýk¬[°°RÂÎzÂ(ÌT¬@ Ü›³û¯2œÂ4¼²'ŠùTÜ…“uâÚzàÉX7w¹/7ä¾3k£­·xšÁÈ«²é˜+Häðt-Ó&62Yt|"œ?ÞÝÇ–?ã&ÅIŒaNìÄž ¶~ìÈžìʾìÌÞìÎþìÐíÒ>íÔ^íÖ~íØžíÚ¾íÜÞíÞþíàîâ>îä^îæ~îèžîê¾îèëîþîðïò.«¥þ.Å~ïøžïú¾ïGÍîþþïð?ð_ððŸð ¿ð ßðÅþeÏeÕIì^ñZï·^#Âþ–f‘V¡¢è'¦ñ¸T# ïñ–òã8ò?òµò\aò0Òò¹Bò"Fóó$©þò­|ïòªó¢Æó8Ñ'aˆ.J&ò7oóDiÜgòºLˆ~”òŠò®”‘àó™UõÀÝ2A¿Ü‚õ8ßaT¯åÆ MXÿõª½õ3ÿôh_…öp/šdÿò#.lA…J–U}O”â‘<.øoŸõwˆ–›?÷N…5‰â¹ öxO©rþ¢?®kÿÜvIŒ‹Ÿùl¯º©„sø__ªeŽFŒÏY2=g#5³£úFÏú¥â5øšß5¸ˆô eû¬ãÆÏT»¿W™b–t‹G8ùšß«‘iø°Oü:ž9žÏô„oÞqþOúCŸ÷zå£?C«¯õÞí¿ñßÿW>ŒÍÿù·¿ùŠü¥BN èÙb]sÅ.q$§ Jue[W872}EM¾ÜÃ?½6Éf@"EX,KfÓù„F¥S"zM¢°ÛKLe冕߰;.§Õkv› vCcð8Ó[¢×íGQ^Dû$,Dò3l™K$ºblä»@„̪¼ÄÌL£Ô àÔtí íd1E]em}tíÒ‚õ$›¥P´½•Ôíõý# E .6>FNV^fn>öyÕÅ¥ΜþÅÎ.pîöþ/¾'/7?GOWÏÁ wçà†¯·_–×Ö߇Z÷®ÿPà@‚UD˜ðÜ … òƒQâDŠ-^ĘQãFŽ=~RäH’%MžD™RåJ–-]¾„SæLš5mÞÄ™SçNž=}þTèP¢EEšTéR¦M>…UêTªU­^ÅšUëV®]½~VìX²eÍžE›VíZ¶mݾ…Wî\ºuíÞÅ›Wï^¾}ýþXð`Â… FœXñbÆ?†YòdÊ•-;httrack-3.49.14/html/img/snap2_b.gif0000644000175000017500000012056015230602340012547 GIF87aJ‘ÿÖνÿÿÿÖÆµÎƵÖÎµÎÆ½ççÞçÞÖïçÞÞÖÆ­œ{ççÖÞÞε¥ŒBœ”)”Œ9œ”!!c­œ1”ŒZ¥œ))!R¥œ÷÷÷{skƽ­!ŒŒÎÆ­çÞ奄cZBZ­œŒ„„„„kµ¥Jœ”k­œR¥”ÞÖÎν­)!!J¥œJ¥”ÖÖÎssk½µ¥½­”scJc­¥÷÷ïïïï9””µ­œ999kcZkZB­¥”BBB¥½­Œ„{B¥”kcJŒµ¥ïïç­¥œœ½­skck­¥!!!”Œ„”µ­91!µœ„sµ¥1””BB9!ƽ¥ŒŒ)))¥”sZZR!!½µœc¥œccZ1œ”kkc­”sœŒk111ççç!”ŒB91ÞÞÞs­¥cZR­­­„µ¥”””œœœ¥œŒ„{sœ”Œ9911)){µ¥Þν{{{RRRµ­¥¥¥¥91)œ”„¥œ”BœœB99JJJ11)ÎÎÎJJBÆÆÆcccJBBÖÖÖŒŒŒ{kJ911R­œkkk”Œ{sss„„{sµµµµµœœŒZJ9½µ­B¥œZRJ½½½ŒŒ{)””kµµZ­¥ÎççÆµœRRJƵ¥¥¥”¥Œk„„s­Æµ¥ÎÎZZZ””Œ””„sscZR9­­œcRBµµ¥ÞïïZRRÆçÞ{{s{{kR¥¥Æ½µ{½½RJBŒ„­ÖÖÆµ­JB9s½µkkZÖççJ¥¥ŒŒ„RJJν¥çïïŒÆ½ï÷÷½­ŒJB1„ƽŒ„skcBc­­¥Æ­µ­Œ­­¥Œµ­ŒÆÆRJ9”ÎÆ”½­RJ1skRœÎνµ”½ÞÞ¥ÖεÞÖç÷÷9œœZ­­Æç眔”¥”{÷ÿ÷cµ­ÿÿ÷Œ{c¥¥œ½½µ„½¥÷ÿÿ!ZRBRRB„{c„sRŒ{Z¥”kÆÆ½ÖïïkcRs½½,J‘@ÿH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cfá„I“N@€`•’¤Ê”-a¾t©a未@ÔtR³§Nž:kr´Ô( =5 Eº´©Ò§C‡>@ú(¤©SyÀ¥á&×Ua`}0–¬²hÓª]ëhZ·JÈÆu ÷ÁºJðNÈûÀÊÝ»JüÞõ+8¯ßüB¸»x%‹#;Ž<#2e˜+cž¬93˜3ƒ†0c4èÓŸS£vpºµkÖ¬yĆí@öl#dëÎ=GEíŠF8P1'·qß*F¤®üxŠÉUúîªÏ>ºê«çüäÉO:îÎC>yï›/^=éµN»çз;ñ£.zã(€D 4N´ÑŠÿÞúá¾ß^}÷Ìwÿ8òŽ¿m=Pã>󣣟¯7@ï0qÃ3`ìš÷?ãE. ¤\þ¼äAÐË{ßërÇ8÷5pÑËàó®wAF‚'¤ òHBþorŸM‡Âjïxãcß÷â@æÅ0‡= ¢õÿÈ=öE‡"lŸÑ&˜DönmlbK˜½£yðƒ3ì฾æîˆâ£"ÅÆ FÏ~×  m8Å2®Ð…3Œ#ø´hÂí½ŽŽ“ûèî‡Å(2®‡¹#ãG¸F {5Ü  éÆVQoL!Ÿ(J²—ä -XAú9q}k³¤ ÁˆIRšÒ§”Þ7ÉB8RQŠ\âÚ7K&jÒ„‰¤% Åþ0^Œ^*sybó˜ÈL&29P4 ®™¨@5thØÌ¦6·ÉÍnzó›à §8ÇIÎršóœèL§:×ÉÎvºóðŒ§<çIÏz–3øÌ§>÷ÉÿÏ} èÙ2p‚&( XNà °‘Àt¥!9Qʽò†•d$ÙÉ_þr£í¨"3 ÒG¢å¨J¹(G’®Ô¤,EéH+˜D˜¶T£/ŨHošÒ¹õó§@Åç:H“šh¨,yH]¦Q§/]^M¡:ÓžÚ”ª¾Ì*OcZQ©’’—\Ý©Wµ*S,^•3-)VÇÊÖ²Nµ¢e…¨Z»šËºõ®þ$jéŒ:Íjb pê£äziSÆe`i’s1À¾q- kÔ»6Å‚²êK«GÃÚÔºº4¤Qõ,NAKZ²~ö¬b­U±ºVÕj¶´­Íèjá*Y°ÿ¯¸ ÀP‹zT¿:v¶>ü 'Ì7€!pK€äЂ(„-CžP3 ¦@"¢ €I,Me('Pð„2$7lg8(ц¡%w‹ .‚‡ <¡i6ûƒ}ãÇ$ …¥-&mûÖÆ•©°­ífo:×ÔÊöµ¨í샜SW¬µ°s‹×Ýîµ·IýkÑlûßÀ‘³C$q0Sì¸ÛOh+ñNe,á’¶õ´v°måZa/˜Ç öñ…)äÿÁféG›ärø®_‘ªÔ/Ø©8ž$(!lÉUJï–n¥ˆd·æ8“a¦é™¿zåÿ­Dn2jÑÜf5 ˜ÎC.ðIá d9-dC´€Oš †àÃ.e½¶fíkˆ›g1«0€–†3„ât A?1€¸ KªM= \O¨Y öV…8@Uh "Û‚Ã.!hA*h°Ô ²6ØÁ@{ Ù€¦A KÈ›Ðb}A UP.q¹ÐWØÁŸ@!ˆ»rB`AÐÌ4„-v@"ì°„T³ÃeÎ÷›…¼Õ8çØÈCîó¿•ìZ àýøÁ >a…øÉAõ0ç"MeOË*.%.>áÖ‰¹¬4+˜SiÓ’Çvßÿ?ðÅݼç×ÙÆwxËSÎg}Ïœá;¶¹@ T‰Ïâ¾½·U‰o+Ö²’VFqÂkžóX~9´…ì·'íÌo“køäG^9Õ[Žç~ëYäl®ôÖÁnÚ±[½éÍãùO}Î6 OzËc¦¡Ö«®Ó.RyÃdú-¯hi¡ï0¢M.“Þu·†Ýë,'û’Ls—‹æŸ;ÔÑ®ö~²=hn¯rÇ…NxÁ‡î¢$éÀ—ît¾G½€Ϻç‹>ø,£çYO3ä99ûØ¿|ò¶<îGZy~^™ÿ+ç3;u£‹¯‡Ô³âï~HÔsT~ùÝ[izÀû‘ÌÖ¸ë[ïzàÞ<È…‡óÿ×Ëî}¥Ï9ñä/ú÷¯Úû¼Â.øvÜî µ*‚…-¨EÔú‹Uç =õÑ7;ÔxÒÇGqdI¡g}à dÐ~ø€8X˜zU~@ @k¦{¥¿I×oQ>É—iƒ9^–}D—~¥UXóóP,å|d€77°€ ˜O2 |àƒøD„u`l0ŒP wc@@hNˆONxz€OX8h…öú”cðuÀƒ0h[p†|h!Àh„gH HhwÐg¸^5Àh2ð†‚Æš`‚8ˆ„8X:àQ>çC[ÿ´:þ'U"¨W‡P}ƒô‚sttT€4è‚ó§a'}/hƒ.vŠ3øˆ«gQ"ÑŠ®øŠ°‹²8¢…w„€pç8“ø~–tͤ|Ø·dÍ—Šr7c›Ô‚-FŒ¬¸o´—ŒÀøŒqÎ(·zÖø‹(ŒpV|¤rÇÈ|CÆÈŽß˜Þ8aâޤ‡<Ôlj†‡o»x:$¸yš¨o”€Q„qŸ4Š€dKþøtéAÕ׌]Ó(W{„ŠÐØwC§¤³g'àÔT:ØÈ‘¸G·ã:YH¸S|Lä‘p×w‰:#IK÷¦GÆ9”à ›àõbÁhUž•(iJÕˆ„ÿ•ޏ“¸“DY43@Ù=‰ð‰BÙ6€~þÕB‡:<l‰°kA#©4C“”§§Š'yb(=‘˜ü(>æ¸å@ &‘ei„’N—Ì Ã-,ÂBÜÃ%Ã?lÄ2\Ä ¬ÀILÂ2œÄlÃ\ù«¿ù»;!8J(êx-eµ½k¬ÿ¤P šHw³wöy ûB£Ç8ŽxX„D8:F%j‚Ї‹Ù6z<=^ 9¹{àxƒ ‰ÇcÙ`¤ˆz‚ÿÔôÈV (ÇDGÈËtA$ƺ˾fü¾¡T‚2÷Åü†³JX`I·°4Ž¥ìÉ,u¤œƒ3ꉛ³P` P³\Ë´|˶\˲ŒË»œË½ÜË´ ̺ì˹ŒËÆ\̱ŒÌÇ,ÌˬÌÄÜÌÇÌËÎÍÃLÍ֌̽<‘\‹=.pŸ`Fe§‚}öDæü¹dܾg<=œ¬s‘Ê' Y“54à5cÓìÉîìÐþìÒíÔ>íÖîìË^íѾìÒníÜ®í×îÙÎìTCîØnîèîÕþíÉÎîÛžìYÓéÚ£n,Úëº=ë-£¦¸Êqî‚ôg}Ö ™~Æý—¢ŒÌ¡Eñw/Ñmþ’+ç'^¤çð8ÚÊh×PzØÈ6øîÒ½ÎåWë3®a}\Ù•4Ñâc€_éëCÿ£$éæH·ç™*ZQvê…v4ÿ–ɸå[½AÔåÿT-§€êeAÏ®™„|ת£ö8#oåú~ò­ôÆxÚ6ŽôiÍÊ}4ðv {h_Œ÷¢™òu=·­“ÃŽ`ïò·~ôóšôiŸâõÎâZMëtõ².Öû.ô{o‘\¿öP^¾‹¯•’Lô†ßž‡oïÙÚ ucõôÿ¸”äHÛZµòK_RžýïQOvÕgÊ£_A*Ñ%«ßú®ÿú°ÿú5¡h2&lbûAá&n‚¼ßû¾ÿÀï|"O|ò'c‘(‹¢(n‘“â”2ÑÔŸqaý{‘ýØýÙÿßý™‚à?á?þ¦*æï*¨â*•±þ®Òþš+ša+­¡+ª1ÿ¾Ò+Àò+µ±ÿÀ¢üx1P…ƒƒ ‘‚¡C%ŽˆØ°bŠˆK`L±q„ SXè8²$É$-¤™r¥…—1SR˜™² 4qî¼iáÍ9¢@èO¤%RXúiS§$Hý0µ*UªS%T­*ÁëW T¶‚%[–, ¯h%¨…Ab­Û!H´[—„]¼$DÜÝ;¤ï^~õ&ì7‰Ä"¾$>ÜxÈa…(Š|ïÇǾ|ðÏ×ÞüòÙOß}ø×~ôë—ßþïãÏÿ~þñ'¿ªo àÿx@óP  þ˜¾&\`éwAbðþË ÿ-ÈAN0„ÔÞæ$Ç;nÑìu1ÓVÏ’§´Èíîtö˜ÅxW¹cáM†ÏËôdw<èÑÐxA Ö C×Ãꉪ[" g¨º$¦Že9ä™}§°щGÜâ'§DÐ%M[À#^UÈ8Ö±‰<Ô¢ÇP18šsi”¢éøE9jî„zÄáÇPø/?Rñ‰±äóv¸<‚ˆ¢cäËH¹B>Œlì]ëî8G7f1ŠV¬ä"ƒæEÚ]qc5t^[ˆII^2‡ Œ$' XÆR–³ ÀõhÕ‚'Ð@V ¨@V@€xÅšÕ&oÈGQîQ™qTfñòHÈB:‹È”æ3ÿ©ÌÞ]“wÙ¤&3Mo>3œÐ¤d5iXÎqj“šÜ§5»ùLv¢Óíl&­hyÏ{Ú2tà¥/)ÌN¶‘ŒuÜdô øHs¢R Eè8jÐ.Šž“¤(C9™ÐˆB”‹å¨!‘¨Q‡Nt¡ µè9úP…^´¡u¥ç`…O˜ÆRŸôêgaÒŒ+•¼PšQ“òôšM©:“YT T¥,%jFzÒ:>4¨K]fT]ªÔ©Vµ¥#}jH·JR­n³¢Ñ‹iYky€ÏÕô¦9EÖdzÐàXÖ®€ºV!(€^Ýð 3 QZ0€Tt!xÆB±ÿü Ðk ö°Tز°¢… –08¡p¡ œ 8Ñ‚% K(À+Ü€ÙÏÞR®®âUzÛ6u£^+W“ŠÛqz4·H¥çP?J\yjU·?-î;¿Š\¡:WgféLÃ¥VœbÀˆ“Ä¡—kB@&rš¸} ‡gÛ€ž·)5éqêÜÞ‚•½X¥¯tÝ»[–Æ—¸R­oGßú[¨bó¿ø¥jG]˜Z·VØek¯tÇJÓ0gûjap! á1ªr£\T¯!-\`û÷½Í±p ÜU¦Þ—¹É5n‰W]4«0ûLãSÁ±b°vÛêa ¯pE,Àai@×3àÿ4p À•ÁÕŒSÀ¬2@ƒPâ %£rá\1€PàÊ4H„±@å’]Ù Æjd{dZ\¸D¹å .XW„È '„lv 3 èPÀpS^s6`eºîlÀkñ‰á;ißF¸¿–/€y‹éNkúÆδ¬ß›úÓ¸À`#\@ ¯ŽuuÑÚ.  6Í®ûkIè­ìgË*fÀ€w³Ïý á°BAŠ‘!‡ÀÀ¸¬-<5®RÒ–n%©½êQƒ›¹ªÎ/¨÷‹ÞOú» öo©Ñ]nu«¸¤9Î'Zu–ë]¯ÕÇ£Ó6n­È­ž;àÿ©®ãy¥÷Ìkríþ¶¹/ï³›Ó5‹Clâ³ã2Þ´HCMnzÓRŸ'Ã7¯sZìw—Ü'øs»½nƒuÃgTw*Ž[†£X¹ò–¸Ç)]×øÝau8·W®óJS4ä³¹ÈJ®oÜA3á6ô¹FóÉ}ܪZçäµd®a1¢’Fg¹¨Í~tOÃ;Àø|Ã]ôqéëŒq>à¥Ë²é){z¯ÊÐ 8 :d+yøDB±ˆ?Ž{Ä6Þ°¯=ìÞ¸ÛÏ>t®WÆ·|º×ÎóöFÜî9o¹æƒNļËÔÞ$׵ɵ‹rn«ó˜Ü®*/vrð€Wÿ8åùîN~÷"À60€ œàøÆO>ò?å?úÍg>ôŸ?ý8_ú×g~ö«}ëßûÜ~òÉOýóûå?öµ~ô¯ùíïþûÝÿýê›_þê‡?ÿ§|ú?û«?üc¿ô@,Àù;@ü#ºš;=H=XÚ;pé;¶"¥ñšºn…¨€'H†Zˆ,º2ؼÒZAA¾¼26ô’6#º¹©»¼mc.Dò¤´k–&@2€<è¸=àƒ/ð‚-(BWƒ5V“-¸/ؘµØ‚#”Â"<Â$„+¬W«ÂW[B)ìC?üC@„hÁqƒ +? …¦¡& À¤³?¤@°À}³—)¼L£$L»q¾àc¶ª»»P¤¡PJ¡Ð‹0piOèÁ@lEW„;`ƒXÒƒ-|E[¼E\”@0îƒ>?ˆ¸xú¨™ã¤H\=§k=¨ƒ=æ’½²[9ë<ôrF°j¤é_cD/Òk;ßã¶¼°‚ÃÁáGrÇ®;Ç ÇL Çu¸À³½Ä$<¸cDJŒ:vÒ@|yœq¹:ŸßÓ=Åžš¢Õ$ÝsÇgœ½8˜“®ä«Èÿ國ÌÈŠ´HŽÔÈãëHIÜÈ‘¼H‘<É“4É’ É•üÈ–äÈ”$ɘTÉŠ,šRÚ"€4/¬+p¹Ç{SF¿ã·K¤;„3H´#%ODH/š¸¢ã¨ óƒ´IJkÊNŒÊ‡ã¼‹3°)s¸È3¦ë èbÃÔê4H‚A¡)h&h X„T €'X¶€; ;¸ˆÔ=cÙÁMлA’齌ñIÖË·^cÆ:¢Æ`é› X´ œ? >˳*(ƒ¿Â€ƒIH$>+_`h<È3Í€¹i!0¿I†"@Í<ÃÄ pÍ2H„Ô´,è„ÿÈ38ƒ&Èò˜l«Ç€™0¯Ã—bôKâbÈØÊ”ÓÆ½lÏjĤ*ŠcÁ¡Û&ÛÑ™*6Ń8¶cÁ$̆ PƒRÌddÌ ÔÏwšPü¦IÊFŒ¹ùtÃÔ!„¨ú|χ\S6 Ô>T9ýRCMÓ(MT=EÔ.}Ò5Ô9uÓ0UTB¥T:ÕÔCÅÔM…T;U-ÔOýÓ7]T6mTIÍÔKíÓVeT+E ‚UZ¥U0018Mª;L*Ò <Ò×Ë4ÈœÄ'¸€Aȃ8CMàf5„@0øAi­C/”Ö-pàÂn 6xƒ ƒA€Â6€:àƒmÍ-xƒ>ÐCЃ>x/`×-¸;¬ƒ;€:¨EoÝCÅØnMÂ6ȃÖƒ ¥6ð:¬ÃWËÿxXØxXF„ð‚6˜×\üX Y‘Y’}ÅAÔlùÅ`ÔuДÖIV}Ì@ÔHƒ’ÍYÝYžíYŸýY -+0¢5€¡]€¡5•­PˆœÊ-â(˜ÍÇ¿ë7¬T€'Z¬ÍZ­ÝZ®íZ Z£5Ú(Z¥ ö2¼yJ-ŠZ™uLN*V«õZ¹[º­[»½[ØZ°=Z¢-Û;RPˆR/ÁíG9b[õ1 Ü6~¤•›Å[Ç}\È\Éíý5€± [¿Íº³MÐù2\×ËFµ­Ú«\Ò-]Ó=Ý»Õ[¢EZ²]Ú‹’F¨DžbrÏ]FbUJЉ[ÔÝ]Þí]ÿßÙ¸áÅžsFaÜÄœGÛÆìÃ[Ë[8€ÃÕÇrä/Ýý]íÝ^îí^³(È‚,°ñ߈‚E¬¡…ŒÐP3Ì×ñÃç[ÖZêý¥`¦ò$;Æm=iq X˜^è[ée]¢E.ZNà¾ÜÊÞ¢Eà†Þ–Þ fà~`–`¦`˵`öà¶à®\[èUa ¾Ü°Má Vav`–ßžá^áNaÖàÞÛ.àbÞaþá Ž`†á îaþà&b$®áÕâvb'æán`굩&p{s#Ð¥s€ôõºÿÚj#b¤#õ‚_!Ûúý§a"²kÔKl,&P̘O|¦ R›£c¾„·Uië®nL§ŠI©òº¦Sš›õ’:ƒ\!ßY#o¥ñºdnZßP´b g¤cb \敜sòdïtO§>‚ä87–_ÕãûåTR§,eqs+¹ƒG/_Uziå»FkÌ$bÖÐbÎIMfJQT&JÖßÊ ËåPÆs¹ëu·tÌÐBJJ¤ÄåÜzåÕešeQn¶-²É*be6ÜCÇî´Jav¤­½Í½c›ÚЭç=«°ï è²â{d$%p8Ð¥?ž"esOÞ$ÿp–`úg€*çÄU\½¦©Ih‚À‚0]Û€)˜ÄEüà€ IP—–¶•ކ•h (è]U€ €šfÈS†7wÞæDH•dˆ$aNfjÞÐØPh®jZªžx)hZ¹„"€Ð 1þ„ؽw–1k›èù^‹žcA®c5NäŒ^8Ø}æ ÐevHMœgÑ‹ÏJjëÐö…ç´ÐFO¡)ìœáÄF^ #ìÄnìÃvlÆ6lÅ–ìžlËÎìÈÞìÊælÈîlGÞ6jY72d´%´gû½è¶®eø„ë Óe°ìæw,kižÓV_å¥$ÿ£z$n>Ê¿~ê$%Ç}þeÉkÙ2˜J·¤n¼Pn¹ç†f¤>êuèÝÎíÐIm8^kZ6çBg‹y0ÎÕfQûJ¦ íãob&Ox»¯ý£v¤î߯kp9‡`‚üÞoýîoþþoÿpp/p?pOp_poppðg]Ífà›î62"í®èÕfë²tís†mc)œb!K½¨7xLÎX„Å‚"K­h0hq¨‚Ù¤q'­À€Ý$¬xbC-Ài³XΜ?¨fqKh4 ¶ä³D˜r¸„•p²؃Pˆƒ*È<àò=˜‚ÿ3ÈN0€'!h„ ˜¬À™ò=Ð%àL…Iœ4(™ õëO²k‰\êlvþüøßKbß¿"Ø'`€J "èß ’À "$(!… J8…~!abHB‡ аaIˆøE‡ @…´RŠs´B+× 5€I¥¢ÄA 9¤Œª€PÌ(¨ôrK;¥H3C)­(¡C­DRˆ*·À‚Ê(Ô@ÿ¢Á’ªÀ2 2lsK/™°HRE€‹ºH£A)£<Âbš‘¤ÐKÐ@€KŸæ€e“ö˜d—e†¡9+hš¶Ùf*Dkd«©ÆZl©½æ-nµá®o¼™ÛÛnË!g Í­tÅE7tÃ]·vÜá+žyÎ]è'$õp}âÙgž~ ¿Çß{þ)X`Ä“pàƒJˆ €r჊ða…"{(‚&¦ÿè!}ØC!þ°ˆ=¢“xD%2ÑNüáŸ(E)B±ŠNŒ¢£8Å+rŠ\ü"ÃÆ AF £ÍXÆ5¢ñŒn$#ãxF9Žs¼cë8Ç8æ±~ü# )ÈARA0$"©ÈD2r‘Žl$$#©ƒIRò”œ¤%/©ÉMr²“žôd0&ÊPê`””$%&D©ƒTN’•«¤$+ÿ]ÊX¾2•¶¬%.o©ËWè%ÐË_s˜½,ŒéË^¶àÔÃ!†¹ƒP@2—Y̘A™Úf/ÁILmZÓ—•8C6Ð a‚s™WPf9¿ Lb¶“žó2½iOmæSžüÌæ>‰Ðp*³žÇLç@‹IPm*”˜Éìç8Û)΃´¢þŒ¨E÷IN|t¡½gC=JLˆÂ“£¦AMÒ•Nt¥ûÌfKIªÐ2´¥.E©25ªÓ…&T¦1íh?kêM›ît¦ méHazO™²¤ÆT€ $ 0Á¨ÚÒ‡.³4¨‚Àpˆ2D¡Už ÿ€(€A˜‹(ð€MÈÕø¥Z „3tBfh„ÀÉÕd tKÀÀ)0€"d`BÀæÞY€! Â:)ÊOlòT³¿¼¦R…ÊY•5¥-ý©EýIS›²ö¤F)l›JSŸ¦ö¨Êì'jgÛQמv¨½ÜmP?ËYЂֳ•-Me‹QÑ–¶¤×(>GkÛœ—¶µ5fqÿ‰]éFw·¦½®viz‚ œ Äx°H"p0™‹RA´sÇ´oZÐËCè—ŠÍ@f‹ý ¿ ŒKZ7$x™´f‡^Ú· q0œÝÞ2´¹àýî‡AÊáåÿz˜¦%ql%º]ïò§«±kq{[‡W¸4žnrQ¬Úéö”Æ/±|WºRëzº¤M±‹“zdâŽ6ŸJ>.r‹ RŒ–¡ –iPA¬Í'Û¸º¡Ý2E—+äÖêvÅfî*w7œdãfÇ s‹Üã#ùÇ\>.ˆç¼c<Ã8Îz–r”ù æ× ÙÍu&1”skè@¸Ž>´‚µüfEûÍ@µ2–w»Óx¶³2¶óq«Üæ#+¶œþè§y|\Uß4Õ‚NègC‹caf“È*åð2ãéPRë×´Ž4vkÝiW#÷׼Ʃ°Sklë3Ù&U2«cýêiwUÖ‚n6°«æ[ûyÿÕÔFª©¯ÉÙ¢Â9ÈåFô³»«ÒQ“ú¦¥n4¨ámiöºÛï¦ôp¹{ì KºÝõ6q¶Yýïx•ÚÚN4uÙ½Õ貚ٻ~nl¹ªçôŸïüßG¿úÒ¯>‹²¯ýísŸû80Å   + À <€*‹=Ë•»SÉ ÿ®ºÜó¿ÕãÿþüÓ?¥öç?þ•œÿÉ êŸh`È)àÿ`ÿ! ˜àJ`N 2 8uŸn ‹|tL˜T€ù¡Ÿú±ÍñÜÐm×½àµ-ÅœÕi]‰q]ŽuÝ "> ß­!Èí`ÝÁ` ¶`ßåÿ 2Ô¡ÐáÝEáÉq nß0(–† šàù¥ßúíÿÍÏ…!½¹Ö6¡œ ¡òÛV\2áü±¡Ö ¦¡Ö-! "á áÚ úá¡V¡!€ÊùIx!P]בÔÓÅÙÒ`R" õœ¢a%jâ%þX'êØbbÅy¢’" Zâ)‚b&Šâ&¢â š¢²âBb&¢=-b@¤`vIâhI¡ ºÛ(Ê¢Â" ºâ'Ê`2šá+Òb*c Nc4*ã*2£3fã5Rc,Zã,b£ –-R!.”.òb ª[¦#ºµc(.#7²ÿ 8 ¡8 cŽ"¦bº£Ò!Jã8æ¡=Þa%ö£*~ãa@ÎäBæã+î$'¶âMþd êã?Dn D E®cqÙÖcU€cÀdaV(¼B0=A2ýAà4Öc¹Á¸X˜YúRKrTØVÆ%V€ /ÅB´$2µÀT Ù c8$@Æc8:d^¢P"cQ*&!ödQ:¦e6&>eP&ÿ%¡-¥6åø•ß.V¤³cFîÝ·éÝ8=ÙŽ[^¾–“]\ΚàÍ›jù$f2fCn&Aê¤gò¤oî!p"¤@çcžbdÖd3j¦Ef÷‰æS~aTjäDÝ•¢TƤ®•¡j¾¤ØÙ$tärÊasæ$R ¢sNæ'Q–çbÆçoâ!ròæDI§÷Ÿ"’¦:Zd?¡æ/>šjŽ$ßu'ÖaZH‚»•Ý=^¦rff}š§„§}ž§?²§zv¦†jdA¾çP–"~êçöQ§š¦ºm¨>UfæãÆM¢¡íc1>£Š2çp†h5Bè…VèƒRhqþè|Š()}zÿ‰jŸ‰2"Š®[HhÿÙ[±! ÛhÚÚáÀ `@º¥d@7Ý pÂ7y)KŒÖcAeUZÀ4ØH‚†å²è‘æ)?bhB⤇ g‡"ab‚¨djLÂ'‘&× „‹xÁ ‚Œ‹ôA£Þâ°2Uç`µgr €(ô•_Óx©XÑÀÀXöXî@ ´1íT–(d@#¼S¬‚dùR#ÁZ®ÂÐ%ÐådÀ«\¦‚ Àè×]&Ó]úe2uÐ~!ÓØå*d@T;-+g¡Á°U0A(€Ø6=—àAX®ÿküA2e€@TAd–|zféîh¿ö©R&Á©Á*ªÀNhÀ’ç>PªTêĆ@,¥F$øij 2é::éŠAéØ ¦”,^+ð—WÉl±ìCu©t‚ø‚œv‚)Ѐ@”l(8S¸A2•AÉÒB2@ɺA/í)ôÒ­úR”,̺AɆåÄBXöR7-¸A0Ô)”¬G@Œí/ @#ÈAÉάG€ЀA4 €^ —¾­9­éÀò)ŸåŠê‡&ªŽ:¬…é¢2¬žná6ìsþ’ömA„@,å÷Åì0ulÀ€ÿ‚uŽ[ b©¼E;úXÓ)¼=Ù§•ĵ«d¢çâú«Á&g"¬¡zjà¦ççrh1Þ¨ë*bNZ’f_"Næþg²!™Ùµ'6Z꾨¾9œé²߯®îÚhîBfŽêín¯í êîf/Žúî0ŠSðv ¯ –¦/ö¨ßææË1¯Q¦"j*kŠóngõþ!Ÿ&ìà6îëìžú/÷‚/ö®Ë#Àù"bú>ÕúoŠR›ôæ¡õæf„2îJBbùþ-á!ïþ ®ïz†ï_¯ÿnoã k/ùö]/{,€Š$á}êQ‚]pöfü6/›qp‹N/xRïÇÿd ° q wðøšp£0 ?± ;ñuÅð/Sñš¦¸äž ]ýêf„.¯_$ž"dÜûñKq?#~Îî×.ïf(«1+dSYqge1Tz.ÞÙ¯áûUdjðß•±Ÿžq¯ñrîÂ°ÂÆâÿéüÞ'À&î#÷ cq7im†®â’šxúÛ¦1õŽñ£²,+322#q,Ïò'¾±#®&/ò*sòÿ¯ßWæžæSpqf#ßh¼ý±(è,'o+3ç2ï2 ÷r%û©ìîæ% ð(°‡Ô0wjÆ2î2§Ú‘Y§ÿpàµî#2*r6/35ßs/±O1-÷ó>Gq-ó²?“Ü8«/ o+ër)¨I%s2ïð6FtÛ£=i B„Gw´G4H‡´H4I—´IŸ4J§´J¯4K·´K¿4L‹4 \Ø€Ðt,A-DL¥÷Ž(0ïñ'·/…YTA%\ ü’\ÁØ€”Œ%Ø€SÛ@TÁSÀ'|-/Ýx&2ž¾ó!׳åÂ/þ®õk5'AxÌõ ‰fl9âõ!æA¢^wß8ªöÁ4°a6b'6h&øAÔøôô<·Û+ŸÛAÏ0ûvÿ® «µL“dm29Ö%Ø@@u"`5U“6TídU-D[™@r$èÛyqZ+ïÛ¹ZF¿AäA hŸ&Üp³p‡lÁ\+·!èAp\@ €Ü‹T·rϵèALl‚(d_ÄÞÁr³ÁÔ@az“AlÆf_ ô5qwwÄ÷h‹ð~£w}Ëw_ë·b¸€øa366a€(LØcG„—SšÉvÂße{rBo›(g²¯ÑÙ:ƒÜ*¯5Eã3,3•;O06ÏŠ/“[Ãõx´]³Èp4\³ÈŒÏ¸!¸÷ÜÁÔ8G[wÄxŒAŽÿ@Ï8‹6g_GãxA¼¸x‡€`Ïø\ptÆF,K9‹p99˜‡9x€ €0xø]ÚR5™mƒx0¶ÝC5951»o8£ó ±vš‰óoï#L”ûÁ_tC"À º¢':£/º£7:¤?º¤G:¥Oº¥W:¦_º¦g:§oº§w:¨º¨‡:©º£›U§úS×tH6”Y ƒWCU¸0Ó¹9S0éúy×Á$¯ñdƒñ5?o>§ñÝé°«¡•“ÔMYlr³?ûŒB;²O;³G»µS;œW;¶¯`¶w;·û²{{¸ï_Ø­î±×¶X3™ÐúøÙÿ:†ß°E·yX«æ –rC]ŸÓ¶¾¿².“=‹!g×;=¼nWÜ¿çy† ê0Å»ûu:³FÅ®:ç¶Œî6;ß/<lëð;Ê{Cã[ËËè §æºD$Ök}dýÖ}×s½×‡=ؽÙkýÙ—½Ø¯½Ú·=Ù¿}ÚÃ=Û˽ÛǽÝÏýÝ×=Þ‹ýØÀ&ÄÔïÖ Õo¯W>õü…éÌã6Ò;ô‡«Y·›uºŸ<É»9Bÿ|ÉG4Õ9üãS~ÉS}ÌW¸À.*Té>|†¢–°Ã`ÖE²O»üßy/eôß»Xßå»äÏ{¬!~fgÊ3tn§x¾AïÈþàÝïžW~òúÊÝÝ 7ýä/hˆ»Áwç2é«Ô •›äÿ|ÔùrØ@ Ø@4e@,@uœåhC5èW2‰k1+G¥ù€¸ þHynËœüí 0° €ƒ.,@ÀCƒ 'è¢D8vôøäÇ(*  B‚2xÀÄ… Kb¼XÒ¢B- ¬`’Æž˜!…˜Óä%;†öàf‰I…5šà\¸0ÿ§M©Yj<øÓF˜`ÅöÜ!„À¦&ÖìzTkÜ·Vo½ÙîÜ­4ÝöõÚ—ï_¤3ë N(•f+ë=L¸.Ì…’ýæµkoÝ-¢N®AÃÆQ¢î¨bÃF„DC3 ¾R…©€'$‚þDµ 4Î8à ˉWä˵1òãÅ)6A´i`räÓW¯‹\cHíÛ9Žt‹R%K—G%27lüú€ ` ØÑIK`ð ®ÒÂ(9ŽîøsÚ;â€J!Î@#ƒžÐpE+h!û˜"@ˆÓ„£á´N°aÓbùD?ªÐ±%Zذ,Ÿ¸BÌPX±EÖþ È<ÿ˨+Ì2¾ˆ²½4ñ2 “ÛqºŒL1ƈ´N*Áœ´L#ÌŽ’r"‰2CLÈœh“Š9«„2Ç#!ÃÒG2É4Kç C¨¢ËÄŠI¬Æ<ˆîì‰$®À[©¥—œš°#Ϥ‹Ë¾äÂŽ<˽’/›íª“®º¬<½:K̹&=AåÔÓ ÍŒÓR6ÍDsÌÊ`ÕV]}ÖXe•ÖZm½×\uÝ•×^[§SæÜ„3½b˼Ù¼Ó3%>Ç‹h¨.…LÕXbß4UÚ­¨=•Ghd.£DïŠ6S7Å•s¸@C•[vQ…vË)IõP&“»Òɡ҅·T~÷ÅJÿ}ó·I&Ø!ƒ S¸`„»b8a‡ýÌÍB/ÛŒK Ù;—¥iOñ^ÒTÔOçýëʃRö7[›¢|wß%§Õã’mNÎÚœK]¹æ'gV÷Ñ’`’·Zœ¼l2/ž;êh©z wݦ'ó¶ÛóÊ%ò阃%4k«MWé¨Å»c;?¾)ä>·l÷h“R ²åž›îºíž»7îÞ›ï¾ýþðÀœpí8€7!üˆ‚ºÜ.W#© }Ìï³MJûÙÌZî÷°†x‚<ø! ŽBH=28z£×/€>:z#½!„ؘ/òà1:êÃw/dÐÝuÿâeà£÷بúlïˆwße 6rçˆ èù¸€ F8ò‚ >Œ'>„ŽÆðÝv/|—>€÷Ó§}.!Ý ÿ€à X@;SH‡%p‚ø ‘ëÊbr¥š]°!™ËÈš%²sÝLf[] ‚>ð ¿C!¶à=>ðŽ ò+_G‚€0´O É! aÃöy¡ ÓÛ‚ìVØÂôm¡YÞôÚ'Dv„ †`G¤€  ^Àê¸,r$ ^ÈÇøE,zùËáð ØF7¾Žqt£–qŒ:.ãŽpˆà@(¶´ŸùÌ] Ñàw:¨¶?]îj‚›ÿù¿<Ü¡‘‘”ä$)I“@À2iTˆ*Z_†5Hf…GmüúœÖj2ÂJ¾–±”å,iÀKj2“›D€'+b¤(ùQ+_[’)9ˆÊgÙf!ÄŠ+kÙLg>šÑ¤ä%o¹€[€—ó#fô¥2}…ð‚ÄD[!ÇsHz©‹L‹”æ:ÙÙNw¾sn¸Ää%9‰ÍOfIeSZÔÐ~Ö.ˆssä™ç€:l1ž UèB*Kjæ’“»¼§6;ŶŠNÎ$=çF†LnímOhèHIZR“Ú2—˜Œ¨ $ˆ´»èHVÃè˜4z®mrÙJgÜNÚSŸþ¨Ü¹¦<9ÿ™MŠ^ë_0%%©jÊQ~®Òk¢iP©ZU«2ô–ôœ§=%g³Ì2Ÿ_ê—BšzS’‰Ò¢"œêUÙÚV·Òòš›Ì$Wñy±}ª^æÜÑËÊjL?M§Qç[ [Xþq¨Y]€Q:SDŽ-£}ÓÜFÍJPåü,tAèa9ÛYÏú-«¨ç%ªÁ茔w})(ý6 r âˆXlakV¢5§ÙìgyÛ[ßnçpyàõÒǘ*œÛô¦ß~°Õyrò XNPήŠê—Æìo¹ÛÝÞ"p!+y`&Š2¥âÔX.Eêt˜»UkÎ3ºÎ¨ÅdêU¼ˆqùU‰Ê1Œÿˆ>WžŠ ð\àÐj’Àr=°‚¼à'¸Á6°„\aç2Á¦0„3lá wøÂÖ0ˆIìa ›˜Ã'N±ˆüaXÅ0fqˆ]¼a׸Ä+60IôÛ¸   Â9 DàÒÒ¯v“e¬D-““öâò½—Œît«;ßIñL˜Åºox„a‰ª@¼‚{+b¢†v´&ªÒ'9Q³4S°2 ´9'ókâï6ùòéb óö<ÙQ<;1ä,‘êøÉJ³]:²ôÀð“Ñ@ÿr4³]°þVøŽ“ /µ\”>cs]Ð8ô@q4@ Ôqþ"0E"&0•2XD! ! À€2%® LÅiÌIFÝP9Û¥èÀ)ï"pFõòH˜¢K¦±Ô$ƒÔ(t#a³k¤¢%a †,N«®[ô%çêTNOëôNéÔN‰ÎO§PóTP•OuOõÔP•Pç´QÿtQ™æqŒ (ÿ³ÝP÷8¦ošËÚjð/ÉQôüˆDAIÁä H0 ‚cà® U‰ A P U¯ *þ@>ª`@:C ª`Z Š ª U`!ÿ2@¢`j¡  N$,²4&¡Zc¢Nµ j"ž@X$Ð@E Zà L$ªà*r` zâÜà]â À~Bv Ðà!RÁ`„#R ZU>L4Dù0T#45µ3?¥k°N¯ðö3Kvî«â1RAJµ ä «ä $v€Š@¯?W³S^VcDfd¼î‰´ / ‰Tv]&°«vŽãºejÒæ¤Ób"†å]*Q*â@_ƒò,bRh.$5t0ï>M3µnFbí¢º.ö¨Ü1M+•÷´ F" U1€@Xñ‚*"AháTÿ A`6²•bB[¯E–µYa’”; ” g'¦îïæ4s]²Âg_5uðY0=åsÛ„£ò41ÐHËV93òvÖ0«´G3Ð$Þ´M 2ý‚æa¿fK·4C¿UJ…P+Že‰³EwïX‰LàfùHsWx'‡É*·fÓ7-iSí³Ssõª‘<‘Ðy¹b7é/sñAMåeWïMùÑâ,ÎÐ÷|Ó·ÙW}Ý·}×—}çw}ßW~ë·}é7ñ~íWõ÷~áW€ý÷}û7~ÿ— 8ø€Ñ‚(õL-5Ÿöô¾sS9mÿÖ±HgwGò ”DKpCÿpvÓV{Ͷg¶óK½7qÿQéT0’é æ¯./·n3”çÖÎéþeåT#l8Nwè*HNwæt8xnˆãÎjõгŽïJГgY†yÕæá;¿y`p^çéç@|ÞçG@F@æ@ˆÞè‰~RàèU ”þé™Þ–^¦>J ê±¾ê·Þªë¿þ¯>ì5üÂ- ìÏÞÂÑÞìËžÌ,@Ä-àà¾ÿæžÁÄáþÚ~ïí¾ï)àïð÷^ð ÿÿ _>€ ßñ!Ÿñ!ßÈ?$,ó7ÿò;Ÿó7ô/_†@0ßÊaÀÊIŸP_$ õ_Ÿ`_öÏ\b?öɼöE ÷o¿ö“ ÷¿ ÷ƒŸ’`øE€ø“àÖmÖg €a×yýÖ¡ßו]Øqd!"!Ù™]Ù·_¾ßÙ¡ýû«}üË_Û±d¶½ÛÃýKû!ÝÏÝë¿þáÞ ßë½Üñ½ÞBɃ J&<°2!áÀ‚ &œ€°`A!N ˆ¢Æ‹!ÌȨqFGKÎ éåÿI”) t fÌ™.kÖŒi3'<{úÜÙhψòTá€ÑJ›Ž@šÂŠQUÌ™šâéÕ¬*¸RÅÚuD‰¬cŸZ0+6…бTX`ë–íØÞ¶­k7/ݺ{óRèK¡n` ?¦ˆbÅ S0œØ±aÉ+OžLAÂc †9S€ñᕚ9›-!uf I` ûµìجgÛf=ä5 »{ó!¸ˆÝÃ…“(~üøåÈE i^ü‹ˆ$éKOr< vê$’€¨VèQ¡BÕ@8"o>|!` @X_H 'í5Ì¿oNU ¡²?,JhA|öi Á°¨ÿž)Œr $ÂK!ªp ªËr1,)h‹„À<"BÍ,˜Â½ /J3‡Ãê¸#>þø£A 9#:„äHTÐBÔPB9d‘ESN RFQŠD‘!fJ‘´ÒJ)©ô™2ÝDS›<á„SN<%”OAÙé“QL¥HQJIUTUd¥TT^ŠUOe¥V[T•ÐUY)Ì5i¥rMz—\vaª_ž¶W ƒ &*a fXc„=Fd•Y¦f²jvÙc¨m–™a •FZf­•&›k´Ýf[j²¥V›n©'AoÁ= \nÏI°\´ÉEÿ[Üs$T{\uÙ'Ý·ÓU'ÂuÝM×_€p£"úB™´'/‘Œ¢}úfI¿s´GŸ~ü=PÌ-ºÌ ²¬Í€ xA+öi#q)£ 8‡.‘È¢ËÅÍð€­0Á‡ßI_€Êªê dÏB©£@JÍ$’MFôdERFy%•Y„GZ~tÒE­tÖdn}f×h’äÀI7í¦Mpö„SuÞ‰gQC%å€"L…TÝ#È]èÜ\]µhß`)ªV¥#´Õ裓º…¸˜ºµ8_œÒê§‘ú×a¢&vjb¨ŠúÁªšOÖ¬²Zÿ&Ú¬¹žnÚg½šf ¾þ:lìÆÛ±¸=Ë ÏæfíoÔܵÁ;§ÜµÚN.¹Ò•‹qˆK €«øÅ¦°W,â¯xÇ1Îñu ä yÅò„gŒd£xÆ €‹“|ä&G9ÃKn²•£\eTYKÖ2¸Üdk9Ìd³™»lå-_yÍjF²‹3´}c]»xÕ1ft+â\û8ØÅæ5¨mchó8×»nv´]Ýc]Û˜Ú<v©‡Ým[ÙÚânµª dp7»Ûêö6®µîj‡ÛÚ?vq»Û íxošÉÃf4ºñíìq_{àóöu¼+-îK›ÜôŽ·»îëdƒzÛÚ6Å>ðsc;ÞW7·±Ýn‰â§^¸½áíêv—|ã,§0Vñb3`€ÂQ(Þýj àaäØ^¹¯U½!øúH7Š+pqbÿ<ÿáLq²-ï~ó|ê妷ÏYLp†k|ëÝv¸×_Íqª[]ëQyÖåÝp±£ÚW»»+Íu²«]ßcwwÛã.÷¹gºìzï{Ö•mévÛýëx‡¸ÙñªÝÂp (A€&4Àñ  ;Û s¼¼æÈ<ÒQ…ZLâ -È€&Q 켨Ÿ„tc¤ @ ; ±‡S˜a÷È€l€z0O@À0‰IØ Ù&1“›¾tk?}Úk®ö¯m}Âû\ñï¾Úï]q”ŸÝûg—zùÅ?þ” ÛÒÜO<Ú±nî»·?éÙŸzÆ/§×ûÍ¿ûù1N~÷·îçÿnuöd À1¦&Ð PdîÖj@ e {iP 0WHw1vŸ° ör`Àa'h,`8€œwo¸t£°¢POBWPqb?ø~|§uƒvxÆvˆ÷sü}FXxöWÿç|i—~˜C…Yè Ç„¶‡u&§m+†pÈ„çwQ¸}EÈh f~Š×†Húׄ†Gcß&…nøl-gkS S0»Ð|è èX†–&{àe‚eÐU°{K°sB` »EÆy—ÀJ¦i·'t‡Ft•`»'œ(ÿ`€›hŸ d^¨}{w„xç„ix‡pX…¼ø‹Ígqh˜wæV†â}Ä8‡zXŒ¸(Š>f{‡'‡]Ȍͨ†Zè…øGwËh…|7Œu÷tÚ¶‹dH€þ7£vŽ!¶ ‰˜‡xh<ŽB&xú·lrÈl¶6q›~~G„Ì6…©„‰ywv㸅pˆ‡¹È†ï8Æø}ÈÈý—v‘Zg†ÁÈ]‡¹¨ Y‘ÜÈ‘f(éŒinc‡×˜qÿÆ~ë–’™f °€qÈv½Æ„õxâwì6q·ˆw&é‹QØ-w” y‘ù‘}§’‰…UX’ɔն”äçÿ‘Iɋۈ•Ö¸‘;)”]I’•'é~I•ØF’× —q‰qI— 0—rY—v™—w©—uÉ—xé—{)˜I˜€I— —ˆÙ—ƒy˜Œi˜™˜Ž™…I™“Ù˜• ™‹™™–™™Š©˜œy™¡‰™Ÿ©™ Yš)™¨™—§Išž¹š§iš®¹š²)𦛩y›˜™›µÉš©I›£™—n·o˜fnŠ(Œ·fœ£(‡ÛÆkÍ9q›VœÇœÏjìÖœÓ r×9œÚY˜F˹ỉΙâYœÜ žÝižè™œë©œî™œl7žð kêٞ቟噟蹟ñiióÙŸä)ÿ ô©tþ  Þ©ŸöùŸz ÊÉ ©”é“ßø~o¸vÿ¹†jG–Šu9•”¥vvª¡ùjy…Š¢·gj'H•$š-zv/ê¡;I£m™•¼¨£å(–*Ê•‰m+ZŸD‰sÄ&ŸÔÈ‘2*…IÙ¡4j…>7-‰xl§¤Y9¥O(€*–WjW ¢9I•*·–Îø_z†hÊ‘(y…ùdfg~Z9’0I•?º~ÿH>*¤ô(Žj¡ÇHŽ%Ú¦N9“Öç–Cù|E Ž÷˜§»¶£Z7I7¨M¹¦„:©½h•Mù”hY–jú”DZ©-©¤)Š~Q8}Öx© É¥…ºÿʦ$•Fº”Y•^ú¡®Š”ÐÇ’Q(xB £ï§¥ ù’"Y¡xj«Çª©ej¥Éºk«ê©^Y§–j‹ÒZ¨¯Šm§z¤²ZÖJ©Êø«˜€\H­Ìª­µ8®z¨ÀèoCÊ¢Š:–#©Â*®ˆ ¢õ:©2©ªú`Š““÷j¢ãʤȚ¦v§Œåz«ºZ‡¸öŒ½È©Üڰʨ¢Zø ©sš«u' ɱ¾Ê¯V¯±z§IJ¬û¨­Ê¦¤°ßè¬K±¡©+•=•™ª›§hù° ®<ë¦Kª¬ÿÚ¥–J–ª®¹q ¹ßj;Û­Šê¬ß®Öè²Ëÿ–)¯é´Š—¯Ïz…óʤ]Ë´P9´Á:’qzµc»¬Ãj…ØZ¶Y¥ ³ù´Mxu`[w«§ºè±Ø«Ä*µ{±*Û¶ Ë¯ÌÆ²û*¨V;¸&[¦7‹²ײ{¸.™¶tȨ`h¯xû®Kx®b¸°+¸m¥+¥‹ºpº¨»º¬›º¦›º«Û0'ðªûº­ëº»Ë»½«»¸›»±ûºÀ+¼½K¼Ç‹¼Çû»¿«¼Ã«»Ìû¼Î[¼Ó‹¼ÐK½°k¼Ök¼Í¼Ù{½ÑÛ½ØK½Ëû½å¾É ¾Û›¾¾+½Þ{¾äû¾í+¾ó;¿ÚK¿ö‹¾æ;¾ò›¿ê»ÿÀ,ÀLÀ|À`À ¬µë¨‰æhˆi†ÁlÁ|Á ÂüÁ"ìÁ%ÂLÂ'<Â(ÌÂ+ìÂ&œÂ1ÜÂ0<Ã*LÃ/lÃ9,Ã8¼Ã7ìÃ:\Ã= Ä<\ÃlÄG ÀÜd}¦(ÁŒ­'K~e›”V…X ‡ZÌ\\ÅÛê³r{Å`Ü”^ÜrféD^éïÞé[-ïšïœnïîŽï£ŽÒ .áÁ]ê¯|êú—ê‹MÜž[…3X‹ øŠg@{pt!¦ì¦ìÅSðìÁþƒÎ.a5ðìF ,ÎzÌçŠÙŽíÜc50»5À|¯XtaàÿnÞÞîô¾ï޽é7>ïý>ä=ÏÒê=à÷Îóù®qïä @ݪåOš·× ºêÿÓ‘-a¡òθulh®[_Ù‹ïú^ôüôþ~ó>ÿé:Oô€Mé`¯ö_óaö¯†ôÖO^Öax–ÙjâE‹~ÿ¦¸pgP ÌÜ’g¯°ÐÈö9×Ìíád?ô‰ß×ÿ ß žãB_á;ßö@?÷^𫾧Z°c~£ý“]·´ZöcÿóFoö¢÷oŸù¬¯ú†oú­_ïbOÔ·ÿú›êvoðû¸÷¸¨‘Ÿ”Súá{Ž¡ÛØ]鮹ïÙã à4ßø«ûÍÔÑûۯϼOð¾OãFÇ®Ä:úÖ÷‡ÿŒß¹«ú‡¸ÑŠûZmû9ÏýóŸþµ?ûÐÿ¹Oÿÿû¯ý`$hP`ƒ 6d¸ð!D…J¼hâD9:4@äH’%M–7bíúU¬S§MÍFDÈulÚ°ݾ- ò-ÛµJ;ží^¾jçÚ¼µ-ݧpïÎØw°ÜÂdçÅ öoß“•-‹Lù’jÌ™5oNÔê×éÕ“v<Š˜©ê–; ~Kº±ä¤IÉJnüwdì ë® ™obá°õçíØ7c๗'¾[qð轡S.úqõÉ~ÿ¸¥J¤/9Ó´‰ûõÖ}M ŸêDÙ¤ç7/ßV6a¬ï³KŽ9ÙKî¸Å¦SN»ç¼PA¹û¹!dÍÀî¤= 7Œ0Cî8DP<Ȭ<–Îó ƒ•æ›j' “³ï¥ã`”oEõJí!×±ªöt”1G!ÿ³®­1$òÈ"W“°É—¼0J笰9+'dÒÈä:LrË*ÔmDñJlÉ<™Ð»I+øxÂòÇèˆ8äŒ2΂±lhÐ?¹Â§'ÊcsJ‚ð¢F¡2°A‰ÝɶXqÉ  ¸Â†8˘¤„Ø"8-Š¡û¾Üj»,OÀ'•”òÊÿ'ûÐUUµ|•U.¥uÕg…²@Y!3<27;3EÐ\Zu¿Õ˜ d‡ŠXéöˆ%‘WD)â <ðx……Ù#ŠÒv<0àÎ=V‰¢Ïr8—ª¨Œª07Š:wØ# 6¸U€Mˆb=lha àí´`M úó 0ꈇ„®ˆXRJ;–# 8VêŠ(VÁ£Š†103ŠbƒD®(CW_IE×^q^/ÂUon’W[yNµËçb3éZMÝùÕéÃ4a„M´ 7 CXòæC1=×ÚäNY‚&…è ã ö@ ;þ°#— ¢!ÿ089ã'šàÓ òFÁ¡Â«€VQþЂˆ>9a¼2¨â%2ˆ`\A0…îµ È\ Š‹ Ž*6¤½I+=#öCVù¸äN?Ý!4‚JŽ•˜Ð‚¾5}šx¸ U s6~è•.þhTw5šÊç“×Ùy¤“€Œ1ÀZ¤ðÙÐd/¼V3!*è,=åsqûê"hÖÙšµX»í&¢ á _v „¸ðÖ+˜ÁYQØA%l°3Øá Å™Ä Ü …ÀD!ÜÁ%ò–¹F°ÀY6¨D8…‚,ASAy‚æŠ@NØ€*B0`3@€+@*!Qÿ8ƒ8¸M}Êf Ͱúâ 4C"h 2…„F~Ó[—¶ ¦9AÐSÑnÕVYÚ‰#T¸¬” >6€VOâ"=EellÔû`U='E`\eÓ¾ˆ=i{d”ž,‘—³Zê²Umê¥+B¼Á˜l‰TB@¢IEUD–ÝTò•jŠ(õ‚I™Uˆ¤ËŽ4ƒMX:e—¬tå-Û¨=[ž±œ],ã,y ϳh±æÿ/·h³é$Ó2ÃÚIØÒ´ž² o_„Š7WeÏæàfH™¤üb6„¢Ó¢ÙsÕÏÄØ&\Zïc\g?ÊÑæ2Ÿ=Ò¨7âÏÊ ËLíûLú”†=ŠHš"Ï«jªV®g§½ìhO1JÒwî3Còä=­‡Ô{3ž ¦R U£B).,=‰KOT,±2HÕ“;õcPæt¢d-‚òãS´Ú¬%)US:Òkγªút¥‡ÚÙ3¸êÕ—(½)Ѱj­Â„«1MÒ K¦™Í¯a5k^ázVÆÆõ­–¬÷zÏŽúõ¤ ¬J9Û×5Ò•©·r*b;žqn¦êqìX†ÿ**Rò”ieçb)kœµ²ª>§|(H…ÔtÊ5´¦5®fÿ Zå~³8]îsMz–Õ’¤°Unõ”E÷lTxwm,YƒKZ«¾æW™íp‰JK©4¹¹u®zË]ùzö©úœëôª;’ëV=@oR‰Æ*sŽå¸‘E0DË4VQ}Uœi9/sÓ[\ü˜¾’Åç}Ñ Ýøb8µK}/‡5²_ÌÇ“†}­*iÛ&ŠfQœ¿Õi€c©]žz˜Fåtë„/«Î¢ò“Çì½+õfkßzV¸¹–°ˆ Bbe¶ÅÎL߃YŒVîêv*2ŠpiLãˆô²;’2xƒ\e2¹»>v'ÑÌ×ÿKSÈÕò…«g_&÷7ŧ4NA¥kYÛPµ?¯ïwë»ÙŸrÙÍeí‡Ú^¼Î9Îvt†‹¼áéN:ɹ¬³‰‰õZ¤È˜0…± ¢ ãÝZØÐVik%#iå–±%°¨7«h÷ù6¶V2ˆq]i]Sz¾ri3ídì²Z·Ù¤f¢q ãQ×v¾§žf°¡TèKZÙÎõTwýëx2úÍä¥u£¥îo·¹!Ãö&v U×òb»Ú`þê±É íŸzùÝŽ÷­`-ëv‹–»ÂUó¡Ï,ðÛuÍ£5w¬+›ptŸ¸Ø2ÕQü¶<Ùtþ»ÚÊ…pŒ÷üFj :Ç ¿¶¿½{Ú¨šÿ¹à< 1¯µík"÷úÒÐiø¦¡ìÕT›¸;N³F^ìé8×{Á†wÍ¡ÍoÓ¹ÛnùÊ_žôƒz;Ë ·8»›:˜¿Ô™X^§ž…Ú[­7Û¶GÕ¾{.ô’³§ã&¸bùu’‹YäRG­ÓÁ^t6¼ßiæeÕ] åh7ÔÎîz«ƒúå|ß{ÝmwèXìíñV_™ìŒ'7Ñ£~t–?É·¼¥1÷²§½îHÒû“Eoàæ‰5¤yàÿÞ`E†×ívŸ¸Æ+z÷YO~³7¸ç{¶§œÛ\49Þƒzu³žó©Gµñå ûð|á~ 4h~Îê ¿Úùjw÷Û)¿ôÌ»|óÿ‘~îi﹟<7Ä÷¯Š#>å=§µ×½åzò¿Ûi)-^øÔ/üæOã& ã=ø¿ø…À$À4ÀDÀTÀdÀ@”ÀÀ¤À T@ œÀ <@ ÄÀô@äÀüÀ $A ìÆð=p²,ôã4š³¾é0a¼*XmÒ·Ãs¼dK HR$ڸ؋¾œ‰¬‹&ð2`²%dÂ&tÂ'„Â($±à€`+<`s ¤ò»¿´pÁ«Ã³Ä‹½ÁQ›„(‚F(J0; 2 Z–8ƒ„D€ öð3>HÂ:Ùà ûK¾>û‘ÝÿjDx)„ÄH”ÄI¤ÄJ‰`€õ?ˆ‚L¼8Û½ŸÃ¡?¦Z=ˆx‚à$;ƒ·!üœ•˜ÅИ4Ä?Gª>ƒ=RË.ƒ=›‰ HÂȃ:0„d FÀª Ÿ`yÆñɃ>¨ =¸ƒ’ȃ@°ÄoÇ(L€(ÅMŒ` Ù ¿ËŠ•QtÒ;ž†(j‰À‚8ÈP›ú–¼™@ƒµÉ(Fkžˆ¢»i«9Dœ¦ê‹ $TÂn$ m”hƒ6ÐFm´Æ‰ =èƒ6Ø#¬¹=ÈÈ‹ÌHŽd„“$‚‘=¨FïiÉŒÿü2ГÜ#‘(I‘<-`"È-I¬Æ¸€èÉAÀF< ǧ„ÊêÇèc˜†8`0ðDmB= cw(WC<&‘hP€8(‚8X›pƒJhKo0ˆšqÅh70BCR¨ËDœ‹4ßR$‰4Fo m¤ÈßnÔF¬áÈ1PBÈÜÆÐF>„d=˜$ -ðžÈά¨ƒÈ… ˜Æ8 >Ѓèñ €@È>…Ó¬M¤ ׬ƒØìMÝŒÊá$NÁăPàDtô“¢x¨& ³32œõ3D“u¬ˆÜÁÿY>°Œ?³" ø›>Â;<‚hĉ¬ƒ0pÏeìÍApÏi¼€MËÜFÉìLÉtOóñù 20„\ ‰’¼O =PM-ƒ0ˆš‘àÏÅïùÏùŒMÞô•§,ÎQ’8Îcñ®LG‰+Båƒ3§ËBr2šz<#9ÄhóÅ»2|+C¬½ìË‘ÚXuôETDhÄG QJŒFÏ<Ò%%Îq,GNôD aªhñ:ïhÑB̳°‹Ñx¼§Žª_¤8Áœn ”! § TˆõdÒ6uÓ7}B9ø…xÿ«Ó8†.<ÑEDˆOC6i£:êÔ4«#žCSÌ­ÿõ¹U3Ï LP¼9c#0ƒÀD,¼ÂKµÔLÅÔMÕÔNåÔOõÔPÕQÕR%ÕS5ÕTEÕUUÕVeÕWuÕT­ÂM5€æ¼=.U¾´,…Ç[[Ç3S^Ë4¶¥ÑEÖ¯ËNï<uµ…Öu‹ÖA”Öj¥Ök}VkÍVlÕUmíVn=±iÝÖqýVr WøY¿*e¥¨" Îà þ*xÕ` ¾àFbŒLâà Ž·—@$6áþàÙàáî²FÜ„=%Ý|=]• ‘½N’åÅ¡½UÌrWKR¥À]±#ÆÎ$VWî\Ķð#U›ÒÎ[¾5VáâÔMÈ€ Æ`ê]ÑRD$ïÚ·c—½Ü*ÇÎ[2§Ôˆ @„&'µš¾†È£}ÑØm௭Q齸F•>F­ÛA^5þ`½ÿmäá7cý[`üáº8.~¶®ã8¿Ö ÇŸÈ€>iX›‚ÈdWÜÀ:¨%Àƒ‡ 'ÜK¶b¾å’ áõâ•Ém‘M¬·M’øc×f* ~Ôþe04YJ.dZ®Y+€ Ø@YÂü×Wydç@¸œ‚H„"(¸f¶¤hdH‚(æ°ed¦âÃc\V¼hª\á˜fGNæ äн¯Œ³¸£ 8ZÀ“¸æK ¨J€Ox’n ´1ˆrQ ƒ%¨4ÿ –¨€^@‘±³»h/&Ò8VãæWC.€Þ%Ü-B Xü7xûõhˆ@Wh Iu•rî!ס” xé@Ji„‡ ™cé2†–(h*\]~Þ—õŠÅÚÄ ¦à>hÐÝWÉ€NèBÀn.B¸œª8i«X„J(‡é”s–žÔ0ãYŠkÊFy&fÑR^3üÿEÞó’ˆ2 –¨3Ș(xéNqêK¨I4¨„k9xik&ˆ=X‚(H9ØOÆmT><è킨„—6È+0e_ 9X:Ø¡`”Úé!ª(œ²ö˜ëÿ~ –6;•m=¿oVÓC®ZÎY›ÕbIn‹?#oÁýX|UÖHN…8ËÐæ Plx8K†ÈfA8¤ÀK„ D`KmŽ)€š¡ûÍ1è­Ý¹c‹y>¸zõvá&NæÂƃ¶4ÌŸ+Ðæ%p›=` §n –"¨‚UH„©7lW`‰‚l„>i'ÐfÖœà„?Ì€EÐæ°Pâ„=(‚!/òp!Bá'¯^‚.¨ÖÑnÐ^èÍCO ¯œW ¥p×Ýb 6 ·Þ­³ØïsX¶U7+ˆܜ¡OãÌÆ¾ïÆkø¦+–¿Ùƒh Zsc$Ìó³<·f’4MÛýªNcÉ_dk¼¸éhûÎŒE%¯úˆ5ŠéÎäCÛè$†¦?ˆêù såv()ÞJ޶ÔEï 8l0ƒ@ø„Wø…gø†wø‡‡øˆ—ø‰§øŠ·ø‹ÇøŒ8Èvzî÷¢ËgçÛg’}:‰(ã\L° ƒ ú^Ù¢ÿvÅ ðõt,ÄÝ!aÖЕѨMïöN þyú¡ú¢z£'ú£Wú¤gz¤wú¥ú¦‡ú©—úªú«§z¬·ú¬çz©ÿÂàûø@÷Aݻѳފ^¾MTmw]wkº$FÚG†ÁPã÷›Wûi/OBn]ifQJƒ|Ü|^wÃ/|GJü‡X|ÁgˆÀ?|Å|Ÿ|į|ÉÏ ÊÏ|Ëß|Ìgy´îNnÒ=óìªmÉ‹ó@,ÅÝš/R³{æ3è«6#VóëIÖÔhïaÿe >â‡zwMú²Øÿýå~«0|ê+~Fþ‹â·æ°Ç` Wöe±R<{ÖW­ÿÕì1×$“oYg?X ûœ°û£­ö¡¼óVf¹e—B_¸í’èJ¹e“xËÇ…mðÿ¹æ¶™ny´õL}îcð©É£kj}Aä…uŸ[°u N\° b–‡&P÷!ÃPkÒ¥ÝYçÝá¨k\¸á‡> r,Þ¸r¸ÑŽ·^·,r–ß×óV4×jst¶Ì3­»R~–ƒˆÇf&l!F8ê¯Ã»z@»íµ/`}Ö)[ùX7Ç+Ì:ÖǹsK]¾ózìvZ.»ôÓS_½õšÕžýÙ#`Bɼƒ?<[“-8Ùu¤Ãe<Ÿ#vœÌîŸl\ƒ—]_¿ý÷ão±Ù°íû{ï-å³U®f„¬!xê û0P•Ot¸Š^þ*hÁ bÐ5ÿÿ³Ýöh@áï}ú)Ë_¾ôù @Ç»Yûr¶•½0„>ã 3hÃâ0‡à÷ü÷ÁÒ*;ÈbÈ•zNHtN%(¾ëÔP‡Rœ"e·?"À‡ß kd¹!šŒ?@"ò@?/O†Â‰bÛèÆ7–ê¸ãÞ#AÌÏ+ ^‘32²Ð¥³#­îÃ±ŽŠ\$#óÁþÑñ{„$ÒZD¨¹ñ)ojdá·â[æ2ÁHËÕüªsela2 Z@jZSž ]hþø÷¿nÚSY–Ô#s>ƒJ8£&2 zÀ缓¡"iCÚÍîIò˜è#b&Gȶ>“P’â4§…sè `ÌŽê³æ”&æþ©š€®°%œa>ûsSB5ª¤Âbÿ<¸ÅJ>O~¥U&ß· ²¦ÄŠæPÕ¸¬§J5­jUÏþ Ñ”5ˆ\í\Qå*VÒµ©å4Z×ê׿ƆªYDé=‘)Î.‚š6¢QWÿÄ:¹R†tï@_kÙËž†§UõéU•åÒƒ~ö‰9"À]9й~fµ²˜]-k±gÒ¶þpŸ’ìRsY[C:V¦f­)wBÚÚß÷3šìÓØÕ–’Sˆ1 'pJë2¦nu‚¾ .u«‹Ì&»ÙuÃ$ÉǸz‘·wÔ i}€&„ ½!ÃB:‰WJBV´†T­uë«VU&,€Ñ¬F×Eû䑟wô]kÔM`ãc8D‚Ç ¥ªs†¼œìϦkß ³62rA:€„&ìw7þ m;+ªKO²¥5?Ø`7÷w€Ù`£5ß4'K_ ãx¤>‹ ?€á{² ãsKWÿDŸEÅÃÌÞ‹i“!qñ£Í! ,oœã+ËsÇ@`´»´˜0¿-CrΜ7â¯*¹­mÝÞ‹•ˆW&Új¦wTÀdðƒü@xÖó ¶p?ÇàÏ€ô-hCúЄFt¡íhEC:Ñ’nt¤)=iFcúÑ—Ö´¥;éJzÓ æt¨=MêS:Õ¢^µ©UÝjV—:Ö¨†õ¬_mkY»:ÐyÞ3¯ï€‡?hØ6ì` ú¤Q¾R®+xÍ’f5³ÍÃbK™¿{ƙ…ØÕn(Á‹aàX$fO¹©æÍî¯Åüë`ºåXît{›í¾¢ººnw«rÝñ>·ºë ï‡ÿ⛘ö^2¿åèoHüŠïFø6ÉðyóûÞ Ï÷À.otc¼â_8»×|ñ~Ó“á§ø¿-^pz‡¼ãêæø¾%q}?ÜãLN€ ¸€)·"¾Ldùª±1‹Ù³ínã,Âð-ò„×Ú ÀÎØŠ$xñU²¸‡ñÎúíêÝq¬koÉ\»ÅÝz»…ƒwnåi‹{î9Ž›b÷x×çNö¬¿–Åk7ûšI÷¿Ë½ì€Ïø×7‹÷±«Úl×ûÛÓöÀÿîd|àOù¶‹ònßúàOzô  Њ\óÇ»y]}›ÝÔgkÏÅ0~² <Í ›®ÿ½´q%šúªCàw‡¸¹í.yÃ÷]ð2O;æÙÍøÈ£]øï~|æ¥ßü×rùÐ'¹×ÇýH’¿ûëÒ'9õÑ]|åßó‰ßþøÛ¯fê‹ÿä±·|åÑÏ}ãožƒçæ>öéïüyÓN“…ž%8ƒ € ÀÎqQW¨Þ”ý(MíÑæ°ÆŠEÜçíÕÌ^Í…±…Œmm@Õ]áí]çõ_ǹÜü±ç-ŸÉ!^ÿÅ`Æež vÁéàþ¹ Ö`óá ‚_*Þá áËßñ)¡åÕàñßýÉ`úàJÇñÝ î Æ ૼ…é) †…Ï9 Š±ÌµÉ’A•!ÿì™j`X`Î!Á™g¡…äÂÁàá3€›ùEßþ!!Ê_B¡Ëé"Úßÿ‰_R!Î]NaûE¢È-¡þŸ‚ß%rž!vßÞà.ÜÖàæI^Ì¥)®ß)Zb*ºb&z8tÂAÞa.è\²”LÍVtñ9ÉWÑÁÉ–©QbI ð3.c3òÅ3Fc4:#5Nã4V#4^c6Zã6zc7b#8†ã8’ã7–#7r£4–£6^£4¦c:Š#;~ã;šc<ªã:Þ£=Òc<î#>Âc>Ú#@¤;¶#:¶£@Žc?ÊãB d6:ãC$<#ÿ3Rd3ö†œuT€áª!$£ ……µT€•ax=àWÙHH Ý*/¦ä交‘¼—=Ö U›W™MšaÑŠòSÎìˆWQKNÒuØ8aIr i‹LÒ•RÖ¤P½O™±Óq¼!HÒ$T*VQ†‘”UN/¶$EÅ?í’^ͤå£G6YB™bHÓ\üŽ& Kr—m1ÓíÕH&]ÇâÞTº^t©e!VùâX0µMà^—_–“:&³É’f_j¦^ÖJëE dºRd•&eB–dªäQ"VGFÛìÅeMTÓñeædädæOÊ%]áÿîa¤eÎ$m±¤jäI†™.Iem2%€MæU&¦x¥¦^ý"xý&/¥¥r®kFæoEÑ&Ó)tÙ^a‚çv.F[¾¦“ÅåW`ÛanåY:§{•‘­pQwNgSšØiçq s¥&i"Yr–çx2›j"h]®&Srç&u®dSj'P6¨i‘ÎÂg„V§‚&¨wʦxÚ‡kÊžz‚$Žø$„R¶AàŒ™!?ah|Ýgø˜U…j€¢èU(ƒ²ÞqÞVIæ(b ¨ní§mKoâåƒ~&}öhŒšV~â'éÌçlBiGéèÚf~ŠzŽ(\–({Úe!—qzé—îÕʧÿ}^§v’å‚&M¡(ù,Wœ.æœ.™=—Ò¨tê©/F†hv ˆÆ޶QѨƒ¢)fê‘ô)Z¦™6&“ŠèG’d‰Ýäž^é…>êú‘˜*š^¥‘Riv"ªyJ(Qç]^j¦æePâf«®¦ruêäŒ*i ê©NSfž©„Òjt*i¬îȤÎ芞–Jjç`›n±ê«òjškÆÒ¬6j¡Jà‚Rj‹:§Þ¤bžh’ªè­d(AÔ€¸’븚k¹¢ë¹ªkº²ëººk»Âë»Êk¼Òë¼Úk½âë½êkºÊÁ{€´ÅZËW à'L©~f«¥öb¤¾¥Nærhÿ¨Z©Ž2ˆaªê²‚êŸzªV¥ê{ÂèxŠW:ª‹Re‹ŠÐª€Â`™y0£vH ÁÒ€´¾aÉéÌT ß¥'—ÖÌ\ •挓w¢ªH®å†zèÑþˆ´j¬“ëÄêÁÚi‡–çNÚª¢RÆ·ªìʆGËŠ…ä¼Ùxቭ-ÅÅÒŠQ¥†*^±Rk¯¦iY4€[„ 4@‡!0˜ÞRÞJ‚‹(huD/ @H‚Nª&chÆÞl…Â)&)Ôî)›>ç³Ç“e­Ö~‡2rÅËêˆÌ2mÅåjj«bkî§u"+Ï(ÀîLï)À÷HÂ<o¤Ìên€V z Àÿt@˜Å 4íJÂè‘^îbLÁ ÀlÀÇR(“ÓçF/‡R/ÒNo°º-Å®êöΈåb.xh.Yp®€9C*mÕbkK1,l–¨Hèõ®®d€L@AÝzXІÀ¼® EÔœïíBm„ÅëšÅ4À4A4À$€þoÇÈ"¨J¯Ä2jâÆêÈÖêÔf0Ë4AÊ~ïwH¤Wô…©Š…Ìf嘊åÅ^æY~Eé²oÏ’©ÆGÜžEò>°ŒtEëð°d̮ޞ€{( 0 1›À(€ÿ>‡Œ Á¬g„r/–žožº°{¢px£œÖé!€pÿlp­HN²-†Ì-"&®  ­†ÚÆÛÊêm]ï}œˆ @É4Á.žW·Ýî@aœdÔXÍ€ïm%øï œ…ïž-lEØ‚ Àí^äinæ®~gw«” «Åf/o~쀢j_n»FËªÅøn xa“º§*Y[È0‰Ò0.O«n*²D YT[à.FqÀDz…j¨¨ª®*Ù]Žm‚±Ô¦/vÆ 0ƒ7èÙ7Ç8‹s8“ó8›s9£ó9«s:³ó:»s;Ãó;Ës<Óó<Û39kîW(°zñsØ‚z5Àé-¡Æ’//çúòòâ²Iž´blÿjZŽò­Õ¾pÄ~®C›móTin‚lµôšjY!Ël¬IgWI›tJÆI³´J£ôJ»tKÃôL¿tMË´MÇtNÓôMó´NãôNûtOõP£4`ø!˜Á,õ%(uR#µ¸êrlÈf«5ÏÈ.ó¬±Ö°íˆàFf6ÓdvN.‹js}†2ôrªÔâ'm"ãC—êÐ q%é]rlÙ’]ßµ^ãõ^çõ_ûu`÷õ`óua6av®F-H׿¦Jhb"ôV·-æ1(Wó²f´Ó‘T©¯b¯âz,’BnÓž((î¡$y¦¨W¨š~¬e›2lwt“gk/\׬ÿÓjµÃZ”'ÿ¬ó>³2X³ÙSôÙÂuu‚6²>ïlïi²)s*k´Ž¤«âJÔ^v²øilcçÛ~ÒvÏö¢>³ÔgEƒiÕZ5–Edó¶‰&¬grqp£áŽZ+nW¯ǵZëwfWª'éŠ,/©bž2Wzñ¯Ò•>-wTe‹6©n$kŸµ„}hm[qtîöéú,3ãiβ„ãw7Y“âê5i«iº6Šx­Ú(67f“vnjö{{7h‘å§zvx︎7¸…Ÿ7Ó•øŠþ2±wl®µƒß1ÇV {åðT1ÉÙïL6ª’xûøØ7‹+9eê†åRáéÿª"÷Ë5èF8u÷'ˆ§9#íh¿u~{¹vdx—R54«y~¬ÔkôV–6åN8_ÆyŠ_p_;¶Ânð}xÛwvß8‚ž9t"l}£éŠ®¥·6›ƒhrë%!«o„UÎÊÛζ·ûVf’Jw]Ç1¯vë@£z7s‹Gsw_ñh{0˺›Àt€ýþz‡ ;°{‡û° {°#{²;³/û³7»±C»³K;µ+{µ_{±G;¶kû´{û·gû³sûè©xª øŒÓ¹¨ë›{i{uŽÈAÄ; Rcd@ ¤u«7 ‹Å(`Í,H d@sϧ' üi~î‹>8¯ãzÿ££;xn(Â9R¼8:dÅËãÅ[<Æß£Æg<Ç{|ǃüÈo|É7£ˆ¿ßö›†ô‘·o’ƒWpE'x ìÁ{uæ¶*údj1ùPB §|w5U@‘ p §i[ß²ˆ+ôn…¹ãvÅ“ÇÀ×jòÜud=l½Ÿk}€5.Ö—wׇýe Ù³Ùýd–ýž=Ø+Ï~Y¹ËxW3|×y/C7…K”¼ €,TAˆEœÎø­ãï€(T‚,ÁVÐ@å£@A T>´@Ø@lç{þV¬‚vd@-È» T~  Œ~½Ô@ÿH$Ã!¸‚1˜ÈüBïŸ0AÀàû(?'ˆÂ@Ó+„BWì œA2@Tȼì@ü_¤@ØxÿhXÔÁnN¨®ã8CK§x7öZ³Œ-x@ÕúÂct@(€ÊÈ)óÉ ƒ X€C+,@±E†‡ #ÌxäÈ%IŽX£E‹'G¦´¸rdË’0ø‰ÂÁ`É—Þªq(˜m¦Ì€iS§O¡>ýÀ@Uª ªHà  G:œø‘eϤ3V0JÐè`ª˜‘Û"Ô+NÉ53 ‘n*˜¹ÿdæ 4T‰Ób È*Qä^j …Ü*;d €ÎdEšÔ ˜¨ËÚ"6(‹ð„ÀAÐT|bpI‹µ‹\¶¸ÄMÁ4΀1§ÊjBvÀ®˜ €ßS%,Ѳ&%R¬‰2éQ²2¿#í)vèØŒæÅ4>ƒB Î^½ºR—Ö-ž/Šq³Ã¾gmà¥ül*@-ìÆ3ª<¶¶ói­òÜ/Áó$$ôÂË) &œ/¿ùTi­™F$ ĨPL‘©©¬ª +´âª½¯ÔO(ùð3 €Uj`‘ Z$ ;.¡ì²»ìx¢Î(R€3ìH£±¢ðƒJ(ã ÿ) ŠbH3 ÒÒ,ÒRÊCÌÃ#SÊà!i ®¢2L9ˆ:ê ÀŒC2¸s’“–H#CãԎˆ«" R :! Bâ AÑØÈ†PØ¡ÒKÓ˜ŒR­£DuD0DTK Äøè+­6å=´’OWï4õ;XQ=cÈ3h¨è@ãª("£Ã ê"ADió4Ôúl³(­‹Ø¬¥£"qÓ£]rg ­ zÄh,ïÌÃ)܃S% ¬ú–°\°ˆ«Uˆåm¸(WÛé\î|ÕÕdÿYn—@Û#¤§tSe•á åµo^2À`­¾`B03v@1‹Ðp¥ ()"£¹b5lÁ[Êè  3¨•­ÌŒâb®™ã‘ëÃUe¯}*@'/tC ÝE¹æüì; ÀWß­ø« Vß-Yo’)´xåxûþØR»ƒw¾™‹âõë‡OŠàWǶÙòÇ}…ÉF€»æ|íZ߉o°7çµoU}3'ª(¨…!Ÿðˆ€*¢ã ;¤µÁKá  60³†‚Ôø2’Ì@O>…#9ùäp/×ñŠ˜m™×nðïKýP^¹í¥»nî–Ñ+é&ûf[õ7íÿ½{œ~\÷'e‘!§?êYìt‹^‰.7!Ì °d|ø¾ÎÎfš³P Æ+‹Ð50ãYþÖ+¶q¬} $Wõǰ˃(4ÜØÌsÀ¯^t³[Vð6£¿]aÜà1G ö¨„EÄß)w¿µÑl‰ÿëßáØBN®f!ì_JØ×9^m±{8{ ضÊqq€ctâûDÄ6]íï~âÒºÀfÀ’‰pÐÚÚÂ1‚â2 Ud¾«àP}ý¢X„ÐÈ*„ÉÐ{¥b ÅøÃ+ÆQ‚¼Þû6¦À2¦‘“/ô›%§Ø1D¦0…_Ô/à‡#À¡ Gÿhå+WéJYª–­¤å,eYË\Æ–·ìå.uÙK_®Ò–³f0y¹Ëa¦R™Ç\å2‹‰LgÚr™Ó|f.+°øyP†õ±_ÿÈÙÐE„Ì[FW9ÌÌŠGŒ¡&·IÉHN²ßœ †ÉJ.Їm\gHG9öä-( jP,   =ÀBZPÀ¡ ¨C):Qƒ.@£­èC#jP„RT¢!MèFQJÒ“BT¡©KYšÒ„bô¤*­¨F%êÒ—ÖT¥'å(O‘Bñ‘ÝŽ8Q$Hô™S‡,áó¹ÆÁS|öb•H3PΫ¤4bÕ@n†uŽ0„^ÿ»¢ÊOÿÝH~'¹dP†U·bUUz„uäçFí(ìª~œkO.™Â¼Ò$?#b©ÜzVÏ©§rRõ á¤Y"5*ä\*Œr¸>tn’ô¼Ð^ë™VªVRƒ¢äêW™˜ÚQ®ì_o=bÝÉ!ž.ª’Í+(.(º0aðT•=+¸Îý³pŽäaÍòˆUå5Ї mY¡k0ÊBE©é;g^{Ø[šõEm?s‹[ëLŒ~`õêa?ÞDês¨¾UïzuåYpⵑQô¤w“[² ¶¾âu,$ÜZåJp„Ñ5j:DFÔUdº÷jÑe÷ÕÔ± 8»öý.w»šÝ7p­‚]í…›ÿ«.÷ÞS¬¢ÝdxGâ×òvÃìD ¼ÏŸ÷ƒÀe£q1zUÂ\ñ¾SÌOÕâ‡iKÖ ws¹d/‹µú_y>.œC^¾nˆÙBî³>ô¬s%Y²=bØ\Œ–¯¹\Ï-ëÒ°ÝðX+½fÕŠuÒšÎNŠ«W½ÓõÆr–q¦S|ÂOÄc‘FCüü窜ϺF´›·ÛFàÆ÷°æmŸ¨IÛE×þ·ÎÅêmŸ›höòºÃ_µpAìµ–ÌáÂâ‹ÊÖÿúfQÅþt›‘{åöúsB¶µ3 ¬Õ{z|±¶l­üäyžÓ^Nñ®Ký‘oº«Pì´Ž“ýhØv›Ý¹^wÀß. oºŽÏ*"C Ú‚Á‹„9Š1Á.åà"¼ÑºŽõÜðEk#ò>lV²ÁËíV©<Ë«Vìæ~-q½©y¸ŽîµºŽrk‡æ7‡¶–]ëŸ9ÚºÕv‚̬l“ ÝFo<6ÃQ;Jb¿¸ ">þî‘èÅä­‘èG¦SÑèJwÛ˜eÛHjß[ž6îãÁ>oKã|åƒÅ6²c¬F?¶í<Ÿ´¹K>«7¨¯àFwÑ;P~cÝÝ!¤ ¯ v6+ÿžÊhñ·ùšaôšÎ¿ûìŒ[~ZŸ“Øì}œsÆÓJJ+»â¾Fo>9ŸìŸÕ?œ}Îk^¢¹ìク筞u@—ò¶¦pß_Ü?Ý“¡·ë]å$SÞÂç°Ü‘ÿí‹|ì¯í¼êá¾øÅçŠìp·÷cÕ;yé+ç%þ¬áx¾»I¤>™ŸRî}ËkÿüÿÏì–¨úŽãð㈠®ªÍðâ,ïèîܤ§àÄ-ùªÏ\Ú~Lû2)î ‹åÂçýÎÂ2ËÊkðöçЦÌðb¯í®!ðî^Ðÿ¥ëM‘HOàPÙx«ú*nÜpðÙ4ïÒºoéVULÅ. “Ž÷ÂoÚÐê|E®øæÑL,Oü*iî.p¡nôöïò<—Ïú~ðm¼Ï·j ­Éêü ð¼ˆðͨ=è‰RïÒ﩯;httrack-3.49.14/html/img/snap2_a.gif0000644000175000017500000014035515230602340012552 GIF87ay‹ÿÖνÿÿÿÖÆµÎÎ½ÎÆµççÞ„„ïçÞçÞÖÞÖÎÞÖÆÖεµ¥„ççÖBœ”­œ{sµ¥9œ”­­­)”Œc­œ1”ŒçççÞÞÎïïï!!{{{çÞÎR¥œïïç!ŒŒZ¥œ„sRBBBJJJRRR„„„!ÖÎÆ111ÖÖÆŒ„Z­œµµµkµ¥))!Jœ”÷÷÷k­œÞÞÞŒŒŒRJ1ƽ­R¥”J¥”ZZRJ¥œÞÞÖRJJccZŒ„{½µ¥µ­œcZB¥½­RRJokcsog-{{c­¥ÖÖÖ”„cƽ¥-)){µ¥­¥œ9””ZZZŒŒµ¥Œ¥œŒœ”ŒÆÆÆ½½½ÎÎÆ­”s„{s„„k­¥ÎÆ­B{{{skŒµ©”ŒkgZν­”µ­÷÷凜sB¥”)!!­¥”œœœB=9÷ïï­­¥ÎÎΈsZs­¥Æµ¥c¥œZRR1œ”kkk1””­­œœ”„!”Œc{{µ­¥Æµœ!!!cZN””„{½½!))”””Bœœ„µ¥11)sssRJBÎçççïï­ÆµÞν1!!obFJBB¥œ”JJBJ¥¥v¶µ½­””½­R¥¥Ö½½­ÖÖ„„s<1*{{k!!9!!)””„Á½sskR­œ!!÷ÿÿ{kRµÖÖ¥Î΄„{Œ„Z­¥)!ç½½¥¥”½µ­¥½½­½µ ±©œœŒ ½µœœ½½ŒŒ{))B¥œŒ„sµµ¥JB9ƽ½Þ½½¥½µÖçç”ÆÆkµµRŒŒÆµ­ŒÆÆ”½½ÞÎÆœÎέ½½„{{ï÷÷Þïïkµ­Æççcµ­ŒŒ9œœZ­­„½­Î½¥½­ŒVuuµ½½µ­Œ½ÞÞµœ„Œ½­ZNA¥ÖÖ{{s½½µ!µÆµRB1¥Öνµ”„½¥¥Œkµµ­!!µÞÞç÷ï9))Öï瘈kR99R­­R­¥­œsdd!”””{ZB¥¥µÞÖ{ŒŒ{œœç÷÷Öï凜k,y‹@ÿ˜ àÀ‚*4È0aÃ…#Bœø°¢D‹/jÌÈ£Ç;‚)²dÈ“$QšLÉr¥K•0[Æ|)³&Í›3sÚÔ‰³`ŠÌ~Máä'ПE‘*%ªÔ‰¦NˆJñ´*Õ«œb}Z‡«¨]=xv¬X²f»N8ëG€Mf×¾ $—nÛ·ÖæõWoß¿€O¨0AáÁ… ËA¼¸BÃW€3¸‚œÉ’/cƬ9ÂfÏL0‡ö §Ϩ+ Nátë°U¿†í:‚ƒ×·gö ;÷íß¶ .ÜÁÈ“+7®ü8òã.˜Ûp0Ëô1ѧ»Àá`º ÕqXÿßî†?æ·7/‡öå9˜ç¾ ùøñ߯ƒC üÿùÇ€ €tRÃrÀà‚:Xƒ ª°`‚¨à …bÈá†ø!ª ‚&¢x¢ |@b‹E°Èb.RP $º#‹8öèãEàd0 Y$, ‰#é$‘D&‰Å“0LÉB‘W²€E–0hÙe—WB&a–I¦˜°ÀFšgÂÁ›,@°&œoÖiç(q§žyö©çŸ}΀#¤¤@JRG-eSPaåh¡42UEUe•XT]ŠéX™nÚU’à°‹18°…–Zlé5–ªkáÀ ^~ñÿõ—¬‚Õš×cˆ1v«a4¶Øeƒ•F˜°–9&li—kf¤©¶,£9»šj§É6ÚlÖÒ¶Ûi¹ÙVÛl¾õÆÛpä"GsË¡›œsÏ!ã7vØ¡çwë¡Wž¾âa'{å‘ç^{ïÕ }îñWÃ}÷á p~ûå÷_€7Xñƒ(Èà€Vè`'Lˆá†‚r‡%Š˜!‡(®œ¡Š.®¨B)(¶ø"‹5žø"1þdCò,ô‘D $L"­4“Iv‰¤ÓWZùô–_RÍeœ_†ùešnš‰5nÒ)'ždïY'Ÿ}úùæŸz$ÀÐЀÄÛdA4€nÿ°·Û `˵`Å|ÁIK€D*>,âAY,‚Ê}ð½*‹ 1@ã̱w-y8ßn/1Azß4,²H%A =D~Çý=ê¨ÿnºÞÃ÷Ž:ñÇ:àÂ÷ý·ïÏ@¼ïÀ³®|óÁW¿üóØÔýö|7¿·ß¨Koz÷ä3ÿ<Ýë§ï|õî‡ß~ñÌÃ_>ÝÀû=ÿüöŸ¯ýôáëßó÷>ãÅo{Ô£_ù¾À­Ïð{ ûÆg:ü0zL úî7A¤`GX@ëq„ÐCaxA6¼{ïööˆXã P(>š0yœà ÿ!¸Áëio]àÿ–xÂ"¦Ð‰òsá÷ÐÇÁýå~Ìb·(ÄzÑŠ&Ôb+¨? .Ðtæ‹ÓhFï P„½ó ƒ(A þOal#ùW?#ú±%dcçÆ=^±\¤cÏØÄ'Òyˆ,cA8F>:2‘pü¡÷ ÙÃJzü£ë(ÅûQ’‰Q äãçIHfï¯lä'}¨Gör–§¼å$§hÊq’i % cËKþÒ‡Zä¡%m©AbóƒÁ¤¥&éFTVS–;ì¤5YIH]fò›‰\d ¡xÌJ^²‹¤¼ 0ÙÊo2}œT¡$£©Lo®RœªÔ!4÷©ÿOQ®pžð¼"#qIO_´—wÄæ y Hwb™Cd(6½ˆÐqó‹RLç(íÙχ>³£Î¤§HùéÑ‚V4ŸÕh*/ªÒcº£Pœç=- Ntò-8Í©NwÊSv€!Z€A`!ïHÀ`ï©1\žRÙÔ§æ/ªÂ›*SçÔü]5Z\U½Ú7¬ò-¬kß¾ÊB´òM­ãc«T—·T±rÕªe+]©zW²ŽÏ¬ ¬kZûºÖ¼¶u¯[ý[W ûW½ O°o%l\ ;×ÇòU±xmìa-›X¾-v²š­¬g/ëÙÌÊб£í, M;ÀºUŸ}›\³ŠX»ÿ §¸Ím~ú$øÖ·Ð°FŠJèÀ©–thJ¸Ò*r˜×¬å<#zR= òº3mæKºÎ@R7¦É•c$íËib×£T$ç÷H*P‹J“›í&™™Iˆ¾pâÅez/Ê]é>W»ðE©—™Í„T¾å…§nìS£ÂðtO®Q ]˜²Tžj´f=KNèÞ·›.0,L—²¤óµi…—ÙÎÏñÒ¼îyKüÞÓxš0‹3Ü]j~×ÃøqvßKÞ_7ÇDŽoóëÊtÄçe°”;à`Þý.ÂÄ=ªºämF’“ ŸhàÏ%ˆWŒe_zÓ;yÿ£^/ˆë+âÏX¿ÌÝ.Š_ìÞ ×·Åsþ±veÌd“®8Ï#峓1ß;7™ÎO¶s¡‡ìç³×»o£ M_AK™ÁTî•€å oÎÓ è£‘Ç‰@œ@{S]«á·œ ±x°…[ a Kx…ðW+q|ºÀhG%öÀÕ ^±½„DÁÕŒ˜aH%ºí#z[Ãræ±’õ|ãý6÷Ã#Fr¥Lbo ÚÒhœt‚mLPã3ÉôxaŒîÏØÄêí/ŽU¬c%úÓ 5AF]ê➢íT55³«\w[øÜ'w2#½ñ“vÜŸuþ8AŠé"c\àGÿ&8¾ÿ,î+Ú¾áö÷™kð='÷ÇÍe·£}œé‘·üß4ç¯Ís"\· ð•%ìp.GÃåÆçu%Nß ÿœÐñôt·®õ®÷ë9¹ë­hHÓû£7ïyÎÛn®ó;æƒì1¥©Žî«›ê:ç´Û¹Üï¸ëqîgOôßÔ°ƒœ §‡_ ¦ P;8€ ײÓŽw·Ýá;hÜÞ°ˆÀYu#ê^w¸h ÏŒ ˆêmø ¨Äð… D@ëPø¢®WÄPÁ7×-!õH‚ðPáz2óàö>PÄjŸû½àÍ`Dãê¶%Õ|<€õÿ÷-˜ÍÛnQàÛè@€^[¡©M ÃÞÜœû3ø"°Àš«Ï7TtÖÚ÷`] 4€D^dà6Dµ~ÐØ€h;plæ]ÐgÀ:´C8¿'ß×{°{ð7¸¨~%Ø è7‹°Hw€Ê·7Ìçf°;7=€‚{£ƒ¸pI „¨s‚; 4p>H½GIHg 7I;w08P8„6h…´³7^QpÕ!09$J´<°y°CІÒCVp {S; ¼3‡%–a˜€C@ À zP}C0 _À„ @ÿŠ09ƒÈnerh·im'v‘f]òVatt¹u`3D< Àt€T„jSuxFS9VSÿ%‹÷ÆC®Hb¬8s¹äw¼¸K÷ÆM=¶_׋ÆuFFqku4euþ†uW÷N·èŒÝVsqöm>ço•ˆh—6Œ)§‰Õe^rЏ•t Çt’WŠè%u]¶\«æOOnÖ8 ÅmÑUN”Çh½XyÊÈwÂè\ÁÐyaVuîx) iûˆjk§Ž*Wgœ¨‰–(x˜hw{—EâØSäaæHaèÈŽwÍ甎Ëèeµ’êÕR'S VHÈøŽ'ic,×þÿøŠ%‘³ÈŒõ¸n(¹“°Hp´˜ø˜os¶ÅXdƒæ“V‘Jyp¹S¹tY’©$i”àuŒ[™•]©“E)”d9–fi’É(–ëÈN¿XvkYÚäoúHv6‡“»(`p)“å•u©“Ù‹­8bpÇsL o?—>w[SÙ`¢æ‘W¹e!ÉNz9yr©•”É•"i— –' viŒa癆†—@‰“ÀH—ÿ–¾˜’™ùR.)š$•‹*Ù’,)ri¹šû¨Gƒ¹”og`Ä8‹É˜ 瘦ö`Ù™:IC0d¦mä3~i–oYšjy—Çy›£ÉҘē‰@Ážâÿ9žäYžæyžèYž €2 7ðx?Iwwš˜©›¾I˜o4žUIj ™œ‰”&c!ÔDG”±x 4‰š)›™ “|÷߉[°9%à€S"`/ àyx8uxj"€S/  ž`F+$`&jðP¢'º¡+ -º£Fp1€x8¥I$¡J* qàf`x851УV:¢MŠSKZ£ 'šždZ¦ejP?àžišv‰œhÇ—"w–Y§ŸUFœM™yÉQ› t qŠš‚¨„—õ¹§íاÐÇÿИ ˜Ð™@ˆÐž ²“šd Úˆà œê©‘ªˆà¨Ÿjª¨ZªžpªÊª®šª­ºª :«¯Z«±* d ªª«¼Š©»j«Àú«¾*¬Åš«ÁŠ¬Äš¬¨z¬Íʬ½ ­Ãj¬Òê¬ê -ð«Øª­Ù*¬ÛJ™€ª¢J—*®œZ®×z®áš®äº®Ã* ˆéàæÆj™ öJ¨‚'rvÚ˜VYœzJ¸És9°ˆI‹q¯Y›ú•Û™`@P± |0±K±›Ð„Ð| N²à”`"K²@²[±ËP±0k±¡ ¡ÿ³/K¡@ ¡Ð &[±) k¥ ÙÐ @ #»   ¡ð´¢`| [´G[±F0´Z»µ\Ûµ^ûµ`¶b;¶d[¶f{¶CK² :ãFô™ÓY°pÛNŠžûyXyù:·oÚ°Š:›„)šK)¸ ù™Iy= 8… "иMÐxS¹¡ 8¡G¦ 6£.Š[RºSi 8j¦/Ðx3j¦¤[ºãÙ“³›Ñ‰–®É°Ê ìÔ¯Ãù¯yúŸ{{OK€}­à;PÀJ¯SŒP@äӻϓ»v°~«AQлó7ÁÛ]½]мÌ;CÆ>Ú¦¯±9¨û*=0¦ÿ¾â(¹;…¥g¹â›¾ê‹žM :rç°:‹Ó¹¶ËJ²«tüù˜ÆÉºo›]=p{|C%È7VpgÀ ¼óQ`ÀÈc†Ïc>€g0zà7;pC`sð¿0$ÁS¸7|{úgÀšWÀÜÁ$lm]Ð;wH…|]ð;Pþ£­`ÀÜ‹p'—ñ ¨ºpßË¥8µð¢"j¥”«¡Aºjàû£ MÀÄR°¤¢à©i +p¢FJ¹RÐãS<꣇·¤^*`*ë;Çt\Ǹ…ºj‡¨š|l¸“é•÷[Žú°r;“}«qÓYhzÿÛ½.ǧ’¸ ʽü4Äv\É–|ɘL¦í+dë”ôûɞʀÈxzŽõûÇg Ÿ›É¬ÜÊRÅ8•0ËiÀ¢q0ËLœ£Ú¡°¼¡W<Ë~Ÿp˳¼R~ ~ÐLª¤_œË`ÌÆ9õ¤³¬Ë%F@Ñ  µœSZ*¢ä»ÅƬË;Ë$ `Ì#p¢Ü|Í áœ>ZÄ> ¦"Š¥ö,MàÏ`m|f`¡R€-f`Äq¤Dl¾2… Ð6ÎÌ\¥IœÄ®œ[¨Ûw•ÖºªÉÈ(½½EÊ´kÊzÛ¿FôªÒ4ÿ]Ó9Ë9µÄE<Ëm`,¤'@Ì\jº>£”›¹/ÀÓ:5Bj+¹8EÔFü¢-:˺ÓF 8êÓ¹K-Eº¢íÕ==Ë`Ë8êÆõSÀ¡E}Ä8Å¡? Ì-jÕЂðtýÌUiÛ¬Ñ6]Éx\‘… ¿НAŒM,¿{ÊŽœÊ«|ؘ}É8mÓi Õ¹µ#0ž-ej°ŸÙ;õÕ¨]Ç›ü¾ûŒY× ^WÙËÙxëŸ/Ê6Ó«ÝÛs¼Ù;¥ÓnÝ¡aJÆS<ÆJÜËÆ½¡¡=Ϭ£\Z¢ðÜà)¹”«¥5J¾k¼ÅÏÿ]xKìÆ»<ÅYšÏåÜ£¢}¢æû¥ê=ÖXª¥0JÍDìÛ!ÝÚ×Éüº’Œß-gÛý¹¿ùŽ2}Ùô]àf ËR`# -Ü ÝSÀSm=•rÌSN­Úã+Ñ ˆ¾Ÿöàþá#=˜r;¸´m¨¶ûØÎä߃LÙ‰J=þá0N¦¾`ÂmÓâã8nÇ!~Ÿ‹ýÚ%Û’Yâ7%žwûß„l™.ÎÛ9¾äLÞäNnÓPR~ 0åmtÚ)ʰ-Û„K?ãR>æc^åhª7Æåœº=·/þänþæpçfŠÀ;O Y€àžÓ^^s·ÕæåUÿ~èc~°7H5`}üH&.€A?0 Š.å 凞è¡ÞéðéS.êTNê¦>ꧮꠞê­ê¥þê¨^å²¾ê°>ê·Nëcžê»Þê±^æ¼ìž>ìº.ìÀ~ìŞ쾎쬮ì³Îì¶îì¹ÞìËþìÖíØ>í×^íÜ®íÞîêÒ.îÛNîáþëåŽîçNíµnîÓŽ €Ò úó–03t]F¥ èøêçrʽ†ŽèNå&p|Ca÷̓>7( ññÿðÁððoñ/ñññŸñÏñ ?òò$ïñ(ßñ*Ÿò&_ò,Ÿñ/ïò*ÿßò'?ó5Oó2ó:ó6Ÿó7Ïó;ïó2óDßó?/ôE_ôAŸòJôoòñ& ñ¯çW–ñË“•yÒȸ=_êߟð[fŸ´ÉõåµsEG HipPùr”H‰$í\nß¶÷I÷m¿h™X÷yß”p¿cv¿÷}÷~øƒŸÇlÏr|_ø‹É!'èý>èßJ_Ïíð’göpÊÈ&ÎzG`ªk‰õZ¯‰t¦?÷y<úüúy6úu?û²?û´_û¶û¸Ÿûº¿û¼ßû¾ÿûÀüÁ¯ûŽ°ÇŸÈ¿üX~ ‰›ØÈgŸ°…»Ç~ìn•öcŸù,ÿ>’Åó ?Ðð ðÆ ð˜nþÈ…:à?  Cxð €óS¿7öŸïð0ÿÞH@ Á0!Bƒ J$è!€ˆ/ Pø°¡GŒ3Y’bG†%Ž ¹Ò¤Æ“?–$ˆDœ9uîäÙÓçO A…%ZÔèQ¤G7ä8ˆåB•Yš³ fL„-Fm(óiE¯a=~íúPáU³Ï HÊ3LÀ-·‰ Aèp)‘ë×µ$_ \˜6ëá”YYrð(‹àŠP@p`µ™ÑB>H–«ÖÎ^A.Æ=1uéw¿;7®]¼zùø×yľÖe3&îwìq÷ͧM³¾à¾«#»f=ìýþ[9òü«5ë ì/Á²Bð3Ò4£oBÎlp½§–›ÏÁ7ÄP" ߣ0ĔΣn¹å‘%Ytñ¢å‘Cü쳿íèò®®îÊ €½œq¢ûž P6›½\É'ŸdÉÃäüSгӰ²²Â›äKþÀ%2QC.Ã.[nJ>s3Ëû,qIìÃ,N«$òÆìîäÓÎMbÐBBß”ñÐÿøݪÍ!Uä3ÇîèïÇ ;lTM&IJ"#m.¹a‡|ØA‡AvXBW¬€âR…èÁ‡$B½„Ô xàÓR—`‹A‚$–;vD‡Ê`ÖA81ˆ m†ý=šB]/v2:‚u‡ ¬"YxH†Ø#!.Aå†a½x5 /t`‘|u÷x{"dÞˆE¬`ÄW[w¨—Ú€¯% Œ.¶LQÌ+á‹8Ï/%®X€š8Q Ï@‹Ì4F-‘|±Nìuò¬"ý,DCÏÑQÂZŽí9ÙETΙ£Dóç—th—‰V R¹$í1< Ç«JLOdsNÿÿ:˲=ý.ܳ:ŸáS²è-K»ç §®ZJ’ì’Ð)~Øâ‡3f«„ºãEÏf[­/n°âï!b`+*±âº‚¶¸äïzˆ¢!¬¢`:„à¿_ ¸œsÃ_âö ÆíŽîÒ0ƒ‹!›oÈÙäò`Çsl±&ldß+Dé'OHª·6²F®ËFôd¯½ìFåa^žc£¡ôÌDÜ—¿Þh=­/3déÛvØ|ŒP P`}Ö‡ÿýâ§ßþù€_þúïgŸ}÷é¯ò àþüGÀÿP€ø ØÀúñ¯€üßÀR0´`ÿ-(¿üapúÎïÒ¦'5o¹KžøN˜Âìp9ÄSšŽg©F wØ3¡¢.ä°‘O†-Ë› ¥»MOxf ßÈËHlƒB_ù¤&!=ñjd›òÆWD¾.m`d¡Ç®»F |*óÞÇÜxF3v/SPLÒVhø¥QÊiuü¡w73&öq‡Ù äݲ׵C wãC¡_¨ÂàYO’S\ϼ!3}mg[Œ"ϼ·ÑɇlDäØš¸=·z“ŒžóFÙÅSÂò‰²ÄÌydæ!O“@ü£Èž'È^¢í•¢´÷âxÌ$ªÒB¤T+CÆÇP†-•®ùb•ÿSI1ª •z‹!&WèŲñßT"6ÇXF2¾Í9¼„(•©DФ@ž) Å<íyO|æsž'?SÀO'üS ü$è@ ê‚"ôŸehCŠÐ:@T¢€(E-ê‹ZT£u˜€F=ÚQ†T¤¨I5QÒ œ”¤I+pÒ’Ê¡3=©LeZ›ât¦:å©MuÊ„Ÿ¨Cj*¢&õ¨L@jS™úT§F ©S¥*S#à©bõª[Ū¼ÚÕ¯‚õ«ckXÉ겞U­^M+[`´¢Õou€ ÆW¸âÀ³p øjè€l` kÔ@¯@,b«Xÿ0V²‰Å«XÉb¶È,g9»Ùφֳ›ý@ >ÀÓrö´©=­ >Љ׶ö±umm?`[Üæö¶µ­-nK¸AÀ®oKã"w¸ÃEnr›û\èB·È.ª{]äb0(wa ],|÷»ox»Ë‚ï¢ êe/ X€Þ÷º¾,ÀÞË6Ü—öͯ}ý»_ÿB@Àp |`%¸À †@‚ì`Ì"Ž Å&œ‚#„x!QÄ'2™ÏB3™pl'ð‹?¦O@ÀoÈ€ ßüå'úÙÿ~ô«ÿüë?üs°÷¯ßüîÏ?þó¯þ¥?ùó?ó[?÷Ó?üÓ?@ÀòKÀù[Àÿk?¼?û“À<¿d@tÀ \@|À Ad@ÌÀ4A ´?ü¿ì?¬¿ä¿ìÀ @”Á Á÷£AÄAôA¼À÷´ÁÁìÁ,B´@%¬Àœ@#\ÁlBó«BöÃA&TÁ*ÌBÔAB0ôÀ\ Ô¤ÿ_b£»ù£ðñ#2¢ê›Ã8¤¦Aj¡ßã"ÝËšmÚ¥Û¾gê½?t&å Äå3ÄU ÄeʦFr>*DGâ&G,%é3¾uj&MLÄMÌÄå˽E‚ÞkCÙ ž7D>í[¦T¤#³‰ÄRäK´Cò¾S¤ž:¿[„Ä0 ųq¥Á>9 ¿ïK'"ÂEa¬ÅêéDèóDf¤=e¼>PdC#*Æa?j¼F$b]ܨH[Ыxn€ ‚59'%Ò¸½ù¦Ú›&42%UÔ_¬!r¾_¬¦ï "yÔ¦W,&{ü¦ÉÇlÚG<”&=ô&€Ÿz”"‚äÄèyÇàqGÿKÒ¢`|&sÄAŒŠàÆÛ=‹`€ €Û ’uìÅoòvÌC‰¦]zdž¤ÇYô%€4HvT&‹¤˜äk£L2©“ƈÁÉóÅ„t…„“‰¡É ´É¡ôÃT>ðSȘdÈ¥l¾¦d $ŒØ{‚’'vlOrË…œøLF‰lÆELеÏNÊÎK+ªKm|K-L¥¤{œ½ø<Ïùl̇¤Ë™ŒO÷DLO]»AºOÊÜÏ\KZÌÆ~4QõÄFâ£Æ[ôÉŒ´>åÑ-HóœPôÔN ¥ÈMÏ4²ÊÍP¸Ò¥D×€ÐýN¼Qñ,Q§LÌPÍÏÊ|QÿŒNQM«h<@…(ˆ‚ÿ€/˜ TèÍ[ü¤ÐqˆT ƒ(@……HÓH=ð(X„JThƒ5MÓVhA¥S«ðSŒà[iÍ4ˆ2ˆ‚9F—H…5] ƒÖ!ˆ> 9q‘ÍÈÛ“$œV°T?]:…=GíŒKUSh_`¨…45ŒHÓ( €Áa€6¨…KÕ• b5ˆ7åSAmgUÖÖ0HS(Ô$P;ÐÓ%° P­X:¨‰X‚,F`¨ M«€ÖJ…½%HÓÐÁ×Xˆf½×4¥‡œ(Vl¥{]ƒ¸ƒ@è‚=0(°ÿÎd°Ó%øV•0Xc±…;°Óam…b¥ƒ@V†Öƒˆ„µ Ž€<ÍiUÆ͉@…ð¨„ň™ÕTÏ2èÖb]€;ƒ ˆ‚ ØÚVp¼,èLˆLR³¼ÈžlK>¬Ï4¡Ðêé‰8Šn¬ýK•KL´Kê9!àš+» %”8’K(W½eÑšêŒ «JŽ!§9»•€‚Q`:­™Ÿìý ˜‰!#Q9…@‚ÌÜ8²˜?ä´Ž&… „$JÜ“È"µÚÇÌË+¤´èR‡[þÄO]`Ü=Àt§Ÿ,$õN`BÛÿé$$×ÀÜ­ &I,^íÑ0%Å$¥%æ%&ÿäÜ#}ÉQÔÈžÌ[] ­RöìÕÖÍ¥º‰]ßÓÅ EÆhÌRµ¤ÝéÅݸ,Ü”t_ñ•C-ýOà¥úe_üµÆåu^ؽ]õõßô Q߃¦óÝÅçËÚMêË-mĤ¼ˆîýÞ _åµÅpZÉý¥àÙÜÞ…FîãàÝ>—D_ó­`']O ÐaÂàG¬ÄIüÝÿMaÙ]áGz]òm_é©Ñ|,]+P#½^J|à/à^ÅûDþ¥#è`ùeÅ%Kbtbýmâ³­P^DEQB>†¢ñ-b%fе¾6[Ž<^EôaÍ`ÿæ›Ú>`N`bâÿ$â*6bN^.ã.ßÝá,þã:A‚6@<dB6äA.äD6dEfdG^äA†äC–dInäF®äGÎdKFäIîdL¦äN.äLåM&eMæäRöäPåU6åO>eWneXVåMŽ¥ þ&5¥â%Lôa 8&[ Îã%&ˆ$8ƒ8ƒ3Ȩ¼‰€<ÒCN@MÕ¼Í=¶]k¶â;¦bíc4.¥ø›€4€„< À °€œˆ)À€Xu#X)€›xx^°€&0g ˆç)؉z^5pçs5À€ƒ€)X#ÿ 8Pƒ~65hœxhŒNèÐgyþZ…Žçˆ–œXèˆ ‚€VçЀÞç„V’Ɖ€–çè Þiž6 pŠ2 ƒ=؃TP°)FöQ)Fàxt˜_nÝ`ÆæÆLĵÎíôc­†R4ß žQ¾Ú¸‰¢Ð èin“Fk·~k¸ŽëŸPˆdF¾™sÜê°žb°6`÷Mâ–ˆjðâ#æâš,§gDP2Nì2Þâ:&l[ìY  ¸ìظlÎîlÏþìPp‚ÏíÎæƒF mÒNP@íÏÆ> íÐþlJmÖ®mÛ¾mÜÎmÝÞmÿÞîmßæl-°yAOâµ`¾®f1~âƒl9ŽßNâîê¦Vî(®na~nl" ‚+èî+Ђïönðoð.ïñNoó&oï^oõNónïô.oøfïðVoù.ïüno"†w˜ïwp„^˜ïýïׂOðûÖïçï7ðGðWp÷–ð §püžp ¿ð Ïpo °„ÐÙZ¬^ìO$á=nì`n¾˜j;®êþÍîâNî¯.àök¿q¯áМiœÀçò¯Õ€8|Ng!gçPr²r Xkȃ0rœ°rtV0ò"7r h‚ˆ°é1Ç ÿ)  Ðèt~éH‚€èƒ  Ph#_œr >8&È (ó@€ˆ@s 87_‚œ&V€ˆôBgó`s‘.t5¸s¹ÞtNo‚L LÎ_ ®Æ.&^ÇÏ9>b«¸5Õ‚2X‚ ÈÙ×k½×sNˆVå×€Ò€$¸ŒPffŽ‚h€„.Zül¼ÛŒ‚†iÕÈ߈jN¦]‰&xNqaˆÔ«èˆ=ƒ§]U¨@Õ(]ßuŒèv¶i HsNÇ #˜ç¶€ˆÖèyßw~ïwÞh‚;å$Ånê.øYºeíаL/ã‡lÿ×âÄvîìÌ­¾$@f:ßµÄ6îøy}wwØ)¨ó@8ëCWùPë:yØt6‚µnè4y05„œØ‘—žOƒwù”Ç úœ  ‚4ž?t‘73GùBðw¬Ïz­÷ô£ÌqÎxæj=u/u>€'0¢Gy¶_{·o{¸{¹{ºŸ{»¯{¼¿{½Ï{¾ß{¿ï{ºwr‰¾‰(Gùx¿ &ò/ƒ&0ét¶ ˆƒˆ–¶¯s#ˆƒÊ<¯zÊ—}†i ?@üCÿrHú&@y?èçɶ®t˜N‚Óýœ°}ÿÔß|”× 0}×s)hý} 8úÇÏ 6Ot3¸ýÑ ÈéPƒ3èƒ[øZ„Ö×€˜~w&~ÜÇ Ý—›÷}ð/~ AˆƒãGù88èðª'|­/ €ïáÚ¥j[.P„@PàÁƒ2lèðaà X PÀ“ &¡£¢A ^‰¤€ Eš€ÑÔ ˆ2gÒ¬ió&Μ:wòì¹0ÆŸB‡-jô(Ò¤J“6ñQr¥É§¢TI’%Ô¨X¯RœJ’ Õ®aGŽ›Ðì×” ‹J¤hÑeÆ=‚À’¤Ë– Õf=æÒÀ‚® ÿ´¡† EXX(å…#3fx"@b "^NŒ!Žä) +sƬX †4ÄLcsÍ*9aa…†…‘ˆžÝ¸t€fŽˆ{áñË¥IHø,YyñÌeÇÞ¹s†ÓC,|!%Àcé:p ¼0úÁMæhmß2íS¿ðó’={× }¼(ñï—z²þ^V‘eT[½…‘FÑe‘]Qå÷ŸY}yõ`éYx!†:F‚ gh ÆBFÄÁBÌÙ„Z`‰uM&>OÔét^†5¢·ž{\½'–}î7ÖT{AdUîÉ×U|^!™W‚s}Äà}þ)`ƒïQ“]zÿiáa_Fš˜ešÙeSþe©Ÿm&ôà•F*Y_Ze©Ugoîפ[Å¥à”!¹I$€:ʷ噉*ÊS˜©h™i ¹ÔdAIÑÄ#@bŠIH†I0à HàlÀvY2HÐÛeÓ­*^‰,öc,&‡ÛjlV™¬¾ƒ$dê¡y.º,ai>¸&z)a’ÕÒw$U g€QñUŸúeGBke·ÔþÅ%³íºû.¼ñÊ‹ÔØ{ï½ l°d[ *ç¿Ø¢¥í C äXúË$[Nø§”umûcº†NXá¼k¼1Ç©@lp"'Ê ûfÿ;p„'i'ÌgÝÉ#ž_M,-Î~­ETöЀÏ>pA ÁòÌ-º4Xˆzü4ÔQK=uMQ$òÃÕXÿðƒ7)ï¨ó´._›ô¹Ü†Íô·hc™v–;Õs½@Ý€ äƒdësÍ@,H(À?ŒRoq׋xâ 0Ž8Ð#wâ÷:~ïÏ•]@äö^^yçž?ºæ¡N9ãŸ7®yé¥OÎ9ëªgþ¸ç®Ïûè¬Cn;è¸cNúî’ßžzî´Ã.|ïÄÿ®{íÈ£nyñ˜7/úðÐ/o¼é¯“.;ðÓs®½ï>w<õ  €|ñ=bÉ%]ÑüÚÿÿ5Ëçê3ØL/Ü÷Êò—näk\Ý¼­­ßV6'éG” žU¥ùI%NÄ%ØÁn}p‚ÿ*áK˜Á~yk…$á×Bˆ´¾Ð‚9a~<ˆC„:œ¡[(¤öƒA," ‘ÁîMfKàùG(¥0yâK`¹øÀùpû¡ ˆB1ž°ŒçÚ  ³"Ã*±Qˆ6T£ÛG òp7<—ëÇ;¢qˆz<#ÝÃ=ÎQŽcü£! yÈ@òŽy¼£Ùü‡¤¶¹Œ’«¤¿,IÉ*>vË¢$ñ7§üI1a³$œÞhG$’Q‰E£šÿú¨ÂWúÑ‘`¼e-ç8¿8e!Ä 0/”¼¥}ljÉÞÇž7öŽSÓ³¢I±iælŠÖD'ø3,â-”%ÙDòˆD_x„ÆI²‰<ã¤AÆù $ €OˆÆ+ðŠ/P¤Ú²Ñð€‰<`ðgž¾ ËV>R—i4!j%UÆR œè ÅH€Dä&˜% ˆ9b–dP €¦’Løår• ÍÓ1c-==SšÕR6C·ÍOvSi¨ä"ÍFÓ‹Æ©b8„éLÁi- Š²¢¬ücCeU3N|*#ÅvpR+iy9[•ä2¯¬Që%YöÿÕ¥…µœi%«QÛÚÕ±¬Õ§” ËâVV±¯gûiPÍÉf^3ƒ}Í©ævª@-ª‹©¤ü¢QÀDšÑ‹Cµ¦#[UY2¢-¥ªD=KQÑÖp‡w,3wé×›6µe¡ìÿ‹ZQ¾–‘/µÙ»XÊqµ„=˜o \…ÝŠgAìäèÆÓzS©D*ºþÛÉBVºÅu®c¹zYÐ~–´õ.D9û]ñ†×¢a¤èF“pƒÜà ìeïÖ+_÷ÎW¾ðµo{ñKßû¾7¿ýïõ+฾毌àûWÁ f0€aø!¸Aý¶»Ôën¸©cëð7A¬Tÿ ÷ŠËe¬Ø²[Û$ÜÅ%7€  +XAQX‹y°ïàsÄ@n@ãJìzˆ¬°…èÆVØÁ"¼P‰ÓB¶Â Üze,GáÅI‚•i|ƒ<ŒÄŒp ‹pðÌ- ÈšÀNÐØ >ð"@"€9óØw€„¬p‰-`<àÂÌcì ÊˆVt–ïP†PJ5´äuê"Ú]6&‚Á(jŠ«é@–×$4h²h€ "ƒ°ÂZp$$ AÐA„…(œá:¸A¶àŠ!àD«u°( :ðÂ0 Byã.n{?z6ÿ®(sR%Ë¶é†øÃæÎ®ˆA\bO.¶¹"®ívA]Yñ:SÙ$·v³­o¡î[²åV1t­zÛÎ^š¡–vãF9‘>RóVŽ÷)½›èÚº„1—«·+çhS¢2U?@™Ê4,nâÒºâ.5kØu+”çðsû=ò-ÊÖá•vbpQ.jš{¸?Ǭ5Kr™b”ã¶Ü´yAœÔ™2­mzÓYœ®]¡>}”K]±@¬™øéë’κñ¥—åä­emÎÏNX’?ܸ_a¹rÛýòž×¼ºîŽ9¿ÉY›Ïû¬r øßeÊ[‰Ë6ßW?¢¶Ç›Ul<ècì®Á-ÑŸ=ã˜ÿœdàóîS¶q>´ˆ¿¼ÆSÞyÇ«ô›Ïl¨ëwn2wîÿ®{¼÷~]x ^ö%ï7¾Ó}n˜wÜ”ÔÒä½1¿m+þª³<~g[éÝzß¼‡nOþÄežÚòË7bÚy˜øÇŠÜçÞ¯é÷‡z dfôÚp2ÿÐO~¢ªß/íWiùãÏ~ù‡ñý±ÿð¯ú[iÿóÿýñßù `úàú öŸºßÂ_à` N Z " VàBà @ ¤)8† † 3„  ® ž z€  ¦€ ¦€Ô Ü Ò  Öú Ô a á¡"ÿaá,¡6áz@N@NÀJáZ!baZ¡~!VÀT€&X¡X¡&ˆ¡¦!Š¡¨aÂÊaÈáVÀÚaV@0Áúaìa b¢!" b!b0A<â":â#Jb8À$>"&V¢&j¢%vb%v"(~"(Ž”¢)š")’"*º@)ª¢ ”â+ÚÀÄ¢Ð"¸À¸À+Þâ.º€ Üâðâ/ê"/ÚÀ-â@ £ pÀ/.c3rÀ2F# #4r@5&#ÔÀ5Zc6Z£6z#8vãt‚6vÂt£ pÀhã9ªÀ8®ã;¾£;šÿ㸣=Ö#>Öã=R@=ò£;R€ ¸ Ø£?ª@|”? PCºB&$¸@R€E^$FfäEEbAGZ$ X$G†¤G’$˜$À@À€G¦dI ÀdJ²Ä$MÂ$L²Ø$LîdLB€N²ÀPîäPB@Q %P"%°ÁR2%TF%R*ÁTB%UV%Uf%På,,Ä/ü‚.HB |‚(8Á&/8‚1üB C åØ \  †`ˆB ,ð/ƒ#|ƒ20A((ÃÈ l‚98‚Zþ‚(C$ƒ$ƒ_òA5TCH:ìÂ.,ÿ¡À7x!èBˆBàÀBh¦1”Â2|!à@2¼ÀkzjnBr!æ¦nZ¡N@z¡þfNÀ¶aq¾áÐ!æ!îá¾a âa!Nç!2:"u"v2â"6"&Fb&:¢%b"%J¢'r"z–"'š¢(¶â)º'*§¨b-Î'+æâ,Öç+²b,ºÀ,èâ,£.6£€Ú€€ò"ã3c2þb2>(2F¨6Rã2N¨6~#††c7n(¨@ œ£:²£:Zã:º£:Ò#=v(>¦ã=®¨‹ä‹¤@.ä@ΨA"dCJd@ZdŽj¤n¤HR€G®äH~dHÿ©&iL®$Iª$NOÆdMâ¤MN©Mþä”åO¥PåQ*åQ"¥R:¥T–éVFåU¦é™ž©påB„B9(C8Á]’‚3ƒ(ˆB1˜¦\ž ]ÎåÞe üB!HB#ƒ((%TÀ/ƒ$æ2˜ƒ(|ƒ=@¦$¬¥p€1P‚( CìÂTæ<,„$DÀ7”Â:B´jòmÀ&Äê¬>jÔ­Òêmî&¯òêò¦«ŽaçJgr.§t:§\§t¢Ê!´N'("w^ëvz§¶‚ç#Z¢x†g&ž§'Žk(žb{Òç)¢k|Îg}:À}¶+”ÿ".æç/Ö".¨h¼ê+*¨¿*cƒB£3F¨4¬5V(tテã7nhÃfèˆ~(‰†èˆÖcˆš¨;¶c>šc‹Þ£=þãŠþ#ŒdB"d)ØhE"dEÎ(þ()G&éJ‚$8)GÂÀI&iKêì’ÂäIR©Lò¤•æ$•þ$LB@Mr©QziP2¥NŠ)S’©™ZeU®©š²)›r pÖríÖ~-×v­Ø†­×’­Ùž-Ú¦­Ú®-Û¶íÚ‚AØÂ-×Ê-À­ÜÚmÝ‚ÝîmÞö­ÞîíßêmÞ.ánàFÂß"îá&.ã®Þ*®â&.+@®ÞN.+€A$\næ‚ÿån.ç"îåV®âNîçv®é"næ¢nç¦nêN.ëN.€AìήìÖîì¦.íæn$Ü.ï®ìîîïήð/ô.ì.°ÂñoñÊ.ó>/ôF¯ôN/õV¯õ^/ö2o.ïör/ôv/õ‚/ø~¯÷nï*Áù¨/û2¯ú¢ïúÂoû¦oüÒoûªï*Ì/ûæïúò¯!ðoþúoïïÿÞïp#pwÂ;p7ê§¶Ô³õߣ»Ûã~¸ß· 1>x= <¾Øº×Ä0‚I¼X$%§Y%@%,™d?$ÁÜÀð-ð@*0æ['œÿ’m>¼™— €ôTð³Ð»£8¶G}.7ýàÄ 0€ Áƒ (ÈP B!*àP!Ɔ "|XP#Ç)~,Ù‘!HŽ=¢4)ñäD‹2S¶LhS%Ì$u&¼¸s$F—wþìù²fJ£CYÖ<ÊÓ'M“Jq­øTÿjÎD§ ðlX±cÃvH°ò œB€Z âŒqëP¨"΄×êØ Wn¹W°D 7EÛx±^Ç])K^œwkŨ†©* úØsÑ‘YY*®*trê´šo6ÝèN™XO¶ú2]ݤWSÆœÛ.활wž– qÖÛ±}ë¶Í›8W¦Àu’µ~=€ÙÇjÙº…+Wwð«¿×þÌÜçèÚÊÙ¯wo¾SùHéwŒ_¿ô|û®ù7Ïý9ÒÞKª¸Ðt.=ôršÎ6ïc7»ôp¸× T'ùâŠ<Ī7Akî®§’ûϸYCì'ì\,Ë-ûÖj« ÿïæ²M¼Ä¤›ŒÅ‘rdº¨"ã‘È!Q„1$oR².&¼0I(—ÄÐÁ ÿ‹Ðà WÌÏ?,IÔ°5ÿR/Ì1ô’C-ËäRD',±?ÇÔqKóÎ1ÍÝ ³¨ýÔ‹ëFßdN2;£ÜÎU[ê7H´Á‘* S‹,Ý4Ó=UÓ9õ*$pÑÌMn@1³Ì°NMïì²Ó5C|MÕà,óĪæduMEM•t×*ñ»O[ÁÌÕIü|P»«‘ÐðÝq¡J|©‡Kp%`‡¼@³Ço?j…#!;—–%%H\ Øcºn‚¢ tP„‘n¸q‡ûmrØÿ= ’wÈõP©÷Ñ`Eµ2Å4‡ Ê8:>#]¸0…ÊàVÞ¸µ98¦õ¸‡ºíbðèwEðUÄ–Z„h¨å—maD‘J¶H…ß_…e´Íé~¤0΄W­ÕO—ëXi À¡‰œÀ&a6ÆÒ…VeCñCÍJ¡7 (Èì%¹Vl³­Øí³ a|ÏP€@*#/F›†7† „”õè„,Fœà   _æ`dlŒÈà†³ï¸Ö¼€‡!È`‘N€xì–xdB°;„¹.¿,¹ÅÖ#Šv ƒ€º9qˆ¡ÝZ¢Ú°„†XX  ÿ!› :V"Áº¡š€‡±…­v  /\Ä Œ?Ê•éèáŒààŒºH_ûôóȽ~–È~ õ»ßC¼p pv ›º ÿ%áF ¬W*&½VÏ|ŠD·ö烴!bœÈBAê·‡úÑàô`ýèp„Ý@–`‹;ÄÐÀ¢°ƒ!ÐB$=H‡VÀ†…€x@€-ŒbIÀn@ ð ±…+ÃDæ! ²Àx°€(èR$# B€@@[X1f…½ªMJ«©:ô¥¤F ;À ¾bW` +@ÿ ]Ô¬¹ ä ÏzK´p4­>ds‚‰Â¯Õ¸‚” ¾Hæx²€;\‘™¼â ÷ƃ=ôàZð"Èy@‚ Â•áä܆P/Ð#Ò+̶Xî° QI®(Kdv$r± ¥3_yEŒl’±|È(ô0‡•´‚“( à%\Qn¿´&,rÌ a“ghI(O ãÁ={Æ(eHÅ ¯X¯Ï•ëœûDHîÒx3!¤¡Aþ7CuÑÓš'–°Œ6q à„B0 À„ò3Œa£B° ^$wÚ»böhèÑ#&ä¤ä¤ÁK?J¾ŽZt.nÿ”5sàEÊåZ^‘G$‰LÚƒIe¾€ª\ _LŒ¹[D´Êƒê `óA-ÀT¤;‚èV@ŠÎ”ò„´^¹*O KøZˆeå0Á~ònàAòjÉI•¯t%¯({©Èžêgç¹ë–f6´h–H©Úl£$°¢yC{üÚ¨@µ4É"GWNjX¤b»ZjÍÖ\qÊ•A~eWd­KO¬•Óªjª’1Ì@BÀ_±Ó¬¦D’FXl«TôXÝz h¾Å¤¸»]»àýîmO{Yꬨ’¶¬v‹U°ê¦7»­\Í _Év¸Õm{„K_ÿ¥ M¾ÀV²Ä[àÔ˜Ty•jQ%\£¸d̽ŽsÓ€ –kB{/{+£첉ÃvÒ¹F\b<ÙñA¾¤™È›±ÿ2,Å%jl‡}0ŸØ­û­±´Ôk]çöÇ$v1¨††_‰jÃ6­€ëøÛR馸–ålI$l Äž$Í[d¯ØÃR2òÅ L­ð2¹Ì—1j5¾kžñ?¿úâwöÊãq6;ä_ôÊU×¥E8&&9¤Ü¼¶ ‡ÑvªÝp{¯úä¿7ÆC ó¥'½à:?ôÔs¬t¤¿å1·7¾¡~_¨c»µœªï¬)òQ{ì±2¶ÒÔÝñàÖU´ÿ†;ÁM¡ƒeáZ¾¶Ó¯îq._üëUG»×±nu±+MÊaW{âËÞô£Ã»ðáös» ïw°—z¾×zã_~ôXÿ{·è…<{u*ñ¼ÙgfÈÝ¿’wkÇåò}¯øßµøÇ«Àù¥<ËõÝr®÷ø–çûègûÃø~Ž<ÕLûÁ×~ù‚gþÌÏÎâGCxî@'0®YŸ¬U˜á›Nþœ£{ò ßü•÷¶óe/kA×;¼YHD$Pûßÿù×ÿþùßÿÿP Ðpÿö  ªPÞ@Ó Í”ôšmÝ®® ¢û\ÏèèìéT$Ê  ‚À!ÿ¬àj.¡PÁlzຠÞ&o¡ vÀhÀMæ˜ÄöÖÍúxý@ñ, ¾ Hà+¤@ÂB0,,@ ±C Ò û¢¦,H «ìj*M Ì@Â0@ ¯Ð Ï %Lr ¨šnàûjÎí\û.ûHG ¿ËÂoïÒO£˜(j– Îà „€tÆl²`qݨl  g¸Dã†p÷BPßÍëƒ ­C,,b` šP-@”4Ài$@F`ò 4`,@¾‚Áâ¿â?AF@,àK1Œ{±W`ÿš1”ÑNÀ¿‚@ ’ Y‘êÒ@â@ Ž1 ¤ F ¤fÀ‚Œ l±$ÀB@í1 óQ÷,Öp.ö ÔEÞ0gî¥NîØ$)‹ú¢õãS>ÝS ,A]`­óˆS8ósÏ&’SF–3;Ïù$ò:Ñëó4óÕÐ ù³0zà¤Á<% `$AaC3Ô(Á; AÿtœÁ œ@6¡$$AC9TvÁ`Fu¡¼ÓE  24BbôG™À $E¿³\Ô2”<`²Á 6ôE…Á’ÔZ´Ø!C+t>ÃTLÇ”LË”=‰@| ®:²ý†s: @µF@ŸÓ#Ï1î0²ù¦OPú:Ò.S¢d¡;-€UšÁ;%!Q)aGUÔ `äáF3Ô DtE`uàáFõI5a(a²!RGÔ;WÔ& T)œÀ ”(!Õ;S VÕ(AVù áQeTK V³ TÕL—•Y›ÕYÿÓS,áZ¶Ëàè’ T?‘$æüôn/ ”ߘ31ÝÔÓÎ\¯:¥S] Ôýz Ñ^ãU^ç•^Ͳ ¼ÉÖØÎê4Oòݸµ½U\Ù•\ŸïNEn!UÞ4Ñ|oß¶âÜÃ"yQD€&­P ¿BªPiMÑ .v -c¿BD€t±Ô@Óà0€€.fy1 D  Ä"gw–f«ñ1àb•1 ü  g¿B â€gËr /6œ†L1 ÐQ .Ög`D@ ›Ì`j€E`jáj—2iëUm¯° Ô´ALOƒìOß4ÝÓv@ÿ÷S÷ÊUo?ðÊþòL×°spÉLbÛÑã&³±áq5ÀHR Q1dƒQl•q ‰e¥ Æ,¤`¤›e‘V ,àk²—ðfÑØ‘q™öI qÁ‚ÃÂv› ÕQ ò€W— iÖ¿ñÕ‘™Òi²ÑwÅðqm£WÚîu\ƒm½¬·@×ðŠÃn‹."³u"‹i.Ȇ#.§6Ì×4¶À nÀ)f'!Hé"VÛá—'!ôfu8Âé‰uHâ¾@å¨s]Ñu'îà]¥wmµw¯qY°‚Ç¢mû4P)Ø‚•Aß´{ë\Õ+ tr!sÿÀ ‚€÷àrè!’À#–ÀNøàærBŠF˜˜ À(§ˆº€G ­ö —憺Ày@Nøà ö`t€ãr't‚jþ7tVât¦X%Ä&h 7N¿Ø(w\6&ýfÇ¢tÍÒr¯CX1dÝ1‚ãXŽáu‚1ø\uÕx6oíNÄ®Jkö|â0F#D*kÒv Þ@‰.«6¬À â‘\ƒpÁXp'åp÷r V”§!uR(¥F bà @yÐQ+w ƒ1[¹ƒñ“Ay*K7ŸqyiVAÙ_w@vއ™˜ÿŠz V~³aƒbÿÍn6üøõ¶oñ´¼†d³_%›×RôÆ5™¿y7[¹˜ËÙœÏù+Žyš1ùý2Y{+P: ùév#ÙÛ {®61–MÓu†tà+jyÒ@$™‹œ—%Ç–¯ƒcñ¯’’^Åñ'_¤yµ‘,ê±Êø¯b Ó_×¹úøõÔNZÕ>Ož¿—žm-’*:¤cº^)÷v;9sGù^q–'7wZ•pT™q™”Û”­v¡Ò.¶xƒwCàb!!¤PgÃ"©Ó1àxb‹”éÏvªC@ª©ú€•Wu'«ÙQ£Õq ®†f—f%àyÓ1 Zªÿµú)e ÁŸ2é Ûúv99¤ë!3˜oë²0·™±ëb¥ÿ|so-`Z¦+^izm?aŽ ;lwYàZÚ@[^› (eÚ°·×8ûA7.Ÿ95²e²-›¶/;S6¬/v 4û¯˜Ö È8,ÌÀi­ƒiëU À¤ý$ ¸Ò–[蜻¶éøZìøo¯—µ÷0§îµ¥Y[eb¶£¼ó³G,dÙ•ð\–œ5wO «Ù{ŒÑZ *ZsI@rÁBì{”_`©ëÚu zj®z¾ñúŒu`|—'öã`)“ÀeGf¿ñÌ ¬ûzÂ%ÀÁÃÂxñq®Ÿrªÿ5º¦Ã;Õ¹»Á9.çµ Ø"¶;o»Ë2€²IœÆn¼s,iVr¸,ÑÑ0 ½—p¯qª_ ÇA§Ú(³e{|œ˜]2«)”qW€Œ‘|­ÚiÔ|ù+Öq ¶\•M’ÉÜ–²ÀswÊ1À <ÍÓ|‘0 Ì{<Ç£Ü@´kü Mü`ßÙoñ˜Å…3-\ÜžWë»ýœÑ«l¼Ò#Ý^GƱô>¯9•⽃mmÑ%ÔÉ‚rÕÀ%wüÉÅB H”ý`·ó Và£5  AssšÕ?!–×\ÕWàÖŸÜAwÀš`j_}(æbÕ€ÿjÙiÀ:‘>ššÀv`@Y–À¦Á€¿s’!ʱÇýÀ üº ¥fB` ˆát{ѨaÝÄ}Ì@ = !ÔG›Ò=ë–ŽÃ;9=¶]ÆóÝàÃâÑÃB Ò=Ìà&5 ®ãà½O5@ Ø»“% HÀ-âC@âñ{W—<:ü ®G@½M‘e¥°áÑÂC rcQ V ®C@‘àäé,>4à b #&m—y³Úx{Ñçeþ&I â-Þæe¾-O;»ÕA¹µ!W¾¥#íÓ©Ô^ìËÞìÁÂê_\3ëýTÕ¼>±'2ìÏžÑÿ)W ò€Œ”ÛQ¸Ó}·µ±®þ+þtO N÷æ»p ëzg…»¤ ¸!Þi4À4@¸cѯ‘ò!íþ)c¾òMq ¤àŽ[Œ áÏ:š ®—Rô¿âyCàâé>‚Ó>Ñ—™a v!‹î V² Þö!ì—1ºP¶!OÀ¯t‘¦kñ]ùv‹ÀÚ(+_ÈÝïÑ1©“žÁ›P ¸âÀ ¤:yÙÖã¼ "é% ?Á…rÁI߇q¿Ó!΋ëmà—ù÷€€$`P€Á l8ƒ /X¼ˆ1£Æ;zü2¤È‘$KšŒ)„ÿÊ•,[†Ès¥̙4kÚœ 騱<7{úü 4¨Ð¡D‹m ÉÇCƒ—&t aA RqªT‡ ›NõÚ5bX¨RVuˆ• “;$`ª ƒ.¡ÃêY°LË.„x¢\Šl >Œ8±âÅŒ;~ 9²äɸ| AËl€«Ö,`§q±Ökšôi¯ZáR ûÚõÞ¸c¿JUìV¶DºvàÕ[»«ßØhK$L9¹òåÌ›;=:s˘5S÷Ì4ªUíSÏ–6žv{VðäŸnßJôW±êƒ+–Ä”|Sdä“9VW ˆ ÅÛû?¸wT=aJEÒˆ`‚ .ÿÈ`ƒ¢€@WU¢Gov7Zp}8Zjv"jåqÇ•l])Æe4@ÝŠb—û™—¡‰ÿqg:Èc>þdÐA¸]T Üðbxãp’Ú…­ç‰ ¡'ezJ„âf+¶hY~2ò'šLžY&€@\Ð&($B‚‹`Ú©¢eÖå‰'f}z¹§Ÿꥠ…zç zºh¢ŒþÙ(ŸŠBJ餖>z©£šJŠi§›ú)¢œ†)¨£žjjª¢ªZꪮ¶ k¥ž¢º„nÂéf–øÐÔ¦%^ˆý ;^–ÄñuašÊþÅa³h®•XŠzRÇ™˜3ÿ‹ã’Â9Üq¼õ„8Ñ(À?ŒÒâfš æºê ÚnžëN+o½ìÚûî½ÕÙKï¾þö›o¾gÆï—ø¬oÀìîÂû+ðà Ï+1³x0ÅCìðÆÛ1Èkï¿7LrÈ [ÜqÉ»Üñf9(@.∑X2‡¯È C•Ù";´€Ä- %•À5ÉmÓ¶qÛåÀXËßÏ«}'bÖjf5| öç¦ëqfÔ*lrÄS‡1ÛíÞéðÚ—µ=÷Û|ÆM·Ü'ÃM±Þy—]¶ÚsV·¼|ûé7á{ßÝ÷à…~øãŠ;^]änKŽyåŒ#îøåšû‰÷ä¢ÿ¾9æ—{®n‹´6Øbìº@”^}¶%¶¶Ë~»x¸ËŽåld9‹5±E]ñÔ1ΈЕJ—¸åÐÈúåSЧ<óìeý”Z^?ý–Ý?¿4øÖK>÷å“?¾öG£¿=û뫟}õíÃO}²ïË¿ýñë_?öýo¾ôáoþóÞùèg@–YÂS?¤µàa«w²ßш8ª…h×#š“„µ½£Yðz!ÚpN¨´þ•…ê3¡îR¶…*¡ ñwÃÚÙ†ä¡ÕŒæÃ ¾°F3La‡¸À*q8$Ü¡—ˆDë±…O‚`­(Á«i1iSb´#­âiP!LÜÿÝò´äÅú„Œaa¸À'‡M”cç8Â6Þq-¬#í(Å¡ù‘!b ùG< RRä )BGFÒ”¤%),>zx \– ʆRk¼“Óø»gE2<¬¬^#1IGFÆ2“?Kš"ߨB[êдdc/e™Ç_ ó–‡Ôe-áØGcú²†¼Ìå0w ËÚ)S™N|æ1™MÖ¸jtÚ¶žÎoŠS[\ŠÖÊŒ§2-ò…]äf*‘†Åi"󑽬&…XÏfNñž•Ì&>gIÌ"¶†‰ †ŠÐŒ´Ég0dWv6‡y“ˆi<7- •j4£]ÏÿJɧSº3œ,)·‰Q’îs¥×L". 9I—ö¦’\g"išÍAr… H¨OŠÄB­¦Îx†Lb¥²Æ²RS±äÔÙXtªR­ Hý4Æu¶ÒX¾ÀhG€/‚’@³ìuЂ&†ZqMjîf[ÅAu¿Uâï¹ ›×†éxê|#wU;ÙM¶ö?hçWœ×­{“œ?L¬DûJðJô’Þ5/"­¡ º)N$±‰EŒâ§øÄ*n1‹_¼â»XÆ0ž±kŒcëøÆ;f1ÐdÀC.2‘œ ¤#´Í»/…ó»]”vµ‚ì(•"`tŽiƒÝT%”µ9ÅÕŠ–ªTþ 'i{æ—RÍŽõðD;ÜÒ8·9Έå²=) aNN™Â,ó“)ÚeôúÙ‚€T0J§Š%zr”^%y‡`2ÿGÚªæ”ZV ¬_¿Ó¤þ//™ZZ¦©4Ï•Õp@¿ûÙS»Š©fì 'Å*/˜²Lµä¹|RÇñÖ¯†4®Uêä&[ùFµ¡MJÚÜ$˱Ý3¡A_ºÎJM¶y=Ò+·Ô­^óL»=gEÇÔÛÖ~"‡í|Z3Á²Ï޶¹;Ý?jKÐ×뎲®˜Zt绢éÖ·¨ë½ìJ‹‘ÀÁ´½CÝ<3W»Öe~w·OOç p7†Ã½mTS\Ρli}hÿ¶Ô‚ÎöŸ=Û>›¼ÝÓVø¼U*ò÷wæÿuªÍcþñƒ0›à-?s“(, ƒ¶"xÅÒ/ÃÿåO&CÍSщÿÛø' Aéw¿€ÐáŠà­¤o=Dá¶`÷ÐüXAõ é°ÏƒñïaòŒ¸>+lêŠg|Õ~!(Ùà³ÑÆ[Âåþ#VhÀ‹p{•°ÿTR ЗpVñy©@>ÃÏRhu„EF•&rGG,'oçqç~èý1x[Ös†ÑDàã€á³‚ d}Ñ‚qá+ÅâPú³4ÁƒL±£ÜGùg?C…4Ù¤tóàvÇDö§Îh÷öC_ç4PVp P¢‡  <ÀgÐqtQ° z@~B 4` TA'¶p 0<@´0yQç3w5›v„fTfHsˆm9'kÚflÅFe#x-Z•iLf'sýço‚؈ †sÈX‰RÖiܶq^§j^aÁk2ÔH·æIç{U3hÿtÐù‡>MQCØÃpî·o –ERe$7€w¦RC(uÀhˆÅHl%pÄs+·«´‰9l»ˆI#ÇÇwlÍÈhÖè‡'7wHømg6Uð5bPŽçø5æøèøìøŽêòîÈŽî8÷¸ŽûH®Ãöèó혎9©ÿXø˜ù(¹ yib!üÖp”xxš6jÕˆgü§ˆfxˆxÇæŒ ÐöY´TˆSw’Wh„è‘´ýÆqPè‰]·E]QRÎsmê‘×ÃVÆPAoWÁ`ÇqªÅ@EÉ“JùIU2”Æ„”ˆˆÇxÿˆng’ÂXn[’Ž¨È‰.)Œ³%1i“ålaYs8·–W rOE^ñ÷Šõ~V„³ä`ú·$«ln§–Æhuil¦ˆƒY‡f&¨˜‹&–NxQ_IF#¹t%ÈÃh’ˆWBŸ‰–ˆÌhpx‡‘z–“çö‰a‡—:E˜˜‹òDE*™ŠI“3©‡ýƘšÔ„³9aºÙ‘»É•Êó•”Ù“¿é˜|Hœ¢™`Œˆ~·œ#‰™™“îÆ™½y^”Ån ˜”¶)—9IÛ‰CÈ‡Ê šZ —ôD»©wÅ™•ëiŒÄøg)ž“除ùŒk™u¥¨r/¹‹ ÈŸðæ·¹˜{Èÿž85—ÕY„ä¶’\GrÍÉmÇt‹»‚¹(i êž«vœ%©–š–ÊÁ9ŸŠŸ‰_‰œÆéŸ, ):œÓø¡³µ a–¡t©‹ãF”‘øw¬I—Oˆ£ÓY™¯™f²ys•d_ŠC/z¡@z‰IÊðù™ò)“ô‰’©ŸÒÖ¢ê颴‰¥’I¥„—:Š’ Z^7y£¸ø£ š™°L,™›àù—ZŽ=©¤jJž&*g§qàyº§zº|ú§~ ¨ƒ*¨…Ú§‡¨ˆJ¨Šj¨‰ê¨‹ú¨ ©“*©•ʨ—©˜J©šj©™ê©›ú© ª£*ª¥Ê©§ª¨Jªªjÿª©êª«úª­ «³*«µÊª·«¸J«ºÊ½ê«¿ê«ЫÂÊÂJ¬ÆZ¬ÉЬÆÊ¬ÅêÌú¬Ñ*­ÓJ­Õ*­.­ØŠ­ ­Ïڭߪ­áêãÊ­ãj®çŠ®éj®6®5`®îêð¯ã ¯0¯îj¯îZùº¯ñº¯ÿÊ5ð¯.°ÿj°‹°5ð ûûÚ°ð° ±Û°°°k±›±˱ë±ë²!û#k±&‹²%‹²n²À²/û².ë2K³,[³.‹³3«³9‹³. >K00³Bû³D[D‹nK‹KKM»´0µSË´U+ÿµUÛ´Y lpµ\˵Mëµ[»µXàµe»µlP¶h«¶°¶jÛ¶l˶l·q«pËJ ·w«·l[·xë·à·+¸J@¸…k¸‡‹¸‰[¸€°¸JÀ¸Ž ¹Ë¸“+¹” —븗«¹›Ë¹›û ž«¹Ÿ ᢟ˟û¹áº€p ® »¯{ áp ©[»)À )N@ »«»¹ë»Áë¾;¼NàÄ{¼Â{¼Ë›Ìë¼Ë ½ÑÛ¼PÔ›Õ‹½Ô«½Ù[½àÞëß«½ÞK¾âK¾çû½ ¾ç»¾íë¾ê[ï¿¿ñ« õK¿ù[¿r@¿ñ+ÿÀð¿<ÀpÀü¿\lÀ°ÀàÀ Á LÁ Á`Á|ÁlÁ ÂLÂ'<Â)œÂ(ÌÂ+|ÂÏ:ÂÓ:Ï:ÃÕZÃ0ØšÃÜ:`8ì³€­6ð.Ã9ŒÀ®?Œ.`M,Ä6ðÄNÜÄSÜÄWlÅ5€ZL°6ÀO\^,ưÅ_Œ°^ °e¼¯€°mŒ°ËÆËP± {ÇKǰǫpÇ,È€LÈ‚<ȃL€¬*à*ÈÀÈŽÉüÈŽüÈ@¥@E°ÉÌÉŸìÉ¡ÜÉ£ŒA{´O‹É¥ ÿGËÐʯ ¯ìʱ˳̱ܴ·ÌºLË€,0àË»ÌÄ ÌÂÌÀÅ l ÌÍŒÍ,ÍÓLÍÕ,Í}{ÍÍŒÍ}«»Û»Þœ„° ë»ä,¼Äۼ嬻éLíüél¼éü¼×;½Ó ½×¾ø\½á»ÏÛËÏáë½uàºÀ å[åK¾ß  ­¾é˾ï Ñë;¿MÑó‹¿¼¿ôË¿\ÿÛ¿üÀ,Ò ÍÜÀìÀ<Á ¼Á"œÁÂ@Â,Â6ýÁ'\¬*ÜÂ=ýÂ1üÂÔzÃ7ŒÃEMÃÜZÔA­?ÄØšÄ?ÌÄNìMŒÿÄNìU\ÅDÌ®XMÅ6ÀÅ^LÅø Æ[LÖZ¼¯j\ÆgÇlÜÆküÆk,±l|Ç›Çt¬°}üÇ+È~l±y}È…ü׉¼ÈɜɆMØ’lØ–ÌȘ¬É  Ù¡ Ê’-Ù«œÊ®¼É«\˰ÌÙ›MË·œËR«Ë¼¼ËÂÜË,ðËÁ|ÌÊÌÌÈüÌÌÜÌÀ,·ÖLÛÔ\·€«Í¹½Íšà½í°»¿­»¾íÃÛ½Í0¼Ç[¼ºË¼ ° Ë`¼Ëà|ðß‹Ýõì×}ÝðÕ¼¾ÖÍŽÇ[ ÞÜÿì¥0Ë P |€ |Àð /@ÿ8 Ÿðßpß›¾;Ñ ¿ð« ú áÝ¿p¿ÜÑ Ü¿,Ò |á ÌÀ|Ò,â">Ó Â'Žâ7mÂ+Ìâ,ÞÓ1 ãÑ ÔÑJÔFmã?ÌÃÞêB Ä= Õ>¬ÄF|ÕB®ÕNìÃT<äSlÅñŠ`ÝäöZÖ[ÜÅdlÖTnÆZœ°iÝÖl × ëÆ5pÇk×uݰyœÇ|Ü×v\È}MÈ€½æŽLØ€,؜،¬É‰}ؒ첎ÌÉMÙ‘Íɘ裌ʭÜÉ¥|ʲ ˬìÙ¼üËŸýè¥}ËÃüÙÜ̥ÍÚ«ÌÊ,Ͳ]ÛŸžÛ¡ŽÛ¸½Í¿àÿ³Ž áLÃÛÎ) Р» ºÐÎÔýÜ¢0¼¼P …@Þ ÆpLpÏ„  Ô«ì ¾°Ð„P PŽ’0¿íÛ› Å  /ð º`ŽpßÂ@à`à/@ ßËîÞ[à ½¾Ñ NÑôûàÜàÍï÷ûÀÒ ­áŽÒ"íÀ\Ò"Ó#Á!üÒ6íð7mÓ/^ÓïÂ1ÃÖZãÒZÃ3lÄ×: EÍÔ;.äO}ä9\äIÌÕ[­äW½ÕLžÅUüÅb\Öf\Æ^|å›Öp½Ö=±læ*@×b^æx¼°Ìׄ¬æmÈoÉrþÇÿõv^É\†É‚®€þç˜,ʓ٣lÙ¥,ËdßèOûÙ¢Ëk?Ú±\̱œÌ©½Ì«M÷rûÌžÎé ^Û·=êÛLê€kê”0¦Îê®ëºë ËÏŽÎËíÜè ÝÇû Æ  »ÞÊ …Ðɾì) Éàµ^½Ï>úÖŽí’P”ÐíÚʀߡ„0ÕÀƒ¯îð í>ïîñžàò^ïî;ÑÃ?~ÑÞ¿þná=À!Òÿáÿ+Á+Mý.â$þÁ ñ%,ñlñ.îâ,œñoÃ7~­5œÄJ¬Ä@.ÕPÝÔ)ÿþ+ßòX åWÍÅ_,å[<Æ8?ÿÆ‹ÖÁ¡†@ 7Àà€ÿ `ðÞ'ºÿ)Pó[1'A°~É«_'xÁºï|у_CèAû‘P&äŸ ABóÁŽÌŸùžÇ»ýIφ›ka ¥7¼õé‡Åÿs‡WÃÛ±ŽsëÃßùD—¹žo~õSàùxÂ%2мb§xÂ'z°‹Xø¯¾°rºOKR8ÁFðb!ñ…ñ[_Ù¢¦¦¯D+œY;»´Î&Ž1‰gÜ_Ìê·À£µïGCÚNŒ~öwV)žýæ‹ÆÙÒf6:èÊ^º¯Ÿåÿ<ã•fÚ¬& !ª…|><y|ŒÆbPé¥Òíüßê)߉šÃŠþµ„œGçÙ×µå³AëçIwÓ‚Æt¥a:Ë8¦Ë&6©C íDƒ¶µ 60¨­çûûÚ'­¶j%­iv“ûÐðœå\EÿOH ØgguÓ¸œ.÷·Sm÷5ÄÃnt mëpÿÆ ¸°u+ÓCüÜäîö¦õ:ê«X¯‘8©-ìéd‡ÿ4Æõ¦]ò•ÏôÖ4m÷± ïp‡šÙ‚=(ð€*ìübØyÏwtžÝè?÷¹Ð‰®ô¤½éEG:Ô£.ô©êD¿úÓ±Îô£oÝé]×zØÁ>ö¬“ëT_ºÕ¹^v¶¯]èh·zÚ¿þv±·ýëv—ºÜ½^õ¹û\î|çûßõþt¸—ýì~?:Õoø¾GñŽ_¼Ûï.yÈÇÝòxß{æë¾xÀ þò…WüäE_yÒk>ñˆ|è«^æú„Ñ,üŠGÅØÃþ¥æ›=ö\ÏDó…Ðö0ŒÞüR—{â½>„Ä·ß¾áÇžƒ,Œµñ£‡üç·9úè›õ•/û6„ÿ=Œ~ìû×ûê'úÑd~¯üŽO÷éŸømÏ{Ïúï‡aî'HþÖÛ0ü¯÷#Ü‹Ÿùßh‚!T?ß @è>Ù>Û²LÀZƒ¾øó RÀîÛ¾Œ>ü™=º¿Þû=z*Ÿ !„·„>нö™¾ØkÀû{±ÑÚ6m,b‚9€k1 ˹L¹ #²šK%8Ã-›C´H{±E‹¹ÜÒ­Ž -.£±r+Bi#0Ýr¶Y3Â+„6Yó6‘»AÄB Ä8–k´Û­»B& ðÍÃl›,eãŠ+-RÚ¸>ë7|ƒ+4ËúA6ü¸!$9+ Ë«9jKÄ×ÿêA!4D£´‚“ÂH¬­N+DI”6SÛ%FœÄýB8;œ6”›8>¸Ó*Å›³44ü­tã4:¬8ÁªÁFû·#L'QäÄZÜÃ&<Äw¹,œ¹™Ã6SÂ. ÂK”3Û3LÔ¯ŒkBfŒÃ7ESD6— )U$Ešs'™‹EcäF‚‹·-DÂu´FlÅDl¸m„ÂE”ÅlRÄd\1Çf£37 ÃUŒ¸¼Çj¼ÆÝ"ÄÜ",•ƒÆ–+ÆAD·s,Èb#F[L8?”C{ì·“ËÅôGl¤È_4C‹¸æ æàÍç^–Ùƒþeºf]e÷ybWÖEX.ÕÌ gÌ'¸!h ,H‚$¨§"‘N‚ 8/ÿ €AH‚¤Z¢@ ƒù)ƒcpç%P¯ õÑØ7hè‚h3ø0ÜKýUä†hD®æÖ½çþd=Žã#¦jÖŒê«DhÖê_æjjöêfÞågÎjšè­h¸hn6䯏=pn/'/+*Fp¯Ë!§%ð‚»>wή‚!„pºœðª’2ù€°2€ˆ÷1/ ƒÅÞEÀTЃ¸¦ŽÍ¹Œê–­cKV]O¥âktÝÎc~heV ®êRžätuh¬f„ÖÙÝžm8lkEÍ7æÝ(Îh²Ìܧª XØ@/+ €2xXKÿ •>2é®wvª é‚ªzì, àò–nHЃ( €Xp(¸FîÈæFBNÏh^Þnd±N`²Æá®VÛ vf×~W8VðK^ݪvð´†p,¾aLžæV=î·Žë£êæYÞòëÒÛ&z59 6›¤pÏN.¾ÜÞ.fb5}>p܆mÝ>d ·ñÿí°æq†dâ~ð Ÿgäåå‰ýðäÖæåŽgçÆLÂ"€`ã²^úE#€67g|M0·Îaî^@[h¨Fë/a—ðdîffïÕ5_ë6çðPfðè6>¶'Ïæ?^nAGÈ]Bÿ-SñìNÄM¾ÄËEå3ŽðáþñÜÆåHNò='b6Ïð~ÞÖ#Ÿt5âSÖt:s7÷ô·4?Wnfno&ιöíËåòÃÄØVíº$a[Çõ¯6ó­Îãwó²®ð³–sn&·sJçñ ¶p^òÛ.è±vZRõ(guAŸrÅõM`öç\oÝ)÷Û wûÍZYt%Ö:ßtŽ]ÖÞd5ÇtQWwRö¯t$v ¯íQwŸjtVÏöoÞöW.aÓwWÏ„Ÿ`/ʧñÖF÷ªmpg‡÷cÿõd·÷ew÷n§mPÏp¶\e/u³žø4÷wVô§E*ßèA~a‡ÿð1ÏËG—yGoôt7ò„&åˆÖy{¾t}rÛ¶x Ïx„÷ù|—á}Ÿwh¯÷œ×Ù“·èmnu¿ËÔ\ymW㙿y¼ ó/÷zÊó°aÇùɽxÙõu¢gvbøç%òhö;Ÿj’×s Ÿs¦?ûZ…z¸–zl'x¬WùÄx±{ ¿ÈÃWÄOtD—ûxu~·{œGöuïÜŠ•xµ7ö¤zÈû¦ïôž—íŸ×|`ÚûøW¯Í>ŸE8ÜÃr/è‚%bO÷:§v6xÕê‚! ·í3h¤/ m «à‘2È@~®"̾¦‘¸fÚpà! L3FÄ ð…ÿÌâ €(i‰mûÖ>Ÿ è:Ø*E×3¸ƒù£=Ø9µTÌH¨&ÌÁ&!àäG~`ê߀ØâÃÇŽ!i„ð€€0\€ÀBgXéR¢€Š#FÐ$EM à(±äH– K’D©r#ÈŽ"MÞŒ©3äH›=?öœéSâÐF"Mªi‡(~`PÀ† ‚¤¬ qçPš#O‚Übea¥!èìгÃK%I¼ÜIR† #2ç0bHCˆZ={ðÐsC¤,K¼ÜØ¡hËH^ ŒJ;˜Aµ¯íáC€CÒî¸ è26w,$!“+&ÿYÀ‘‡Y2÷Òà0fkµ[´ ×ËåÕ !B½£Go!”w€^´`Kb=—º8ßR)b¬3Ñ|ö `‡!>¼|Ï€Þ‹µwöª½Ñ…¤ç£/È „N¬´pSŸ±„-Iø‘:@Ô¥õ[rjyáÃ’9š‚ê! µx¡ÖP  _ ]luFgep't ]H¦áŠˆi$RÊEaK-h  M_œð¨hõÐ!tQ,_rô›<<¹CB02„-…B ÉÐ „F™¸Çø2®-y´«²ÞÐ`‰Dz÷ÂŽp›®@²D™E¡ÇC<Æ6ÀÜ5}¹@Ý]˜åWXQÉÆF¤f 9$Rl_Å ™Å eÒp;# }yœ¡‰õèŸ_eõÓ¤BšqW‹Ž^¨ñŒ¿’I.¹*€q|rÂQÚ ¬@êQM=e’ªU pUñ4Aª|¬ÔwfÅo aw%Îy•LÀ° ‚K©dK;(ìäd  ^°Ò̲›^‰^ ´˜ 8„û-¤ ÿV"Ù¶$$¡†!£Â’@‘dá$4 ¶£´ˆ(9C°ÒXdS‚\i5Ø1 8±&±Ìaéà #dBxl‚Œ×f¸¥–­P:€ „s³ÀÖ¬f8Œ•„—ݘHc+ìâXä7öX)7 ³‚ý–P‘¢Qm!Vó¶TÄÑØÑ K°ãÏb¿ÜØq48OX/b¬#òC ßΰ6ZIŒôÅ $B"î!¯ r¸D¸`L< íö0lÎ#Q!$@¥ ¡•‰èz7)ä‡}Ô’1»'AÁ Ì¡h6÷¥õ½J'̓ž¤~7½à*·¤ÿ^V˜™Ìd.ouÈ\Ÿõ€œà~HB0 ˆŒÀâ3JSNe¾© ï*Õ›•ï–9’ã1*59)õXBƒX< % ™Ü@·b<â=UÏã mJ¢Pˆ *w¨ª§3•‰“‘ð3xÇÁè¤@&k®OQT5¯‘ŽPïx è4=‚*—Øä¤ÒkTJª’æMn+ÌähO¾¥ˆ±ï ©©&ñT’ÑàÉRÏ´(E_U¦›õ¥}ÊÊJO²R‡Rªª²êg¡@JÏlÊj«Ke*2› Ö–¶O¨ AŠ H  ¼`J!T$`! òÆÚ•¦Ê ŸÒ‰H5«{"Ty_Õ¦aÿ©9(|IJ­‹º&Q5¨ÀJ3³‘Ý,K·TÄÂʯ–,iG{XJ=/µ—½%Sà ?jê´´®½h3£'¼Ë¾š‰õ¬ž*ŠÍÛv›§.l‡[ãÒJ²¦•UY¹‘¤|B®¤²ÀÜÙ’'Ü5¯Øk˜•RÕú.­¡µ'ji«'Íž×¼ M/{™Ü‚ô}ê]Ý<ÝçÝ>å–©Ñä¬Y \ÁÖ6´ù¬l »[þ6w¾É3ƒÁSû·¾EmpP+<ÏÙΗ¸È}0g Œ\³ž¶¯jý-†mËá¦J7ÅíœhGžÀUmW!>ðqÛËXÑÚwÂ://[ÖGx›òµ1€Ã[ÿÚ"WVº]rÝ;ã'ÙÀL^/•Ë›ÜÙÂRn²•«<Ü[‚½'Ž2“)«ØÇg^³oÁš_kSÃþ²g üØÅî)ÅÒ¥«ù²«W'Õ¶˜Å2™<ä*/ØÁqN4¡]Ñ1Gعf¾¯x¹LgÇ÷³]þê¡7}a‘~ºÌ2¥æP‹ÕJÝ2`¿‹iÓ”ÑWžõYëlaá*­ä«¦ƒ›<1@ÏråsªàɪúžºÐ“Þ5’#-j<Ó˜²Ð~6Z—méf—zÓ}]µF·<êm;Û­}óL™ lY+ûÛÙn‰ËíîÿšÛq›§=gT ×ÀfnEün\ÿ?z¹Â^'±GbW¼²JÈë3¡mè…ÇÛÎYžx’+Þï®JÜÛ7®4¤q¼cv“{ÐÖž8«žì‹ŸÔ%ç4ÄŽñ[£\âéfù®E~ä}3|Ü^4oLjåú[Úº^ÉÀÅWð…œïØ÷rKÞizg\Ôlþ¸¯cmuªÿüÝN_÷ÖÍíò“§\ÁTwõÈ«Žõ§Û\ÛaøÙ¯Þc³¿[ÜQçz·ëÞk‹×{èÀ¸r•Lb½g¥è¤:zTüœ>¬0Ýï­Æï«µ,õ–ÓÚÑŠF·äô´_žì¯4ÜG^hSÏô–§0­cÞôÇ{=ò”_=égžc(_¼æ!ÏúßmMñ_Oÿä½V¹ó¿Â'ýðŠG³èoïñ·k~ã7§v´Gmo¡ÓxóË/ýñ¯=ùsÜõÙw8ô™zä3žÈkïþ¼sÝ|šÇýúPV>Ì[/g²NýÞ€½¥×çû¹:¥®†W_⻞þÑÏ]Ù%_ÿÙ¼ ‡¥šÿ½×÷ÁÛ×M"ÚØ‰øÙØ¥U ’±É1`ÚY —å\ñiß²Ýú™_¯ñ›ûU›ÏÅßoÝý%ð›ð) æŸó½^Rçß»µ›î­[Ò   ` ¢ß®Ûç©]è%¡ã%`N_Ùí Ô1áž^Ž ê×¹œœÉîÝÛì­^Ï– –Jù¤Êþ!ÿÞ`NáF¡Ü™ÖÒ^çÑá¾aÄÅ¡ŠŸ‰ÑßcqŸº ò`ÈõàVž^!â"6Þâ¡ßA šmáüí\ êÜs‘!;åß;­Š nàb"ßÓa ëM ªb(®!(¶á“Ý™:bR šžñ=âʵb#âØù"+šî¢ ž`öuàÞEX&j¢šœš")Îà:`Ö¢§b2rã6Âa)Bžôá  j¡J!"Bá ÒaÈ"&¢ªãJZ6¡[â݈¹YøÁ™Fbp1cÀ`'ÊÓ º": â8bZß5ªRaCV¡òâÿ!¾Ÿ4ª¡0.¡ê­bûQá.î!Š$G aõy^Ercqy•%:Ù1JÊ?4º£D†¤AŠbò£BÎâFöb¾.údFfcNRä Zä(&bAê$9zŸ$ÊÞDš$S–ßùa[êÑ"‘cq!ã6ªä> Lnb± d«$Têà42$ï%¥YbdÛ¹åÛÁ£Û!äL$æmßOZä7–åâ\92äR¢%_fWæ]b¡“£úÉ[¾áX:#ÒɤP.d¶åÿQæ+‚¤-FåóI%ùyf]*eQj$,Ö¡af&OR$DB¤%®#[F¤Cö#¯ÑdIfÚJFŸîcE9f]Åàÿ@~¢k‚£Uf`5¦8§ez`_¦rÖ$`†ãpò"Ï ¥^þæ2¢`’$fަ"êcû gÐu>ò£§ue,FßnöÂ^4bãdç^j¦Þ$pÂç v'nÚ§uÒguƧ&£iŽæ7ö¤GÂ&gg¨ñm¥dJe­}¡Ý1æ$þzŠe<‘%¢fT(€N§_Úäi%^Þâ€fÁÌÀ‰¢hŠªèŠ²h‹ºè‹ÂhŒÊèŒÒèŠzCâè‹ÞhŽòhÂèŽúh‹® @Ó/2¡—Í£îß=¨IPè3ª'ÿIæN"J,ŒE6ý˘Æ%~ç”F!~h€¦â˜$Âÿ¨ücšªéš²i›ºé›¾© ÀœæÔ)€Â l€D€é˜%dº¤‚N¥ À“"]o^èZ6ç Â(ˆHT–,B%@BìÁ‰”Á–Ìô€ ‚|L72ç{6%•R§¢>åfÁ™Âi«ºê«Âj¬ÊªøÈéSTžî©{&䟶™,ê[†ÁÖW2cLFiãPÒ@Ð@*´ è‚$ Ë ÂB,Á³ÜÁ8ªD°f\Šé_Šf‡¦e©:Ÿç°ê˜Ä:€¸ë7€\Iš&… LÁý½@¼…ì@X@\ ÷ž¥ˆÀ¬*ìÂ.E­Šÿ®’ëe¥…µ#öYáðjT êqÎ%HìP„lÇþÀ¥šPµ^ë=K´˜l‚ê"U†kv†éÄ’jªuÄªŽ ˜Áh¼E Ì«| h€4Á¨¼UÓÊ€œA:5mÓ¦ÁQ,íÕNÁÈ@ø¬$l\­h@L¼J@`mmÓ&A EÔ’@€\­÷Œ€Ü’€ô1 -lÔjÀ×âmÙ¾Ój€ „ÃB.Ã*†+ƒ\€Äêªaªæ)¶— ÊÆ\^­'‡r™³úη@°î¿| êÒëÕG9«êbgr.ç~êÿæz)Ú•„Î’ŠÐѾ«»ª-šÖk„€Ä8øÄ€+„Ó 4ÁQH$„S|m Ã¥ ,À†À ÈÀ¾&¬Úzoùo¼¬öü­Qü-Âþí ,߆ʥ¬oø0¯ H@<.À&lä p¬NîM|TæêAU 't¾c<únîÒ¬èvl}†(>FŠWZáCªåGÎl¶§©Fð’ ðá­ 0î ˜-ÓŽÀΖ°H€ÏZÒ2mDW¬0ÓNÁ§€­Þ&¬”°`€LAßì÷1ÓöÜE[5­ÝNÓ2­À0ý®J#-ÒÎ0 ;«ðÿUå©võ—†>'*ŠkšèFæ±n®fa0èâçsgs¦&Ÿj2‰°ž ï“J!X€¼¿ r"+2–ñIeî  ±5R,ç1îÒ¬°fb@Z¨Çö©ÃŦZe(è(׬¥u²Û“™Úë"³r+»ò¬ZÁ‰îèŽZ‚žÎ™é‚péj"+{rrháˆ:°\–¦1Ë#p:g—vDJP PÁ3K34Só4[s5có5ks6só6{s7ƒó7‹s8“ó8›s9£ó9«s:³ó:ks4Ã3?o2S#†Ÿ¨B°%·nÿsgJr´€öbKÀð#ðÁx€D÷$vxÀH/$v(80Át—vtS·#|öð$lB#$6x€\wv€$Pwe§@(4€÷b—w2$¶$8(Tƒ&\Az#6l‚Owb—‚#Àö„Sx…[ø…c¸hAœ5=’i)Ïõͦ£Õ½u©õ†öîsªæèŠ;ákÎçí*_Èb‚sC÷'6!\Á&4C98/ˆ‚&4Â/\P‚ˆw#@÷}C÷¶2ƒ¼wtÿ|G·(ÈA6l”3l‚38ÿ\¹Tb;A((öl˜#ö’o‚`§À˜ß8À7›9d7w†óyŸûùŸ·¶4¬Ã–†§v¦uŠ3smñ¶Ò÷=ǸW²>K:_g¢Û¤ßÅìytóAeë¸üÁtk4øsÓw’/y“£ú§‡z•{@5`¹”8èK¸'öÀƒèBe§¹bw·;%x“oú2€®{°€2z´Kû´û9‚Ùæpg¨m[ºB–xé"úŸøm“r‚š;1‹hºs»>×`»xÀ˜/v Ä»bë¹gG÷gCö½Ç;3;¼À¾;Agvb§@bëyÀÇûg§€ÿu÷b;<Â'6¾ÇûÇöxG¼ì‚P{Ç{üÇ«öȶƒ`^Ëì¡ãö¡-º'¢ê¶WæÇ¦<2ó[:%\μ¸§Ù¬Ãà,LÂ-¨Â)¨Ïû<Ð =Ñÿ|Ð}Ï'ýÑ3½Ñ/½ÏOÒOÁ$À.L½ÓK=Õ[=ÖsýÖ½ÕOBÖ«Â-ˆýÔÓÃÐw}=°AØ_ý6}.˜=0LÜŸ‚ÜOÝÛ=Þë}ÜÏ}ÝÇ}ÕûüÞ þ$¬À0Ü}á~â‹ýâç‚â#þã7~äW=0àÂâÃÂÜ_>âg~Þoþ)t¾åc¾æ;>és¾éƒ>ê‡þç¯þè‡À€§'·Œ‡èºÃ|ÿ° kXB)\«¡ónÌwû¸îîgšü]ëµ=÷D-Ì+Àr!“!¬°AÿÁ¦Øô¯"[?¬fÿ+s¿t5AØÞÒåâ‹û³ÕÊûfË×þËŸ²ís 7Žêì·p_æ,?Á±Ü_ ëø @X€`AƒWh8XP„……"b,”8‘âA1fÔ¸‘cG%6™@“L’0 ¤Ê•-[¢4Y’eJ\ÙRçÌ”;ú|é'Lœ.eª¬9³( ;$@Ó$ƒ ä¦Ë®Hmeš¨Xš^Æ »”dÓ“B—ž5*4)Mž]y–íIVèÞ¼}õÿ<˜oá¿.ãÖAð„A $„°09Ä /Ô4Á€!„H+2hhy²šHQ£&Di,x^Aðõ‹4^iòÚB +,¸’a!4Á)ˆÇmÁŒ ’) !!Àq F”hLðSAf´0‚ò@ˆÒ%Qàz“;ÔX1ÅH #bXñ8@žšÈ9ìž*ÐÀ,¨ üë.·Úòj% Ý’k,´„új.°ˆzÐ0“–J0ª©„b .Ð*ˆ½”òð°–âšpCµ:´ ²b¬0­·jt0(ĨÒ1Ã#ÄÐÈ/D²H%5LÒÉ;ÓÎ1ȶ“RƒNx¬!ÿþbXlKÈà¯ÊÆ®$¨L‚DPC„+ÉlB40â¢æ4Î%>Ñ!6…ú æÍÓ¦3îM3;(Ђæ¼è¼é,ÈãM u N9Â/!‚.Ý¿¤ÐÒA UÔ¬ Ä )¤ð.±Z\ËEs ÖO%êH¥¢ «°RQÖ%ylÕGaDUISÙúµA³dt’E»fý±X[¥ÖZ¥R­[m-ÜöZ#(‰È‚Œ ÷#j¡ùXá4 v@Í‚d 7ŽsÓ%WŠ}ã8! ¦0h {À àdxÀ|í+ß"v_úÔe·¶‰#¶ 5Œ$ wŠŠã·ÿ0É ¡:á„Ëâõc‡&>a‡sžù?(oÔŸ.pÁe•ÅQ×™Mé³ý¶Y`Ÿ W]2E£NöF¸´}Š”’Ø©jÇ2¥@Púul»n€Â&¡†Ù»*Ù‚‡!~:€Q,‹¿ï€!T¢Ã räöén_Üñ 'ìáà )5 0 š‚„s7ª³òÏA}¢“}üÈ`iäPõÔYgÚ…ðÅ©uå5+¶úUnW£%Î@i:N éŒð‚Œ$n @€|æ_?‰ÿ=tòBúæ (Cú=Øc•¼ÐÁám8ÉÞÝ “/œœ Š€.«t\•y;hõ ¢óàABþL$b‘à–B®pH-\ê`˜µ–ЮD'JîV4·ÞQPq-°Â°„A´ V8üp ® }h ðŽø†|­lж9(Â$Èðó: ‘&G‹üí x;£'"Žb< DOà·¿npB!«d·Ce òm…Œ„îÐÁ„=Šx’}Bg„‚UäPHƒ $)¥n’“ÄH ;B’”¯V OY4ÂЊX4ÿ¬ÚUn—;!½PkZ t€Xa(¹[z@‹2ºâÀ žI,¡=–à‹80Æö€®€ÂMòÌTô€z`+,@Æ$À/S!Ì”³Á#€öHÒ¶@{¦è€Q®%¶¸vLä 4¡Ó —Цy‹¡%Id¡$v.5dl Èç<ư¼ d;W¦@.ê` _;WgÀ‘6 ªÉXÂAP'fpEeNÓ…‘«a%»<T¡V”ÃÚ]—T "u©¢4¤)]Ù«Ýp+2ܡѾÅ ÔDWäI\@]¥Í'Ý* ÿYÃ:,½àå_€\RI€ìÑ¥…¦Då]Gi×®H¢®idå©$àL–ôTÁbÐO Â<áiˆÞD‚P‰ ·SbXOi „MˆAÓåH@!‘¬§:ƒ8i€sCuík44S)íhµåÚmÍ–Ûié¶V¼U(L¢ZXúj–­«%+—ATUX4j]Ô–ݺàD{ΕVP@ôXÊ}(•zAñ QRCz£†<@F21°ÀÐó‚ÄAN{Õ Ñ„À½äÑÏm^°&ħKF° gz3פa?í–J»`÷ÎÇqpïÇ`›a sD¶u½®ï@ÿ]ÁØRÄ«ü0…Ü]Ùk:<%VJ$ïö»ªäÐ\XI4t¹;Æqs'ã°Hwȳ5rJz Ê5dÃMvò“ ÒaÜ2ÎÇÎR¡ Oˆe+WY'*¶qOgÕO9Èt53Ëüã{8• ’^ûa¦e9ÌWVÉCƒ†ùB™Ï}ª”Ռ↚Nqq´¡—P/³‡b¾ëŒËLK»–…¹¯³tx{—hU¹·‰ï˜}»PMÃ$\ÒÙìi d†=s’ɤ(ÒjŽdR„iX™Fl]X/ä‘êH¯;¢?+¨TCž³³\ Þ¦ÖÓLýt‹¼<\êNÈÜšJ¨qÿmo›ÛÝöö·Ánq›Üå6÷¹ÑnukQª’mNó÷Fd3xFï=491ˆçäÝDý»°tò·|3eyG$a˜éØÁ ÒoŸÙû\÷¢™A,Îpƒ[àOo.ž0÷*ü7ë·½/~o{;?fˆƒÃÞ›sqF<G”¼åûoñÄ\ÏüvïÇï) 5>@ÚˆÑ\ÜÙÌ/$rÓŸ+“E_­ÑɶqÒU"€'d`ÕD÷úçºÔ×0Q–1õ ¦`?H€¿aÿAø#ƒÍv¶Lõù¬a=•‡Ìj’N#”$ (ÇZàRHCA.Õ<é@ãIHÃ'¤Ô)Ôÿþ`$0Ã-¥`cJ!*X…Ÿ)è—æø™†~M«ôx,›j}ãC¯¤¡ô ‘Á0°ýVG¿ ;Ÿ‹ Ãe7ûÑ&1ÒOŒüV"hDµ“¶,Ãlõk—dë]ÿúõv¾¿` ~øÄ˜,ˇK^ÚûØùN¦Ù¼€wgòh#\Ÿ·†Qæ‰Ïu6:™âÄ+þï@ÂôhªþBMZO &Ãò¯=¯óFSòC¿êãõŽü@¾¥5Fñ¯ P:hO#"PtÏ8Pω.ø¨ ꖮȼë© Û¬”Lbê¨*‡^Ð–Ž ªû|0û¢DH`Q-a†ÿfjJ¾¦ "Œ`è0€:– ªcχ06>árÒ` BIÀÌ  kÊ Œ`Ï… 3É J H  “"…ö<ðì8ç1ÐN0  I >F ‚ Ý0âdó"9…˜#LÎE À=üí é¿Ð qÕØ QØ‘"%1§Ï‚ÏÑ®.ùŒoG ¡Dmq¢­W¦MéHqúxë~°AEûlT&‡"¤ eZK#^½ Äî΃Ì@¬ÊT¥g¹l‹·h‹Ìœ‚ùr¥†¨®ªš¯¥sñAÁqÉtFqå¬ÐV‘]Ÿ)Zÿ1–¸‚­íC¼±ñq"Â&C`ã^2Â]Pp£¢à&â=h<^à<:¢’@Â!i£'B=^ @ò1¶FBÍ*Íudq¥¹ÌÎæÂ[,¹‘¡îñ"U2ı°ÌàY ²†Ð ¤`½PðJ‹Úг0@†&[‹L& Íd(ã¤'P^ò²bÀtN Æ Y EÃdà$#ëd¼pÑ£'?ïQÅr&[/. † øÐ]²’P.gRd  ¦JVò#¤ì#£ëºË™Î©œ¯Š"Ál/ý’VR².ñ±%Ýo\Nà¢8Æ!üOý´Lòà£_DËJfÿƒ?Ìä³®d<°±öÍ3È% N#DjÕ¶ƒ!3óÒO:*3 bS¦â:*ecÓ jÓÔÅ=lóe^ >†.“ÊÇJŒÄ EÙ¼«ÙH²êL2»‘3³ nC<%76‹:.ç&W ”L3ß0NäN6‡<ÑÏLÜÄSþ¼óM¦ ;I@ï k³¢ÒSÚ¢D >YK5À; ÆêP¨CÓe6G7ë°hsAã䑃>=åñHËSðdŒ3;29CÎHTøàì/KÑ#@0_1úªÓwD¿Q5Ì %ä²sTè0À"et# ÔôR¹ÿ¥Ú”íÙj¬#§S_Tк%F´i4J©ïrH¡Æêˆ/Iu0/;íK+„E¡0¹Ô0±³Jm1ìzC3V-£²D#êÍ=žÂ†î ê AT®"d@"Ûeâ8BÁ<ÃÐô@‚´øF:ù² Ó™3Ŭ‘j¤ŠÑ˜´OòIÏtP}0ìÌšà €ªà%!>%üÀA,GÀSamÊ0RvÍ ÎÐ;}­:ÄÒ Ž#Ï÷ ‹= ô^;¢PS$Yp]ŸñªÈ ÑVbIq^AlíUfù,_«c*kjíÀDLF“²Ê„iW@ï8ÓÀ¶<гædX—óÂD!4À<þøÖÅÎ@´¢µ@6l/ņ´oB/Be×Ö5·c ò€hŸ‚t.HÔŒ´L­óÐÖq^4^WPÒtV%†VoÌh#Žãö,ß8gr b£Î… ÿ2aô¬rùñ ’r†âø1â*7rïÅ_!·t&u5WϺn30 äKr t9GvCWs’â W¾ø1Owf3Ò¨B’ËÐ1h½TE#F|6»ô:“1xŸÌqÐ¥÷"ϱIó*qÓõo[ðf]ÄpéqQaôR¯wz£æj·ë4n"ÔWTüã¢7#v÷#â7#Ú÷|Ihx{ |£sÙ:ÒfßUËö¢y×IŸfqõ×µÂ. â`½>µcÖ ò•3Ce‚7Âÿ:Âs6ƒ˜Pù×y+õK•w|7gD| ÷„D?8¨öQÏ6—ko2n ÷0à "¦`5‚YŸÿc3XOâ!~âç½âùâ/Þâ þá5~ßù\{Û,atå+À|Eüy× Ä··ÁóêÙÙÜÍ 6'äܨŽ}Ô¶®Wvå Š½ÛGáñ]à‹áþà“žèÛÝè›éŸ^飞éËÝé«ê¯^곞ê5Ûê»ë¿^ëÞëûÚëËìÏ^ìÓžì¥í;íÕ}éã~êç¾êä   HâJ¾$~¬³/­Ä·¬ÈÕ[pÕ±Zd>Å7»àÜ$\0QT·ÿNR„ªàP„~ëÛœÜݼì“\¶GÞù=ôižô¡ýâOŸñÅ]õ%¾õ£ýõóúÞ'^ö»¾ô?õÏ÷EÚw?öAßõußöMøg¿øKŸõ‘?÷ßø™æ‰ÿù—¿÷›ÿ÷g¾úÓÝ÷S¿öµ_ܹŸö??@Ú€¾ýÞä3(¿¹ÔåePÌ™%»Í\¹?ùŸÚ­]QËš.ž L H€&|ù1ª@ 8tqâÈ8±¢DŠ5büXQ£ÇŽ#Q’ܨñbÆ“ [^\™Ò¥Éš.?ÎÌX³¤D˜9Uòlé3hLiÅxS&ФCI2ý‰ÿóiH‰=§Ý UäÒ—UÃ*• ֩ب1›"=땬Z” °ÀDA,Í9h° ‚r<€oßÂw"&lXqc‹7Ð×ï`È|W@¹òßËŸ=' ´éÓ¨SŸÓq£ÎC ‚б€rfÛw?Öû2€¿O,µhA†L‹<ÆÉäÙƒ ¹óçУKŸN½ºõëØ³kßν»÷ïàËO¾¼ùóÓÇ'žÜx†; $&8z1_ûñc¾¬¿æüÿáfPg|…æXbþæo©æàƒ°†V°É¦]ZV~rv™‡% €"’8b‰(ž¨¢‰,¦ØâŠ.ÆÿãŒ/Ö(£4Þ¨cŽ<âèãŽ?öäBä‘D"id’L.餒P6匣)¸Y†VŠZ•j¨å—– ƒ^ùᦹZk!Q³‰É_€f‚¹cxšànvçm~êçážgÊç yJ¨ž‰Ê¹¨¢öù¨£‘"*£—Bš)¥›JZi‡r¦¦£Šª§ZZ*ª«ªzª«‚‚«¡…NÊê©þÍ©ë†|æÊ뮚jgdªi¬„m9T!œ’Ù별ÕY —[bº*ƒªv¨­µ§b»-©ßFê­µáު߸à’K«–é¶kê¹µŠZ.¬|¢+¯º¶ÚËê¼²Öÿï¾øŠûo¶Òz9mµvfypÂ]*|'ªVÞ'€±j"‹ÕkoÎV[ÁwÜ%±cÜoµ¤†Êá¤ðr{r£+³û.Ê0“ü2Ë1»lnÍ¥¦\rË9ç;°É8wû3Ï@ ¬rÐDG<ó¦ W¦´†»-(µÓ >mµ³ÑJqš³ôѲqn<ìdTO-qÖK_;´¿63èöÚ2?ý¶ÍôÆ=÷Áx§ õÞrÇ]wÛvû=2à„ç}sà…óý·áwó­¯Ú‰÷}4âgÆ1ˆÂf.çåXb¾ùÂŽm a×m‚}aÓ ×Göê½ýÚiã‡ÓÍoÀ¯‹LûâŠÏîní·ënôîïÌ6ð¾óNüíB÷ÿ޼Î÷ﳺc#è´¥So}‚×O²è’Þ’éO—©yŸÑç 1ìÁÿ®7ÑI?^4ÓÏ Oóü²¯Û3ý†ãÎ~üë#=|ÿøKžüàÀ§éÏ‚[×ù€™@9ND›å"h9î9ˆt³ÐÆÆ÷1Öq*|К`ó è>æIŽqp‹ìJø¿:.…(Tá`@ƒ,Ðà YøB ohCòð‡> b‡D" ±ˆH<¢ÈÄ$6q‰NŒ"§øÄ*J±Š›³Ë]´ˆ»¤â/ñ‰]þ:GF„…éRh<£¶FÄXP5ÞûZÆ.$6б1d® Öç ÆÇýQNo,^úŒ7B€ pŒÿÊ;dîY,$B2ˆ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  %(S •Ò|˜ÉË^ ¹¨•í•®¬œ,Ä@\…ð©ÁàDÀ‡:;:¬i±¤¥ÉÇÁ?R}b|ßýê‡@23€~|¦3GE€Dh—ØÌ¦6·ÉÍnz³9ˆ)å¥wUºrš‹ä\¡8Ö°vRËŒãf•5GJÐsÄì£í9L=3™&Ä ÊBc®†/”áäWMxó¡¨D'𦠯 \9õrΜÁòƒÙÛgH[L¾]í2òdS™5Î|þR¤z@bhð<à¦7Í‚Adz%™¶­#ÿo²À€»|jÈÂÀÈ‚Js}œ 5ºHç5õ_Ž$E·ÊÕ®zÕX9(%gĺHs¶ŽiõØ;SÏ—ªî­æ;HJ'¾:ꓜ$¦PÊ¿|á(àk¿ð„ÀnÀ>à+ð›'¡ ¯ÈÂ#„Š<*2ö«* ÍVíP5¯ùÕÚÚö¶mÎÆŸ”e–£œ[M›W“Ví¸fÓ«rq5W‘¬4N½ä£[9õ€7€ÅéMŸÁféxÅQ‹ ÙðBÃ. ¨é`ƒ½>`D‚U/†ÒÚ>„¢–÷EæAÿŸ*À„ưd Å­€L`ŠY0­ h Ƭÿ¤ÖúYFuZ¸˜mýKs±ò½zNØŸøÄ§^ц0R# pG_ðW6CìÅ‚ñ(À(ñ\ÀÝ0îõ–]¬M7ùNwümjó›L&Cu^ý° !“Õ[ùÊVë€ÈÚO¼÷Ž©ÝVùª‡½2kïÌûD.i¶©KzjPÌv&^û„€ ¼‰‡íËæRç:ù/ X}€"æM{¥Ë OiãFâ &P@ÙHi(+¿L`3—‰ÈMm¶Xµ¨¿ª[ÊðÖ–Ç—§ëO~‚K„뤉UÿéÇÈyÃ^s3³æ;f 302²¬ã†‡¹lŠÐô,QGå^™QÕ´~ jßýN‹GHCs°ín#€Ûßö6¸Ç-îr‡ûÜäF·¹ÓÍîu»[Ýðnw¼ß-ïzÓûÞðVÀE€€'PñÑp¬ÀŸð¬:ÖÃtu1<\4ϙ̧®KWÏèª5®Ä•ܬmý?ñÙì¤iùiÚihSÕÉS~ö?;&A߀hzw¡u}œvf—Çü137LÍa.Lš·zç8§tÎïô* Ý>BMºÒ—žô{±µá%õ¸Kݙᵂnâ¶Âá¼Ç#RáQÞú…»â2búä$W-!4'ÿ+sá]MÂ|U9$×Ý×®³{Ïñ~÷ŒË™oç§ÞÃþrË©ì÷„;…áx5—Tä b³Jw9Ç–ŠXÖ#<ÊØùÎñ]ㇸ]Ûä´»]夷öU{ÍõØmó­G¸G®ÆØÃuöq‡=çA?zÅ»4ó¢8ð?¬ø²¯ÓóX—£Öíêu¿SðóqN󿂯ùÄûùQŽöBK¾ví[µôÓ'þßWE÷å¶lð­=}…~ÆK¿ÙÿµÉÂe—ŸÙ³´}\k=Lü¹§C6O§~Q÷|ÎwO×g}»÷zû‡zÙ‡vÕÛ÷v¨ùÇ6(]âG;b‡aùÇèζ€ÿôWu&˜ÇzëWK…‘|º'!HvÃÆ{Å%uŸçL u5XËez>(#„þ¥vm4z3h8g\ÇwWhE{`æ„ìC‚O˜{4˜PçxÅ•„Zˆ…&#…Vò”÷fRx|7‚Pø~†så§l„xz-ä}«÷}µ†F8v¿gv·_:X}}HPºW€UØÁµ„yhˆÆ‡‡‰}{.è&Ë7ƒƒSˆ;ˆ€^Hu*øx?ø†è† øZœ¦çlì|™bÅW.„X‰ð‚ò'‚]x†˜S¡‡Šff‹hh†k¦Mm‰»fqšH€—¸x›XŒÄ¨„!G‰ÆwvÿKö‰sà§PYpk×˜Ø¸ÚØÜøÞ¸áŽä(ŽåxŽãŽéˆŽì¸ŽæèŽîØŽòèŽG s©X|ø˜€]¦ªÈ«ˆ0>ÌXa 37opé=P tŒ~øj€1¢WQ0_‚¸|‚ t =ž(„ÓŠ!Ù<ÕÄ `#(€# ’(Â’'â’0“"‚)’’(ù#2“3B“*“&â“3Y“B9":é"@)Cù“I”=9”´ ƒ¶u‡yü×€Si•TIk‘†/Hl˜Œ¨’LU:Ðà`=°eÐ –léjÉ`P fIj¹ÿa–KÐña—e°ñ‘–ké©S˜á—€9zÉ—¿¡–Ð}A=–@K S ¶w°`w ™pqùtIY—e —t¹h‹°`ù—±˜µá—Båšr8’¸y›rX’Á€‘,s'×ZøˆrÐÃ}£¸2Ï“dž† ðÖE06£†<ˆæ7Ò9YȮpƒ· y<o P [PV° ™o”ñžseiyo@´À öy<€žµA yŸ<0([p7 pæÉZ±@wá-PŸÐ‘'ð£0 P{ÿ–`  7ZŸ‘¢ñÑtp w` p4ÀBðŸ™z°Ÿ:úŸÐŸ¹ 鉉À ½™‚¸§‘·g…aâo7žšó¤˜Ce€ix_z‚Ü7 xo# pDÖu6(‰¾4Œ¤(¦qš0\ ŒÐ%€oj‰ –Fï9•0µÉ–îÙ  ™4àŒ€ŸBµK€¢ðI B*>С”Eo)T' S…‘tª­*IP2Ú> qŸ@¥zª7zT&Z)ª¨÷Q«°1zlY£7š£; ™=Z¢Q°AêBuÿ4À…º‰¤"ù¬†R’’6|î¥øJ4pŸº쉘Bõ‚Úsš˜š–h™>àš–©–qY°—tA›Ð„)I+ó÷hª¦C“˜\Êȉ»… ’Z7†h ±Ð%­ ñ—°Ç ãI± ˜40±4°ûPð–õ¹±ë±{¬°±[À–€A»4@Û`!»—Ð /[ã¹DêõY±DJ]À±]š³‹1´[Ð¥« [0 } >‹³-ë± +µ)+³­W_I­Ð:3¼é›MXˆÍvq;Ó=±WjI€)+¶P ña w@ÿ'ð @;ªà¶ÛZ4`  B°CÀK±èÄjÿ¸Pâûº¦®ø´ˆ•–›ƒE¨:uj:–ç¦Sèt¾¤•ö˜ Ñ."EéÐM”Ý’ }Эѽ’="GIÑ+BÒ%bÒ"ÍÑ$ÒÐ+ÑJ©“½Ð$ò©ÔWÓÖ*ÊõÈç|¦¬uÂhum|Ç9=~êû¸´Üφœq÷J¸¼ÓöŒÉ‘£È¤H`:3UœñY½%W=)qUm@ â3aÍÜ ÖWÖ[Ö¦¸áÖäRÖˆóÆÿ@Ô@=ϲ<¶-èιVÇ7ÌÔ|˨LÊGÍ…OLÏflÓJlû¬ÉRÀ[‹Ç„]KN™ðÔ% ‰N¼Õ-,5rÀƹÃ_]ˆNlئ=°§Ó€|q=ÍRƒ½¾ªÜ¸Œ¨Ç²°„ìy€Ô×=ÉŽ Éǹˤwì<Æ€”2‹—.¼k‚¸=}¶l4Ë [Ž­Øé[Ý‚}aí6ò¼‹À½Ý±ÜÝieÉ›]ÔÔ}ÝùÌΡ,°cØBªw¤,Ú«}Ë}U˜ØÍÛ¤üÞ&DÉTÈÊß>ʘ‘­}§ý:§9,Ô€Œ×à=Þúýà>ÔÖ9áÞÜÜ-UˇƒÃLjÙÿhÜßYËEÍÛç}•íÜ#þÚæ¬Ó,ŽÞlÙmǪÛðëÆ³Ý›WâYiâNí¿u ǺÍŽ­H ‡”ß#ž­—|‡²øÏ~ÎŒ}äK.à8øâ®×WåÆ(W|MqbX¹5mãM½Ø²ýÈ׉峬àJÚæ½âEÞÞX?‡·Ë~<ÙeìÝ‘r@^Šuîæ-”ÎtíÛ?~׆ã¼vãV^ácÛ*¾r iׂžÇ«|۔θðÕSÙ%EÜWÚO^•þÍàÈmܶM„ ž×ŽèkŽÚ¬¾ŒÉUàxàq,ê¨Î‰¾åº«¯YÈæ»ÞêªnÝø]\{ÎHÒmr®|ÄÒþÊYþá7KˆzhÔ‘îàm~ˆŠ؉mèb.áß è¿^í ^ë×íäîÿMålä‹ ç(®ìÌ}Ü…Í穈çƒÀ •ä£^ê§×ÛYÞÁR°Þ¹¶NÞÛäÈXæ-ìðûÜ÷¾ÛoÈ-Þé›è“év¾lΊ¤ó]\øzŠdžÊÞ-ÄßøìçÝòçÅ<ÝåYÏÏèë}òŠžð!Ί̘ò$n}ªü´a­¾s§N 7x沊U©Ö¾·²ñ»vg÷Ö þrãß©¡k®Ì><ÉÑ¿¡³ -Ý1òïä×£§ øþnÉŽþw|ãE`y§À¢—`ï hžg6¡z·UHÛ`çuÖ †Bè¡„RØ!ˆhá„'BÈ`i!¦H¢ˆ(Žc‹2žhb8ƨ#;¾èâŒ>æÈã$N¥ [Þ-—žd|]FÖdåqžaø¤’íÉ·$hÉYÕà“ß… ft¹ÉÈ\ibî…z¦‡\“žÉäœQNigšuW¥{êÉR⨜y:( wš(¢‚>G<餒VJ饖fÚ€µÐÒÓ§ †*ꨤ–jꩨ¦ªêª¬¶êê«°Æ*무Öjë­¸æúêœÂòÀ¯À+ì°ÄþªD§ â†ÚuËþb÷^³Ð>+-³Ó:KíµÖf-¶Ûj[m·à~+.·ãzKî¹æ¦.ºëª[n»ð¾+/»óÆkkÅæ«/°Ç¶F!†_i…`½ñÒk°»Œð 7Lðà C̰ÄGlñÄwKa¯ìë1±ý*($—=!@G^^S¶É=—e›ÊrùrŸ4ßóÍ5—isÎÈͼóÏImªÄÐDmôÑH'­ôÒL7íôÓPG-õÔKŸlµÉ& §–{¯¯‡m,×"#ÙµTF1'@T X´K1Œ$Ë<¹- gŠQ ¬Ýv,Z`”SQ©$x,0­&˜zI›rÏ2Góä8ÿ¬óåþÇ‘Mh.Xœ’2ƤFL)JWzÒ–ªÔ¥,}©LcJS˜Út¦7EÓ C3€NîâƒÃi$cPÓÝò\0{5?ã'ÓH³9NÊOÿã-Gyu©P Áä>zu‹+$è‚6Ê&kíR¢ä¥ZÏÆÖdµF¬àZÝJW¸R+ˆGä "纬¢–î¨ÃÔêtt&¿펫Å*~ºÈ¦^vKÖ!lžîjÁhfõ0„Ì™ðtêÑbf¶‡bYjDûQå0”}ÎtiݿӶö¨u­iQ[Õ;‘µ0Q:…_I‡Pfšuªqƒ¥`ÐÑ@<)Ÿþ{ ±2WŒú‰îYid"‘ Ùyì#ˆÃ¬¶ñ°CuÓb-÷³aB8V ˆ8Ô¥²þðªŽjoïê]¬¢w¶½îu©¹ÛÑÕ\ÈüeG‰9Vî>·=Çïw{Ç—ÊdAƬïTë¤ËÐ*˜Â²Lp‘zYXCtq"Œ…|aè:SKTiðˆák[èBØÅ-^(¶ÌóË(ª°:ý`Ù¬GŽ9ƒë›IòP_4àpÆÅŠÛÔX XªQÃé©F†+ä”NokSÊ’_I·ɇS/¾ 8SŒ9ÁX àV6a;m‡€Š°ƒI³Tàs0˄Ϛrùcf¦vÏVqŠKþÕäÕ,©¿uk^<*CÅú˜¾úÉqèzÝß Ø©œÝ\SFò$Ó?ìm\?ñ*ä~z½Ž /Ÿ·ußÝj2¿»h|û$ËŽ8€M}5bš™ê" ψ¶/FyÃ\V#O¤¦Òûú²¢˜Xw…B])ÿËêÛ8šSQ‰S€fæ §Ã FO°m4ÛrJÜN‘”R$eÝk3‰¸¥¼€X7*ßn÷ÚÚ¶}+)ÿ&®[ Õ(Ÿ·HÖ”n³Û¸W…Ã>ð\'FÀÊ4Îïq»ÂpIÞ›IüÝš{óÛà©3.,ˆÛ zïMàŒ-¡sk}â÷5”µ)²¹`+]ÂþúšK­µ¯5Bàµê_¤Ü1«õèijHg`M5óbÍl?æ¼N¦uÍ_8ã:©†¹¶›­[ÖVW‘±o²›Õ^µK•ë¾c…‰×fê€8·<Ü„Ûô›ïEÒ £ô³‡xiWÓÀ®£úÓ»Z¦ÚÅìÛóR!íY#Ö:Uºl¡Ë«èý$u«ù‘¹Ù‹þb% {=zÝ0Zß4&Œ¶’_g§Tø†🣶í3smEξš”¥áG Í"i±ªEâ!%ĸ.z:};+±i^^ü¾Õ‡æe¨w.ïøÆ“ý‡”§­ý0,üÒ|Œô<]ÌÒû¥g÷žSºëËÒ÷þ³ýµp¿™ùm$Vú‚~¹ÒD^™ã]7ÔaÒ•BŒEKvè2úÃEôXÁQuCDÕBUlžmf•aùu"Xé#xÑ·µ‡K&T(6s˜\¥Q]Í$€de¦aN7T’iÝ¥ $õ|ãwQèAQ·KBjÂVZ\·A\ÇbÕæ-J(k{‘‚‰F$(6º§‚¼gcP$.-$ƒ˜3EB4#;7xµ@•(9Ä—Qˆ-jþRåB˜P¸`¹¦ˆ¨gh®óZ°¥yHòYeXH˜g¦Å^I¸lz8ä—ƒµQunHWðHvè…W!‚ݲ…ac‚HujÌØŒÎøŒÐÒ8ÔXÖ¨?ÜuÚ¸ÜØÞÈŒÙh¿gYÒ–t”x‚aH´ŽãÇŽ¸öŽÆáŽñØŽôòxõ8ö˜ø¸ÅT|“ó<3C1eCˆUFMWÁ1È‘9‘i ‰ Y ™ Ù‘Ú’Ü@ëP’&y’(™’çpð0}pÿ“29“4Y“2á Áq>ù“@é“™”DYDy”™ þ=P’24Hðð‘Ëð>ÀWJÀÀ”NPO •8P H–^àNW° àph fЖmá@å ’x™—g@i|À.I/Iõ`óP˜ù`“Ši Á“Žé˜ ‘“ ‘“£ÀiLÁ©`1¡7U18¶p™º Ni„q” ”cÕ8‡U‡ƒeE-ŠÏ¸>ëSL°™Š¬‰R9•W°©S­H›Â—J$¥€ž¦\¦‡VuèRØœ8µœ3勹™RÊ…i_Âvø3|g§!Å霪I<‚†%Ëä?Eø 4ƒSpÚõ™­Ð™ñÖ ÝV ‡qðnþ×7ZÓ zCާTó98ýÄž‡ A•uŠRCÁ]ÌgxL%ºjØ9XÖI.{x;bX€j"ý¨}„ (˜!D,xŠ¢Usœxl|è°÷p-& °)0ú¢2£4:£6Z£8z£:š£<º£>Ú£@ú£B¤D:¤FZ¤Hz¤Jš¤Lº¤NÚ¤Pú¤R¥T:¥VZ¥ã…š¡èÊêê纮íÊ®é ¯î¯ïZ¯ôz¯óš¯òº¯öª¯ýʯ¾hÉê1ºg€j¡q%#PŸw“7ÜFqx³6yIQážYûÆoY&Gþ‰7ys2~Ö\ z%{²º˜²©¸²&«²-˲XqMø4³4[³66ЬÐ:´é[»/ò7Œâ—j¨þš²8ˆ4$j¤ªTÅ#œÇ„„F¸­R»0ß¡57{µX›µ3»)×±³à³D%‰áš«Uµ$‡–H˜X|¹yÓeœ2y8‹³Èª ·ÚŠ0›èƺ·|Û·Ôj«E`@ñ³ùtŽ{ª~ćB‰Æ(R¸PH††tEå‘W<㊠¶¦ƒ™©7§s ø}qtU(ºØHºjÅ(<t€vº“E^ª‹ªùãvŠE¸ù´¾µ¶Ìêz|&Hd÷Pt6œæZºoX@Q«ˆÂ¹hjj%q8ñ¼Ð½Ò;½Ô[½Ö{½Ø›½Òë …°&c5à›5ÿ‰Í´[,ÊXмÁ7*pVþ–7«CqM&`oSo—8[¡M‚‹²èC`·våתÊ2«WhŠÛ2W%C Hœ;äDI'I 5 À”$ßôà–N¬Á>)°5yó+ß6; 8—tÂÂ#ìÁÛ¤µ2x_kü䙼 ¥»-u¾ c¸ˆ·êGƒãå¹™{x‡¶ÊÇ£šu© HZLÈH+µíC‚3ÃZ¼ÅZÜ/b7n­pNžy áÃäd¸V"yV©%&´~¨ Ü„å+»sYPlikc:·š?Ò?HÝÓ@þÒí—¨Z(¶Ê ¹)º ‡ ÍÊU!ÁÛ¶:ðåêHm‰J óh^¹¬éÌÖÌr·Ö0®[7þî¨FëV\Í»[ã~:ßwåÂË€ÍÅTž‡¿.¡n<ÜÃைîkwõ¯!óÎáò?ÄYaFpëöa¿ph?öj/ölOökïömÏfoöo¿öt/öi7t¿÷n÷gO÷örŸöqŸö~_÷l÷s÷pøqÿønŸ÷ƒ?öŠ/ø”ø€¿øˆŸù†ÏøvŸ÷€¿:|Ož/öŽ_ù¢ø¦_ö¥_ú“Oø­?ù²úœŸø°ÿùjÏùŽO š5-\í'Ÿ~‹>µw[üÜjüÄ/1‘uƒÇßüÉÿüÝzÝ-tÆ$JÄ1ËYSÙÿœÚßýÜÿýÛþÞ/þà?þæþ_þèOþêþëŸþìÿþîÿí¿ýÄ@• iÿøÿk9léý$I§¥Yï}/¿*ó4DSue[´x5˜ša›ÆoØmŸÿ„< PxD&•KfÓé<£…©ôy¬RµÓh–kíR EcQV,È Ám>“Հ،V§tª‚8x˜pˆbp xxˆš`¬h$d,8 t°y Â”|  <88$(ð¬p`)yÅpœÅ8!Áý¹½åÐÅõu&æ˜9&:Þ!RÎqîÑ ò‰>2ºÂÎÖÖÎBª ÃÒÿ"ß:[ÈSChÛHPS0£ MoˆWþG¨sÀONƒBBTà­G“ Òr ÒAA!$`è€!œR­ä V‰‘³vÑ ‘+Ö¯µb­8YLæLÉTÔp–³4žÒ¦]SF ɵmE*ùæ-\¸0M•~·E*>2¬ZuÓÀÝ€ ®¶±j¯ƒ1 ̪3›à€ ø…"îÜ$àè>*Wo70Kå–›:ÕéàÀƒ»„¢JñbÆ0 82äP“';¾üXófÎ= âÑ„:ÚôjÕ­”v}5ëÙ´U¯Æ-·Ûµc¯æý[uðÞÄï°NÎò4pØÉ`Žç pÎÜLtçëØ=oþþ»¾ñäC«CK¬Ä-”Ã=úNl±;ÃÓ®AG„‘@þH¤ƒ 7êi`€zô¯ŒÀòj€#õ ``zÚÈâq ¬+ØêÄåëç«x†”’I'±S€ÌòÖÓ£BìÄÿºCC7í\“>8 |®OaôSÁþê[ñD¿3t>6U¼“ÐÍ.ÐHùܳÈñloCvœ¾M34Q6ñdÔEJ?õRQï 3Eûþ¼s4FQÉ ãÜárHB#¼õ<+ç0@7ÔÈêH%ð+=†Î›íÕ¬«ä±ÒÉ-õ$²Ä ?u³SM[Ü0>Lßøó½YS¤ñOG/ÔÆ<»åôNXA|Ñ8uo^x÷ wÑ|KÐÕwÿmóËyK5´ÒLßT±aƒûã–PQ-å¹:÷U1UrkœQÞRe­Ó[uÅ£\“Ý/ÝuœÑ[íâU_RÑ¥ùTm 6ñF>wÝçS×5•[ m~5GŠ]E0è„3yÍ€]µÕƒm Ô{Ëõ0h«éð¯d±Ã&{¾±Í.ûlµÓfm³Ý^î¶ã¦{n»åÆÛÏþ¼ï®{o¿ûœoÁÿô~¾´&Bj­MQĵʯ¡P¨G%*RšT¦.UfL„jT¥:Uªî°hÐLizG›Æ’g8åS=ÊÀ¤[NìMÖÉßånæÔ¢¶U©nm*\ÙúVºÂ‹ BÚj^õºW¾öÕ¯,Ç '3xEzœZEÓ UÀvÕgÓ+ÞÓ&¥¡ NÒÇWp¤6QVbµÎ’²”¦ª`ç²a ¿ŽÖ´¹Æµ®­…þ­\ÛšÖ¶·Åmnuû×\ñHVA®ôhÀ6Aޱu,ÕVgV‘ùiIdƒ®ÍþõÅÌ÷UÿÁ_3{zJ» „Nmw;^ò–×¼€ì«„{1±ç¸~M.оº*”Ùµœ¢Wž†žý>PU6êØö4¹tµô¢/õ(ÿà€×ó6ØÁ†ðnC« Öqþ]À{ûš\°FTñÔÅ–X®UmQ=˜Ã$>˜ÊŠ‚¨]·*Ð}xˆ[Žu¬¸ç˜Ç?ö1ao<ä¥}æ+‡öÁãµJÅ=™Ne®ÿ~²:ýicÌ0õIM¿-[ßÅLb-—˜Ä\Ü/þëÔºf5·9Ío¶œÙg:ÏÙÎ_¾35BüuÍhHÞk|¼¼ mÄhÃXô䤲´zJtâ"]~ ˜e*Kió YÌbkb¢m1eΤ¨©6ÁâŽOÔ5Cõ©UmjV‡ºÕVvu¬aÍdŽù’Q´^9 2ìÚw£ªSØÉ"ØbiëªzT›=–_©Õ9§þY÷khüηÔU‹)¡C§Â>ìÔÞV ªFͰ‰Pܨ7EÓÝísŸzuM.ôŒrW%G g»W€yÍE‰ù4±‰Zö¬±,ârgº\¤–WÁ§¶ïÇ]WCŸZšÉm"&û֔㵎 °O#’fýF8ÈþG-ò˜–î²ÞNEýŸyoUÐ:ƒU…PK¥vý÷Â'>ƒÐjkrÅÔçò‚Ùßq'_”ã÷mÏPU¾V~§Á†zÔ¥NŇ¢¨Ðct®³Ù&E‡òÀ°©ZNÓ]cûÃôHo=~»+]¥*W€t>Ù,YåI˜¥,ÍéB6zè/Ò"ž¾pý5;Ì!–.ôøÌ²é‡…"”0€@< Od¡ ˆ€DP¾ó`@çq8à×9€çŸ¨ú à­HÀõп^ISÇý7«>¬§ÇĹR!ÅŽ±7´ÞÂ×ïXóa–;¤a¬y˜d©æŸAãËdøëVþlõž›t#.’ãØån>*[\V‡ãoŸˆë<ñµ]åfkëùëÀôOd€UØïøÇß_ö°¿Ó¯Ç“½D°¿ö[¥&ICp€\¥Üƒ@;z(“é=«¸:>ž‚š CÜz¹Š©5²®ñ ƒÛ³Xi …z/k¾3³])<)“™Ké5>ê’‹¶»z@½²Ž ¤:ÄRŽÞ®KcYÀ¯³A¤[¨¼­²ì"Aº!¸†ó¾D+¹"Ë8Ki6ҩ½[˜®É˜ê:?ÅÊ q€1hÃÞrÃ8„Ã9|Ã:”C;¤Ã;ÔÃ<äC<ôÃ=üÃ>ÄAÄB ÄþC$DDäC"Ù‡Fì‡Gt½'’?ë@˜*+>ÝÓ£›R:<«‰£ 2k¸ ã%=«6¤C4c˲Ù1¦“»jAÃmÒΙ•/é>ÖZ<±Å'ãÅ]ôE›ûÅ‘ÆaÆbÔEbˆ»ÁGÙ6[ŒžŠÛ ÔCó´òŸ³;?À åÇï+.ü¢Ç{Œ˜z||ä>~´åÚÇ|ôG{È‚ìÇvCǃ“(AL»D‡²FASô—éQ9{{{¼Ó®Ly*¼¶sË8ñK9®‘.|™[2 1²hrþÈŸÃ¥ñ“/b[8›$®›ÔÉœäI™œAltG—ÁÁlc•6yÈV:>.ì³[ü7¡[nL·bÉ*û F–„7Tû*g±¹JùÆ£›Âž#Cµ²7S¡¶a›I{«É.ËÉZK·´I¸ÔI¹lË(S—e#£“)(´­ä)`¢O,6†ã¶c»·‰É ÔÇüâ¶as6ÿ³S„µ›;CJ;I'ª ±l™[zKQ˜m¬K,GSÄAÑ´¸x„1âša›#¾ ,)lBtéÒò2zùL ‹E¦T,ò£µûB&›Å ¢‘ûÚ&Ô,<@ÚÁËS9:Ÿú4ÒEd“¨oþÁFDâE¯ÜΉ»KíDL“óN”J¡šÆœÍˆüKlŒ¡f$­¼k’)Aʪ¡ªÂÏüÔÏýäÏþôÏÿÔ!ìÈ®ÆLOdOL4¹CçC‹´°>cë"SëL *¸ EC[²Ðuœ‡r³®úÈÐT›P³Ô"¥ÐÑ¡<ÑhLQãQ]QmÑTQ [Q•Pý¹[Kq;ÊšbÏŠâ)-0aô6ç ÌSì ÙPÆSÒ¥; ?$O²TLYáђÙºœ^ ;¡Y4“lÒ c6 Ú¶)+Ê$e<ËqÎçô²˜ëľS'<{Iå\‡Å£¤Ò QÐļ’G|Äþ²ÈÌØº ÍŸ1UT tÍæ€–°Lºk󰆓8-4»z‰J-…Ê-«T‡Ã–ߜȊQ-ÝÇ4¥1õ͸”AÛ1» i®655ª€,Ðj §ÚRY¥SmÑ•+Q¼«O%y’ßr¾-á‡aaƒ`9-%&é!ÑÌ:ƒ)1€ ¹ÓÊ,a½†T}¨Ö¹K“À~°ÀäWkO%ÙB821^âM&yÞumaþ•?Òš]2€$¤Ž=’nÝ^!ùZj]’~¸:a±@:¸:ðÍúd®›¥—é ¹²ºÈžÓHÓ™Cû JC§¥Y5Û>Mµ§¹\WzØK©<6Ø7`ƒOiÄyxÄfT·TuhD®¸Že u=.y¾ Þ`?8°’x–ÑeT8aÎúÝ#yi‘à}Àà&©±bƒg–¬Øá4¡á e!†‹ë°À a1ÛGä^v8a ´Ög 7piQ’Öy`F†Db&k=[LkIÒŒÜñ1\ÃãFº¬W/JÌÈ5³±…œí›ÜRå¹½¤Æ¾¼ÚMôÓ›#8sÄRþ“<¿é”ÒBcãR;Nì”/KEÚZìIð,.ªRœåJíÑc úR³à­•EÂíWD¼—œÙ#uq äÂÄ">ö89(`)òK¦²SE&eÃüÒý™®\¸c-è Nû²e¹ÕÙ™I!RÄ2ÕJm#[Y³[oËdÛ4ä54ågË·ãÔÌ€k7Z–ÈKýå-TXO&‘UŽ"ÚÔÜQà0´3Æ9scN»¬ÍF½QO–KrK,‹æà,ÊÂ˾ÝÔÍ„¦ÜEýyRä´ä£ê8«¶}&æXF&,îÓcå=éÍ[ÕÓl.žUgU3X>Ëš)uã¢þºwÄÓì40ñ)2YRNÌäh³¸Â´J<ç!…׊;ÚÔäZÊÅUU–ÍÆ:P Ü·m†Óyv8‰±§áhÐLÅP£e3ÝÕ*ì7°TK¨61–Ìo¼êîC·CÅ_QUi¾»i›‰dlVcxæ\ŸtéƒË1tKD&§ŠnOA‰hp‚(Šöއ.Ë zfhvff3TWMEJíÛêäÄ´‚´§íj˜bÜ~—ø¹48E¶ç+K8¤I| OÅë¸*í|æÂ‹;塎™½N„‰Fà4jµÌãÌËæÄŒ&çOöå,\³ƒUÊ<<îLNvòÙ=KÕ““JŸ !ÂäÒTZ#ãÐNþîZ¨ôì-ÚßÁ¼(J‰m¤^¬¢F®£†¹¤žÙCÑeY¬ß‹Øci±tÌ9îß)kP„3¦LîwZö¾JMþEªnG\ÞF­TŸê<âd´Æ\Õ°6?Ó¡NMud¼vå>aí×;`Hýk:Õ`#íÀ ¿WDS…³²ElR¿ZÞÙ´e”;7üVL0ÝÈanj'›kÎæM]d1¦ñ WÛjÃp^X³Aïl¥Šp׆ÔíFÚ’KAÚÎkNfÂö5;3®žW|Kw2RÅí«AHÑîSM÷Ž·%X‚\N,ÿ2?c=^¹í|í Aò™-rðïúPjæöµ%Ïkþ¹®D0É¥MÃ|þ)eÌlL³ª¬nì„PÜÊ ÿ–;Ëò•ÁK¥tfWlgVJ'¼l1†ïÊš;GàZÅã[½è¶pç¶jä©q€žC[3AþÔ…õçM§H¢cqU‡G™4×Y[O;mŸFëÌßÇbéFç>Û¦néŒ2eÎo£uéÐr~™sRÇZ÷ˆsX>ëŸ1æÊÕ:uBnÚºU̶ljÝØYäßdCžýñ0Õ\f{¦ÇFí½+*ó,ñ5FΛ¬5y8Z©s+øûñ딎£œ×ùçùž÷ùŸú z7z³ªùXzðFéìïB%Rbú§÷®¨wz©ozTBÑ©Çúª‡ú¬ßz­§zÞ†zC'ô£§pæN‚¢±´GûµŸ1¶G(µoû¸×ÅW¼N)”²{’Z©¼/©¿#´iQ%CLÄÂ'üÃWÄÄ7|ÅGüÅwüƇ|Æ—üÇŸüȧüË·ü̯üÍÇ|Î×üÎ}>¤š ýÒ7ýÓG}cÈœhœØ‰×ï‰"°†¡¸‹Ú·ýÛÇ}¼P +ˆŠÞ ÂþÂ~àoŠÃHŒãG ÅHŒÅXþÐþp~Ï@Ž…~†p„é·~ê¿þìÇ~“à~”( Y¨í_ðÿ~–p‰ÔGÿôOÖÇöO×ýhýø—}¡ÈýûŸ‹¤~¦¨ Þ~8EžÓ\Ëøæ&†ÖmØTcÈy±@@N\6~ëùì½#˜Ê»£ y›-ƒ%4¦›«GÂ”Š•r±[/8,ý†Ëæ3:­^Ÿ `·ì-Óéî{¯—éï~>ßàà á!b¢â"㢄àcäÏãD%ä䥤¥¤EÃÂBƒ‚çg‚€@à À*«çKEÆË€è€A)À„ÂËØ¡¡RÎÁC ±ÍÓ ×rŒ›s04\ÐWÁÃuþ’•VVo7TV8÷Yy9[ºúº:\–;ü}žüþárb` _£€j¢„©%ƒi:˜Ðá$ŸD‰"¥ Á©T@uà*W§µXÍZ€¤ FŽYƒw@²+œ9F€X/‰mÉFåË–0ãe»ÁSGQm_”~»â…ˆ¹¦dÈu‰Êî*Ö¬lêÉ {øÄÊ£Ñ?~ײek°¡¥K BÜ´B†O *~2…Ê€€zxLY€A#W•<9àÀ.•€ê€óà™°šÅnn¶Á3†Ï•ׄҹ,/©PÐF”²·´ TqR«‚AgÕ¶Öܺ·vuÏþð±ÂÉî˜ÖÐñãm—3ëü9" síR$±+Mf”õá)aiœ¥X€'uñòVûif6_S7ù0«Rw$u]õS±áæž~渂 ¶ÑUX Ç qbécVYÈPs¤Ð†rRWA)6‰%šxŠ$¦hb‰&€‹1¢Ä VظÄ— ìxã0GEºv$ʶä9fÔ§ ”YýÖ W½‘¡pgb!†ƒ(§!˜rEwÈCd.tˆhJ·¦šm²ùæ])2§'uÒy§yÒYQžzÖÙg :h áùgª(¡î™—£þw é`•’béœa*ž^zú)¨rº€¥šj*©â©J*«£Žêi({e*­µÚz+®¹êê(uò™i¯¿ú‰'±Ã[,²Æî¥,³É>º¬³/X+µÍZ­¬¡›­µÚЧ­E¾Š ­·£ðÕ-_àV»®EÀ~û.¶íŽÂ+§±Öêí`ÖvJí®ýÞûê§|É«—ÀÏK+¸²æ{°¿ ; ª½gîÂòŽê ºØbÌ.´í¼.¼ßVÜ1Èî.2É|IË­É Sô¶…‘ @Œ-Ìç«q¥öÊÜÀÔ[Ñœ¦û.ËåŠÌòDó: °½<ÃZpÄùZÝoÁýF °þÕU“ÊðÔC ¯¨Û>lk¼_{œ4ÒO‹nÛ!k|ôÁñ‚±¯k+lî¼¥Í1Óü^=+Ë/ ¸À)Ôâv¼)ž'á}€v(ô)–à—vAƒPtÐgM˜çAtå @yâéé-8ìKü«ÂûÖ;5ÞKGœµÚoëÜ´§¿÷.|ׯn}­ñë[5ÕèZ<ßÀ}ï»',µôo7M{Ø'|ýÐ÷Ž;ÒÙãËtÙ7;¿±ìIk¯× +†qaÇ‹ª€âòùê2{”óB'’ÀØb2#œÀ<’—Ðeçý£_^l×2Š=/eï#ïf<®ù­|éÜ=f¿‰þiaÍÃWÕw5v­l" ßÞ`ˆB}UOt{aÇÆ7 "o[n«kç7Âz¶S!Ãì'¸‚©,üKÜǧUeqüÄÿ¾c À˜nu”‹Ü%8?R„î;eìßwPñ¼^qdkS¡sX<^!,|˘ÃV7ÝÙpkw„ãö&Ø=æÐn˜rÚ!™A Âqˆ:¢ôüèÆ}å‘[ “ ð.)°MöÍläÂ$sg1i!rŒBdÀ€çª$B¯T>T'/Õ7üQª……Ô 1‰>¥åÒz<%›G8¯)qh)”*!Ù-‰ŽnÃý)Pƒ*Ô¡µ¨F=*R“ªTš@NÍzª³ *Õ¨RuªV­*V¯ªÕ¬k«^åêWÃ Ö±Šµ¬d=«Y¿*'ˆÁª­”|k:‰ÈJ¸^ê­`«ë]‹(W·Æu®}åk]§EGºî•°ˆd«a[Ø¿&¶±Œ},^ ÙŶþ²”½¬_-›YÌ*v³ží,¨VF>AÆŽ´|4-jW:·‰ªS+-BaûÚÓª6n²¥(má†DÞ¶·¹Åmjg\Üf“¾îqcûÛä W¹È].t¹ÖÞ¶ñ—ê{vÝXÑë–4–_k›-û©]îZ7»åí.ËUÝ[*—¤â=/|Ù;^óÊ7¾àC^z!Zßýn—¾ý/€íK^þø¿AüD;w©>`­×Àö¯B')L¾—¢ .0†ý{av]”¿ N'ì6àØÁ&Þ0Ù:lâ —˜Å†0Œ[ã 6„µ.ƒe¬ã_Br„á.ŽÙ¸cˤ&‹áŠ ÊMn7Çþ/r’¡ŒäÓNyÆD¾r”Ÿ¬e,X‡+óe÷nüO!oÙÁ¼ïDUFO6™Ì\öç1‹©Úõž^$¬]›+›å7Y˜|ᜡìb>—yÐ{v°E‘àóqÔÈá’+ŒhЏïõñšSiÏ®žÝ=ì6óªÒõUãu2¡Sý]Oß¹¢+䣕mèYÇšÖþ#‚P¼´u9¥Åó‚Ýò•Ÿ¼å3ùÍK¾ó—÷¼æAÏùÏ“>ô¥½éSúÕ‹¾õ§w½êaÏú×›ê)Q¼â³>yò~šÒÜþèïƒß{à_ø¾/>ò¯|â/ßøÌ¾ó£Ÿ|èO_úͯ>ö¯¯}êO“`¶g8ûVG³}¡4?úŸ©þ=®Úw~ÿùÛoËJÇŸýöwýñŸþûÏþû׿üÑßÿõ_þà `ú_ æ« ^øµÜøé–kEõ^ Z z“f`‚ànà† Š ž  š –  ¦` Âà ®à Æ Ê Ò`ß|ŸÊE 2žÖm3uJY÷¡&aö!á*áö9!>aN¡Va^!Jß A NÜø]S±­š ÿ5 ž¡.à*`²!þša¶!ºa¾!Â!Þ¡Î!®aì¸ vaÄMಽN¦Ra"Za*b#2¢#F"$Nâ"Vâ#Z"öñ’½¢ >Üò Dù™4±ÉÄí™"*Î^*Ê+ž¢*¾b+®¢+Æ",΢-Ê".ZÖàpb'.ÞGÜX6z!Ù´¸Ô%£$b"%jáb œ3>#4F£4º¼ñØ ñ`/bŽÉÊ*XŽ-üP(<ŽQŒ@©¡:Ê¡¶ã:Úa&àyd#=Ö£=Þ#>æãÕqôã \Ç íÊÝ>~â!ZÔ†˜ÂãXŽylât-TÎHÔ zØþÂDž‚x\dz(Žx†vl$Œ¢ïÜ IÚ JÖ J‚à<ê£K¾$LƤL^@`a„\‡8Û@‚ß=~aba|caMÑXÑíO-¤ˆÐ| z|‹ÖM8jG |z¥âÈUZ µ""ã2&£4‚LŽ%Y–¥YZ]¢,‹_àä)/ö"!zMÍËÏ ÌåäxF>Œ,¥BºÎü<‰,%…Â]ÀIŒ#D6×™U`Æ#;¾cöŸHôàY^&fff>vÀH,äZr#I]Ê[v¢A[Þ8Í»(PZÚ‰ªÜÎ8’jNÄͤ¥%õPò¨“W*#oþž^Ô‚fþ§p'îѤ¡,€Mâdv‰×h ¢O“<Ñ)¨ÕÑ… kÍÖÝhO°=™Ýb-æ¢äUKЧyž'zÚ&(|fNê™È4gÆe<¢w*›÷Œ 7µ%8)[îàßœšÍç’õ&X"Ÿ•'z&¨‚^fkŠ{ÚóÁ§–&5­R©±”.åvöÐÖ©Ñm‰ÐzéÓcºcd¶aÇ´ä‚®(‹ºdT®[5:fÇHh>'BRºiè¶•HùgÅSK!ØHÛ«‘YHÍ—J¥d¶ Çøc?>é@iD)•N©•J)–Vi–^©–v)—~é–†©—Š)˜Ž©™–)š’©þšò#›:©qÎ_,ÑhøÉ'°ÁÓ)½JUèû|(ù‘h?ÑP$Ñ•Iá™> ø¨ íæ( ”çi)¦²E*¤Nê£VêõHª¥:ê¥Rê¦fêwj*¨~'ÂTVÖj¬È)îQè´}~Ôê¦ØûÁ*†Â™‘aW¢Þf{ãš(–Ÿ ]ÌÕ±«±Š±ª#Íܱ2+²ë³6«ÌI«z=+ "+¨Ô( jîm#’3•ӟΊwYŽR"ÖÐßÌg§Š¡%ë£e ïœ$ºY¨™SʈK²î+´:«¿Nk´ì¿VëÀ.+À¬²&,¿R È0Ž©ææ©dOzþ+…æ.}˜¥ë­¶‘¨ÀVù}ªÅ–ŒIU«º ”$]cxv£Â¶ Dqd…ê«Ø¥XÌÞ,Ìæ¬ÍêlÍöìÙí,ÐúlØM'Š·&…†Ø$éÍàt~E¾Vˆ9í?)XÝhÔò‹~éi“é&¥£õ™x…h‡¡k³W¼Ž,tEš¸5WigÚ¾-Ú£m1j¸öÎÑŠŸ· $^1AY( µÇŠ­Ü8ªÚØ*‡Bí’¥, A2)›ÓžfkU¬ûjÛ6.ÛþážX-·un.Ÿš™¤•ë~uîn­ÍÝêPÞZê* ù¦ÁbÇtÔ=yP©Ë7ÍN±þ–VãÊÕìcúYŒ«ë<ÝÉÖ§…l¢…&«:¯@…ëóæ—êBoõRïZPöÞ×öò–G=^ éEëþà/R®VfÛÛ$o1&.1â}­n€Þ¦ÉÒª~žÓͺoÓ®ùj~šíuù­â©®.lÙ‘÷Þk/mpÛ©1ð+0i½ë©Íø²œëÒÐÓïÞúmPÞìÍÒÞÈší¯RÈ›&bn%}WüÍm Á¤È ×ðØ0Ïð ×pïðë0ûpÓ0 ñ1ñq3±÷0#±#ñW±?1GqSmSât±åx±v†©Åð¯ÜþëvX·Ðð o-¯®Ú¬fŠëpmׂcšñ+y× /ÓRŸyõ§ h‹2!›ñ;ùŒ”JªŒã8ª:šfÜ`cARlÙÓT^Ä1~FÑ^ÐØ )ÒËùÙÍåî¶µlyP›ErÙ¶o¾Î%Ær!Ïò,WÜõ¨„é0Œlb®ï½j{áÞ>îõ‚B!€Ýð' ÐÀ â¸þ@¤GÍ ŸÂQ:"[¸5T9Þ§ù8÷Œ!ýî×/ÑŒÍïÕˆ%€Ã 4œeªÄñÀÄY¦°sÃÀD\ŠHœ;·³NÀ3-·hʼn.o‡ÖnÎ*ˆñãš³$Oþlù* Q(`³`¦‚é Îþ,¥1׉%€`eSå†^­ vóÔëÛ+&jt/íˆ3#} pÞ$Ä1@à³âàÄ)€=ãó=ÃsìsP“H”gL=†Ã­ó8\Šøtèó ßä=+å@kfA; .—„¼,äBëä*‰G0kcDW2ـ‹b 8ÍP¯‚Z3F¯ØÂ*ŒdDV($2“Fˆ1)j.[É%ualö´4õ¦[€ņmOM4Å9õ>«Üc¨\`ܳ¬óÃésèÄd7Ü‹>@?ƒö>?6@÷3e³B$ÀP¼óUcfA‡ .Çq( ÀH^$Íþì¯õ óÓö'ÔhåvÎÉÏîÉ¥cöZçvç=y­Ž‚-©™eÂm§'hgÎ> É8À0@Út`lwSCbtÃ)dS£·M7Sïh‹v{g£ÈkÃviµD@ä ŸÄþœDn $îò6Ä1[›ÏIΑOG¡sê¶îVj/õ¤µ½aåÓ¬¬£UÙÉòÄu÷Ä1‰Ô7‰C´4_?ó¬óWWlp ¸'Rr7³ii­z!‘á«'5/€jV‘³˜µª»òhÚ¸0¶îxÔü™yx‰7yfÆö²lõ.÷¥,uxè6´À¸Ëù¶8ä·µ/…uhþ‘I×½º,ö¸íŸY89-’ñNÙ‘eçíB£Ô¹ß9žç¹žï9Ÿ÷¹Ÿÿ9 7 [R˼öR/$cvŠ–ûâZI´š9¥Âòÿæ'º­KaùÉQ’žì)µ¨Zz)YõDVŽ*©›z©Ÿºª§:«£º«¯ú«·:¬Ïº¬×ú§NŒž4µTyþlÇˆŠ¦ÄÚcÒ6ôåÊt@2ªï>8wVg†fl…½«þkYìDXê’í«”êŽwWv{};·ƒûVŠ»“ûµ–{¸§û¸«;º¯»»»ð2{C63¯Û eF,O ;—w%÷äë$IͺRª·çKéèÆÚï›kâŒwþ,µË+}éè}Noú 9ÿžÅ_<Æg¼Æ[|׆Ê.4•(Í:3´^EÌ¢o7Å2ŸÅÙ…W×Íï¦Çnä.ŸÖ•Í©¬˜5¼j„ãïæâ*Ä”]A,ѽѯ/Ò÷íÑ+}ÒÓ?½ÓG=’ûÚûO¥<Žˆs5ËÊÉ»û¶ªË¤òÄ»ûév£‘kSÔ*Ó»¼§3÷V+‰yŠ×hÓjQ-Áïýüö½~ùý¾Dmè›÷µáóýß'~ÕaÝgó cR×ïûöɪ:Áo)ûKÓœ¢Ï„søêñC2`;Þš[gÃjr§hƒÇ=¾²>á¾¾0‚9»Î>öþº~ì§,î/¼Ÿu/¥›ðNZ¦¾G´Ê7Z]z#ýqp{mºy¹Ú+æâü­«¡ŠÌÜ[nš¯ÓÝó­ƒwZÝã(Ýß*ø·eøë)ùC7)Ÿù¡?œ*ûϸévúò'ÅD~YϸÄWºb‡²Âkè‘¢O\A€j‹ÎJ—­*ßÌPÚHŒ ­°“@LÅF36iSEÛ •µ…íNA+•ûo¶!Ò<ÎäS)œz¨Yìô*Íu{¾ÞJq—ÜDåXùœ^·ßåŽÆ.<þo~l8J>RNfÌÆ4c^^Ä !‰‡z(qþ"µºtÈh!aÔf®L ÉPKvž¾bfþDh1mqgu-{}I…Ó†9ýn‹/ ?KÊ_Üàð¨«çôø,ŸÉX£h(I÷D<ÕÏR—W½ W5wÖ‰E õyÚ‹,9Óq¬“Ký}ø ·„ú&{·i_dÃÊ)³Èðb tÐ8…+íMk'í`+¹¤S;|ùØÔâÒ»fQ¦$Â8/]·J,aÁb“ƒç¿eß>e)·«âH 23ù“õ’âÐq¡èñ«¹KW@—içl-^^ŽÚçLí¨¬¤™D9÷Ê>-]¥ÁÏ úÅ×èÕšXÌá”UX¯!Iþ¶6W$EDgr‘Ñ£þzä¼Bsä«IV·M Æ ‘%Ò°:Ï Úv¾™ÜÂ,ìÆtdqéÒµ«­õ×4Z9ˆùA¹Fâ²kšÌØë>ßNòÉ$rƒ©¢ztÅMÚ¯®+ó(˜Ãã® ÷s « j-‹7uÙÓ§:Uál[Ρ à‚Ci¸â¼(A ŒåÐF€ú¸ PàÁA QÄI,ÑÄQLQÅYlÑE?|QÆe¬ÑÆqÌQG;{ ®’Tp•ð"ë=DR hà˜ áÂ$©¬ÒÊ+±ÌRË-¹ìÒË/Á SÌ1É,ÓÌ3ÑLSM. ò2…0@0Èþjd¯6 `€=!¬€ú;D ÏìC"QC=´ÑFÕ@TÒI ôÑJÝ‚ÒMqÒôRNe´SGCÕÓR?MÕUOm•TWcõUEñ AHšfN:‡¼Ëȼ(ÀÓ“;ðºÏtºMÙa5óã¥Ê˜*Úô¤E­¥Ü¬–-ìbI"Ymk0–[o·¥ÖÜõX±.ÜtwKJ°fÚ¨ÖÞÂËU®]ï¨ó:`ù€×™8™ÙúêÆ½.ÝíÜ—v·‡Xr( 1TÈ`þ À ÐoÊ@…öô'å$ < ô´( p@x!0éAÔS+Ô €ƒ&l ÀBTH"œ à°ê•ÎdoÙ¹~b–ØEÄxÐÖyTã†i./# ¿bµ>~DÂDñSŒ¨üÄM,]é@ýp‡·ÚíloÔš€ÿøÀ¡'5¯† 8€ <ÉI„*`“žG ]ˆ…oHsüÆi¨ŽÂÓ£žHˆ%1nÊq’ :’O6à…þ5Æßu-zíÛ‹&v¯¨på?èë$è÷´LTLTÉÓ$iЪ ) ¼ZUPFÎØÆ`´›¾¶cþ$ßÊ%Ì@ï€A…P™Æü‹ ئ6.“oT&üׯ@ÉšàS ›ù  *sP‚&f˜ÃP²CмžYÇ>‘Sƒ’ ÄúžÁÇ&E¹^·¬õšpŽaKù\ù¼÷>N|íQœœ"H4÷<0ôð{‹–ûÐÖ ÙïnøÛ™þöùÉPDÓ S ü&J€9²GÀ¤ªTzRbm#q -øLFš3ËYƒÜÛŽа„R"N+\Oàf /PÔ7)ŸÓ cQÄd û;Ù¡|y31>OoVA×­¶.,7ÁLFPÅe½–¦Í2\X¨f6}‚&¤äã[¢¸Ó½þ¤$¦>)‹Q*>‘8ŽQ­PꨢVÇüôwª«ªWÓ瘬⠘««Ý0Wù3×ÐÌü¬¡UÌ“‘Í 0" ­·fE«ý$2œ5»&ˆ§šáŽ‚ÚV4‡uÃ8ílMW4Àµ:MÛfËJ™Ã•¦Z›,)sOúlb‡²´ìbË ÌÞŽ£×ð¨{@*ž$ì)œKòÈËÁÅ‘ÓÔ$”5?¨ArZs¸lf_UNŒP™ Ì¡›'(pƒ1|cl¥@ ð‘…â¼ú[Ç’½ómæ_”‰!öªP1¬c3}`ÍòwPüÕp„ÛH^’ø½ü`‚‡›ßþ7 ,þ•™ÃÑ´©©"ûZvÓ´t$;llçj©1Îmf»sÂdwµU'ÿA—÷q`c‚Á6ò’’`—94¾á’^ —=jœ¤–aˆæD6G‰$nœÝ+î¡9ë¬ãÁß o“do ͤ“¶9·p 'Ùå>ERÁ.ÈŽ…^g§g¸¤.ëØÏ¼M8É/®Š~¨Ø%c£öwe쫘«­ë8—Ý€D£ºêîý²1åËv D§†X:iL08Ìc³#)ÂÞåÎ;`sLChÏC|31Èí9‡ Îànð‚ ÌíDþæ¶"äàô$m5¦yÎìvd 1h¡t¯ño,tï±ýÉ›ÛÊ^v4û êÜÓ™öv¼ÿîÇj­žw¶…¾…v¹‚QÖµ²fDÔhÇ(Í O ä'½B@yNxïv¬ê–ø¯Ã“T*< fEÂCØÏYà!žÃÀQ+Hä¢ %)BRQ‘¸ZÔ6ª ÙÑ>²ó6—Zé3ú<$5¡ù¢ŠÀu¾&6@ÅèZÈܧÒõ¨?/P©†Ò‘4îmmU_~–IÊEzA••!Uá2ðàc­èìžZ¦-îo.€P^Ið 1U“ü 1ý3˜[—Öur‘ö:ø_¥®þ§líâj¬'¹¶ç} Èã5N!ÆÀß2Nýue¥„a^–¤“5爽ë&Rî;ù©mXÔ"ÑSes¢iýQ‡‚®öñ;N–«¯*ª¥ zIäåÜ'¡ÙVHWäʵ®Ö¨²{@Ôgï r¹ha^ë ÜÓt£”¥SäSQò§õš9b} *”(¸¢ìŠ./Çí¾cÉŒûHç}Ú‚0Þ®¯æª·È‡ $ðô Š„nþNúT†»nÏ£–,#Ïä”Êe†o{ÚöŠõªù?hP(ð^GUP¤´+Ñâ¬~PäªÆsxá!€ðMèEväj/bÇ“fÂÏg–’°ÿdþ²v¬ö|­»p/îÎü’‡±Ål$§ ªëãÞcºÏðfÃùÌ®®œ,|,ä˜ ~¨+·«2Ææôè‰\/Öä#iF¦±6p }¬¯Ì"±ânÔ¯EP ¿ þïx -˜ÂgppÖJ –pÁ©øG:ZIuo?¢0qBøúi'p§äòhf¢·.F­¨Àé j¬xN8;.FðÈ~Ãö1ØrÑ­ÐÉr¯8ðÐûFG ò)3H±º61a¨R0çÔcã¨ð¯²Fˆ ±•Þ.6xÌ÷ò°#lƒ•(P=–çWñ¸†ÅP‘£¶ð£º°3±ñÏy:þCýPnÆýélÖïzbÊ£”JNÿPíäÐ#Ÿ ¯èí㈆j,´gÁê§.§–rA¨ì ôý°bW­íçýx'þ8¥æ ™î*&#Ö8ñÁÆ€¦–°‘bPª ãÇþqsœ•䪱Ì)ÙgÓf"˜©  =>Æ—P$„¢ó^P “¯o@AÚ/8ú/ ô¤’Á"‹ª' ‹÷òiíæ¯Žg—¤f—’«knpz¦÷ü/S ÙJðàO¯6žÅ/¢‹¼¡¬Ì¨GPn[’¾R8ðG,©%2©Æ/ô Kõ°¦K‘ô¢hŠhÆ_þ®¥‰¨‰†’jª(S³ ÓyNQ4£$«f…0;>Ó Åk? ±Jíñ#³ ~;bë°~/áŽ33i†Oª JßÊúà£&ŸÏ­¨c7WГð ‡5‘Q±úO Ón™Fª`R’óºT2ŒHpÕÜfö Ê=D†Ÿø)îØ°CÓMÃð^“(ÇJû‚‰!i 5ŒŒA5“4fã†(ô@Ñ;*ÔîZ3².7rÿËÕth´‚ô32ëó—*sA3±ñ=g ²¦ë/¯Ñ¡h2‹²ï#”ñ¡À¯·píMBãÝÓ}Ô·‚ªÞ1ƒÑ‘: s¨jcþ¹V§C}®œˆÆg/\T]&s.X²«Lƒªjæò8=Q ÛJYvR±D3 sí­¸ªUó EñEŸt±bP¬lEy)MOC×jJ‘ôLqÓ©òLI K…„óÆýn «ëÎŽü6SL…Š µÑ3–Š–ÊƒJÿ©•3I»ïådŽíÀU{ÎüÎ.{L5ëmr²Y?ŽS›”6¶t7‚Õ¾4RÃÔ^¥U[[þÍÛvÂÊ_Õ“R¯òR/£Žbeªððs2çÉJTûŠ2F`…M1so^yRK0?!a_óXs <ŸÐ¨£¢z”hâ#epcó¾¥4Ð@Ä [u3ˆÔøX«ŸTC=´<$# ÖQ,¡öL“çW݃d©aX¿±X³6oXJñb"×Wk=“k‰¶‘GÇÔ‹ž“®”UifÈ4n+h£-Õ†+õ°òÔ@›&0‰É2açdÄ‹âu8³°8!µcU@dG-‘kIî_ë]ÌÕ« 4hgMb‘ì]ÖònAî÷© RµþjR1@«ˆôÂbû–ðT±-7ƒúª âŽ“h%êrw‚qÅjñ ,Ù•jݲ©æ/åÖ[GuÙâ¹0Î`üS/k"RZËïc9/aBhq– ßFU;“z "©" ®/÷*ñ ’_-ÀwÝFws‡7ñÑ Jú\P0§;žC\űUAï ƒ¬hoJ~i´‹:v½VQRØ4æN£Ô=CTI_&?¸çqSð¹ÀfÇò}#E}q&q·öp—t¨j1‹òyÔS/@”Wí xx#÷.ÁÖ4&Z(×yñ<`#JeV1gÿP…ÿS[¶%"õ÷ê…_¯B¸þ8¸x—>ã¦}£ã”¤S`[ãɨ’{qåY·9t oÐsþr–’tµÑcI|»i`×ÿr1#¸u—Ø)Tcu;Dz}%“8WrE¥¸w’_å_Gô"D´0õqn3îSe‚µN‰cЉNñ’’LC7T63p~¶ä4öZgî^°<;pˆÖ wƒÙ>=xvI ‰Ox$ÐS9´hùØ–2Ë’¡ÃÕZ‰‡é^Ï ‹Ì•ÌpB5 ãÅRÛ“…atÈÒ‡CTŠÐÍ•ø&rZl¹QcYEM?K âÌpÎ9pÐyý†ÓùÝ9žÛyžáYéþYžë9ŸñyŸíYŸéÙŸß ùY ï¹  Úœz ñ9¡ÿz : Ú 'ú ºI&µž¸£Ø—]“`M@:¤Ez¤Iº¤Mú¤Q:¥UZKøW^ÃY«ŒSS_&­Ø…¦mº¦qú¦u:§yz§}º§ú§…š§g:¨z¨‘ú¨•:©™z©qº¨™ºx¥j£½kœ@Qæšµz·:«¹ú«½:¬ë¬ÇZ¬»º¬Ñú¬Õš¬×š<¨­Óš­åÚ¬ç:®éú®í:¯áº« ¯µz6™‚ªó@ 9c¹õk.±=±[ ›±!Û±û±%;²)û²Gs1Û²'»³9û³Ê+;´7[´=û(­´ié]S¦g™QÁu”a»ëb»$i›3j{¶m;·q{·e»·oÛ·u¸y{g—Çèñ¸Q¹ß7ï˜[¹›;¹¡ío/›y*j@°Hì‰Qù¹—Û¹Á;º½{¼Ãû»Å»¼™;°bø‘%’9×½[¾¡«ôâû)ëÛ•Vƒùô]鿥)‹°…“T1µK{´ ¼ÀœÀœ´ü±?‰˜™Êu6¸»Â)ü‡Ã…{Ã-Ü0Çoò¸ŠiCuâ";httrack-3.49.14/html/img/snap1_b.gif0000644000175000017500000002450715230602340012552 GIF87añ »ÓȵÛÐÃùüü¬¢Žf®¥ŠŠC¡š~zn+)ßæâÀ¶?6=ÓÕEaLÑNJZIß]á\ Zâ`h\éb^èèoïðñkwvpbõy{€ûƒþ‹†øÏQ¢G™*\È0‘'I§"ª51EV«HeÄHÀ—Ç ÿCîR€L¤Çfº¨|«J bÍš)À‚±ŒðàN˜/aåC–Ë1ÈR €Ëš´¢XõVS•LÀd*ͨ_Ãz –¬Ø²hϪ5Ë6mÛµnãÂû¶®\»tïêÍ˯߽ûÊÕåµäNÁ}k^ –ØNÀ3–y²åʘ)k¾¼93çÏžC«%öK4èΨO«6Í:uëÕ®cÞýº¶ìÁ¥o립Û6ïß¾ƒ÷œ¸ðâŠI Xμ¹óçЛOp`ÐëØ³kßν»÷ïàËO¾¼ùóèÓ«_Ͼ½û÷ðÏÓJà,ºýûÎЧný¸ã"÷Ÿÿ€h`ÚEŸ.ø5hßtÕ(á&Há…fXá†h-ˆ€ƒ æ÷J„ž Õ•[0q¨!†*ÊÔÓ„(ãŒ4Öhã8æ¨ãs±X@ÝûUæáŽÐé ‰’5p˜,²P‹/8À2»ÈÔ‹1( ‹’,YgÓ.Õqi,ýÖe‹,¦ùÀÕQAä›pÆ)çœpN7Àc¶ÉØsBØßŠ€¢¨oÀ¼`衈&ªhôaƧœ~ *išƒÊÖÔ3Q@8$à©p œNAj B(`ƒª¨š©¨3ı*­ÎÀª«}lê*§7xÚC©¡jú*4Äkì±È&«ì²Éî¢,ÿ TÀ£qÉߤ•b«-`M-@ç·à†+nœÐ\LåærdFm#þ¹ØTX@I(Õ@/ZÝë S¹,À/NÅÃ@2Æ`yç¶Ù²hËr 8à@å p€Ä÷&pðéÀœJ;çír Œ,U›+ðÄ@2‡2Å*£«2Ř<îÍ8ƒÈæsí"ö–Ø“2QÊðÑnu qsé’|®s%7w€+U@3s P\µ§T\M2ºUÄXµ~U8àtY3G±§9·í¶s=ö3‘Ö"‰tÃx­4κì<®À¿¼-xÛqG6÷ŽAçmôâŠ'ö0sS»Œ¿›ë20õÿÉknsäo.–C¬1/ùrŽ ¿ž³Ë¯·‘“Î9s î±“ß>øî!Î×á:&~÷ðŒŸœP´O“òÌ'ï<òÐ/ÿ¼ôÑ7_ýôÖS¯}öÜcïýõàoßeÀçX·¼¯I™ðTªôoñð7N¼üñÏ?[ù8 _™RDÛ_ÿÿô  ÿþù¬>}Š—e X)ÝkI·HX¾²t¥ÌÉ„JXšÅú` ^Ø"&V‘X`FR*.:h ~p+¬ –Œ;ƒ'%Ñ w8ÀÖ†)ÒÂßηÀWÔåxã{ ^"3½ù‡|"m€˜!ÚH}a`Ò~ñ¤ÿ '¸ÅThÑ€0’FM‰IÏA\„Q%ý‰ÛT.èŒ~µ '^l—O¼¤GÙd¤V¤´¯-Yç&LQÜ”t˜Ù³H¡V¬bFi'küÅ1i”JþHNÉä'¦ÉÌññü @»:Y‹¬ QŒ¥ ($BJžÑ"w)EYö’—¡Ñ%^¬X#"æÒˆ¾L&0—ùËfb†Š!&°èa*ә̼¦6³™hBFš3¢&`¬ÉMlšs›çl˜7óNS2äL§<ÑIÏrþo ²eµp OdÚóŸóh=9„O½´3Dâ¤K<ÊP:4 *(\ ¢wB´ÿ¡}(F7zŠ:(¡ )GEªÑ†yˆYÇBÂ6´Á p¸ÔfpG:ÎQšªC8Í©NwŠSzäã@-Ä!†õ¨HMªR5á¦^DªBÎd—»×b¬û&V··t9ïoÚBYôñ’t9†—äë^/>P•-i×-š4€}`*ö‚Ë™$F'MÉŒ›ô"I<Ò—4ºÈš„õCá [¸Â¾°†3Ìá {¸Ã þ°ˆCL⛸Ä(>±ŠSÌ⻸Å0~±ŒcLãÛ¸Æ8¾ñˆIÃà;¸Ç@þ±óÚëã"ÙÈB~0„?”@YØ-ÉGŽ2”§l6¤T–2’·¬å¶X?Ͳ˜¹<æ.³æË÷ÁòZè¥{M¿(e ™ô‹ýÞ‹0À¸aû+F=SEÎö%³†^´€uñîЈN´ÿÚüÉ6©/h~?‹s37ŒÐ†V´¦73kE%Oª¢>ë´Ÿ' ÚÒª¹”²–€ÒV»z՝޵¬gMëZÛO1ܨ6é2ûZCªvÕ4B%h ‹S˜P±]å¿ÀT®R@ˆ}a?{žŠ¶c±{©Ö„F>Æ8PÅ8D¯ð^tY^¤rJB/øÕ꣜ҧ{Èy'°tFœÖ‡D:ý’{Ãø£_ZNÎ@œ=ˆœx!aSb€+´InDœlÊAnÈ$òrh„ S:£`¤~JODö„aú§ƒÚ§L¨[†Z¨ŠJ¨ØBdŒš¨º¨,²d‘Z©z© B©˜j©’Ú©ëE«ª¢:ª¤ªÿea¥šªªºª¬Úª®úª°«²:«´Z«¶z«¸š«ºº«¼Ú«º*À4€hŽÄzŽÅz¬Æš¬Èº¬ÊÚ¬Ìú¬Î­Ðj°Šµ·©Øê©wh­«È©Þš­Qf†L–„G¢~àz®ÚúzâJ'ך®ßê®e¶®:gjï*e&è«øš¯úº¯üºª’h~”XL€8/T±ÿ•4øk¯ "_n7xûuÓA4tùh~Á­ÂH°;gÊ ƒ„IÉYœîe§qôF¥Î§|Õ§èj˜±0kwF¢o7Q±À…±;'è^IJ]>+Öõ];Û²`ñ²1{´575a³‹a­Kÿ´ŒG—H;µ4·¦¢êh{°ÓÔ­P+Rƒ:ü29b¶d;¶f[¶h{¶j›¶l»¶nÛ¶pû¶r·t;·v[·x+¶\TKÁênÛµh§j«bmÅVnÇ"«r¢¸Å",µ+Ôf¸’;¹“»n¢Ö·W®õ*~‚;m‰à¸‘»)6P*Ê6©b8Él++£û¸ *yÃ"º6@mµ,›"»”»»¼{kSƒ)Åb¹Ñ¤µáĵ ëxӻʻ¼ÌÛ¼Ëâ7è¼·-‚³ô ¸\6oÔi}ÐwKÓ½¥:Q÷PçÿEmž2wT«iS'#6pƒsãZ-O›E:ñÿ{|Ú+¸°›‹c2Qu…Ætq÷@Dw25Ã.ö¦3¾Ì4ÿ•uNGœõÛ¾‰V.C“aG¿ìj¼ca—^„œí2lâ^Ó $«¥?r ¸¦>]ô¿œ1s\Ã5Wxoa½æÊË$A[4d`@̣ؽ1s,#ò5Á‚3kÛ†Ãrá´škÄŠÀÏQp·:¥“ŒqÐÁl9Ç€;ǥȠ1…æÅfSu@¢k¼ujì)rTŇ&Åj¡Ã2Üxj—Û+#l׃¬S€n*AtF¹lgqfet×l`3:Ë2å‹Ç‚£ÇfÁÇV|j€ÇÿɤÌ;žœTœ³},Ê4,¾†|'Ys|yr'Íf w2pçKËÇg6&w²sgwÒŸÐBmÖÆ@’ËæRwqÈ Ê½ÑJ$¯­Êûã,Í0ܤ˜Dg±ð'ZÓ-}Ó6Ó8½Ó:ÝÓ<ýÓ>Ô@=ÔB]ÔD}ÔFÔH½ÔJÝÿÔLýÔNÕP=ÕR]Õ@}г€Ñ×|‰#é>\Ò`ʘè=/ìGÒhmÒé5Ö`QÖûsÖÀ _lRœ=´¦(2ÖjMPÿÚQÄëN÷+ŠñõÒ—G2¡_)l[—äÂOѱš”ÂlRB.ãæméŒÞé|În~nÿ>å=yœ^êžéãýQÌýƒç}éžnÒ¨êù³ê5ã®nê–ë,¬Uˆ·þëž®ë è›츎ÖÂnÍ‹~ìÆëÈÍ[ŠÎˆ¯>íÈþìË£é¤ÞìÔŽÚÉžÒ]‡­¾íâ~©Ýn¿½nÖÌ>î]îÁ8é“‘îðÞ©¦íê^ïñ.{©~e£nïÚ~ïwéíþíþÞïDBaŸ5 / ßð ÿð ñ/ñ?ñ_ñOññŸñÿñò?ò Oò"_ò(ò*oò,Ÿò-¿ò.ó0?ó/_ó2oóY‚¦¹óþ¨šøÐ•®ù•B/CE›•e›HŸôJoÿTÉ‘½¹‘Àù›RõÁVŸžà©Uø¹õ\?žÎ` +Eñ¨ +öõ(ögó¨OÉ ÷Èóp?T|°•sôx_EôKß÷™`‘¾Uº¹–m9õXUT/ #v°VBŠb6ñ—é8º¸böcÿŽáf\“mi¯.ÙùjOƒ*žrŸ9XOúü÷¬?rðú«ùt¯y¿´Ù{ßP–~‘éTMõôÁ?„/¢À‘©ø¨`±EkãÊ©— z$ è—)™—9€ R° ±² ðXönµ˜”© W R +ÒéÕ‰WØàùœ"W£"•3X6µÿò¿ú7Õú;µX¨éó\ ÆIíÄWçiõï6bôÂDSue[÷UÐxœÉù¦‰ÚÎ÷\ÿýbC`‘x"Š@pBŸÆb,¢N„s€P0½2â h, , ŽB"Q¨ß¾ÐW°KˆëûPètH¼3T( 8”k´û»Tàû£8ìë³û|Cü--•@ý\•H]mu•¥­µ½Å½¥pÝå¨Àî þá(.ñ!ÉXFnF9y‘ž¦®6–IZÁ¹îÆÇVÚ›:‡ªºÊrjïj k8(C8pj@Ði{‹›ËÃ3€&<¬ ýA˜ˆN¥„xþI 4)Òÿ¿K’(hê£cTÂK®<©ijª„©d‘¤+×J–-eõ¶ëÂ/š2‡Ù4–S„2=?@óiÂÚP¢Ô|´øÖ#E7I·]#uÜÔx\ê-Hg‹š]é=ùR5Í™, ШaóE•¤B']l—ÕCrëö2D‡WH`(QŽzV`ƒ)kµRéR±KaÀfáV3ò•yvÀìS³ÍÏŠ~Í#HoAvÍfú©Ó©RÉ=û@lÚ±­ÔÆ-Œ‚¹q£m¡ðárý°î@A#ã " ã\záSªÂ8 P]dÝ·nMz¹XüxÅÏ„iYý1c΢Mvâ}húÒÿP‹^šÚèèp«Å¹n- Ê!G@ð@,§ t¢ˆpB ÏÂ'6ÌpC?1D+ôBK1EWd±ESÔðD=ì°Å·x0Çq”‘Çv0ÔÑG $R !‹,rG#—L²É‘drÉ(qt²J)©œRI(ÌK.‹üBI1…³L3ÉÜ2Ë2 ²M-¯„³Ë(+DÓÍ:ÍSBÏ´³O>ÿÄP?éôsÏ;ÉüSPEí±ÑE …Ï(Âd´L¤`Š®®¨óÒJëÌÂH­x¼ôQS?ÕSSeuUWU…µÕX_•µVZoŠ/àõ,àU?ÿ3µÇWv.¶×+’ý*‹^ð´ÔQÛüÂ+`` Y­ v6[g÷[qq7\rÏ57Ýr×E7UJ@Ö׺J´+i¿àb^yé}Þ¬pâ6^«õ•ÏP£¸í*xçÙ·`uÛ…øa‰Ù8bŠ/¶8㊷ ¸+ؼ²GP€Ÿx'€x5õÕ«º°v6}·b4S(¬ÈÖÚ…éñê 1Þ˜gŸwºç ZÕwé¤WÕõÔ3É[ç|¢«‰¦zh«‹®뫳æzXO?Ô:ì®ÅÞºl²Ï;m³»Ë ßÞ†;n¹ç¦»n»ïÆ;o½÷æ»o¿ÿøâ‡·xvã—G¾ùãŸgzç1ý}zë¥Ç>zí¯ßžjå¹?ûð»'|óûü^|õË_ÿ|ößw>}øÛ§~ûÝÇßç/êá¿ÿÿ'ÃäAЀD`¸@6Є`%8A VЂÄ`)8€´AaE8Â6Á À*éT˜B®Ð…-„á eCÎІ5DR¿@Bö°„ÔBýòw?!‘ˆ¹[’àC&ò0œG‡ÿ8E#RñˆVt›¸Åž0ˆW¬bÁ8F,®K‹\D£ £XF2Š‘otc­ÎˆÆ->1j_„cõ˜G>ÆQ s¤#ÕˆB?öq…Ddȉ4d$!9Éî-’‘$´ã))ÉCv’“׳ä%EèÈOnÒ”ž<¥íB)J’2•¯De,K9´U²R™$¤,ai»Pƒ¿f0…9ÌŠªª¥-]yª])‹Zg¨Ó=véG<@ H€-µ¹MnvÓ›ß ä›€q@ „U2Y¹LXe*`YÀ=Ê0€Ä3ù ÃVf•à¨þù/2Ü£ö‚4UÐÿbE—©ë%°² NŠVÔ¢Åh+åñ#kóTê%.¹¨fª!_æèÉŠEÑs _;Ø¥œµ2Û,`Ù⊰ÊËkN4£?jP…ŠÉN¡ M§)ÊNwIñ¥7åÃü53sža6ýJXÆ)+dÕd7MZ”Ì’†1~™|ym¶ÜÕžõxÝå ܱÞ=þ¯›Ï|å¤~"ÖÙîqžç›?ï©;^wÒkœÔ/÷xß•鑃«¤.ãÊW´ž •µʯ{,€×nÊU†zÂîÁ Pná)BÔ ï·ôÊÀ¬Ñ}ãÒïú¼ÒöÒw?窧{¤™þ)wòK ïèÔÌгè*ˆ¡Ò·Jÿo:uÞ¡Üû÷Ç? ‘.\¿oðvJƒnq‚*à•ƒŠ"i"@¬h‡,Ø8)–ƒÊ–l‰,€&àƒûË¿ Ì¿ý«j¤Ö«+ù’!™w"Á5±À×A¹é#µÇk¢Ë#5É;+îÓÀºã@?ñ@ú?ú3\´g´&2&€êã!Ô{¶g|>j>b´Að«(_dDf< ¼‹‰r€Ø°Â»ë8XG‰»;É[Çj DŸk>³ª§&œȸz|dž£lz"~ÔDÖÚG„£DTôÆK2FAÆ.Ò$r¤È:1G±+¬+D½•˸5X¹lZ"T¹é›'It2Ø'¼ ŸÓ8„Iü %Ч9¸8¹»Ã—=E`Ȇ ¤‡“ˆl%eÇe´È ÄÈÿ‰Ê8Ü1³IEÉ@°·ü:¨ü Z”×3¸´9ÛüӸ¬ÉªTÊ=°¹[äI‡Ç0{Å¡dK>Á@î=ž#µlš¨‰jC][u$5œKAà9îkÃ+븻ܱÌÃKg»C¬KgÛËEp܃‡;K[òIÊ{ÊlËt›ÃñÌÏÍÐMܨžB¹Ì[JÍTÍ=±'0‘Ö„Í×”Í ™MפÍÛ´ÍÜŒMÜÜMݬÍÞÎßNÞNß$Îã4Îä NäN¨ë“ÓÔµÌ$ÊͤÎÕtÎDNq´ÎíœNîl“ìLÍt‰ Á–êìÎó$¶/ ¿~“NY¡—yOÿôôÎùü¤ìlÏ3i€üÔÏø'Þ3©ò”ÿ¼§ý$Ð5ÐEÐUÐeÐuЅЕР¥Ð µÐ ÅÐ ÕÐ]ð¼£\¡'«Â3§š™ª©ÑUÑeÑuхѕѥѵÑÅÑÕÑåÑõÑ…Q—Rû\KfÂ+ŽYM¡@Äã6Á¡‚Ò'•Ò(¥Ò)µÒ*µ!,8ÒAQÏp¼OD QVqú4Ï2Õ!},ÈvÚR2uSùœ"4]"]ÓÇ S85S<=¤0e±.UË:%©6åå²– dŸÞ˜š7ÍÓSÒÒXQSa³Ó¢:“÷4¢A)MEÅÔüáSÿ_ë?mÒNòÔ'yÏx2‹ƒª–|™iѽ‚—Þ«™&°–ƒª9o™€á½mß#Ñÿô–yȇ(ȇ+ˆ—'üaõ•Õ¼ÊÔE-›Fe:…T»S;‰Ï±ð=õ—M¡½ó{©sx]EÖØø=« •¼z™oý½å—`?†ù‘’ñªKÑ †©›2§Þ×ò\Ö}g¶NU¦ð,”Mm“}<‘Rg‘‚dÑ™€)@‡)Š"“¨}9‡á;!,À—IÀ aØ@*°Ø‰%Õ‘­¹‰½äWfÅ‚h%¹A™V>™{Ø‚¯Á7IÔ1¥’ø´«{ò=5ÉÙ:Zÿ aÙ£MåÔÕcÏ"eSuáY¤ÕÓ©å—e”GÙD™ÙžÑ7j‘:uq©Á ¶‰i?P‘—y0ÔX¡Ô-èU©×E[V]”h€gcª«}N€]§/ ¾…Ïn™Ø…í•À©Y˜Tƒeé–Es©™:€Þà'©ë¥`Q.»õ=™RœI˜«§^Q(­b–ËWÅõ=Æõm3¸=dÕh¢—z½&5`€ÄÖÝ•ƒÂ\›’\Þí•Zm\œé hi@©aÖ‚£Z´•U9­ÈòÛÜ<ÙÚ¹VuMÛ6°ÙýAÉ›©_驊šGì*ü|ú^xq¨.Hÿ{ø'yeWô­ª'˜×µ_ͪ³P×ð]˜*zu¨¸}™¬BÖüU-èª0)^…Ñ ©Ù’‰—ÐåÕšk_w+þ1*¬8`çez*Ú3ÁZ× Uø´‚Bu:ó#ÔÕ-ÔÉE™B¥ßl™xB¾ÉekÑóÕ*†±é`‘*,¤—pm™f.—êŠ4°]!,Ω_±—”Qåbâœq¨n™ˆz™¾`åRƒˆò i«‚ˆ’ZÜÁ”®˜QI½B¾ŠG1‘¢2”æZ6æuf!Éå§…ægŽæŒ¹å—Ufâ:å7Þelçköb¦ænv/fÔqÎfv®˜m¾Zt~1M–p&çv¾gT™æf#uç|hˆç¾eÚ¿£ç ±g|VèNãd.hÿ;hŽ1ç€f芖ىV’~Vš„¶è…¦èsØçŒ–ç:ŠèÄèŽFéFè“>‡jnf†é”iÑhwaé˜Vilh>qiiMeœêgžéü–éjSgò»é”j¤ÝiR~hOýf7qV¥¦êœ¦–¤–Þ§V¦’Ö¬^ꯆŦ¾d­þÛ£¾hg¶j°>ã¡þ£¢þÀæªVkVë`vkäê©Nk¹æëº>g²¦^³¶îë¹îN¿æç»n¤¨ÆŽÞëÇeÂÎêõ4hÁ<¯.ìÌ6SÄiÀÎdË–êÑíÑ&íÒ6íÓFíÔöÌ{@ëŸTìD„뺺ÒÙÆRÚ¶íÚÆíÛÖíÜÞœ9}mWTÍ6lÈ—žîã&n3úí^dläîá6îä~nçŽgÏ–,®¦néÎî¶¶îpjníïéNìî&.ìïíFn%Š;httrack-3.49.14/html/img/snap1_a.gif0000644000175000017500000002330515230602340012544 GIF87aë³-TPYd\•Œ{R¨o±¦²§Ž¢¿µÎïÖʵÖνÞνÖÓÌàéå÷÷÷ÿÿÿ,ë@þPÉI«½8ëÍ»ÿ`(Ždižhª®lë¢@Ä\×´Mç;NŽðvhÜ|Ç[©<6ÄFðÖ0&¯G^skãb¯ËåwL.›Ïèt¹pd'ÝîN Ïëø»>¿Ÿûëz„…†‡ˆ‰Š‹‡ŒŽŒŽ„“•”’›˜  Ÿ    ª¬ © ž©¬¨±©HZ¿^4C>ÀÅY?FbÆ]`TVebLÒË_ÔgÒjÚÛÜÝmhqqxyrå}ä‚€èƒêí‹€‘òóŠ•…™÷›ö——†ýøš0`µŠ•Áƒ<  A„«0!H5ÑÀÄP¢0‚2%J@ªþ¨\´h ׫’TÌe‘‚—¹4bT¤¨$(ÙÒÔΊƒŽ*3#Ñ£¡ˆ ]ª´iQ§Fe"º´ªS¨WŸjµºkׯ\Ãz Š,Ó¤`ÍŠM‹–jÙ¶^×Ê…š*Õªq³º=ûöíÜ­|?•B°7/ÛµcáN|¶ðbňÿl˜²d¿˜gVk¸²gÅf?[šj´èÓ—S›VzµëÖ°YË~=;6íÛ¶s§.­wíß¾ƒ÷œ¸ðâÈ+7΀УKŸN}zx?.É»‚íß¿{ß=üûóÛã·Ÿ¿¾þþûýþÇ߀èß"à‚*Ø`‚2h`„Jè ( ìô\uvø:RfË%×\‰(ž¨¢‰,¦ØâŠ.Z•a*Ö8ˆ¯Ô´WŒ0öøâ<écDI(ØÑhã’8Џc^&‰rÑrQ)ä•Ë À’\véå—`†Y]b–ée»° ˜Ûa·€› ˜âÉ“O͸¡™Ð5ùa)SF°«`^"%`KP°ÊK‹*ªÊŸ5% f-hˆfq¾di¦¶hÚ(N žbÀ/µRêFb›¢8ÝÈúÀ@Ðê€*h `ë´ÐÀ­l(,t±žê@¾þû€°Å¢iè®Ñ©9À°Èb›l­ÐáÊ€P{‹š,Ý®º~+Òv¡iÀ³²¢;žôÚ(bÊ"J Û•"@ˆŸ%`g½†¸'‰­Z©pÂFîÔæ›oʱ'ØU,±ÅGœ1Å_¬ñÄoì1LJlrÉ(œòÆ'«ì2É/,³È,×Ó5ŸYÕb N;¡‰i)h°€£½J-«˜z©Hq fJ ­5Ö*j)+Cv¿‹¬­±J‡+‡…?À¬­ºN×øÜ]«@ @ðåþ˜g^ãuR5§W¼Yæ4Á_ëRBëZT›IÅ÷ëËÁúk¸Ó9€ëì´+>¸wé@¼¸÷Ýï¹×®ùñÈɹ[·¦;éà =H(BƒÑ`8” að†Dþ'JÑŠZô¢½B8ÊŽŽ¦ãô©HGJҒΜ&q€–b¢¥0µ„KaJÓ{Ä”¦ÿÐPW+8 Ù1ˆÑ…!Р 3@ê ÀS¤àâ¸N˜ziƒÈÈ*š‘„jdô«`=ƒ8Æ…Ò¬çH«GÙá?°¤&ë#a•úî*])J5ñ¼Î‰'<‘€uñ¼·ú¢EIp¡ ^$‘+Œa]QXY×a-í³l ?ÔuV²ŸÕ ÿ”™ö°€l eƒò‚Ö¦`(´8¬Žäb7¹yD¶ˆÁˆjb(•*P„ ”¥pEÕye¶;ÉIM²þ3ÜdJ·È­te#Z Êñº¥Íf§™m6H©‘x¯CÞñš·¼è=¯zÓËÞõº·½ð}¯|ãKßùÚ·¾ø½¯~óËßýú·¿þ¯€Là¸À>°y–]Ó6X ~0ô$ìà GØÂvNë‰á_øÃŽ9›‰Î{ØÄ >1løé%¢øÅ*N±ŒYËâ.¹8.4Á­H€ 75J$8A‰Û ¨D¯!ÀÉaER). ·à”¿´(Š»äÖ§âmMn!äo'z3˜ßfÅ-ÛÀFwZ™…‡8l™éq¸j´®lEG‰ÐyÚ©’G°{å ;BñWó:Sþc.ݘº«ËË)_æÚŒ™Ïl泤§³çI‹ Mh›×—$èÈ š’Iܰ“Ýh—:ÆV"õ_æ¨$zŽÚÔ°Fµ¬O]h&•xÖ±FÎ-HÈkrùºWÀîu°-ìbûØÃN¶±•ìe;»ÙÐf¶´Ÿ=mh_k3‹¶9ÅíìTJt¡.å«F“SÙ"'¦8÷ Óî±ÝVD>·¢Ø**N¨Šqí#Ù9ë\Šû׳’ü[ÁWð^°¤€+cà1p@ãG;BÍKW±2EKEÂ,ÁÒ çóò0ó饄î3#Öæ­[YÝ\§'ËŠ¹f.óšÓüæ6Ï9Îw®óþžóüç>:Ї.ô¢ýè:oÒQ0˜4½é$€ûÄRkÚåü¾ÚvQ;í§–ë}üº÷m@9V½FWÏ:Öíõ®ƒ½íaw{eX§yzpܧÎûÚ§÷¾¿ýÖKÊû¹r¹Äq(M>Tn›ì´¼ä#OùÉ[¾ò˜¿¼æ3ÏùÍ{¾ó ÿ¼èCOúÑ›¾ô¬‹'«ñ|N§Sïj=ìeÏ‚ÚÝ’x¦:’[R4DÇç&IN {±yºé&›)Äxn|?%³ß»ì•¦úÁ·¸ðq©} §ÏýèÃHõg÷PÚ¸{ï›_ú³¯}ø;4~T–ýðï~üCQýpþ»ú`w<¿ü÷¯T¼”­vwø'Lý7Ø}êw{ÀäzºW€üw€yWˆ{øzx({à§€­—{Üô‚8M 8 è`ñ& °‚,Ø‚.ø‚0ƒ28ƒ4Xƒ6xƒ8˜ƒ:¸ƒ<؃>øƒ@„B8„DX„,Ø YÖgcØ'‚è„PxKhhM8‚Vø„WØ ö<¢ÀCá…Ÿ†]ø_H†ah†cÈ…œ‚†k¨†b؆eè†lø†t8‡v(‡x‡zx†yȇ{˜†‡~8ˆ€Hˆ‚XˆˆxˆŠX‡}˜ˆŒˆhˆ‘èˆw‰•(‰—H‰¸ˆ™È‰›(†þI4 µPÅU¦x ¢è Ù`µ¥hŠa‹²HQcugu‹¥Vº8mÕ‹ïÐVrŒ$•Wò°W–`W)•Œ0'¬•ƒ…9Ò «ŽâXvAO€ >%q¢ C5PApf 0?UåøSOPÙXE`4@UTÀj€U«¸Š©‹]5‹þ‹e‹o@heã ‹ëoå¾èVÂøÅXú€ŒI‘ɈŒËƒå(…E²%AªS SÀ-ÕŽðS©( ßÈD…))똒P ËhèØàöˆ­ØŠZ¥ÑðF9‹µ8þuI R RÉp‘VIWwu‘zU‘É•xõRž0o8a 1XI¦n½ ¹Z£P½Ù#UWq5 t™•‰PWûœ0Œ‹ü°•ÉvùR/e—8•˜Š¹˜ŒÙ˜Žù˜™’9™”Y™Sw™—éqœ¹™žÙ™™ù™š š¢Iš-eš™‰š§)š£é™­ùšªIšÎa'ô qV_¤Yµ©Y€w›p*UQ›ºñ]Ó5yÝEœØ•Güçw—xà vE[’’„ 0–@Ö|Ë×(©ò-P6B–\A9Ò$6çÆdÚÆx1`1@YtAC¼þIvÇyZóÇœªFŸŒŸFB‹G‚¥6ûÂC%Á§ :6-an§P q ‰q ‚eç†k“ £‚*j$ŸÒ£ŸÜ3Ÿªœö¹œ7v#]Ðù}Ñ3Cs—>E?ÍÙ*Jwq÷¡«f~ø?,‚œð´¢‰†z§¤@:¤BZ¤Dz¤Fš¤Hº¤JÚ¤Lú¤Nzyûâ£YX¥Xx¥¯:V…Xº¥àE¥]¦\:¦_ Xfz¦hj¦€’¦lÚ¦nú¦p§r:§tZ§vz§xš§zº§|Ú§~ú§€¨v*[¢ö-'¦^ЍO¸~Ò~ŠJ¦ºvHbx=‘z©z~¶g‚þX‰š©Ÿ*}Shk ˆ©¡jªÜǨÕᨠêa‚úª°«²:«qÚªJ¬ÊZbCd£`6>Ѫ‹!;!W¬!WiÆê%~&ÃZ‚–ŸMC©h©‡á‘ð&\æy ¦ðcÐg­é½Š­q’|e¸Ie#t(Ëg®ºuo¡dÙê„ö8Zr*@ ðpsp²b(µÒ[‚+ú*qµ°g{ ×q°gFdš¯»c+ËÌ"p̲;µÀìr°¼cgtÓ¯d D–¯øªiÉÚ%Ë &C.†ò¬G4ªVW…™U>Èy¡zŽ1u˜J¬ÀRf·£+"ž³ƒþ¯Ñá,þb  ,‹3e°,Äåg2eRI[+ó-ß"+Ï¡.¦àf‚p++ µøR âIq'k/ø&œö.+·z#2+¬æ³k›·z»·_²gJ\%€¬Gb¥j·üf!2!ˆ{!Œ›¸+æá¸’»¸Ò Û!ˆÞá¢M1·Ò‘«¨j¸ ëMœžºŸ{ª,'1œJ¸(ˆº®{º'¶©ƒ«r…ûº¦{»Þ³hW·V‘­²¥ X»¿·|{¼Èki#'K>ŠrÒz‚žºAË…Œg -K.:Q(«%`æ‘c9–„B(Ч¡Î‰»:á7ÿ樀’ÜþBdŒ eKfСqËâg\„/´¢%&ûuö À¾´R ¶8Vk7Ä“¼ ,Ëû€¦7'Ǻ+~¼‹„q¹¡3*±ÁªÃÁŒ† p¹£°³!о~ã'Õ²±? /ß‚f&qZ¶eË-/,+ÿò;×R,üË-Är´K;/Ãì"µâ‰ÓÀ üÀ!¦3ÁQÁìwÁ?BntB¼ˆñha²Œ‘¦Ä^œ·LÜ4¼9›Ð*ÅJŶ›]n²Æ25ãÆpüÆrÇt<Çv\Çx|ÇzœÇ|¼ÇwÜÆE16‚<È‚Œ£›'hŒÅY—£Œ\¢r÷È5š£Ö%¥Ð»º´ÛºþŠ º,v¼ÉìÈc,¢TǬ;½è{Ê7ÊÉ‘ Êž¼Êj£WqÈS»™œÆVÓʸÌÊ)zÂ- f¼ª‰ŒÊµ A¹¬Ê­|¾-*˥퉥àxÂÍARÌŸÌŸ¼ì¿Œ«ÁŒ *…•‰×\ᜮ¬õ<6aÎÞ<ÂéfxÎêÜÎëìÎìŒÎð\Ïô|ÏïŒÏóœÏü¼Ïþ,ÏÏmÏýÐýÏ­Ï­Ð ]РнÐmÏ ýÐçlÑÞŒÑ}Ïcxxi¡ÌÛnã@®ãA>ãCžãD.äH~äJnäLŽãNÞãEþä?žäMåT.åQnåKŽåW®åU>å[îå\æ`Nâ¾p”hžæ%¸ø”µV|0•W9çt^çsÙ—€y‘}5˜‚Ùç|þç‚I˜†9S„n™†™:%”B‰¥Øè Õ ¥P’ÞPþ åèû¨æ˜žéj€‹¹ØéLéæwðæoeç¤NyÞçx~ŒÇÈWNã.ˆ„¶p„/˜!ò[².ë~ò¡ Á€U\•èXŽÁMér ®XéTp r“–N”üHÆíš^íÝpVJééœê|0êyÀXê&u—ªÎêyꫮ環–3!%A f©ÐRN“ ÒX%yærÀÀ>V^¥Ž3`Tîx“í°ïüŽóXð ïN%=iRõìŒn ZíÖ~ñ_ÅæKÙém.êpþ‹P9R )îwn‘§Nîr _èŸÃ):cd¿Yëu1á–¡¸’r0ÜØþ ñx“6`T@ÐSSpfÏàŽF°TS@,yô¶øðG…ì”>õýèUñXï9Vvà”ÿQïV#OòVI—zÙ—yiòyò` /ÖÖ:ïˈ·`ê–ÎQS0,©=pPBa@ ÂbRµT?PåÐŽPö(ñcTEYñYù›Þ”dÅ”^ÿõ¢>êr.cOöÉ—ªnúhß•çþ•“"¡‰¶c¹¢r? ¡c,± ù.¨Hõ~O“§hùG“ip NeéVõoùÔŽù¯ñœÏñMÉíOéí£_•¤_òi/‘iŸòk¯ŒgyB¶`n§‚e‚þÌ â_ëgÉ ä ˜ )Êþè/ŽUóPB úÏ .ÿÿ„Y©­gÞýCq$KS,ª”XYÕ…¥5]ÚÆï‚æY~÷íz ÐxD&•K¦ð |&£ÒÂsZÝYXm×Ú­~Ãc,×ÜM vÛ­H¼áíÅ<ξÇëŠý½¾çûÃcÛëã D\È£K¤ûKpä»;d”[ÀTÌÜÔÜLÐãÄüTŒü4=EM]@ˆdEE€û„eUpMÅÍÕ+%%þ´æ…ÓäU4.Ff>>VNîmž®‹œ¬ž¼Öî´””·'ÿ.GOW/O[[œƒ/ާ®_”§Ï¿ä÷þŸÇ7( ½|ËChPaB}ÿ\XÐá>Šý*>ÄxQ£EŽz°£Ä† ùqaÆ‘'²QÃrNxÖÄ€–H^4_’ °†  RfJ¦-S.uʱ)T7R½šµ%Ö¨ ~…ª5,X¥bÍZT#@­¡[#µ ¦ÎšXkwÀZ¬EWÒ4E£Ø»Wm‚½Ô.¨{7¯Á±^«N=˨J·R;_þœYthÒšÉr~ºq´ÕÓ«G«i« vňíp\sï‚›²Nwï'¢w‰Æ½yѬݜÀØ.Ÿ°zÉ3kÐ\Ao¯þ¬º´ëñå½ól}Z»yñ–˲/Vñl§Dyí>}ÐÄl U,©»0¡oßð.°§SÐ(òLë½óZgŠ˜â¼¼™~uÎZÄ yEºN” ßï åZ2±6IT”˜`=6r¢ìè6‘Iƒ_6 ëyñrò5Uc:#Ìá_õö\#OyÍ"¥. ðåÓßÉ®ÕÃWõ)þ[ÖÎwŸÖòȆù1z–”~waw³D¤+‘6e%iúy¹LlMØ“™…Œã˜ïFfz5ޤ¸eÊ#ò #ÒÊ&É£¸qª?Òš¦{RÀt‚©ú£>ï£À{¿a¸À+"ŠA ¿0¿¸9½ó’Íà=¹ Á9€ „ºcªÀtÁ”û¼Ð»ŒìŒD•ó›±»o‰°é©ºB̺yˆ#¡Á‡°AêÁAóÙA%Q¢3)ƒÂ)”Â*D3+ŒÂ+ÔÂ,äB*ÜB/ìB,Ã1Ã2üB3 Ã3TÃ4dC0„µÇ C:4%Çȉ°5E[Âøk yG(„JÄA<þCBTÄC$„FDÄELÄBlDFTÄG´ÄIŒDGÄDHäÄK¬ÄM¬¯†Àz³H¯ ÁôÃ/)2AW\’XôV¤ÅW¬EîX¿“øz8Eõiµ?TÅ0™E[$FY„Åa4Æ[DFø3“âù:6C¿`ÆuYÆc´Fe¼Æb¬Æ[ô9\ìŒ=œ´>”ÆU™mÔÆlLÆsÄÆud’f´Š^$qœFr$sLÇ{´Ç|DÇnd‘€Çû‘GzHøÑGvÄGt,Èvt0~ÇM Èq„HÙIȃ4ȉøÛøÇŠÆyŒÈU´H„ÉŠ”Ƀ¤œ‡ôÈ•HutIŠ|þÉ‹ÜÅ~T5šbµðiÉœüH®I’ôI… Ð{Æ@ëH0É&q YÚI–ŸžŒÉ‘$Á«@ÉTÔ¡@;’ÊÃOJ8~ÔI¦ô3¨„ɰäÊ{˜J•ìˆÿ@˵3¸ß¥ÈXšP„šû¤´¤Ëº´Ë»Ä˼Ô˽ä˾ôË¿ÌÀÌÁ$ÌÂ4ÌÃDÌÄTL½œIŽhÈï+Jíè(p ;¸l¥ë¨¹+¢„uàÌÎôÌÏÍÐÍÑ$ÍÒ4ÍÓDÍÔTÍМÌ[5°ûE iÍwp¹ŒÒ=8P J¿®äÍ¥t ÒCú±IØÄIÉl¤\ÌEßTN¯:༲ŒLÕ˜MVdÎåìM–I:þ+ èŒMã¼Îï´ÎñqN yÌj3K}˜Îñ« ^¥nù( Ïê”ÏñÔî,NéŒNÁQ‹È=:HŠÔó ’Â"ÊçC81]%ÚŒ¤Ð(À„ÜS¤„Ñ(ýÃì4û\ ÙÌO*©ʨ‹÷Ã2”ŠÓþAå³)¥ò´À+µŠ, ’ŒJI"T9%GCu ;ý<,ÍÓ“HåTç¡T°T'KƒL•ÔN-ÕùÔ‚@T¬PL=ÕW5UŒIU©ÕUX•O\EY­‡Z FÍÕX ÖzáU|XUÓ;O|V]Vfíí¬Ï* GE¥emÖkÖò(Vf“V‡¤Öú UluÖqmµƒc=¿V]ÔpÍVquWуVÕðÕ ±ÖvµWr]s½ƒyÅS|õ×w­}…tÁdˆzý×{X–X¡|MhT×jeׄ¥Ø…]ž‡%ʈ׊UØM˜xQ¥ÐûtU‹õØ”?‘¥þR’µRŽÕ „EÙ™ÍUŒåWï¤Y•ÙycÙC¥Q ²Ñ[ÍÙ¡½×†½Y %ZMY›íVȄقٕZ¥eØžu ‚½ÁoÙ‰MÚ®ýC£mZóÔZ¨åÚ©õÚqeZ—Ö§•Ѝ¥Z³…[ŽhX¬U±mÛ²}Û¼S°U[oe[ôÄÛ³\SKÛá„X“]W½ÛœÛŸM0ƒµ·\ÅåM¾5ÜE\‰¥ÜɵέQÈåÉ]ÜÑUÚÆí[§ÍÜŽå\ÒÝ[«ÕŒ£=YÖ•ÝÍ…×ÝØMÜÕ¥]I5ÝË-Ù;•Ìÿh“KÞâÞã%^ä5ÞäeÞåu^å…ÞæÞç•Þê ¥ÞëÞìµ^íÅÞíõÞî_îßïßð%ßó5ßô-ßõµÞÀåܽc…ù¥ßúµßûÅßüÕßýåßþõßÿàà&à6àF`þµŒÜ×°MÔ¿]ÝmV­ [TÝÝ•àvXß}ÙÔÍ` ÖàHs`Võàþ`¢…_VáÕ­`_,á6á–¤ŽG»=a¶Ø¾a¦ÚŒ€;httrack-3.49.14/html/img/httrack.gif0000644000175000017500000000776515230602340012676 GIF89aÉuÌÿÿÿ™™™™™f™ffÌ™™™f™fffff3ÌÌ™f™fÌ™f™Ì™™f3f™3™™3Ìf™ÌffÌÌÌÌ™ÌÌÌf™Ìfff™f™™™™Ìf3ff33™3f™33™ÌÌ!ù,Äoÿ Ždižhª®lë¾p,—D4ßx®ï|ßFÁG,ÈB²L:ŸÐ( \H¯Øl2¸`j¿àp¬‹ŠÏè4° é¸Ûf»çø¼‘ ໇z‚7} }ƒŠ‹+ ŽwŒ”•vV< 1žG’H£–(|’©€: 0( µ¡-…n³'±¶/…©¦'n’mÅ;0…·%² ² …—ÝÚˆ(ÙÙ ××µ³×Ù½²«Â#ªó; ¿µ¼Úå×Zc'ëA¤q´d}ëŒÝµwÚþ$ŠG‚˜!;ðfÜ»—àk&¤ð/ Ã†Ýdÿ½÷h:kÓ½ëÖ‡"‰7óìè°‡o `ûJØPA@P枀ê[Âo±BýÆ'bm6E¬)&D]¹Ô õg”à·xº´mYµàff•‡ÎŒ1ð¼‡Ë ÐGÖRØ6pÀÄõrü°0†RuÛ[BH*380Ì # Ã@‘@;ôq-¥ ûñŠ[¶—ÊÇŽó1Èù¦ß¯7hÀÌÀÏ6Þ²‘h®U+…ÝZ±›ÞX2l¼ãF¾xï›nkº»n€ñf+"ssmÄ€ﵯ»ýve^iž³c<@So!ÂÆD2œGZÿè¥`L*çŒÐ |ΨJÔ,åÐl…XSWenÉ’ ‚^"õ´`ƒ'c˜7s‰ð[$XM"žcŽurÕ[4A%K‰bq ”¶ ‹& Þ½ÈØF-†ã[ÚŠq&ô#nçXˆŽDÊs¢Föt¢¦¦ð$…¨€-±Õá•EÕÉœY"\æçk ¥†Jue^ÂU) hJ2“‚&º@âÉ9Î1 %dàüƒT„Mb:¨ka2àf…p"‰ã5 Ü28Ц Ũçb>Íé?f™ží9[/ZÞ&âe¥ú†›Àp€qä¹êj­Ã —Ü —eÍÿ–9ÐëO•u§ˆ-¡J$1€ƒª(c€º@; Y£®0T·UòéB[a‚ g±# WŒ8œgNF± ­S,4æôŠË¯©Nê£ 2ãn“‘%ï5Em»Ã]Ú<ܤ‹8üŠ \Lœ#µ@c, ·&òÊ]™<Þ’ÿT °-ØÂŽÀ"4ó7ñ=¼*Ž7²%¬–Í2 ´ÎÐ|ý•Ãp¬yšf§p«Æ_«Õ#ž ö §äO,`¯ ‰‘sŽ*I‡&šIÿd›¶ß‚G6Ä.&«‘ª´ËÛ1Õ½Z-Î-â€d¶ÆÕa±¹µ70'œÿIùp'!“M(.CX)KÞçÎÞ¸¼Vs 56ˆŽeÏPõ–ƒEŸ|ºŠ–F%ädÀQuÊîL,<’ÃA%thûU×{ù6â‘DÄ Qüø vsörµÏ%4ÁåH‘àeÂà¬ÿSfè˜<Š4pÔH³ ¿±Ž,-È=b¹êA‚w~¹É†T Þ@JÝÊ2!.ÍðÍ" ÑR­àVŠÉ]eô§zôé"RIÖaÂé]Ž1n²CMhP䤀Q úÞ¸bç•çR@»!Ѝy\Fr˪Ѣ–+¬¬¬~±²Î¶ µ5B€|p™@ª!½ÿdÊB$Ë$.‘í¥àˆ÷‹œ¤Ä&ýæŠàÀl€áôä}"K1Œ(•2ÞëW3€‘Ðâ—š7Zj†»{Á¨RÑ£ßUänÐJ_ÞEñJs“Œ&ŠNj>ðÐCf *¬ôà à"™CŠÀKw"G û¤I߬ÇI½#Úxä "¥HC%ký.~´B6°®öY"Š‹¤\cGì@Pó0Ùºì± Wèœ4qC "D YÓŠ;èÖÁ”þÌ¥Etز,Å€ÊØrN9ÊåÔxhdpàJ T%F´òx’SF =Æt¡jg“ñ§9©ÿ¯k\ …45Ï„m‡n?ÊT!‚ÔÜMâYV'Ôµ&tbn˜Œ(çÝ+’c}Zr ¦LÔ‚«Qàú¹xªÀ{ŠŸ ~cÐ9qR}œ©¢–dSZeÌÇd-›ÆƒL¥T’© c NÀÌpFÏ¡ž XÒLwû`$PPiÇA'M‰Ë\“{:,üSÒŸ\Nwy1Pɺ„Â0…î„–GCÄ¥‰\\2›¡=ÞÓ¹t|õª.$ßK.»ûT0Ê>ý`Œ¼MŽ$Í!‰BzV÷hÖ¾ä«Sú†˜*JUIª˜` S;Pà;`áY§ØU¦±ÿ'¬«îºÚ`– F×0‡e߃£ À!Bj¢ M˜ËRÔ²ÊiSJâ¹9ñ.µúi›ÜUH£7™ÅRØó‘Ö½—¶\—n³š;Åhƒj¤Y º#ß´µJí:'sßTŒ6øPtŽñ©íR„Œ†@ÒJõÇXñÊîrß…ÌÅ2Öª™«ñõcÊb׿.€¸Esª4q5^E1$™—23‰M²×MYªEQ䥒ïå]™(, 6ÉG/J¾Ê[®ýr¨ªÊð‰Ù– 5/q——žaež³¸*QFÞÂuy2i˲¿Š ˆ7)¾WÎDZÆ Ö3ÿ‘~Ý” sÄÐkÕÀƒÝ£`­0—Z®ú¬ªu!·q±[NʼÉA:ÉB+kûÇJF+%üi˜ÊK­kð‡²6 òžomOþµš<ëPŒ ´Z4å  D I–nÂg*‰ý$ÁW±ÙøÓµ³™h\É„/cš6?çœ,@@¹pbĵðGĈѨhØ5N𼆖.I®ÅU\úZ@ždJ/x‘™Ù÷Õèà¹*_`×p¿SΞÝËxðš|ã¤Ò+V Çhó”9ØÅA@,µB´1š¦rþì‚T¸!Y]C²XÊpÆ¥L£† Ëÿr+'8gæ‰îR.0ÈËO¤7&k_£cÀåâ sˆÝH9uö BBïŸ'o+0Ë袽Áy9¹;ŸÞL ,Áß5&ãƤwýáÉ'€ë }0Rôs‰…Ãx¥!Ã=ŸèšH: Ÿä.o\‰xÏßW6ËZ[œj¦Aȃ|ÅâN'xäµ› Æ]DÊí‰ô>ƒ‰¨þ‘ÖÕÛû•¨û®•'íub€NÉùq— 'mOŠù¢Wñâ=ÊæÍ˜K\(Áu)6éÊÍ6Žn&HgUÁqÍÓ8¿â{šwwÏF²øÞ£(h)‚kwZ^ìôYfvÙGEõdå-tÿ69ÿåqŽÖ!çÖ3X2=´eX’"7%ðH÷abwa#¶ÆÅöWÊSLˆ`f·[?ÚôpAàõO@G©psÏàyî$¥GžpN•ÄB`F1#dÐ3g÷~XWä3he A",¥ó]ÄZ¼%•Nèe[å( ?¶/&•¡$sÙ  ›fb$m Y”âsØF&^Ûð .†ýGT2{:¸Ci·f>˜ns=³Z?åoS! C»VdWøæ–Nµ#~¢¡*®2BUøa+оPqµq‡¶B=>Uh#P”‚·$ïgzæ@E>öàp§qTe$Ew¥ÿ¦g‰PI¢nBq°+fá-Op±¸ ùÕNòå÷Ðwvt|ÒU%q$k#!‹/0óc~$"2:ãæ‰M ×€ € F˜¤ˆ²7{Íe…˜u`g]×b‰i•Àx$–[ôwà ÜH*Â6}ðE_7nH êƒAÈŠŠÇQǃ8 –6 @½Hˆ* Q;h"B`LPäPf0lÀlieÙQ‚çê(ýØ$2d  Hgt-iÜ&i+E‡Ôò,ð†>iiTv|ì‡`ŽAºxB1-g ¤ù “ÔI õŒàsG(PNqx<8ÁQ#)uÿ×e:§g83 )L&Nîcöƒ ГcPVôˆ€“pC“Õ†y¿ä@O3==Q1qŠ•uK>Ž!Ž*ryXH ˆ„¢œ ‹*hr8:#HPc²œƒ·)_ q¿%¥¤OK.UÄB’¨6ºƒk:ÏÕHTpÜ‹OH…{*á¶.yžVªÐ§’—ö–PF$¨©fÅó7îW'2OÑ OØB¡ÓDÆ$LºØ¹8ÿÖ¾qrÙû×Ñ•6JeÙ²÷b‚ ð 4ÜÓ!Ò«2ú¼a‹¦ •ÏžG’,iÃI²làÕO›j QÞ4É‚(Œe¤²ÈñçU8‰¤A5sô‡†LôXê“UFºIhˆ+f­ &ˆ`ÿ B ¥˜‘ j” ÏR£&6" ÊåŸZÝh‚tUd”§/>ƒôý‡É†½Y> lô @<+`2 –µÖ" ‚|L˜“­Ö( Žò¼ ‘lZŸ Œ¨á ˜)#ÓìÝÇ &ÕTÞS®Y·]ETamFM8xš%à]ßQ˜È·Rš]S‚“; ʃ!€•>!¦o5¶ø·›lÓÿ(HÑT R¤ÃGZ/θ£3!`Â+PrÉB¥©£ßEÈ”ÆID¢PJõqfB¬uM1Ÿ4¢Ð!Pxçz¾ôHýàJ ð!ÜQÀ‘W$9Q.ŒôÎE{ÝrÊR]=CÏ fyqìÉ&Ki“Ü %o &7PÙÜD:|Î‘Š„''+ØH TU¸ˆ%!¤õ” H[Á§™§|kAÊ51P^0Dà©ÆI2e F£S0w$¿‘³Á¤b–iÔ€†K…]× g7ÍЩ4TÎV|E…%B R¶W6R¢0ð„hËuQd8klÊccÿcb‚?4Èci*ÙTHeBÚÛ`ÂLÅ%¶žNâ.#k¨(ÒŸŸAräL"=â ©»Ögióô Ø‚dH™Ã©§e¨#>7í3¨–,±Û'ñ ÆaáD #±øpEºú…ǰ^9rD¡¢ÄÆÊ‹Ÿºª•Á²' [(Q$¨uù"8íT쪿8qTß|n¤Òpð²mi“ e(ˆ àîW3‡&hS% ò3ÄŶI•— ù2)Fõ7P$š–d81|RÄ5mŸw샜Àód•E+©†ÒÚ]LhGÆçh²çY`íܧsÖàœ 1A´îÚÏÿº À8Â3Mm„ÃŽö°Û )ó,MµÈå—UO›Îêe9æ¯xÙ€ÒMÅJR¿ðŽC¼—fÀ׺?CGIÑŠÏ[L«; ±Žø¯²–ïÊËm2ÙKôqÉ•P¨‰ÜÑbuÐ2ýdEw5–G–©`€‚Æ0ALÜ&çÊà!«úJãEXf¡œSdç°JRøDˆp)‚P9’ÎcЄN(Ir©È¼Ê!‘±n vãH¢`w©Qg…û@xÔÇÿ¬ÇLAÜý ÁŠpÇn]׊’‘´i§þËËTRRÁ{8Ê’ÃÔB… i(ÍQ|µ­>¹Á áz]*ÿ(Õ}hÂ_ãíh_òª€Q°Uf@îÙN6ŽÐbx%g9pŽ—ž‹Ôä;÷hÕWˆU™~˜IˆçA¢¨ø!˜É@Hk㘌ˆÇ£ÄCo¢Ú¿®Å<£‘ >âYMD"V°ðå¥m…FÅ ÅF*dYТGŽ1êhËovò`aîVÙ@ë<˜1»¬¡îPÖo¾´º!Êi<Ëeøê³!ÍIStŒ…Eƪ8@o§šž»'¢Þ½è2ü!q™U퇩Àš“&ÓÀdàÛñÐr>6Ll^Ù¢„¶Ã¡Í\´lgo6‚p]. ÕËïÀ1ÿÂ+êæ§ø’Ñ^ªÊ;æêœH¬D×´ ‚xg@\˜WÜ%Ðk±@,Ù;¬=òÕIÿ ÐF;Éh7‘’ëøÁQõ´¨+Ð*]…UC{˜_«äq¢ÖšÂE⊠[È”$ÄZ’9 Ö½¡˜tÌæ½‹ÊÐjÚü o·:Ã=Ù `­J>©6¨™†˜šÅ™l w3óEj) Ó oP¼ß!… ÙÒÉ÷ƒ>2\Ž&ÄW[±ºAŽ»Ë›Z… V)·/̪&pð)ÊÀ—Ô¡Gb?Øvá-cÉ’o‹³*ûœ!æ4P47sn@C«9Ž'c"ˆM‘è(Ú3лXœÿ]NÈ!wXdÝÝê2€÷*·¦§«4˜éb)pt(EkÁLb‚p ÄÇX—í½gJì㊯íL$ùáp¤Ô¶à!ø™Qôd€ßw mLQÏë씕˜kvÀzg9Â㊥¶A§ÁUè|À½*Óû¤-Ó[1SÑÚŒ+¨'f!bÙR.Ç›g-@ƒ>|8&}L—s¦nu#éP›õØåcugddðJ†4ì$–T¯öz ý2 ¬ƒ\CR¯¢@!ÏyØ—§váPuØRM†ÓŸ5—¥»W6ˆ;,=¢Þ-tÝ_qXL ^ÕrC%<ˆe‚Yê×\ášÁTÙ‰RRŽWa ÿ-êóUÔP£–·,Ö 6²e}úÒQŸ1SñăDuSMHtq‘-Ðä>Dw7‘¢Q9ÃR‘ %†HB€¶óP¡bP|c'²ņkYe0÷C!³×ÜÀex³@&˜zF±‚åÁ5ƒ>¹4„òZPƒ3ˆ:ˆ‚ ½DP5)1H<¦5»¦ ·G/^ ç|TÏòq÷A1†³æ…xöJ8ÀYÑ&i¡‘YÄxí²e….w… P¡„}gÊ2UDþgU8@gÝ@`®¦`–b~â*`50f°…lq’L¡€SE…t<WY“€{£ÿð{žH§Yý&"¢Q•¡‡ ‚Y“0j?@H™Õ!"yCÃ#0ÔxaÑYy¸B Dt“¶°BÏ$±8;7"U›èi÷}pD²<ö‹ò–~赉;ç©ä0  bŒ`\ƒüÐE!3…$Ö†[ÑUÅ‘ &ùæ5QG,7OëCZkg3„P}Ià+ã &Ã'¹Wt‡–DÖA"ô]£%v3+€gˆ'£ba¸WÛ£„à³ð·€È3FàÁ G±~Æ•+`øp;æ] ¡2°`tDI2»*¿g0"˜3aa:Ú·˜B‚!ø-unÑŠ‰ÿ89z§2F"ù'‹—O° *d‚C× ½8NŒp_EÂSðQA ±ƒ ¡V1uÓ3U°gÛfdð7ÇHs½3aÑH×¥a·X<äb`'7N›Ris)ç…EÚÒcç(s-¡^° ßôY¢pÏèPøxdhñ‚;4kd¶•gd¡£ Ì$9dz’ƒÇF åU‰ºee"cà AH…¶b˜¡QšÆaF6.±“£F†yh $Ì„†®ãêÈw¨,3t`AV¿¤vJ€2í7‘c¡X&ÄyæH‰¤)5†UÓ8=s‡Ks1 ÊEj˜Ójd­H™ªÿSWÂ=³´RÀ¨œ #arf_›A'8fvKF!s01¤Es™õ#C’Wv‰3‹‰ÒG¦Ò‚# Xˆ–¢RHÄ+ìàˆS¢ Vd¦ö!õ€ÙF†R0j65t‚n¡%;¡"bvªScÛ({½seEp,X0´<²6]Act0Ez)!chÈB;BQ÷•â@CøE/IòïãqT7•P¥7Å´Õ/ÒC–½Ä}ý [*O¤¢ca]1"ið„%(„M²1ª’†^@… þè•Ø“jˆ±eQ9¶gíá"•è )ØØ" o:‘´\!SHþÿt}¡mañ‚<åŠ[5N€Á¡™!›UNP-æª!,–#O“³pÔC=#V Ï)“q¸gæøU~©\3aæV;–„rœÓÁ&k\r~Q0?ö˜t]§vú;2sH^‰ðùx— Kf+"@œLågWÅ{…¯*Œ™–òk±”–[F±ˆ Êê¤û§*(U(¡ ‘ñø›ËR ¶ B•D›–AmQ!«kU°O—M¨‘yèªLúM¤äpУ(€ÑCE3ôk„¥j¨Žp¨wÚ®ø$ÑÐ6ˆ&~§S‰ç&òHkRŠÁ­¤Ò[–˜y‚"bôRåÐ5„,Mÿø‰&…9îÚ‚Ê(Çök)·GZ‰T)yâ|Qä%<™)}:—PàW¬6":3Qw=ôj*-è‘-Ø@ûW;‚ ö²æ…>AåÍP9i›r °Zh¦ù­äx›’YSkh+ç;f†«‡/"™ÀúXU]ž »?a2ùøUöI‚d£^YÄKDS!jU<“À"ù§ÿ°yʹ³<˜z ;¿cرÒåuÙfqaÒ"…Á‘a0’/×%ÉbŒjò˜'·Ž™e{Õ/¥å?CñxåulQ´Õ)sÒ².´‘Ü jß"¨¯màBE…¼¥ê)ÃcV¹^ÿ;r¤É.J[,8hÙ!òòÕ?Þ?l'a°C!¢6·ÇI+E š\RÒpbÏÑFÖvmÐæ‰K=¢7Â_'›FcÕ@u L,©€ :­\!ÍF;httrack-3.49.14/html/img/android_url.png0000644000175000017500000010161615230602340013545 ‰PNG  IHDR@µ6E ÊƒUIDATxÚíw\W×Çgf{ߥP+ öN°w‰¢ÆØbרyblѼ˜ˆÆ^bïÝKì]±w°¡"ˆH¥,Ëö¾;ïçq²5F}Tô|ÿØÏa™™ßÜsϽ÷‚@¤ÔBâ%@>¯;ž$Iò¿·=MÓ4M¿«=³X,Ø3MÓ‡/5‚¼KݲÙlŠ¢^ø>#éÜÉ ß§(ŠÅbsÉca Œ oØ62M¢\.÷õõV«577W©T–Üæeê¥iš¢(§Óù ºtéâííMÄÓ§O:ôŠ“Vºä~(Š‚£¸þ‹$I8è;t¤”!—ˇ vìØ±¼¼<‡Ã"),,<{öìØ±c}||^§íuss«Q£†kS F5:v옛› >ù“'O:vìXµjÕ’¶ëŸÅšh×?»XÃŽ Ÿ—ÛLQ”P(:thff&ýròòòÆ/“É\{ÈÅT'‘H:uêT¯^=W²Ùl‚ ¶lÙOØ›Ýn§izåʕ̮iÖ¬Y¯^½Ê•+Çœ!4¼AT¯^½W¯^®}u…B!•J_áÃ#È'# eµZív»Óé¥a·Û­V+/,,¬dÃm T*mÓ¦MtttxxxI¯ZµÊn·'%%5jøðá©©©v»}Á‚®†~òÎ; ïÞ½k4Û´iãz ÿüç?&“)11Ñ`0tíÚÞ1b„Á`ÈËË«^½zÉsCO¿÷KDçÎiš¶ÙlL#éŠÍf£izèС%]VŒH$j×®]çΣ¢¢j×®]RÀ+W®¤izýúõA4hÐÀl6Ó4½hÑ"fØm›6mhš)^¾|ùâÅ‹A„……±Ùl«Õúã?±uëÖŒŒ ‚ š7oNÓt»víJºß!þÆÈ'ŒÃá`±X˜2e ›Í.¦²Ûíl6{Ù²e«W¯.Çb³ÙN§³Q£FcÆŒæúÕì7H’\»vmI½APêÖ­[µjÕºÿ>±òóó ‚Ø¹sgLLŒD"áp8/^$I2..ÎÏÏšßÄÄÄZµj-Y²$88˜¦é’'€F>qœN'›Íþõ×_ÿýw6›m·Û]åÍf³OŸ>=fÌ‹åû…-kÕªuäÈ___³Ùü ÷þåp8¼½½»wï¾k×.ø“ÙÈùùùwîÜ¡izàÀ5š2e A­[·7nœ§§'MÓ, ^ ‚àr¹åÊ•«P¡B@@@ddä™3gÄbqÉvŒ|âÀ´ Š¢|ãÆ ¦v:,+##£W¯^Œ;íªÞððð'NÈd2½^ÿêh0xÅŠUªT‘H$ÑÑÑ/쯂;Ý¡C‡uëÖõíÛ÷Áƒ,+==½°°þEÓ44û'÷ööÞ°aÃðáÃ[¶lY¦L™&MšÀ8 ùì4L„ÉdêÖ­[~~>ã*Ænݺ¸Žî2ê=~ü8Ó0þc#ODzzzQQÑÁƒy<Þ šJвÛíuëÖݲeKttôÖ­[][é¼¼<’$ÝÜÜìv»¯¯¯Åb±Ùl………AX,–—õÙøë"Ÿ‰#Íb±233{õêuâÄ §ÓÉår tóæMW¿dV³fÍ#Gޏ¹¹™L&‡S,ôõž¶Ãá¸páÂŒ3¼½½M&—ËuuÈ)Š¢iºB… ׯ_×jµuêÔiÙ²¥ÑhüñÇ7oÞœ••5~üøÃ‡¯X±¢V­Z“&MZ¶lAsçÎݹsgvvvãÆ333/\¸@’d±éØ#ŸQ@‹ÍfŸ9sfÔ¨Q\.766ö?þ(¦^š¦[´h‘àííMQ”@ `³Ù"‘ˆÃáp¹\.—Ë ¹"‹Y,V»víÚ·oO„@ `±X ˜Àb±-Z´nÝ:.—+hš¾{÷njj*A½zõZ³fMýúõüñÇñãÇSµk×®/¿ü²zõê<ˆˆˆÐëõŒ7Á€ãÂÈçx˽{÷Þ±c‡k£ ªH$š5k–ÅbI’¸sçŸÏg±XJ¥òñãÇ0á‘x>sÒ¤I0R‘j‡ÃÁápvìØñÛo¿ýã ÍWÀå…¢€‘Ï”*áý·XwÚn·Ã;‡þ bÏÁs~ál'["Ÿ¡€_±<€YèÚvÝòÍàß§F3àòA^ù0êÔ©^)­fÖC"Rê`«T*¼ RZŒA,)½àDA#òA\èÜ‚¦i‚ _6¦E’ÄËfƒ0\0 ‚|0óxl‚øk®Ìb¡iP&ítÒN']L¢4M$ÁfsN»ÃAÛí8œ HÀwîä;‚ ívI’6›“¢(‹¶Ûiš&‡ó_…3ê¥(Âd"²³3ÜÝ}}}…åÊq±F÷/`’ œóæÅÖ©ÓO¯Ï»víI’©©ñîî^^^ÒÔÔ §“ˆŽ\¿~³ÙH’#`‡(,$Ö®ý­M›M›†”)C³X(`)ÞÁ|Þ%ÿ'&I‚¦ î›í$³V[`6ëtºt‚xJ’EE9A˜LOy<¶ÝN>Ï@ÁbÑ<IÓf.—f³1N† %„çR&’fþ¯\h‹ !VƒʨU«y… !ÇN¡PXßé´²XE±I’ i§ÝN³ÙŠr<3 AþEQZ­z{{‹D¢—|x[Ó4-ˆ çlßþë„„ƒ Dׯß"#ã~Ù²AåË×ü8W à„Êl&¹\±\ÎJOϱX,i0Ðyy&‚CcÎìÒ#¸²ϳ“”üÂ/L†ËJÞø:¾zYœ ³ÿ’¾"ÙÊ¿Z°öê]½æÇŸ?mßp'°œ Ó¿ç™Åb=}úôñãÇ<Ïf³ …B‰D?Á»0 „ýÂ…fsE‘&“Áé´[­F“Ig³YN:-íÎŽ k×òôéñÌÌëµkw k¸dɈʕ;‹DnÞxútWëÖ3` ΞÃá…BNÇÜv$IÊår³ÙL„H$"ž—c’ÓCޏ;]…äp8t:Ý_J¸d/¼j4MK¥R»Ýn2™`é™P(¤(Ê`0€8—Ë}ÙÑá$_ç÷ i>hµÚ7’Ãá‰DB¡ ›ÍWõßÞ4MËår§Ó©×ë1ÜøÞ\hÇãñ 2Ãÿ(ˆ’#NŸ^KDƒ­I’dÊA$Áb±L&SZÚoï*ן>M-[6óÞ=J¥Ê×ë³ÙláÓ§'ýýƒ8±Ý®'IЦi.—›““sëÖ­ˆˆ@ ¯ÝnÿóÏ?CCC ‚¸xñ"Tvãóùf³Ö1‡‡‡gdd¨T*xŸ¦i‹Åât: E‹-þmÿ‹¥[·n#GŽŒŽŽÖh4Å."›Í>zô¨»»{­ZµÌf3ŸÏ¿uë–Á`hÔ¨ü™”””™™YRº‰dàÀåÊ•›>}:“pðåÞàòåËÑÑÑ6›M.—[­V³Ùüšâ—ÉdwîÜ9uê”Éd ŒŒ„Ò®4_½+š¦y<Þ®]»ÄbqË–-M&³¨Åü¿Ãn·[,’$­Vë›9ϯëBCIQ/‰“Ïws:õ%ˆ´Ûm¥6iÒ!,¬Ç±c«ŠŠR:uêÏb‘uÚ±„„„Ñ£G_¹rE"‘ØívŠ¢Ìfóˆ#æÌ™S¾|ùU«Vñx}ú:thÖ¬Y³fÍ:zôèO?ý¤P(òóó{öì)‰V¯^ݽ{÷ï¿ÿ~Ïž=2™Ìf³ ­Våp8z÷î Oðê+V¬(“É®_¿. ;Ö¨Q£nݺ8q‚Ãá$&&r8œjÕª1räÈ“'OΞ={ìØ±óçÏ߸q£D"áóù—.] Zµj•OÿþýŸ>}Êáp¾ùæƒÁ°råÊ~ýúýòË/ëׯ÷ôôLII9wîœÏ÷ß/ ëÔ©3pà@±X7pàÀV­Z­^½Úb±ôë×:Ї7 )))uêÔß‚Ëå*•ʘ˜˜eË–QuêÔ©¡C‡¶lÙrõêÕ!!!½zõJLL”J¥iii›7oöõõ]¶lYÅŠ‡š””$‘H®]»vïÞ=èQ÷èÑ£Fk×®õòòêÓ§F£¤Ç‡1bDXXØ«ëŒ ¯Óëõúüüü‚‚«ÕúÆáöëŒÇp¹|Š¢ø|IR2ßr8.—çt:ªT©¶^fæ/¾èT~ýúýlöAOÆá4((¸g³™H’Å<~à·¯qÅ¡ÆÔ<„H’d³Ùk×®­R¥JAAAÏž=ûí·råÊq8œ+W®ìرƒËåîÚµËáplذËåFFFfee%$$tìØ‘Íf›Íæ=zx{{ïÙ³" p)ív»»»{hh(dâŽÿå—_BBBæÏŸŸŸŸóæÍ   Š+ÆÅÅÅÅÅ]¸p¡Q£FE¥¦¦nܸqܸqz½¾M›6³fÍR«ÕµjÕªR¥Ê¡C‡† öðáØ˜˜:tèÐÁÓÓšz¡PÈçóårù—_~Ò¾}{¥Rù믿víÚuÁ‚V«µbÅŠUªT¹råJdd¤F£a³Ù6›Íjµòù|×Kát:9EQ³gÏnݺõ¼yó”Je³fÍnݺµpá¶mÛÚl¶ºuëΙ3G­V7jÔ¨ZµjÛ·oˆˆ€sàóùóçÏ Û°aƒÙl®[·n``à±cÇBCC)ŠZºtiddd^^D_P‡oEQîùÿÕL¬çá2kFFŠÑ¨ÔëuÉÉÉ‹ñéÓ´û÷½´Zm^^>—+ÐéT*•N.¯`³é ¥ÓY—Ïç;6‹%_¡(£RåZ­&‡ËŒ¬€x«ÕÊf³ C§N\c§o0 úôéS‹Õ²eËéÓ§_¹r…Ëå>yòD¡P8Ž{÷îUªT‰ËåªT*FK’¤J¥R(±±±f³yÿþý"‘H©T‚Ìè¡aÆüñÇåË—Fc:u|||D"ÑÅ‹ïß¿_§N‘H”œœLQÔ¨Q£ìv;Ø ô¥¡m‡¾hùòåïÞ½«P(&L˜0gΜ;w6hÐ`øðá+V4 ð\³ÛíEEEN§Ód2éõú¢¢"¥R©R©ÂÂÂl6ÔÈÌÌ„Ÿaׂ LŒÇã)•ÊÌÌÌÞ½{k4šÂÂB×´iÓcÇŽA…‹¥Ñhòóó}||ªW¯ž’’a‚ CNNŽR© ·X,À`0ddd„††B‰°ÜÜ\H˜Œ |'¾ôËJ=¼ÃÁé¤u:Ͷm1<×jµÌšÕ—$Í»vͲÛY$i¹s'ž$ ‚pË¥ŒFЦm2Çd¢ ˆ“Íf7‹<<}ššš:dÈ”””I“&­\¹266666¶N:ëÖ­6lóà) ‰¤R©Ùlö÷÷7 #FŒ€®oRR’P(?žQQQ±±±ééé+V„2ó?ýôSXXØŒ3‚ƒƒ?>nÜ8???(9[³fMCèR©zÑwîÜéÓ§‡;©|ùòJ¥rذaÒ¿wïž›››R©,vÙ‘·l{ÌY‚1…w?ž E………ÙíŠ";uêäáái4RS………=z”ÚªU+ƒÁ¸aÃúôôŒ¹sçìÞ½«{÷è;wÖ®]ûöíÛuëÖ5›-Ûf³ñxŸûöm///>ŸLffæéÓ§ÃÃÃΜ9Ãf³“’’Ê”)k0+V¬˜œœüèÑ£  òááaÌoÏb±ôz½ÑhlÕªŸÏgܼgÏž5iÒ$ Àf³Aû¬T*[´h!“É\rss+UªT»vm«Õ {3™L­Zµ‚±Ê/¾øâáÇ'Nœðöö:t(EQõë×wwwoÙ²å½{÷8 ×ëçÎÛ¦Mè6mÚÔÓÓ300ÐËËëöíÛ 6äñx̨:<)Äbqtt4Ì‘Éd&""¢N:‹…¦éöíÛ“$¹oß¾øøøÈÈȉ'’$™Ý¾}{½^¿sçN??¿E‹ùùùq8œ¨¨¨>|øñãÇ#FŒøæ›o¬V«J¥rwwoÚ´)AUªT¹~ýúãÇÛ´iR¯^½óçÏC5½ØØØªU«Z,xðÁ`U—.]t:ÝÁƒoܸQ¡B…… –/_^£ÑT¬X±AƒqqqÇwssûí·ßBBBH’ܵk—P( Ù²e‹@ X°`8ùùùU«V­Zµª§§gdddBBÂÑ£GÕjõO?ýÔ¸qcµZ­R©Z´h#Ã(ã·„Ífggg?}úÔf³cþopaÉ´´´—='Øl¶^¯Ÿ1cF`` F£åóyÁÁÁN§óÂ… ^^^>¤(ªK—.{÷îÕë $………A R933#444//ÃátéÒ… AT › -‘H˜F-‰ C±ÇMÓb±˜¦ifN²ëÌjfçž…ÏÂ<'‰Ìf3—Ë…Ô,‹9(MÓ‰¢;Åsža¢2ÈŒF#ã¤Àt1˜“¨Óéìv;Ì…€(7‡Ã9ðD€Ó÷^«ÕÂ!àRƒ n?Œ„‹Åb6›m±Xø|>üØÅNfÀÑù|¾Á`€þH±ÏZ,NÃB:îܹs999<Ïn·Ã”/X c4iš†H˜Ùl†g™V«åp8"‘®$ª÷í[`.—›˜˜˜‘‘‹ÂÃÃ}}}m6Û;^Ìq ›Í““’î_¾|¹yóæYYYB¡Ð××W«Õ9räܹ³-Z´bÖp¹¼[·n™Í¦ôôtOOϪU«j48?p¡á&sýJEEE®ÑÉ2︺Ð0E opt!ÜÂDž`”¢»LŸ™yfDH˜C€gN”XÍ3¨`Æó¦Z­f<莟0Û NO®G$‚™MÅD’á®6O‚0s%9Àœ×£Ã6ðX)ùY8±¢¢¢ÂÂB£ÑÏø¬V«e¶¯LQ”Édbù^øs oÊ*6µáÝ#Á}PTT”šúÐá %‰§§§ÓIÃ:„´´4Š¢‚ƒƒoݺåtÚ{öì©Õj\T¤¾s'±J•JU«VU©TV«µ˜ßU²FÛ •󲱊’7±ë–Ì‹}œyßõz¹nóš‡{õ©2F±0[É]ßtݸØá^öu^}ô~¨¢££Íf3ô¢]õÂkøêŸ yË(t¹råÀ‰sþø×ãÉÿØÛÎÏÏ?sæìÙ³gž={&—˳²2ããTª¢k×®=xðÀb±øûû_¹r588877W¡P\ºtQ«Õ$%= "'''>>Þu ò¡_ Gýû÷‡5’xM> ÍãñÄb±H$‚žÎG¡_Õ†…,­[·NOOãsõ÷÷?}ú4ÌC@ìƒó–Éw+cf þÍÛó— ˜!99™YžZ,‚B¸¤ž`NÅ54Oˆâ† ïÞ!ÿGóùü·q·hš†X‚ ‰qÑ·ì}á…F#`”‚|¼Æì RŠŒá%)ÅÆ‚”b¿}Œ AÙ.6~‹ H©0³ªAÒ'`‡ƒWAJ«€_QøA]À8¯APÀ‚|ãLI)ÅÆ™X‚-0‚ (`AÐ…FÏl~Œ È'#`¦äç›}ößyo@¿·¼x“!^ÀŒ ]+š¾°º)S+ä~YYT’$…Ba±7…BቴAúU¨äâz¶ÌŸŒát:¡ºn u•ð&C>¼€¡ÌÜÓPU*q8œbRd³ÙÉÉÉ………/Ó0äš…R—ÅÔk6›ïÞ½[,ƒô½{÷ dÉë?eþ•J_ö>‡ÃÑjµ7nd±X\.—ùV‡kÂårAä sŠ¢`KøxAAÁ–-[J~SyO±eddL:Õf³ …”””Ÿ~ú jgݺuë×_…Ú“ 0»ÝÎçó-ZtíÚ5¸§‹ùP™zåÊ•+W®”H$ð_ØŒÏç?{ölêÔ©Pâ êÓ:Î_~ù%==*qÏsSCejÆGeò•3Þ;<˜ÚÖp¨Ä|„ ×kf9ÎܹsÅbqnnnLL |D,oذaÏž=b±8&&fÔ¨QãÇ9räÑ£GåryRRÒ´iÓ †Õjõ÷÷OIIÙ¶mÔXÄ» ù-°Ýn÷ôôLLLÌÊʉDñññûöí{òä‰@ ¸zõªÁ`€öÊ^ …Bh™¥R©ÍfcÞaTÁf³•JåñãÇ?®T*Ùl¶Óéäp8Àl6‹D"hÞ)Š‚Ò<O(‚E"‡Ã"iR©”9¢Óé<Nœ‰Db³Ù‡T*…¶Q*•šL&(_èt:…B!‹Å2P—¢(@À<¤Ré‰'ŒFc¿~ýòòò’’’˜æ7==ýÉ“'l6ûîÝ»íÛ·?~|ÇŽçÎ{ïÞ=‡ÃqïÞ=Ø 8ØcÆŒ9räHVV¶ÃÈÿ‚XKåÿ|||©4uüøñ-Zë™CO¨–* +UªT©R¥“'O&$$„……ñùüÿ>)Êd2ùûû:ujРA*• —Ž ï»×4$$$555''G«ÕöïßÿÎ;P »Aƒ[·n½{÷îæÍ›‡ ²téRƒÁàp8Á/¿üÒ¥K—9sæèõzè4‚c|æÌ™Ö­[·nÝúôéÓ6›ÏçÏŸ?_,/\¸°jÕª:N.—ÿñÇ÷îÝûí·ßÚ´i£×ë¡;zõêÕ>}úôêÕkÓ¦MP<~È!K–,±Ùl ,¨Zµêü!Nž<™žž¾iÓ¦ üüóχÒjµ›6mR©TÛ¶mëØ±ãâÅ‹Nç¬Y³Ú¶m»mÛ6Fsüøñ€€€¶mÛ‚GÀf³5Mnnn… @Ì®°áͬ¬¬¬¬¬¸¸¸û÷ï×®]2›µÎñVC>@ Ì4¡¡¡{öì¹té’§§gÓ¦MÿüóÏK—.‰D¢2eÊœ;wŽÇãmÚ´Éh4>yò$==ÃáDFFz{{wîÜy÷îÝ)))µk×ÖëõB¡0))©°°°bÅŠA¨TªÔÔÔråÊ¥§§Ïž=ÛËË«Y³f´Ùlñññ={ö,[¶¬D"ñññ±Ûí‡#44´]»vV«õòåË®GLKKkԨљ3gärùÀË•+—››[¶lÙ¥K—6kÖlÕªUàòåËåÊ•[·n4??¿~ýúGŽ¡izâĉnnnAtìØÑ`0ÀK¯×Ûív({ <ÓOþܲeËÁƒ~üñÇðððãÇË.FÓ´›››V«ÅÒØÈ‡i¡:v¥J•ÌfóÑ£GëÔ©£P(üýýwîÜY©R%¨þ®P(ø|>ŸÏÿñÇAoÅ10ŸÏ¿pá‚J¥š>}úôéÓ /\¸9}à( yp¹\«Õ »bž#:z¶r¹Ž8eÊ©T:dÈQ£F=yòäÇ<~üx``àâÅ‹CBBöíÛ7yòd¨|-—ËÙl¶››ÛO?ýÄf³'Mšôõ×_?xð`ìØ±·nÝâñx®v!å:\s‡ãZQî?ÿùϪU«j×® õÁá}ê9 |»ÝŽΑ&`‚  Ìãñ’’’êÔ©c·ÛkÕªuæÌ™êÕ«“$Y±bE£Ñ8`À€~ýú …B±XlµZoܸÁf³4Mpp°Ùlær¹jµúĉ111±±±±±±S§N=rä‹Åòöö>zô(ÇKIIÑh4<¯råʇ&I2;;ûÙ³gð€‡Ã©X±¢Á`€#ŠD"‘H4fÌ.—;uêÔðððóçÏ_½zuÆŒß|óÍüùó“’’òòò*Uªd·ÛÜ­[7ˆ«9²|ùò3fÌ(S¦ÌéÓ§Y,VFFãç‹Åb§V«G@@€N§;sæŒD"yôèQBBBhh(](%bû/©«Wló–Ýn¯W¯žÙl~ó)öÝív»›››··7LbAù`.ôçÌ«›èÿõÇä #}ÖO¸·“ªùß ØÕ•uõŠÑ.¶«×ä³úÝá•íÁÂð@©³!æco¯C¢ý‰ÙÌÏ.t)X,­V›——‡Ó¼°Œ”>ÃHUVVÌ{ÁkòÂ.Ö~aôåeö Û÷7ØÏÛØ¯³Ù˶wg*öÁ’ãC¯Þæ£VoðþËÏ] Š¢˜æ÷ƒ\´?”ýß>ð[†X¡‰2^8dâúæ«G‰_,Q‚cAZ¦ÀdÒaÎòË1'Vrò3'”x>}ªä_±æëÛIÉïÈdºc6€Ïº~Åb1ý&³3— ^™\<®ï3çÉì ùL[à·ôâ` R©T(ÌÎÜd®ééùýÛC¸¹¹™L&³ÙL’$cîD"‹ÅÒétÌá8ŽL&ýhµZf"'sdòfX,­Vëz†ÌK©T ïët:˜ŒéúðƒÔ"°ÀÐn·«Õj×CÀN„B¡H$‚#2@²8ºÕjÕh4pzE¹¹¹­Óé`J)œ‰»»;È^£Ñ0æ …B­Vã}üùö]'B¾,eìËlHòváÂ…† jµZXôçêþAº)ø‡Ã‘H$®Êt¥ØûŒÍår—/_~÷î]HU ¶P(twwW(7oÞܲe “ÝŽÇãM™2¥k×®111Z­&?3ç)õN:Õ»wïž={8p@$¹®ÔUäææNš4)**jìØ±ééévËõœE"ÑÁƒ¿þúëèèèõë×s8f®%E$Ý»woĈݺu[¶l4¶°JŽÞ£Gýû÷C¸DóçÏŠŠúá‡rss¤T*•'NŒŠŠš={¶Ãáo™9Ï„„„Õ«WÔoâ5Rÿ¢ýÉØÌë[Ï×Ù«T*»ÝÓý¡¥år¹Z­¶K—.°HP"‘?~¼wïÞà‘2k!`]“)Þgž 99yüøñ\.—Ï秤¤Œ7N 8Ž%K–4lذiÓ¦ .„åMl6[«Õ¶iÓfçÎ[·nmÛ¶­N§cnz‡Ã!“É6mÚÔ©S'‡ÃÁçó{ôè±páBH ªàñxOž>žIî‰c¤Äç7ü¢Ð$IB¦ F“——M¥Ãá(**:qâDVVô¡«l6›cbb†¾cÇŽM›6AjÂÂBHd þí”)SÌfó­[·-ZtåÊŠ¢Ö®] "¼ÙÙÙ?ýôÓìÙ³ÿý÷uëÖ­\¹rË–-iiib±ZZ@°`Á‚ààà³gÏ.]ºtç·º{÷.EQÿ÷ÿçzô_~ùÅf³]¸páÈ‘#Ç_¶lY||¼Ãá˜={¶D"Y¶l™R©¼zõêÒ¥KÏŸ?æÌ™ýû÷Ã×÷ïß¿wïÞþóf®5‚ÃHoØæp8“'Onذaxxx÷îÝI’Ü¿TT”@ ˜8qâôéÓÇŽ»lÙ2@мyóëׯgggGFF4¨Y³faaa;wÎÏÏ—J¥qqqUªTINN,K¥RMD|||³fÍäryVVVµjÕÂÃÃOœ8Áápìv»D"ùý÷ßCBBjÔ¨a0pÂ& øÍÕ Ù¤òòò8°uëÖcÇŽ­\¹²k×®¿ýö›Åb™0a°aÃ&L˜Ð¯_?‹µaƺuëêõúäädµZ½ÿþ½{÷^¿~ý‡~`³Ù>>>:u’ËåV«U*•;vŒ¦éV­ZqâÄ š¦Á+ær¹v»–æºFwÕj5ôia½T*ÕjµLx Â]p‰D$I2-$‚9rdÏž=Õjµ··÷õë×£££!„‰¾¼½½gÏžíîîn³Ù$ÉŠ+ªU«V±bE›ÍÖ¹sçjÕªY­Öï¾û.))iéÒ¥W®\?~|Ó¦Mk×®››KD±£ëõz±X¬×ëdÀ–Éd† ‘HTXXë¢Ùl¶H$R*•ÐY0 ;wîìׯßËF›ðëúÏé]¶lYÕªU»víZ«V­7nÈåòjÕªA’€€€   ²eË’$Y«V-¹\kîg̘Q½zõÖ­[O›6íСCÙÙÙaaa«V­òõõµZ­gãÆ;wvww'l777Èwžv±áë¦zá ábÕŒ4Z­ …ƒ!::ºwïÞmÛ¶…l`·Û•J¥Ùlöõõ]¿~ýŽ; käÇîÒ¥‹N§ëܹsÕªUG}üøqè$3•%\n4[¶l©Óé,XÀçóOŸ>½nÝ:777§ÓÙµk×+W®ìÙ³G ¬[·îòåËžžžÐüž9sB sMã0ÒÛ6ÂPÖH§Ó1Å hš†$f³Ùb±°Ùl«ÕJ„Á`€Ñæ•îUªT¡i:77×ÝÝ=??ŸÍfC —„„„iÓ¦9ŽÔÔÔ„„„ØØX£ÑøŠþ^±5º/”®k@|N±OArˆˆOOÏ•+WªÕjÆgqxzz;vlРA+W®lذaAA›ÍÎÏϧiÚÓÓsĈ÷îÝóññY³fMß¾}«W¯ l±£ÆÊ•+Ïš5ëçŸ^·n»»{Ù²e9ŽÕjíÖ­ÛÅ‹{õêåííX®\9©T éÁ6nÜØªU+ww÷ôôtôŸ±~0éT‹iƒþ-¹¨¢ÇEAÞ&o+ ölß¾½B… µjÕb±X;vì¨P¡$—~™€Y,äÖ‚±Yx@Àp.4‡C"‘À³Î ²@ÃXŽ«Dårù—_~™““søða«Õ Ž:á’ÈÍÍíÆíÚµ‹‰‰tY,–Ýn/[¶¬‡‡Ç‰'D"‘\.?{ö,ǃ–ð-hšV(ß}÷]zzzJJН¯¯››¤Å„¤YA‚ÌÌÌîÝ»ÇÆÆþòË/$Iúûûã6ãp8"‘(-- ooo¥R©Õj···B¡(vô *X­V£ÑÚ¾}ûM›6>}úÛo¿5¤Q£F_|ñÅøñãNg—.]‚Ø»w¯——W“&M0þŒ°ß^½ ™ix‹ŠŠt:Annn …bÊ”)YYYƒ R«Õýû÷7n8“Æ ûòË/Ÿ={¶uëÖyóæ)ŠÝ»w9òôéÓjµZ©TvéÒ…¦é«W¯ªTª/¿üR«Õ»_õz½J¥‚ÁFÓ·oß5kÖ4oÞ<::zçÎeË–íÑ£AcÇŽ½{÷îéÓ§ALLÌèÑ£-‹H$Z²dÉO?ýäãã“””Ô¢E‹˜˜˜#FÌ;wÙ²eß}÷t}9ÎâÅ‹.\¸qãÆøøx»ÝÞ²eË'Oždff~õÕW°š/22²W¯^Õ«Wïß¿ÿôéÓ'MšôŸÿüÇh4oݺ588øË/¿´Z­¿üò˘1c˜£ÇÄĸ»»ët:­V;jÔ¨û÷ï?zôhùòåaaa*•J"‘ܼysæÌ™III&“i÷îÝb±Øf³ýþûï_}õ4Ñxæ°&L˜ð–†ÙŽ7†ÑT‹U·nÝŠ+òx¼:uꤤ¤Èåòzõê•+WN¡PÜ¿¿iÓ¦$Inذá×_…¬ë?þøã€,‹ÕjÕëõ]»v8qb…  þ*Uª4xðàbp׫T©-¼D"‰ŠŠ*((HHHhذáÒ¥KÝÝÝN§R©ôôôlÖ¬™Á`¨_¿~­Zµ._¾\PP0yòäaÆF‚ òóó7n\¦L™œœœŠ+* (§ Õ ›7on4¹\n«V­ŒF£ÕjmРÉdâñxPë,00°zõêYYYõë× oذáÍ›7SSS[·nýÛo¿¹»» † Ô¬YÓõè:ŽÃá˜L¦Û·oׯ_þüù­Zµ‚)–'???---** –I’¼páÂâÅ‹—/_‘ö¢¢"³ÙìïïEñ†þÜ •Jå[F°¸\®X,†é¾4MÃLè‹ …B>Ÿo·Û¡ñdüÌsçεjÕêÖ­[5jÔ°Ûí4MÃÀ ljDƒa÷îÝáááåË—·Ùl ƒôÎÅ’NBÁQµZÍLQæñx‰º²0š ‰DÂf³aÎ0ÌÖ€2Üv»Ž ýg£Ñh2™ &C11¨T*@Àçó¡Á‡ó®ÛX,½^ïææf6›¡s+‘H˜ù[bõ0‘ æ«Àљ޵B¡ iÚ`0F¦__úó‹E,ß¾};++«cÇŽf³Y 0{‰ùj‘Èd²K—.µjÕêÂ… rÕµ+ ñ$™Lf2™ zu}™H’+ÅV#1'è‚¶ëf®µ¶]ß„í™UDëi°Ù®;¡b½qð¥™psø”ëjŠ’G‡}[Øäúu˜õLÐàC)&>ŸŸ––VTTT·n]“É„.íÐá|‘ÄÞM˜$7.¥·Ó޹Z‹±\oëbbˆ9._¾¼L™2 |×Ižðñ¢¢"æVvµKÊæÕµ—Æ ƒØ®R|õ±J¢äû/ž}Ùû/Üg±¯!th¢!èàp8ŠåÓAJ¯zY$!çPZ»óõçæ¼n L‘„ÙAoI×G•yòXv'MùüÀ ï×µišÅfK$Nçx^|ðMöó™Û4Íæp •J£ÑX. À“Òðú”N›&6IZfú‰,ê5EüZÅÍh‚ HÒìpÎL*jîÅ/+dhš"ßô´I‚v8ÔªB‹Å¢HüùÞÐ&IÚa÷pw'=Üí6ë¿^ŸRi;išÇ"‹¬Î™÷‹º•‰Ù„ƒ&¨×©ÌPl=°kï«„;G(¸”ƒ&,Úê¤I‚€¶óùNÿ­Ír8ßø³h?ÿ!væ×ÁkRzm'M³´ƒ¦å\Š|.ë—éÑU­¯ÕÃ)‚4ÛéžrùlÊ]–«÷„½ßRÿ#Riq8m4Aý×O}wµ‘‚pÒ„€EîmæcpÐý¼áÿïSm´Ñ~{›& BÄ¡DlÊá|Ý(Ök±þ«x‚à±H†:䆓&ÌNúõ—ˆ¾V Ì´×FýÜ?GäÝCþËîÐëõŸ·º¶@í©>0YXXøaúìÏœþÆ“Þ,×ô˼Œw¸Ã÷án•˜ˆ†|nPïY´Ìü!f‚¡ëÔÂ×ß3۱؜äwàüroLúõÿQ"× ï¯>MÓîSê|Ö~›¼ÐÿÖ&žFÉd"‘H¯×C:Kâõr3‡Ãa’!«®ðùu‹9®i Jn/`Ñ•k2ª’©­ÿÕ5q}Ÿ$I¡PȤÂ-yžÌ/Åårïß¿þüy8Ì™üYÙÄ;É ý6F8xð`£FZ´hÑ Aƒ¹sç …BâùÄ}€It ÕCXB@QÔ³gÏ>|i壢¢æÏŸ¯P(¬V«ÃÂ¥Š œì–)Œâz âùJ¦œœœÐÐЇ ›ÍVl3𦓓“óòòõºvb·Ûa{ׯãZ!…x¾žÁuH! ·îß¿kžà7ƒº.Ÿp8V«U(nذaܸqQs&V6ñAêƒzOŸ>Ý£GiÓ¦uêÔ)99¹OŸ>\.÷»ï¾S*•îîî0wßb±@ÁȉìþS*•>>>K—.=xðàõë×5Íøñã=== ƒB¡pÝR£Ñ+Ë¢P(, ¬Úqww‡v›©cÙùÜÝÝçÍ›çëëk·ÛÝÝÝ™TÕF£Ñh4zxx´hÑ¢ÿþcÇŽÍÍÍåóùp¦iµZ ‰¬9›Í¶Ùl&“I&“ÁžµZ­\.×ét‡ƒÅbÁ"~’$Åb1ñ|yƒV«u:^^^ááá¿ýö[·nÝ c6œŽ»e±X2™ ž}Ú!>×úÀ¬‰'oQ™>éÚ¾ÿ•'®Ä>aoß¾}›5k¶hÑ".—[§NH11hÐ ‡³yóæ)S¦ìÝ»×ÍÍ­bÅŠ$I®X±"##cÓ¦M .Ôh4Mš4Ù¸qㆠ²²²ž>}Ú¸qãË—/³Ùìààà%K–0[êtºÚµk;Ι3g ‚ÀÀ@‚ æÌ™Y2)ŠZ±bÅ/¿üW½zuH ¡ôz}\\\hh¨Ùl^°`AQQQLLÌŽ;¼½½'NœxáÂ…ììl‚ êÕ«§Óé¦M›¶`Á‚»wïÖ­[W"‘ìÝ»÷äÉ“[·n½rå ¤³»téÒòåËëÔ©3wîܪU«B)£ØØØêÕ««TªeË–¥¥¥ýßÿýß±cÇjÕªE’äwß}wóæÍÌÌL@ž››ûÓO?-]º4##£AƒðŒØ¹sç¤I“nݺ•­×ëû÷ïÕ›°uú [à·êA;$Iòx<¡P( ¡t:´‹h™s8œÂÂÂÔÔÔ¶mÛÚl6«ÕZXX8räÈ;vp8œùóç?¾]»vÁÁÁ]»v=yò¤X,þý÷߇ &‹ëÖ­;f̨xâîî.‚ƒƒE"Ñüùó;Æçóÿý÷áÇÖ£F:zô¨L&[´hÑýû÷ù|>‹ÅZ¾|y||¼P(üá‡-ZÔ­[7•JÕµkW«Õ «ó8NQQÑÔ©S m6ÛŒ3f̘ѬY3«Õ¥ÓéªV­Êçó½½½ýýýNg·nÝ®^½}èСáÇ ‚K—.?>''§jÕªiiiÓ¦M;qâDxx¸J¥š7o^QQ—ËÕëõ .,**Òh4±±±ûöík×®ÝÇ;tè`³ÙªT©Âf³ýýý}}}5MÛ¶msrrºwï¾jժɓ'»»»ÿñÇ ¨[·®B¡€/þ~âhœ}à7¯ Ÿ …:½>3+ˠד$)“É}ý|Ùd"(ªäg!%è ‡XPP0wîÜU«VõîÝ› ˆÂŸþ¹sçÎ$I}úøñã+W®¼pá‚Á`5j”ÕjU(àˆRÅlwþüùèèh¹\U‚Ëå …âÙ³gk×®=þ|“&Mz÷îpìØ±=z¨T*H^)•JaݲP(\¶lY“&MºuëV©R¥ŒŒŒáÇ/]º422²cÇŽ7n¼wï^VV–B¡¨Y³f£Fòóóy<^½zõöïßOÄÖ­[===>,•JoÞ¼)“Éà1Á‚ ‰D²fÍÿÞ½{—-[öòåË&LX¸paTTTDDÄôéÓÍfóŸþÉf³===ûõë7gΜŋ>|úôéAäçç_»v ‚ùX/÷s³ßª>0MÓ‹"HêÒå+ÙOrøb±X*£i:-ë‰ýFB•êÕ«[Ìæ’C2àu ±X,>ŸëÖ-Š¢Â E"Ñ_|qàÀXª.•J¡ø0d¨q:F£Ñf³Áºv&ÂÁmfK1ÿu:6›Ãᤥ¥±X¬‘#GÚl6g0 \ÃÎ.‚Ä |>ßh4šÍfÇÉ´Z-¤ªv:-Z´€N5MÓ0)U,Cɨu 鄊 sèí+•J±X\©R¥‡Â! Gýøñc½^_¯^=‹ÅN~ff¦J¥jРÑhd³ÙL.Iúla¿¡z)Êáp=zD WÔkÕŽ-–›ìNŠ$ø,ÒX˜w÷ú•üü‚/¾ˆ°ºd±‚«›››‡‡ÇíÛ·¿úê+«Õêïï¿qãÆC‡ÅÆÆÚl6‹Åiâ´Z-$mƒ[Ú.ˆµB»Íb±Šµ@œÙuKxÒM …Bnár¹$IþöÛoPÂÓËËK,»¦Ës}è€ÿ °Xà2@íååµuëV¥RÉãñäryùòå!ç3“FÜ8Ox@àʵÚ0 ±X,ƒÁ  a ê•:ÎàààmÛ¶=}úT$¹»»»¹¹AÞ,>Ÿ;|±k'r”Ð=‡wÚͯLXD›§&çéË×N9}òÌ™ó7n븒&í»è-¶«×®ó×üRPvôÛo¿]¸pá7ÜÝݳ³³'Mš$‹«T©4gΑH¤R©,Xо}{¨N¸”Õfc ižkÁ{fÄ”éìÁõë×Y,Ö7²³³G5Äbq\\$ˆÜ»w/<,˜FŒ9D±ØÀjµBʼn֭[gdd¤¦¦6kÖÌÝÝ}×®], æÀ†DðF£ñÎ;çÔ©Sz½@ƒáÒ¥Kr¹üðáÃ=jÞ¼9¤æ„CtêÔéæÍ›*•*""‚ÍfïÞ½[.—7kÖlÙ²eƒA§Ó]¸p)¿Œ·ò;F옟û_µjoð©Ðƒƒšœ’b#ÈÊuÞMϾ”p«@ä^Èóg´[nAvîÅf ê×nÞââ‘} ” ¹ŒQ‹Å***>|8äU,S¦LnnnãÆçÏŸ¯×ë7oÞܧOŸZµj †   ØØX»Ý.‹™‰ |>b6mÛ¶]½zuãÆOœ8!‘H`fŠ“ù¦é)S¦üðÃ/^„F$½uëÖaÆ>|ê}õÕWÌB“]Jh™ÉÐ÷ìÙsñâÅ‹eÁ‚óçÏ}úX,–iÓ¦uëÖ-44ÔÛÛ[§Ó2Iü·:Mr¹œÃá8N) _ý˜P?7©³»d‰züë¹Ð4MóøüC‡—«RƒíUvû‘SçYÞɔܨ7$é&WÖeµs£»¶ŒÈ¼y…m³4kú‚R©4999--­L™2Õ«W7›Í„Ùd2]»vM(Ö«WÏf³9ÎÂÂB&S¬J¥b³ÙöÑ£G¹¹¹uëÖU©T\.W*•ðùüb[òùüôôôLJ††‚+‹F£IHH‰D 4€x8ˆÖn·BePf\Úáp(•J…BÁãñ(Šºyó¦H$ªX±¢P(ÌÊʺÿ~™2ejÕª¥Óé4 3€l6›µZ­§§'|e@˜˜¨R©êÔ©STTäççwõêÕ¯¾úêêÕ«=R(¡¡¡Ì…ºy󦇇G`` $Ž}øðapppÕªUU*dzÙlñññ°J¥‚Ç*ð-Õ Áθ¸¸¤¤¤²e˶jÕJ¡P¼¢”MÓÐ/Óh4´øäÉ“­Zµ‚Ú}ïMÃÿZÀ0ááØ‰“a-Ú¥>+øå̽{î•&Åf4át:9\n„6åÿºD°MÚ'IwÚ¶mcý{>gpTÜ‹Ð&]±X,˜W%y™r'ÐB26´±&c›PT©Ø–N§“Ïçóx<ÈÞΓ yt=óíØl6¤ª†hƒ±™ZJ&“ vÎçóá[Àä x Ï˾0µaúº$IŠD¢¸¸¸víÚ¥§§@Jjæ^‰Dp:p¡` xép•ìv;Tc¼z•JeÏž=ïÞ½’Íçó·oß^·n]¸Cþ;oÑ%Ø)Ž=úðáÃáÇ …‹/¶nÝúôéÓ 6„°%“YÙ5½1ñ<Í0“Ƙy¢ÿvuÊ¿v¡á%)ŠÍåé´º,+Ëép)(Š´9ˆ,³Ód4º /̱ ¾´Åb1›Í„KºVø®_ž ¸;á{26I’&“ îxæM¨~XlKð`Í.ñpx‚ÉD‰Œ³4M3 ¨]3Q36Tô…s`±XPV†ÙS@”é±ÿµ“¢˜‡MÓ‹ÅÛÛ{ذa0øÌTW`ž‚9ø]™«Tò$‘7†ËåöíÛ·   ))Éßßßh4~ýõ×ݺu»wïg† v&“ jS«Õj3gÎìÚµkòäÉjµºvíÚÏž=ƒq~¨#|>ŸñÆE"D(¡¦d;gê˜Íf=Ñét¯_òê_±ž‡Uv«E.•ÊIIäóUþpçz² ¡Hh3›(õ²S!¹).%]ßyádf3—y_$y*ö)xÔ•|³¤z]%÷²Q¸bsž\÷óŠñX朙ÇJùòå—.] s!‹IÉCÛmÉo„¼qó+‹¯_¿~éÒ¥+Vòùü+VîܹS*•Nœ8qúôéß|óM5Z·n¯P(ú÷ïðàA‹ÅÒ´iÓÇçää 4(;;›Çãq8œ3fÔ©S',,lĈPR×l60`Æ Ý»w¯^½z÷îÝsrrØl¶@ ˆoÓ¦Mxxø_|qæÌ¨Åñ¿°Ó銄\G«Ìó/ãßÂE«òœ<EQÅrp…leVËw…B¡Ê}*•HÙÏS¿ðYË’ÞI†ˆ`mÓ›}œÏç+Š÷Ôu!I»Ý^TT„Ý×Á¾qãÇ«Q£†Z­†VÔËË«B… W®\!IòêÕ«±±±¾¾¾3fÌ(**êÚµknnn·nÝBBBø|~¿~ý|||òóó>\TT$‹'L˜;lذ©S§9r¤gÏžI9|øð¸qãjÖ¬9mÚ´óçÏ=Z&“åäätéÒÅÃÃcîܹ>>>íÚµ»uëôïþWÃH$AV Np_.àtm\ûK^ÿÙ#§^çÔkä9IC}‰æuÃXVcnVfå«ÕúÂFØápˆD¢3flß¾],3݃W§¶}¡ð ‰Dñññ£G&Jò.¹ý OæôéÓãÆ{YÕ…ÿ…†q-þǔԄ–Óµ—µ@äݺu›5kÖW_}uèÐ!­V»k×®Î;‡††J$’!C†xyyAßU,gff®\¹rÕªU£GîÝ»÷.^¼xìØ1ß4iÒÔ©Sûöíûý÷ß_»vÍb±dffªÕêqãÆuéÒe×®]'NüWe®¨7ø¶f³¹R¥íH¾~¹r`™ÑZüª!+­ÐÎnЧmDY7éÍó§Êø{xz”,#=u‡ÃãñöìÙsùòe38Ä¢\+*½ð˜~&—Ë…Ú¿</--mãÆÌ°0EQÌÜlF¨ð¦ëd(ïÂçó·mÛ†¢úÜÔ AÊb£¸€§¹Ãá€[4''ÇÓÓ³bÅŠ‰‰‰‡Ãh4B<b.°Ù½{÷H’lÔ¨‘F£ÉËË«T©’ŸŸßõë×áf³Ùb±À\XuÓ¡C‡ÈÈÈÖ­[/X° &&¦iÓ¦¯ˆ~¿‹˜$í6k«–­ŠrŸÞ9sÂK¶oÚ`Ô—íFtmQ·&Ϭ½tdŸ˜Ë©_¿žùï·˜ò\|>¿  €$Iooo@<…B¡R©ŠŠŠär9Äo™ ô®ý=ƒƒü`ôÈf³A·\hhËd2‚ rss9´ðP¼ÛápäææBDèñÊd2(ÒéååcÅÈg…Ãá(_¾¼Á`(**bl6ÛÓ§Oañ÷Õ|p3…ìKºxÌ6®‡`«ðAh¢ &î¡C‡¶lÙR¡B…ß~û­zõê°ý5ûVo8‹v:Ù,ªSÇŽR>çúÉ#7OJ‹¿üðÚùëG÷ß>ºRP@dd¤­D€QYYY-Z´hÓ¦M›6mRSS¡=t8ýû÷oÑ¢Eddä€(Š*((hÙ²eVV–L&Û¾}{TTT-üÏþ³víÚ»wï¶oß~àÀ­[·®]»öþýû¡8 ´äR©tçÎ 6ìܹs£FÎ;'‰x<ÞÊ•+›4iÒ¥K—Æ_¿~&$Ž=ºqãÆÍ›7_¿~=3‰ùL (J¯×7oÞn‰D¢P(<<<> %æaž¯¯¯Z­NMM e|7©T ¾7ŒJT«V¦éëׯËårooïôôô§OŸÖ­[×jµ2³ƒ…Ëd²?ÿüsäÈ‘]»v]±bEZZZNNÎŽ;ÄbñkÞ‡ÿ"+å_ð1‚t6nÜ8T§Ë}öL¯7ìïëççËåñþj{Ÿ/†ãñx¼Áƒs8œ3gÎ|¸N§“ÉdF£±~ýú©©©k×®õóóÛ·oŸF£éׯ_||üÌ™3ü½½a–Á`X°`ŸŸß¼yóGÓ¦Mccca`§N *‹Þ CDDÄ~ýõ׳gÏÊd²õë×·lÙ†‚ß]m¤’-ðóÝÁa`2ƒë(å_‹]Rv°X,˜ (“ÉÔjµP(´Ùl0§Ÿ¦iooo˜\áëëKDaaaÛ¶mýõ×Ý»w|ýõ×+W®‹ÅU«V‹ÅpDF#—Ëaê¿kØýÙ³g0[C ”)S&''‡¦éAƒåçç×®]ûáÇ\.×jµjµÚ2eÊÀ˜û б¥ú´m&\ªÕj;uêÔ¥K­V s$‹ŠŠàw86lP*•mét»w‡$ÉÇ ÈŽ2mÚ´‰'BoN§ÓÁ ?ÿüÓl6Ã|ž.]ºDGGëõzµZݦM›víÚét:¡PÈb±4ëÔ†W·Ào’‘ƒ(ñ0 ](>üóü³0òéããcµZsssÝÜÜ`Ž |I6›ýèÑ#©T*•JSSSy<ž@ ¨[·®Ýn_°`Addä_|¡T*W¯^Ý©S'fq³´YÔq… *$%%±X,ˆï§¤¤Ô­[÷àÁƒ—.]ºqãÆš5kÆg2™„B¡——Wrr2—Ëåóù"‘èeÃThª6á2MR£Ñ€hõz}aa!£"F£T*!ªÓé`Ê:øÞƒ:p‰™Åá°€\©TÚl6hÒ4« ÍÌÔjµðL§Ó©Õj¦y­Œï3^o6›Ú·o?bĈµk×Þ¿ÿâÅ‹µjÕb±XÇ7nœMÓ&L5j”@  …eË–=tèPdd¤L& Ú½{w›6màY V«áZØl6°m6›N§Óét\²dÉØ±c¿þúëùóçóx¼Ž;ž={Öh4®^½ÚÃÃc„ ƒÁd2 >¼wïÞÍ›7÷÷÷_°`LmÃÐÎç ³6“™„JëׯŸ——äTé–œMü}:³@šfû’C¡®ÇuÝùëžó¤I“ˆ÷˜VÖn··jÕêîÝ»k×®µÛí 6¬^½zÍš56lèp8–,YrêÔ©L˜0A§ÓÁ x777ˆÀ"Á¯¾ú FÞ C‡Àå€ìVjµÚh4¶iÓÆËË«yóæÛ·oß¾};—Ëݸq£››[@@€T*]¾|ùÍ›7»wï.“Éêׯ߰aC‰D²dÉ’›7o¶lÙ200022²X ©}ζÍfkÙ²ehh(ŒÍ}EÒ¹Úï<© ¹ þUømlX +'E",K€u B$1)T™UG4Móx<“c`,ë‡iz½Þ4 ‡C,³Ùl­V+“ÉÌf3¬J¥ëâóùV«âaxÓb±0ó`°ˆõ‡ˆçI#˜v²Ø¿ˆ¡6Ò{Ë GaÖLÁܦ$Ä!žçÐaæZ1®…« S©\m&™¼É\tè–¸Â5;Q"eëï„·2ÚÄÇšýž» @Æpu0˜nƒëld× •Å&WºÎƒalfŸL¿þU¬cÃä¬*ù&‚”¦‰(ÃI¸&…'þ^+è_é½pFñÊE¯¹‚|œ*•ª´œ«k/×Á"ȇi™eðú²¬%aênþcKþö0Ùy^ÑÂ3Ëž^ù5‚¼c¿Ïò¢`Ëd2XÀq‘Häº|ùŸ‹Å®,)¤b®õŸ'd¢R(/;–kúX˜‘ò:ç6Ú¥¾¼(EQ'OžÌÌÌ„u¿\.7!!!!!ÇãA[²ž0¨…Ëå‘‘ "!A,#{©TúóÏ?Ÿ>}ÚÍÍ VBêF6› M¥ëù8.— £Ð°äª7ÀA9ŽH$ºvíÚš5k @ D!y—زeËŠ+ }ìòåËoݺõÓ`°š)wÌœ?d3ƒ<•Äß‹b«‚véhrð1m¬ï'¢°°ËåfddÜ¿ò›8N‰D¢×ëoݺe±XÜÝÝáƒ2™Ìáp$$$Àjaš¦Ÿ={¶nݺ“'OBY`™Lf0nܸ¡×ëa5¿kÐK¡P<}úôæÍ›p2F£1''öÌåróóósss¿þúëmÛ¶Aæ¡P˜”” ¹\naaáž={þøã‚‚»Ý¾{÷îÎ;ët:HË’““s÷î]Ècç¯Óénݺe·ÛÍf3Ìæ)Vm´ß¼À÷;‰÷0~)Üš¯‹E1–>}ú@ÆÍÌḬ̀°°-[¶Èd²S§N 2D*•zyyA?‚ Ž;6nÜ8‰D’ŸŸÿÕW_M™2eРAz½þÏ?ÿ …³fÍÚ¼yóO?ý$‘HÔjõ²eËÚ·o¯Õja±¡D"‰‰‰Ù¼y3%Úµk—»»{›6mFõÃ?,^¼xöìÙwïÞݸqãŽ;Ο?_TT4xðàÐ4íïï¿cÇŽ3fÄÇÇ;Îo¿ývݺu;v=zôàÁƒÛµke–²³³«V­ºuëV…BqüøñaÆÉd2??¿¼¼¼#FŒ9²°°Çœ‘…¹B² ˜Ã$ ™Ú"ÿ6Dœ••åååuúôéK—.]½zuÙ²e§o߾ݺu»uëVll,³Ú~ñâÅC† ¹}ûöáÇ,Xœœ¼ÿ~ÿþòË/wîÜ1bÄ’%Kîß¿?~üøï¾ûfJÚívH€°téÒsçÎ¥¤¤„††Ž;ÖÛÛ{Ê”)?ÿüóõë×'OžÌXd³ÙeË–­\¹2A°zÃ5œóB13þ$EQ]»v……ýû÷?þ|bb¢Ñh7nMÓÍš5+[¶,,>pà@BBÂŒ3 ©oAAÔ.‚¹ÐGŽár¹*• deeݽ{·víÚP‚p×®]åË—¿|ùòéÓ§¥RéÁƒóóó týúõV­Z}ùå—LJ˜D¼+V¬h±X¦NÚ®]»«W¯ X{h4“ ¾KÿþýÝÝÝåry¥J•ŠŠŠ’““õz=œDDDÅŠaÖ7‚|`Ã@Kzzz||¼ŸŸäפiº¨¨(---%%¥yóæ …âeu`0SåJ4¡Óé µtss³Ûí*• :Ì&“ɵfܤI“Ž?ÅD¡à)Ûh4Š¢89ò{õêcH¸c0ôzý®]»ŒF#—Ë0`œd«V­Ö¬YÓ²eKƹ…ôë½zõòòòš?þï¿ÿîíí½jÕ*___JCjׇ‘^¯w8V«Õn·Ã2)¿™L&ø¾xÃ!^À°HèÑ£G mÛ¶uww‡ ’^ ~üøññãÇÛ¶m+•J] =ìE"QJJ ‹Åòôô¤(êÑ£Gááá0~AwïÞuss«T©’J¥zúôi:u˜ †åË—_ºt©Q£FN§sýúõÄó%#R©”Åb•-[–$ɽ{÷ÂAaÉ54}pP›Í¶ÿ~ø¯Z­æp8yyyUkòäÉMš4)_¾<<8Ί+*V¬xøða‚ êׯ³wï^«Õ*@êW &¯X R«ÕÓ¬¤K‚ FÀ,K§Ó%$$tèÐA,C&¸5¡àüùó;w.¦|X¯?lØ0±X¶ÿþŒŒŒõë×›Íf±X<{öl>ŸŸ‘‘±wïÞ½{÷–-[¶mÛ¶½zõн|ùrZZ ÒÆÄÄôêÕkûöí………P¸L¡Pìß¿¿~ýú=zôX´hQÓ¦M¿ÿþû3gÎ$$$:tdf4øá‡Æ8°cÇŽ7n”J¥›7oîСƒ——×¶mÛZ´hÑ£Gk×®™ÍæÂÂB‹¥T*Gµdɹ\žÝ¡C‚ |}}ÿøãýû÷GDDAN•Ja’$ÕjµJ¥òóókÙ²eÏž=g̘qñâÅÇ¿«2ò_1Nœ8ñ œçøøxŸ * féñ|ª†ÙlöññÉÊÊr8>>>L# ÿª]»víÚµ;vöìYOOÏÕ«WW©RÅl6¯[·.""âþýû ¿üòKTT”^¯ïÔ©SVVÖÁƒ«T©Ò¼yó5jT¨P!""âÚµk—.]ŠŠŠ‚w«V­zñâE“ÉÔ¡C‡N:%''¿råÊ3fÌèׯ„j!c‹Å’Édv»¦dÀÒ|>Ÿ/˜Š~&“Él6 ¨§×ë¹\.L¢o®µ* m¥@ €ÿBEf¹\®×ë- | äðxÜ¢E ­V‹F>Œ MQÔõ|Eý%è‘Êd2›ÍV²Ø1d#\ @ Rl;ÈëÅ,îW*•®Éà@“ÌŠ_’$F#ä „––ùT±UÄàHÖ̚䂂ð±m6[AA’4p*•Š™q DzÙlEEE°g•J;a ‚  j™T*}òäIÛ¶mýýýÓÒÒÆŒêE>|‹(Q<â…2~E/ÚuWAÀ”&OOOƒÁÀf³]}ò’,^(× c¯®VòãÌú~Æ~Y怒û/i0¶Á`ˆ0`Àýû÷ƒ‚‚ªU«ö¯J¿"È»0ô¡²Ôª¡ÂY,–V«e³Ù¯.!c­v»¦éêÕ«C4ûCµ,‹Íf¿ñX+›Í†êï¬B’EEE¾¾¾AAAV«Æ·ðžCÞ!oRà›Ï绹¹eee¹.£+&r‡“‘‘áçç÷joüéÓ§………p[Æ’¥ ÿ•oo0233ßøãZ­6++ëÝŽôPÒ…|ßxÃ!XÀÏ:44ôÁƒ.rÕ0¬õ‹ÅYYYjµ:$$ÒAÛ Ìv‰DC† Y´h,N€÷]—û33\«2S©a|Än·K¥ÒS§NµmÛz¶ðq˜ÚQìô\çTÀò@‹Å"‰vïÞIßeœðy2a¼ÛwïBÿÛÒ*Ð_•Ëå5jÔ8xð`§N Ð ȘÍfÊœ³g϶hÑ*[Eñ-XýQ.xS"‘ÀB<£ÑÓ¤Äb±V«…‰D–õaµZ¡‚³’ ´ Óªà»xxxÀž¡VÛÍÍyæfñù|wwwâùÔ«öä1"Ú[ÊÛ7,nL&SµjÕ`Æ" ÃÂRaaajjj^^^dd¤———Åbù[$š;vìܹs̲D"IMMݹs'I’ÑÑÑÕªUƒéíÚµ‰Diii?†'ÂùóçI’,W®ÜÝ»wýýý÷ìÙíÊ‚1§5kÖ¤¤¤„‡‡GEE™ÍfdZ¶lYFFFݺu;vìh6›…BaZZÚÖ­[Ë•+WTT}ò’;´ÑþØìÿ®~³4 ÆT®\¹]»vf³ùÊ•+qqq§OŸ¾qã†H$êܹ3¨·d}`™L¶råÊîÝ»çææ®\¹òúõëÐêž?¾yóæ©©©ÉÉÉÍš5»xñ¢H$\윘Z Lf˜nÕ¢E‹üüüeË–ÕªUkÀ€‰‰‰Û·ooÚ´)Ìô‚}Ðê;D§˜C@ŒúÁƒ_|ñEãÆgΜùõ×_ø8Þ°¶½Hékß&©ÝkŠœÑ¹Åb ‰Dûö탉–yyyAˆD¢òåËCš@°qãÆŠ+º¹¹…„„ˆÅâ-[¶´k×®råÊgëÖ­QQQ Qfl†ÑLr8­[·>uêÔ“'Oüüünܸ‘˜˜Ø±cÇ«W¯ ‚ñãLJ……ÁœM‡S¿~ý?ÿü“$I.—›––V²ÆDjhÌIíØÅ¢ÒÿÓÀ7 Ï™3gذaׯ_‡ôW°Á²eË¢££a÷Î;{÷î5›ÍR©4,,,11±N:E5lØðÊ•+õëׇ#(e­1”)´Ûí&“I£ÑtïÞ}ïÞ½7nÚ´éÉ“'GŽÊçóaôËËËëáÇ‹åÙ³g“'OŽˆˆ¨]»vÙ²e¯^½*“ɘam´@ûã/nFÂLý÷S„'‹¯]»vþüùºuë* Š¢BBBØlvNN¬ÂŠŠ*S¦Œ^¯‡!åüüüZµj‘ŸŸŸN’d^^^ZZZýúõY,VaaaRRR“&Mòóó=zT¿~}Š¢¸\îáÇïß¿_·nÝ–-[êõz@ðìÙ³}ûö‰D¢Ö­['%%ÕªUËÝÝ=77÷Ï?ÿ”J¥Mš4yöìYxx8Þ(h£€_U^òàÁÌgš¦Íf3L¨‰DAÀÊ>H³Ìáp`É!3K^¦0Œú Nçú&$—…\v°&„À<½^y­l6ǃ7F#›Í†c½¬Ÿ6ÚŸµ€ —b %ƒXL`&ž-üéj35]í’oº1eÜx(.V^ø¯°Þó0Þ(hc}à—„Î¨¿ _1'Ç×fZ?×°v±7#TâïõK¥ä2CæX°ÛbE½¤´@áU@Ïq m´Ñþ°ÃHØ#Hinñ  A0‚ (`A#‚FŒ  APÀ‚ €A# A0‚ ïUÀo“m´Ñþ ö_¯¸œA°Fm´±FƒX‚.4Úh£.4‚ ÿSÚUÐølCíßþËeV«ÕøC b!òÞŒ‰ÝÑF»ÔÙÌ+¶ÀRŠÁ>0‚`Aì£6Úÿ®¸ºÐ‚.4‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚¼ž€1/4Úh—:û¯W\Nˆ èB#‚.4Úh£ýo\hl]hA>ÄBR ›q¬AA÷(`Ì 6Ú¥Î&°6‚|¯‚`A0‚ ¯/` b¡v©³™Wì#ºÐ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ €y¿ÆÄîh£]êì¿^q5‚  ºÐh£6ºÐ‚.4‚ (`Aþg`m$ÁA"`L+‹6Ú¥Î&°6‚|Z­¯‚`A0‚ ¯/` b¡v©³™Wì#ºÐ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ €A#òšÆÊ h£]êì¿^q9!‚` Œ6Úh€ûÀRŠAAJ³ —AJ/X AJ³€™Tw‚”JÚ5¨E`¬m´?z›yÅ>0‚”bHN‡WAJ± Hi0–VAíRg3¯èB#¶Àh£6¶À‚` APÀ‚ €A#‚F0‚ (`APÀ‚FŒ  A0‚|úÆÊ h£]êì¿^q5‚` Œ6Úhcm$Aþ èB#Hiv¡ñ öÑFí…ÖëõøCÒÚcVJ´Ñ.u6óŠ}`)Å  èB£6ÚèB#‚.4‚  6Úhô.4¶ÀRš[`¼‚FŒ  APÀ‚ €A#‚F0‚ (`APÀ‚F¤4 ³R¢v©³ ÌJ‰ Ø£6Ú²Æ>0‚”bÐ…FÒìBã%@ì£6Ú" m0ð1† ¥6“êARÙvm‘Ñ9Aíßþ«Ï‹.4‚”îA0‚ ï]ÀXZm´KͼbA°Fm´±FƒX‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚ €äÓ0¦•EíRg˜VAÐ…FŒ  A>;c m´KM` AÐ…FäCÂfÚeA°Fä= óB£v©³™Wl]hA>¤ÑhÄ«€ ØFm´ßw[`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`AÞ¯€1­,Úh—:û¯W\„ èB#‚FûÀh£ý™ô±FR ±ûÀ‚|°6‚` Œ È0æ…FíRgX AÐ…FäCBšL&¼ ‚}`´ÑFû}÷±Fì#‚FŒ (`APÀ‚ €A# A0‚ (`A#‚FŒ Èk »£v©³ÿzÅå„‚.4‚ èB£6ÚX AÐ…FäcƒX‚-0‚ ,n† ¥¹ƼÐh£]êlk#!È'i6›ñ* Hiu¡ñ  A!` b¡v©³™Wì#ºÐ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ €A#òšÆÊ h£]êì¿^q9!‚` Œ6Úhcm$Aþ èB#Hiv¡ñ öÑFí…¶X,øCt¡yïƼÐh£]êlæ]hAA0‚ ØFmì#‚.4‚ (`APÀ‚FŒ  APÀ‚ €A#‚F0‚ (`APÀ‚üMÀ˜•m´KM`VJÁm´Ñþ-0ö¤ƒ.4‚”f/‚`m´ÑÆ(4‚ ÿÖ…v4>ÛÐFûã·™Wì#H)†´Z­x¤»Ð‚”Vci´Ñ.u6óŠ.4‚` Œ6Úhc Œ ±Œ  A0‚ (`A#‚FŒ (`APÀ‚ €A# AXÀ˜Vm´Ký×+.'DlÑFmlÁ ‚  6Úhì.4¶ÀRŠaÓ4M’$óÊ(m´ÑþhmF³Ø#H)†´Ùlx¤´±0±;Úh—:›yEAJs Œ—A°Œ öÑFíUÜ [`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`AÞ«€1­,Úh—:û¯W\„ Ø£6ÚØ#‚A,Am´ÑþØ]hl¤ƒµ‘ÐFk#!ò! ív;^)­A,¼RŠŒ‰ÝÑF»ÔÙ7Cì#‚.4Úh£ýF.4¶ÀRš[`¼‚FŒ  APÀ‚ €A#‚F0‚ (`APÀ‚FŒ È{0æ…FíRgÿõŠË ]hAÐ…Fm´±´ ‚  ÈDZ¤”·À®.5ö.ÐFûã·ÿ Z9|Œ!öyïÆÄîh£]êlk#!È'öûÀ‚`m´ÑþwÅÍÐ…Ft¡A#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#ò^Œ‰ÝÑF»ÔÙ½âj$AAt¡ÑFíãB³_GåN§“É€ È{ûº{­>0E¡§ ï§Óùþ‡˜¦iŠ¢RSSŸ0‚ Ø¿»†…Y'Iü›µW¯Þ!æ-xÏÀ:sŠ¢0Tþy ¸˜Ò Äú6òƒÏ¢Ãù>¥K’$‹Å‚?ív;Ș¦iÈâô¯öæp8>Û§@é0MÓùùùv»šM‰D"—Ëក o°ÏÂÂBNàÚ°#ÿ @¥ Ñ””¥RäççG|8==þüì.(8-Ì+§ ¿^¯çp8Ó¦MËÌÌ|øðáÅ‹+UªT­Z5«ÕJÿ¦•àã/ÜnnnJJ lüÏ|ÊõbtÝ'óæÇp­àjL™2eÊ”)ðçGò;‚ðBCCëÔ©óøñcµZ}ùòe6›=lØ0š¦O:ÏÇb¿×  ’$·lÙÂ|ëù~W6óZšÖ3%(Šòññ)W®\… 7n¼mÛ¶û÷ï?|ø0==}Ö¬Y'Ožüꫯ.]ºÄb±nÞ¼9hРèèèíÛ·S•——“——»JII‰‰‰¡i:%%åÂ… Œƒ·|ùò/¿ürðàÁ7nÜ€ÎURRRll¬ÅbVzÅŠû÷ï‡3¹~ýú Aƒºuë¶råJæT?øµzE¬îÚà$k4šÄÄÄ©S§ñùü† Θ1ãÑ£G;vìX´hŸÏ:tèùóçÁ—^¹re÷îÝxùòeø-Ž;¶fÍš­[·öîÝ;..nÔ¨Q`ãÆË—/g³ÙŸÛz`ª”z ®ñgG—ËMOOÿñÇ¿ùæ¥RÉf³Ïž=[§N£ÑèããÓ»wïùóçËåòØØØM›6Áã`Þ¼ykÖ¬¡(jóæÍ&L€=wíÚuÊ”)•*UÒh4õêÕ;räA7oÞŒ‰‰±X,pܹsçnÛ¶ ˆ³gÏ6oÞÜ`0Ž5ªk×®Œ—ˆ¼°ät:¥RiÕªUüñÇÔÔTøí&L˜pêÔ)WçÅétÚl¶æÍ›ÿøã•*UÒét7>yò$A'Ož:tè´iÓ, ts˜vésì —:Ú`0‚_~ù%--íÁƒW®\©Y³f@@€Óé>>4MïÙ³G(jµZx?<<|À€4M÷ïßB_4M_¸p!22Òd2söÐ…vµArÉÉɵk×&I²Aƒ‹/f.ìÅ‹)Š‚4H¥RÁ¿j׮ݣGš¦'Mšäáá¡×ëZ"‘ìØ±ƒ¦i›Í†.ôÇîB;‰D2gΜF5mÚ´S§NÇŽ#IÒl6Ó4ìp8>|˜›››ššúÃ?Œ;öÈ‘#ƒáÉ“'C‡MLLT*•wïÞ-,,ìÞ½;ìßf³qàÀ°°°ÀÀ@“Éäp8†š››[TTÄãñ`&ˆ'Ö½{÷¼¼¼6mÚ,_¾¼R¥Jqqq<Ï5—/ºÐÅl‹E’dHHHBB‘#G*T¨0yòäjժݾ}Ûáp‘››ët:ÝÜÜÖ®]{àÀ~ýúõíÛ7''¢Í&“ÉÃÃC$ÁS "^EEELœ]è‹¥Õj'Ož|ãÆëׯ?zôèÔ©S•+Wf†sÍf3‹ÅÒëõEiµÚœœœ§OŸÚl¶‘#GÒ4tèСÔ¯_0˜QDƒÁ •JaDŠ$I@@Q”Á`€=3a8 ‚ :v옘˜°|ùòòåËÏ™3çu*Ê}ÎÐ4m±Xôz½ÓélÛ¶íÖ­[333 ÅàÁƒY,\U¸øf³¹Q£F3gÎ iÔ¨‘X,†+‹«`,Š¢(P5Ä#>ÇqàR4ìéúòòòò÷÷gÚC‡Ã÷)Š‚›Àßßßét~ÿý÷‘‘‘Åv2pàÀeË–Y­ÖqãÆ1}3¸Õ«W_ºt)EQÐ7KLLt:ÞÞÞ·nÝ"B(Â]Â\´7Ö¯_õêÕA¬_¿~РA}úôñóóƒGÀÇÖÿüàçàp8X,Ö©S§úöíûøñc¹\îp8ÜÜܾþú똘F‡€$É .\¹rE§Ó‰Åb‚ öîÝ 1ØÆõë$) ]«æ~^ãÀÅzÿ³óX,èj‚ÅŒþCä~BooïÞ½{wéÒåܹs999 ,hÓ¦ ü·ÿþ Ož<‰ŠŠ‚€“ÍfyðàÁz½þÛo¿ÍÉɹvíÚ·ß~;xð`‡d³Ù–,Y’‘‘±fÍšÛ·oÃïÞ½ 4ˆöìYZZŸÏçóùÉõ|Åãïv‚hšnܸ±P(ìØ±ãåË—³³³Oœ81cÆŒN:A<Òn·_¾|Y­V{yy±téÒû÷ï/X°àäÉ“ðTµÙlf³ÙÕ#£i:>>ÖNº/}ÂŽô_¯ÅúÄ÷Ýh4oÞ¼‚Lh„¦é“'OAÉh4öë×ÏÝÝÝßß¿B… ;vì…C¨ùÛo¿…‰4MÿòË/Í›7‡;w®råÊ>>>4›Í°óéÓ§K¥ROOÏÈÈÈÆOš4‰¦iFíáááççtðàA×Ìx­J±>’ß.NfffçÎ=<<<=====¿ùæFãp8´ZmëÖ­…BáªU«hšþõ×_e2™\.oÕªU×®];tè@Ótll,üXÌä™™3g …Â.]º| áÃ÷c3¯$SDøÅÍ>6Ûjµ2ý¥bEØìv;‡Ãa¾A………¦|ùò® Q±}¯£ˆÐ˜§§§K$×ÍŠŠŠt:]¹rå `³ÿÛ)((ÐëõAAA®Á¶{­à:üôÓOALŸ>Ýf³q8œ¤Þs‰Ôjuaa¡··78ÉÌûÙÙÙ|>Ÿ$I­V«V«áš›L&>Ÿ·2Óõ…}>{öŒÃáxxx|&õ“þ*/ú G\Š­1‚X1½p®ŸëG˜îó~1‰–<ÄÇ0¡Ún·³ÙlFÀðçGò£Àh03#Úõ:»t®?Ù+ú·aÄáý±J— _]Á­ä –7À_¨^×}‚Qì#Œ ã“„ËÒ%¦h#¼ÏlÿQü^=°ôAbiÌ#¯ØucæÚ²X¬’×¼XÄÌa¦²V¡¬Ò4üc›/»cŠýœ/Û§ëŸ/ÌçXìM× a/ÜÇ_}n/¼nÅÞyá5/é9~l×ÿ½³]ƒïÅ.Ú¥×.© ¼&Ÿ˜ý_‡‹›}Â6Ä{ð÷ÅíRÙ ×>!^ŸO¯ÆyŸ2ƒ ‘H„—âSŒ ¥9 —àæCô¶À‚` Œ  APÀ‚ €A#‚F0‚ (`APÀ‚FŒ  AÛµn5‚ ¥ \„ ¥¹Þ»w/^Ayï.4“AAAAAAAA›VÍE>©ŸøþnP÷x^ þ³Ò-‹Åb–©ÀŸ‡ãs›÷_ü0åW‘ Š¢(Šúl¿;cËd2‰DâzCã½-ðÇþÐ¥(ÊápѹsçÁƒÏ›7ïüùóE}ÏZøšîîî#FŒèÔ©S¹råÇÇwìØ±nÝ:»ÝN’ŸÅú3øš>>>­[·~a#LÓ4EQׯ_¿wïÞgrMJ‡Ï F•*UvíÚµù–,YB›ÍþLÚÞ <~ü˜.Á… üýý‹5ÑŸö°}ûvú•¤¥¥ñx<Œ|D>³X,ž6mšN§£iÚb±Øíöùóç¦(Š$É   ¥RIÓ´Õju8ÐdzÛíV«•¦éøøx@[~ϲãÇÛív³Ùl{ ¹¹¹ÐÅ@ oÏž=“““ááj·Ûm6MÓ ,øLLÄîÝ»A½%[‹ÅBÓôĉ]¯Ø§}5> wBÉ«át:išÎÉÉ‹Å(àOÍš5:¿ÍfƒŸçó0ܯf³ZÝ’·¬Ãáp8<àp8Ÿü- äÈ‘#¯ðÓ§OK»€Kwwˆ$I¡P8cÆŒk×®uèÐî]6›ý¹=PáûV­Z•ÇãÑ4ý¯á½€€è c›óiPŠÛ%ÛlÖ¬ÙäÉ“ ‚°Z­\.÷sþ-ù|>4/¯Ø†Ãáðù|¼ï?_£ôžºÓé$IòÊ•++V¬p:\.Â6Ÿío™““ÍìË6 iZ­Vçççƒw? øC­F£9rdÓ¦MãââX, nw'<Ëaé…O1‡ÃA’äÅ‹U*EQ(`ðÇÒýc±X—/_nÙ²å×_’’Âb±H’„¹Ÿ 0-Ád2ÅÆÆÂ#¬˜†Ìñ˜>}úguYÞrä}=‡žmJ$’Ÿ~ú©¨¨FSl6Ûg2L<Z¶l™ë@šÍf—„¦é#FŸÇDøŽ'Nœ°Ûí0 6›Ín·çååá8ðGwQ¡B…õë×ÃûÛo¿}&f:À£GÎÎÎv5¹{÷n—.]ˆÏ`ØõNX¿~ý«gbÝ»wËå–ê™XŸà\hf!N³fÍú÷ï¿bÅŠ„„„Ïd.4ñ|°\.oÚ´i… l6Ûƒ.\¸`³Ù>ËиqcfQZÉVúöíÛ™™™8úcô >ÛÕH/kf1ø§ù¨úäïã—Ee?wÝh4–••5mÚ´þ¹!È¿¿÷KÄÓO?-‚ÝnIgìv» S§N­ï²‚`”JåSO=õôÓO6¬uëÖõüå—_ ‚°iÓ&‚ âãã-‹ Ÿ|ò‰¸ì¶_¿~‚ €Ï;wæÌ‚ ââ↱ÙlsçÎ%â›o¾ÉËË#¢[·n‚ <õÔSõÝïßÎï1ò/ÆápÐ4½oß¾ùóç3 S?LÅqÃ0kÖ¬Y¿~}8Ã0<ÏwìØñ•W^æúþì¥K—H’üꫯêë ‚R)))-[¶¼~ý:±ÊËË ‚رcÇ¢E‹\\\$É™3gH’î+üËápøøø<óÌ3;wî„?Å €\^^~åÊA&OžÜ±cÇùóçÑ·oßÙ³g{yy ‚@Ó4|Á²lpppDDDHHHÏž=?®R©ê·Ã(`ä_L« (êÅ_¼té’Øóøàƒ;vܾ}»S§Nùùù§OŸ&I²Îôl‘'( Å0ÌñãÇgΜɲìÒ¥Køá‡:ê¡W¯^/^ôññ¡(J.—3 £T*% ˲,ËŠÃBΨT*š¦Ÿzê©!—Ëiš–Ëåu¼š¦?ùä“7úúú²,+—ËA¸víZVVAcƌٰaCûöíçÎûÆoPµsçÎáÇ7mÚ4##£{÷îƒAô&Dp\y²oyܸqÛ·ownTÁAU*•+V¬ðõõµZ­R"Irß¾}W®\‘Éd4MWVVæääÀ„GâÎÌ·Þz Fª Ríp8$ÉöíÛ?ýôÓÎмâQîú' yB¹«þžãÖéNsß8ø/TÄ"î ƒç|×9Ø$N¶Dž@ßçõñ­@çþ³ó–wiÿwj´¸¾~€ È}+£Áƒc) HC°ø>$‚ ¦ººKAª€1ˆ… œÈ (`Aþú[‚@佯´H’¸×lq‚ .‚ ÿ˜€¥R† ~›k³X”)ð¼ÀóB‰ A’ð<Ï9Çáp6‚üC¾r¥Üá„Àqv’$ívž¢(š8NR.—J$ÿU¸¨^Š"Ìfâöí<???Ep0‹­0‚üý& ‚_µji›6 †² N’$™••ìááíí­ÎÊÊãybäÈÛ·h±˜H’,‘UUÄW_}Ú¯ßô.]¢šF#HÝæ~(ù—˜$ A ôú†á ¢ÓUX,z½>— ŠIÒS«-"Âl.–JŽ#ï¬@AÓ‚TJ ‚…e†Á8‚ÔžSšX4ó¯r¡iZ/BÈåt|ü ýûóZ¶ìípìP(T¡¡íyÞFÓE1$IÏqÃH(ÊqGÌ(`ù(Šª¨¨Ðétð²¡R©¼W‡?+`Aär¥Ñ(—Jùž½xñçøø‘íÛ÷ÊË»Þ>'§T.—DµÅB²¬J£¡ss‹¬V7š&F¡¬ÌL*hÌÅÂòÎGU‹ˆ;«“Ô¿à».†¯•üár¼ÿkep&âþëÿyŸÅV~× k÷ßÕCþüNmûw¯³á²ÃóLÓtqqqNNŽT*µÛí …ÂÅÅnÁ£0 wúô>‹EKQ¤ÙläyÎf3™Íz»ÝÆó­[W¶oÿ¸uë)ÅÅ ùùI­[‰‹ëðÙgÓcbžV*ÝoÞ¼T\¼³oßwa Î^"‘( ½^/>v$Ij4‹ÅB„R©$‡5Jàét’ÃáÐëõ¸(¡ÈîZj‚ ¨ÕjŽãÌf3¼z¦P((Š2 N¹\β콎'ù0÷CXðA§Óý!9¥R©P(‚°ÛíPª¿÷9A£Ñðùä“çŸ^„´´´.]º¬^½zþüùåååîîî‡Ãh4º¸¸‚`0(Šb†eYðØ¡(ôz½ÉdÚ½{7Aµµµ$IªT*’$õz½J¥‚£3 .ŸÙlW{AþpäÅápx{{ûûûCIBΗ?»ï‘à“jÖ¬}hh«»Þ6ž'U*¦9…‚‘Ë)A Áf³Ûl„\.S«eµµåEÿïLÁápHÿx,‡Ùl6›Í‹ÅápX,øS´M&ÇqÇ™L&£ÑHÓtRRÒsÏ=·dÉ’¶mÛ?~\.—¿öÚk=zôèÖ­ÛË/¿ í‰B¡¸víÚ°aúuëÖ³gÏï¿ÿê<Èm¥P(*++Ÿ~úéï¾ûN¡P@]hµZ[·nm4oܸáîî~öìY—˜˜˜£Gºººæçç—––¶k×vòúë¯wíÚµk×®+V¬`Y–ç.,,9rd×®]ûõëwúôi¹\.‘H ƌӽ{÷îÝ»¯Y³†eY•JµiÓ¦¹sçæååõìÙÓn·ïÝ»wÔ¨Q ÞôíÛ·k×®Ï<óLNNŽ\.ï4˲6lhÖ¬ÙóÏ?_^^^ZZÚ¬Y³ &\¾|ÙjµºººþôÓO½{÷îÞ½û€NŸ>­P( ÅG}ôÖ[oÍœ9³sçÎ={öÜ·oŸB¡`YvÞ¼yŸþ9lsîܹvëÖmðàÁ/^twwÏÌÌ7nÜ»ï¾Û®]»o¿ýV­Vcú?Ä’H$·nÝ:yòdbbâéÓ§«««EïïQ XÄj5ÙlfÑtΤxdzòÈËË:sæ øŠ§NíJJÚ¯Pxj4>ÙÙWH’u0PXX˜———ŸŸŸŸŸûöm±ÇEÞá>¶‚äĉ‰‰‰/¿ür³fÍž{î¹ýû÷¯X±bÅŠ\°`››[yyùèÑ£•JåúõëŸyæ™×^{m÷îÝ®®®v»].—ëtºaÆ9ŽqãÆAç¼úÈÈHWWפ¤$…BqèСŽ;Ž1âðáÉäêÕ«‰¤I“&A̘1ãÈ‘#+W®œ5kÖ‡~¸yóf™LvöìÙ°°°uëÖùúúNœ8±¸¸X"‘Lš4Éh4~ùå—&Lxûí·7mÚäåå•™™yòäI__ß×^{M¡P´iÓfòäÉ*•êèÑ£“'OîÓ§Ïúõë­Vë„  S}x£Ñ˜™™Ù¦M¸,ËVVV.Z´hÍš5Eýúë¯S§NíÝ»÷úõ룣£ÇŒsõêUµZ}ëÖ­­[·úùù­Y³&22rêÔ©ééé....\HKKƒõ¨Q£š5köÕW_y{{?÷Üsµµµ°èñþýû§OŸwÿ<#ÈÃ4ƒ¡¼¼¼ªªª¢¢Âf³ýápó0“Jå,+£(J&““$%‘Haå[‰D²Ržw4nÜä§ŸÊòó¯ôè1>,,|Ó¦Ÿæg©ÔU"‰¯¨H³ÛÍ$I‹ÕÜ{ðúDWrLýJˆ$I†a¾úê«ÆWTTŒ=úÓO? –H$‰‰‰Û·ogYvç·ã믿fY¶gÏž/^4hÃ0‹eÔ¨Q>>>»w%ÇqÍ›7‡•¸“““ß~ûíèèè?ü°¼¼üòåËaaa‘‘‘G=zôèéÓ§;vìHQTVVÖæÍ›gÏžm0úõë·bÅŠššš–-[6nÜxÿþýÓ¦M»yóæ¢E‹8pà@///hê …L&Óh4Ç_´hQttô€*++—/_>tèÐ>úÈf³EFF6nÜ811±gÏžµµµ ÃØív›Í&“Éœ‹‚çy‰DBQÔÊ•+ûöí»jÕªÊÊÊ®]»¦¤¤|üñÇýû÷·ÛímÛ¶}ÿý÷kjj:vìØ¤I“ï¿ÿ¾{÷îp2™ìÃ?Œ‹‹ûúë¯-KÛ¶mCCC:Ô¼ysŠ¢>ÿüóž={–••Aôuøg (J"‘À3ÿWÍĺ.³ååešL•ƒþÆV«©¸øÖõëÞ:®¬¬œeåz}uuµ^£‰°ÛõFc%Ï·•Éd‡Ýj-ws ¬®.µÙÌ +ެ€¼ÍfcÆh4<Ø9vúFA‹‹‹išîÝ»÷²eËY–-,,tsss8iiiQQQ,ËVWW×ÖÖ.]º”$Éêêj77·¥K—Z,–Ÿ~úI©TVVV‚,ê¡C‡?üðùsçL&S›6m|}}•Jå™3g®_¿Þ¦M¥RyãÆ Š¢fΜÉqØF#ô¥¡m‡¾hxxøµk×ÜÜÜæÌ™óþûïïØ±#>>þ?ÿùOdd¤Ñh„zã8­VËó¼Ùl6 Z­¶²²²ºº:..În·C~€üü|¸åÐ;'c„R©´²²2??ܸqµµµUUUR©´K—.‡‚ 4M×ÖÖ–——ûúú6mÚ433ÂAÆ¢¢¢ÊÊÊV­ZY­V¹\n4óòòš7o)ÂJKKaÁdTà#ñ¥ï•êá*žôúÚo¿]$•²6›uÅŠñ$iÙ¹sÇÑ$i½r%™$ ‚pdg?o·iZHN>tõê9Žã²³Ïñ¼Ãá°……EÜõ}ÃÐÐÐÀÀ@‹Å"‘HôzýŸ\ªú$I>ýôÓ‡cñâÅaaakÖ¬9|ø0<è°s(/–eÁO6 111ÞÞÞ¯¼òÊÑ£G¡+.zìV«µ]»v7nÜ´iSLLL`` T*m×®Ý÷ß_\\<~üxèK$’ñãÇC^.—{xxwy8#OÓ´Íf[°`Á Aƒ>|ôèÑ.]º|öÙg“&M«¶: šZ,–^½zõêÕ šÜ™3g6nÜmAÄËÛÛûÖ­[°›Í¦ÑhvïÞ]PP0}útq‘qñîUý‰q;è¡˜ÍæfÍš=Z«ÕÒ4=mÚ´æÍ›kµZâNš?›Í†Úû“þ3Çqááá✂?6‹ã¡Z`Š¢yÞÆq¼L&eYÊd¢Áîê*1›)Hâd·s&“ÖÓÓK¯×»»«uº‰„µÛí... #ŠÇù`Öl6[­VŽã,Kg·þÓ,‚¬³%uòóóSSSøáÁtSAZµjuðàA£Ñèëë+•JgÍš¥P(^ýu›ÍöüóÏ7.**jÖ¬YÛ¶m+//Ÿf‹Å£ÑhöïßÿÊ+¯H$Žãúõë7þ|—V­Zétº&MšX­ÖæÍ›÷éÓG„ÊÊÊââbHÀQ]]­R©‚‚‚Š‹‹³²²¦L™’™™ùÖ[o}ùå—K—.]ºti›6m6nÜ8mÚ4ñ P*•jµÚb±ÆéÓ§C×7==]¡P€Ÿ5°aÖ.]š›› iæ,X÷î»ï6jÔ(!!aöìÙþþþr¶E‹R©†ÐÕj5ô¢¯\¹òÜsÏAòxx’ÂÃÃ+++§M›!ý´´4ww÷ÊÊÊ:ÅŽüɶW.—Ü%Sxôs¡¡n (*..ŽãE<ØÓÓËd2feeÇÅÅeggõéÓÇh4}ýõ¦Üܼ>xÿÇw>óÌÈ;v´nÝ:55µmÛ¶‹U"aìv»T*…a³ÙÄFqÖ‘Åb{VPE9ŽúN5I’0#n ]AˆÅûøøDGG¿ñÆyyyW¯^ýî»ï<==!‚µ~ýú#FLŸ>=99yýúõ›7o†ÈvUU•««ë×_=lذ÷Þ{ïµ×^«­­…ºÃn·{{{Þºu«Gv»Ýn·wìØÑh4„††VWW·oß~À€ƒ š?¾››Û§Ÿ~ÚªU«-[¶ð<ôèÑ^x¡]»v6lpssƒ¬9)))#FŒ˜:ujiiéÕ«WçÌ™ã4µµµnËÓÓsïÞ½58pà¢E‹F=dÈAƒ9sæÀûöí ´ÙlEÕÖÖNš4éÀœ1c†L&Û¹s'I’ï¾ûnMMÍ¢E‹žy晉'öíÛ÷‡~¨¨¨xýõ×õz= >M›6­cÇŽ[¶l±ÙlÏ=÷œÁ`€Á$«Õúæ›o>ýôÓݺu7n\ZZÚÖ­[÷îÝ+‘H v}U:;;»¤¤Z…èèhOOÏ?Ö…¤_}õÕûô³­VëùóçÃÃÃÝÝÝe2Yjjª···L&=zô(42ùùùÇŽkÕ*îøñã ä§§¦ÈÈÈ7ndgg‡……·j'Þ{š¦ ƒÉdêÓ§L&ݼ’’’Î;‡„„ØívhŸ+++{õêåêêêüÜPUZZÕºuk›Í{3›Í}úô±Ê=zܼyóðáÃ>>>S§N¥(ª}ûö½{÷NKKÛ·oŸÁ`øàƒúõëýÀ.]ºxyy…††z{{§¦¦vèÐA*•Š£êPS¨Tª‘#G WW×ÚÚÚîÝ»·iÓÆjµ ‚0`À’$÷îÝ›œœÜ³gÏ7ß|“$ÉÛ·o0À`0ìØ±Ãßßÿ“O>ñ÷÷—H$Æ ËÈÈøå—_rrr¦OŸ>iÒ$›ÍV]]íááÑ¥K‚ 7nœ”””““Ó¯_¿èèèvíÚ:u ²é-]º466ÖjµBŃUC† Ñëõ?ÿüó¥K—""">þøãðððÚÚÚÈÈÈøøø£G&$$¸»»úé§ÑÑÑ$IîܹS¡PDGGoÛ¶M.—ôÑGàD”——ÇÆÆÆÆÆzyyõìÙóâÅ‹¬©©Y°`A§Njjjª««{õê#Ã(ã? Ã0·oß...¶Ûíà€ÿ(XòÖ­[÷ª'†1 ï¾ûnhhhm­N&“6jÔˆçùÓ§O{{{ß¼y“¢¨!C†ìÙ³Ç`0fd¤ÇÅÅA “ŸŸ×¼yó²²2‰D2dÈ18]P¹\^g.´‹‹‹Øá•J¥Ñh¬S- ‚ R©Aç$;ϬwáYø-Ì‘J¥J¥Òb±°, 3¨iš*‚‹‹ Dwêæ<ÃDe&™L&ÑIéb0'Q¯×ss! Ê-‘H`ÔpàÞët:85ØàöÃH¸J¥bÆjµÊd2¸ÙuNfÀÑe2™Ñh„þHßZ­V½^ÃBz½þäÉ“EEER©”ã8˜òoØL&A f±X .Óét‰D©TBI¢zÿ| ̲ìÕ«Wóòòàe†V­ZùùùÙíöGü2Ä-ìv;LLO¿~îܹnݺ( ???NwàÀ“'OôêÕG|Ç€e¥)))‹977×ËË+66¶¶¶Ö××Î\hxÈœ/I«Õ:GS $+~ãìBÃ%p¼ÁÑ…p‹y‚QJˆîŠ}fñ{˜"ž9Qïm˜A3FÄ/kjjDϺ£UUUð'Ìv‚“„êÉùˆAˆ³©ÄH2ÂÙãIfO£þK0§Çùè° T+õ '¦Õj«ªªL&Ô)ð[N'n—LQ”Ùlùîz;?ʪ3µáÑ#Ás Õj³²n:‚‹‹‹——Ï ð­[·(ŠjÔ¨QJJ Ïs£GÖét/¾ø¢V[såÊÕÆ£bcc«««m6[¿«~޶»*ç^cõbç-ÅÿÖù¹ø½sy9oó‡»ÿ©ŠF0[ý¿tÞ¸Îáîu9÷?ú] T#GŽ´X,Ћv>Ö]Ëðþ· ù“Qèàà`p✇?~÷xò{ÛåååÇŸ8qâxII‰F£)(ÈON¾X]­½páBFF†Õj HL<ߨQ£ÒÒR77·³gÏètµééA%'';ODþ)À5jÔĉáI,“Ћ–J¥*•J©TBOçG¡ï׆Yúöí›››û‡Ï5 àØ±c0°œ?¹xòhe,Ôÿñöü^¹qã†øzj á´ô„x*Ρ)¨i þ‰7 A½Cþ@Ëd²?ãn ‚±A9ž‰qÑ?Ùû‚FFÀ(?y|Œ«+ H0†—¤ #LÒ€üçcT‚ü“}à:ã·‚4‹o#Òð,‘H°¤¡ ø>‰?yÜŒóÚŒ È?!`œ)‰ XÀ8 A°FŒ ºÐò„€Í/‚ €ù×øÏ'Mlpð<ÿH–γ¥Þ¿xÿ†+zoâ¿YÀâ½t¾¯w½Ç°¥D"ùKoÿÃ<^u¶qÎ0ú@~ïùÈår…Bñ»Šî.7ƒ¢f•`qúúCª]\ÐrÊ=$4M?ÌzÅ(ò²¢¢âa¶ƒ4jÕ’ÄB#Hn"FÂàËÜÜ\…BáããóÇ®=Œza1ûûï*Žã‚ I.¦iX¤Úáp@v1) ´¢bj‡ÏUCQTvv¶ÃáˆŠŠªó@Ó4 ™ ‚€Q“aÈY#jò}fee»»»×Yª_\=XH2HQ$=ºO!ÀÒüR©Ôh42 #“É ßÊÃ\‘Åb$Op&÷Z¾˜a˜Gå} ¾©äåå-^¼Øn·+ŠÌÌÌ @””åË—CîIŽ‚ô¶_~ùå‘#G ˜¨ xLÅdÖâ-‡&2úÀ³âü_ø—øC±ŽÈÊʪ¬¬Ÿø¹ócDQÔüùóW­Z%‘H$IQQÑøñãüñÇNš4éå—_~á…†þÎ;ïÌ™3gĈS¦L™9sæÄ‰‡ rèÐ!¥R)j£þi;7k,˾ÿþûK—.…ó·T(_ýõË/¿ ©LæÌ™óÅ_¸¹¹åääÀÉ@6X@ŸeÙ¼¼¼‰'&&&*•J1g¬X¿Øív¥RyüøñîÝ»§§§;ŽS§NUUUA;)æyt.(–e+++çÍ›7bĈѣGoÚ´ Þ]Û')V"â9Ž“ËåK–,?~<ܸ¿â6`À³±bÅŠ””L¾ñøºÐÇyyy]½zµ  @©T&''ïÝ»·°°P.—Ÿ?Þh4ªT*•Ji/ Ôúð(+•J†aÌf3äþƒ¼òAØívµZ û—Éd°O&“i4h•J%ûìܹs*•Š¢(“É$•J …óctíÚµŒŒ ø•ÑhLJJ*,, íܹ³¿¿ÿ™3gT*U×®]£¢¢bcc»téb±X’’’7nܱcG___š¦!"I’ÐâACâN:Eh`–eÁ³U*•4Ms ˲G­®®®¬¬ÿüsÈL)‘Hª««ßÿý‘#G~úé§{÷î½uëÖ_|ñÿ÷ï½÷Þ‰'vïÞ­P(Ξ=ÛªU«Ï?ÿ¼´´ôÛo¿]¼xñ´iÓ¾úê+»Ý¾{÷î+W®ˆ{6 Ðý3fLhhhŸ>}:vì¸|ùrŽãV¯^Ý·oßwÞy§¦¦Zp233g̘1}úô÷ß_lеZ-$æ…Tã:®¦¦Æd2™Ífžç«««­VkYYÙÙ³gSSSÛµk—’’²k×®iÓ¦ >ü½÷Þ»qãFBBÂêÕ«GŒñòË/߸qC&“I$’5kÖ|ûí·ƒ ‚^tPP««kvvvjjjLLŒ‹‹Kjjj^^^XX˜Z­ž;wn^^ÞÂ… ËËË—/_‰„rss£££»uë•T.PP2™ìã?Þ·oßñãÇ×­[·lÙ2è8H&…çÁÿ—_~ÙÓÓbcžžž6›­¶¶úÛŸþ9I’®®® óߥ” 'ì<ß‹ßÀU‚››ëëë;cÆ ˆíA²R»ÝÞ¬Y3wwwˆV"é80tƒ¥Rizzz›6m8ŽkÙ²åñãÇ›6mJ’ddd¤Édzþùç'L˜ —ËU*Çq&“©I“&·oßNKKóôô\±bÅæÍ›{÷î}âĉ’’‚ ~úé§–-[Ò4 ’Gq ¼Ífc&**Êh4ž Ä{`c»Ýn4]]]½½½÷ìÙ KQQQ‹-Ää·ÇY,–šššÚÚZNÏ¢U¶Ùlu§‡Ãn·‹1d›Íæp8†¹zõªÑh8p ‹‹‹^¯—H$mÚ´¹råʱcÇ6mÚÔ¹sç¼¼<ŽãW¯^}óæÍ>úH*•ŠÁê&MšTWWËd²ÐÐÐèèh½^OQTPPP`` Á`xöÙgcccÝÜܼ¼¼¬Vë©S§Îž={ìØ±¨¨¨ŠŠŠ)S¦„‡‡¯ZµŠçùäädŠ¢` b×IIIf³ü£ôèуeÙ°°0¸öÖ­[‡‡‡ú駇Þ¶mÛÊ•++++;vìh³Ù~øá‡sçÎýüóÏMš4qss£(*==ýìÙ³{öì Úb±˜Íf??¿ÐÐЪªª#F´k×|.£Ñ%c·ÛÇŒF”Ó?Ð;»XâH£èpŠ#‰äêïïo0š6mc4§L™²téÒÑ£G ‚Ñ»woWWWŠ¢žþùeË–A•?iÒ¤ÀÀÀ~ýú½öÚkR©ÔÃÃcüøñ¥¥¥žžž )ƒ†===M&ÓäÉ“,X0zôh‚ "##Ûµkçãp8ºuë¶qãÆ   Å‹ÏŸ?Ò¤IZ­vÆŒàÔÁ2#nnnЮ²,ëíí Zp&}||d2™óU«T*///8©T @<öÒ¥K/¼ðBLLLtttyyù˜1c._¾¡ °Z­,ËŠ—ž9ÇqR©7«Õ 6˲‹¥¢¢Âßßßb±À(Ã0ÅÅÅPÀ%Ã(( q8‡ «ÕÊ0ÿ]?ÐjµÂ( ·Úíö’’µZíåå¥×ë­V«‹‹Kii©R©tuuµZ­J¥²´´Ô`0øûû³, Ž+˲,ËÚl¶ÊÊJ777…BA’dII MÓÐx¤+AÄCÈd2___˜ø¡P(ª««õz=8V•••Ï<óÌÀgΜYSSãëëk±XÄ.¸Ù%%%r¹Ü×××`0@I‚Ão4!^€è„‡pöþ„–JœÛ­™ÅbéMÄéÁ èÖ‚0@bÒpèÈÕÙ¿¸[A`ÏðÜ;Ÿ˲ÐG¥(J*•B]à<¤á<ö)Nf¬óç}¶'“@§×yN"<ÙÐuwþ-œƒè®‹qZqJ†hÃÄ/˜ '±@¿Êúù°½swÎ Ž¿‚óOŽÁñüÁ¥‚}Ò4m0† Ò·oßåË—×ÔÔˆsÔàèð§óÎÅ t¾XÔÒ?#àÊÊʺТ†¿•æ<ð®³íêÌ«/!çýÔÿ²ÎöÎÛ8ë_´O¸Î~Ä0ÕCWÜ^Tuëª!w­ûîºÛ:ó¢ëOœ¬³Í˶~AÕ)«»îTš““ãâââëë[g ç½nâ½*ztqÿfú¡&ÐÜõÎÕ‰ÙBÃr׃Õ}Þ5|×͸sEsŸm~×qÿ¼×uÕ?Ï:×ë|¬:Ç­_>ÎÇ}¶©ÿ}}ÝÞ§ +Š¢š4i^À½îã}î/¯4<æ.4ò¯ç>Ò°Ç‘'¢"Gé6Ðq`gçð^žÚh£ýXÙâ'Sg¶†ÐFûñ·EÍâìiÈ.4‚4ààEee%–‚` Œ  A‡°óDÈ{-‹6Úh?V¶øù§úÀ3?öoà‘ŸÆãp]85 yv&–ó¢ âªÎ/üuˆ¯ˆ¯ûßuƒG¨Û‡¿.xÞƒ«IçetÿëçÜÙ¡8£®¥þK<â®ò¢ê¼Ì€‚Gßý)Q*•°ÊI’°¾!¼!\ÿ•€G¼»GÓ´«««Ñh¬¿Ž9¼L÷çOC”™¸Ìõ‹VÿÒét0°ï ¹\.—ËE)êõzxVÌ„k1™LJ¥^±„:Ñápèt:ñ¢DÁ?Ì9ÿáúÔùµ¤Áñ`ÓÓ§O§¥¥HZ´hÑ©S'‹Å2wîÜÉ“'7oÞÜh4ŠÏØ`Šmν¾eŠíù][{WW×¥K—ÆÄÄ 2dõêÕ£G†ugÄssss[±bEppð³Ï>[UU¯ËÖßÅytçãŠ+•C…E‹ýßÿý_`` ¼ˆï\ˆ¿¹Þ¼yóÚµkÆ ³Ùlr¹<55µ¼¼¼ÿþ‰‰‰/^„jÅb± 2$33ÓÍÍ­cÇŽ‹Åd2íß¿¿cÇŽÇŽ3›Í°TÉdruu}æ™g@Þk×®å8nÆŒ°Î¦ó›Cbåüž óeþ®«[~ñÏúwy|ƒXã<ËåòÝ»w_¿~¯ûàƒ¶nݪR©nß¾ ïÙ³,ëîîîáá!•Já©rqqqwwwww—¼€µÝÜÜàY!IÒÍÍÍÝÝV$w>œJ¥KQTyyymm-MÓ°º:d<ðððpwwgY6¨©©!I–˜÷gîáááááKÞ0 £V«Õjµ‡‡¬Ì.±¦¦fñâÅ®®®$IÀŽF|îëœ-,»“——7kÖ¬£GªT*©TzñâEX+÷СCçÎóññQ(*• VÌX¸paUU•»»ûçŸ~êÔ)©Têçç—’’âçç›A=RUU¥Óéd2™»»;¬Ë©CñªT*XáÂ…555^^^çÏŸ_³f——,ôñðW½hÑ"WWW‚ †bW©Tø‚þ¿­,‘Hºwï>~üxhß}÷ÝQ£FA:/©Tš››»cÇ»Ý>räÈF ‚pêÔ)//¯1cÆ€ vïÞ””>jÔ(ÈlôÕW_ݼy³K—.}ûö…:AP(gΜ9räˆF£ßŠk¾úúúB‚ŸË—/ïß¿ŸeÙQ£F5iÒú Ã?~\¯×4–}S(7nÜØ³gI’C‡mÚ´iNNΕ+W(Š:wî\‡ú÷ïo³Ù ñÊÆSSSׯ_?`ÀµZ}þüù­[·úøøŒ=–³¨s¶ÄÅ.¢££7lØÐ¬Y³ððpÐx={öœ8q"”^MMÍðáÃ;¶víÚ#F;vì‡~pqq™4i’L&ËÈÈŸ4i4ΰ4´L&+--]»vmNNÎØ±cccc¯_¿žÝ¿AöíÛ~éҥ˗/ûí·:uÚ»wo^^ÞÎ;œ––¶wïÞ‡¼ê+W®¬[·î¹çž«­­ýòË/«««{õêÕ¥K“É„=êC ,Vذt¨ ÕÕÕ *Xš°¼¼|þüùÁÁÁÑÑÑ‹/¶Ùl‡úꫯž~úi½^ÿöÛok4šüq×®]ƒ¾xñâÒ¥KÕjõ{ï½wóæÍlÛ¶í×_…µ,•Jå™3gV®\Ù¾}{«ÕúÊ+¯˜ÍfðèÌfóªU«L&ÓÍ›7.\«ÑhfΜYYYIQ”››ÛÙ³gW¬X KLÈd²ììì·Þz+$$$00pΜ9ùùù&“iÉ’%ÙÙÙñññ«W¯NJJ‚ÅÙ`É;¥Réãã#‘HjkkÛ´isàÀï¾ûÎÍÍmùòåu΢Pƒ¡M›6]ºtyï½÷ @Ä…f²³³/_¾|ôèÑóçÏÛív½^?{ö쌌Œ×^{mæÌ™AAAƒA«ÕZ­VЭÍfÓjµâ˲ÉÉÉÆÃÃã7Þ0™L999Û·o‡¨vìØ‘¬P(<==ÁµQ©T¾¾¾7oÞü]W­P(üüü¬Vëo¼a6›ãããW­Z•iÍP!ÿ’ –\.ß³gOvv6¤ç˜6mšL&ƒ…‘iÑ¢Emm-A …bÇŽñññS¦L!Z§¡C‡FFF¾òÊ+*•*11133³gÏž:ÎÛÛ»_¿~§OŸóæÍ«­­…8–Z­NLL¼råJóæÍ׬Y³páÂêêê܆1™L‚ x{{WWWƒs.®YÅó¼^¯w8µµµ‡Ãl6Ûl6»Ý^SSÓ¾}û‡¿jXX¿¬¬,88Øf³ 0Ä嵑/`1Š‹‹0`€Ùl†EÕ¡Ñ (ÊÝÝÝ××wõêÕAyxx̘1#>>þµ×^KMM7ož\.ß±cG—.]¦Nº}ûö… ®^½Z"‘¼ùæ›z½VB¿ÑÃÃãÆƒv8+W®œ4i’¸H:øÒ~~~r¹ÜËËëÃ?1b„ÝnŸ>}z@@À¬Y³vîÜ)‘H ´˜’’2iÒ$‚ RRR¢££EÕ‰‰TÄ=燇GUU•¸ xÅ ÃÔ9[ñ‡‰Äh4öéÓçâÅ‹6l>|¸5€¦bÈA¬X±bРA#FŒ4hPïÞ½ÛµkUÃ]ÇÀ(ŠÒjµ …‚㸜œœAƒÁʸ™Vÿ„΂»»;œ'x׿ëª!ócxxxBB‚ W®\Q«ÕJ¥R§Ó¡†ÿ%7òt@pX³Ù\SS3tèÐýû÷Ϙ1#88øâÅ‹|ðA=¶lÙb0ÒÒÒ´Z-d ˜1cÆ!C®]»ÖºukXÿ}Ú´i½zõºpáÂÀGŽi³Ù,Ë„ ,XÀó|nn®Ífsuu5 ЛÍf½^?f̘—^ziÉ’%z½¾  `êÔ©&“Éd2 <øØ±csçÎýðÃív»Á`;vì¬Y³æÍ›'BqqñâÅ‹³³³!þW‰Z  ÷ôô¬©©ùàƒ ÿxÂРöéÓ§ÎÙB.äæž1cFBBh’¢¨„„Hn`2™ž{î¹³gÏò<ÿì³ÏªTª)S¦¼ýöÛß~û-ŒQ9Ÿ‰è>Ð4}òäÉ•+WfggËåò¶mÛVVVÖÖÖ¾õÖ[E]¿~$I™L¦R©>øàƒwÞy'22rãÆß|óÍĉ_y啇¿jN·téÒéÓ§8p`æÌ™QQQ¿þúë¢E‹0[Ê¿gX"‘¤§§«ÕêÀÀ@ç¼õ×®] ñòò2 GŽ©­­íÖ­[HHAgΜÉÉÉ騱£^¯÷öö¾páÂåË—ƒ‚‚zöì í¹sç®_¿Þ¤I“öíÛÃãCDùùùÇŽóòòêׯMÓ×®]suuõóóKMM…´¥¥¥GŽ‘ËåO=õ”R©¼víšB¡ ±X,/^Œ‹‹“ËåX¨¦¦&!! ˆ~ýú¹»»WTTäçç7mÚ”a˜ŒŒ H•^·T*½téRvvöÀ3335j¤V« CãÆ!„›‘‘ g ÅRZZZQQѬY3›Í&“ÉrrrŒFc³fÍnݺuëÖ-}µÙl-Z´(++óóó €¥•/\¸åîîNQÔ7äryhh(H öœ››ëp8rrrª««i+òóó?¡Ñh¼¼¼üýýsssOž<Ù¿__ßC‡ñ0 SAA¿WÀ¸.4Úh78[üDA°Fm´z ü»œW!T M#Hƒi §u†ï_swÞzqþáãSÃÁv‰äeB8-(ýx^ ÚØ? _ s~^as~ÁðI’*•J|k·ÎùÕiúœ5/®/n,Èù AçUÎ[Ô»žø§ø[x×Ö ²ÛíâþëZ\F.—ÃÂØb#ÿ@ üð^%¼}îü Ã0F©Trçî˜xäÈwwwHM¢V«]\\@ ð,«P(”J%˲6l02™ÌYØ*•ÊÕÕ^ÇÕË0ŒD"‘Éd°@4è‡$IØ9HK&“w^‚‡màpâÙBÆX牸ó">¼õ.‘H êÑh4°Z5˲ûöíËÈÈ€? EC»¸¸¨ÕjØ­N§Û¸q£\.Ç×ß‘úÍ7ß|˜–2 Àšã I¹\^UUk©‡……•——oذáÊ•+-[¶tuuå8îĉùùù‰¤¦¦¦¦¦&''§¢¢¢´´ôÃ?ôññ aÐ4-•J/\¸påÊXŸ^âg¦ªªÊd2&''ûøø@#OÄÉ“' aÛ·o«Õjš¦KKKAÏÕÕÕUUUÚíââbX¹²ªª* € ˆòòr“ÉtíÚ5‚ üýýoܸqîÜ9¹\îíím±X"""àÜ ÅÕ«W/^¼9 ¾8sæ ¬É,¡C‡¶nÝÚ¤Il‘ÇQÀ°HúÙ³g÷îÝ k²Èd²[·n-Z´Èd2íÚµ«¸¸X*•:tH¯×ûøøxyy͘1C«Õ¦¦¦;vlРAÉÉɯ¾újFF†Z­ÎÌ̼qã†ÍfkÞ¼¹««+hlÞ¼yÉÉÉÕÕÕß}÷]‡ÔjµÍfS«ÕX°`Ñh<þü¡C‡úõëÇqÜ›o¾™››{áÂ…ôôôøøø—_~9>>ÞËË –Œ‹_¾|yyyy×®] ƒR©\¼xñ?þh±X¾ûªªÞ½{ýõ×Ë—/¿uëVÛ¶mÏ;÷ñÇs·mÛ6-ZÌž=›¦éöíÛþùç;w­Ý¾}{çÎ Åœ9s®_¿~óæÍ„„„èèè}ûö•——“$ÙªU+H"ƒ2FþN¼*%´·Ÿþù¡C‡BCC‡ZUU¥P(NŸ>mµZW®\YVV¶mÛ¶Þ½{§¥¥UVVŽ=úâÅ‹cÇŽ6lXiiésÏ=—ŸŸyw6lØ “Él6ÛÙ³g_~ùå°°0½^™Úµk7hÐ µZýì³Ïž;wîÙgŸ…Ôv»ÝßßÙ²e"¬´´ôܹs<ϯY³F«ÕŽ9rܸqQQQEÆ7nX,–üüü#FX­VXSÆb± 8pÚ´i©©©/½ôÒ”)SAhÚ´éúõë Þxã>ø M›6û÷ïÿì³ÏúôéCÓ´\.ÏÉÉùé§Ÿ6oÞúÊ+¯8p $$¤ªªjçÎA¼òÊ+láÿþïÿfÏžm·ÛÅÅnä10øÃ† óöönÚ´©ÅbaF§Ó1";;{øðáMš4yñÅyž‡%£m6[dddrrò”)S\\\`GŽã¼½½år¹^¯‡gÖa‰zyyi4š×_VœdF\œÉáp€Ók6›]\\¬VkaaaIIÉ”)S`Iºššš¶mÛ¦§§WVVŽ7.??ÿìÙ³r¹<22Ò²@¨ÉÃÃÃb±yyyÒ4íïïODff¦——WTTTeeeëÖ­†)))r~~¾Åbyï½÷8Ž»}ûvXXXzzz\\Ïó«V­¢(êÒ¥KA@2|˜ÇQÀ°¬äèѣǎk³Ù`ñG‚ ª««,X`µZwîÜ9}úô={öPŲ,˲[·n=vìØ–-[8Ž{î¹çÄdÖÜ‚€-ôZyžW*•W¯^ýä“OÖ¯_ߨQ£éÓ§‹‡ î$]SX-=..nΜ9ÕÕÕ‰D­V«Tªýû÷ߺukéÒ¥»wïÞ´iS‹-Ôj5¤,„^$ò5F£QLq@„Z­Öét<Ï{zzæææZ,HöI˲®®® .„5}}}?ûì3NÇ0Œ§§çÕ«W=<<`UJµZ ñj|žÇ4 m2™ÄÖ‡J¥:räÈ”)Sjjj<<<@`òÉÉÉQ(z½þÊ•+[¶lÉÈÈày²{Á¨,ÎzòäIN'9ŽƒL‚§OŸÅw’‰‹  £Ñ8pàÀÄÄĤ¤¤¢¢¢/¾ø¢ºº:&&F¯×›L¦æÍ›?~¼U«Vb ØÿÞ½{/]ºôÉ'Ÿ¸¸¸„‡‡kµZ›ÍÆó|LLŒ¿¿ÿ{ï½—’’²|ùò–-[z{{Ûív³Ù'•J¿ÿþ{£Ñ¸eË–ÄÄÄ¡C‡&''ÿôÓOÇŽ›={vuuµZ­.++;sæ æCß(4qgøTôH­Vk\\œÁ`ؽ{weeåk¯½æáááëë{íÚ5ƒÁ0nܸÚÚÚ={öøûûÇÅÅ………¹¸¸°,Û¼ys»Ý.—Ë]\\Ž=Ú¢E OOO³Ùìçççéé¹sçNA:uêj·ÛabFÓ¸qcŽãÌfsttt‹-|||öîÝ{õêÕŽ;BzQ™L’Ëåjµºk×®b^b‰DiÇÒÒÒôzýœ9s\]]u:ŸŸ_DDÇq:uºvíÚ‘#G¢££_zé%…BqðàÁ   V­ZµlÙòìٳǎóõõíÖ­[@@@HHÈÏ?ÿœ‘‘1mÚ´Ö­[K¥R‹Å’””Ô©S'È<„Ý`äïäOä€ùÇ1 ¹°ÀM7^‡sqqq>1ÈÆ¶iÓ¦ï¾ûN­V;œ*ž’óåÃeÂþ9Ž«³ñÐÎ'_ÿr óÆoTVVŠoV!ÿÂ>ðÿäY¹G.gÅŠ^H /$@"\ÈGÓ4ÇqÐW„„ÐíÔétA¸¹¹A·âL …Òð™Íf³Ù¬R© {5MÓ*• &BÂÏ¡ã éyž‡Ä…4Mk4Há ÝTñœ]]]Å>ª8ÆŸÅœfz½¾tssƒ Ý¡J¥‚É$,ËþüóÏIIIK—.­ªªòòò‚ªÕjHí ÝòÚÚÚÊÊJ±d ö¦V«!×!$&IN&±ˆH„Z­†þ6 ‚€¤„ÐÛ'IR§Ó‰û×h4uNv qø¹Z­†71Š‹‹a¶L}WíGn$¦ÎûÀÎZuva¨rd‚g¨T*¯_¿¾{÷n‚ †Þ¼y󜜜‹/VTT(•ÊñãÇF–e>ÞÍÍ &«üòË/§OŸöôô3f ¼A3L@Ÿr¹<77wëÖ­¡¡¡Ð¨®_¿>++«E‹£G.((8þü!CAرcG|||@@@BB‚——$æ.))ÉËË9rd‡ üÁÿöÛo¯\¹5jÔ(¨Ä+;v¬B¡`f×®]/^ŒŽŽ®3?ì^÷í†hÿ7xüÀu¡aêÅ—_~ùÜsÏeggK¥RŽãäryffæ[o½Ù¨Q£9sæäåå™ÍæeË–•””„‡‡Ãd ©Túã?nݺ5""B¥R-[¶,//oذaß}÷Ý©S§ªªª-ZÔ©S§   W_}Õh49räâÅ‹r¹\«ÕnÙ²RNoܸ±yóæ<Ï?>;;»W¯^›6m:räˆR©œ?¾Õj4hÐ_|qñâEx±ÑÅÅeË–-;vl^^ÞªU«àE"qR÷ùóç»wï~àÀ/¾øB£Ñ|òÉ'—/_7n\bbâºuëT*ÕŽ;¶mÛîéééåååêê Rüè£$É/¿ü²eË–‘#GÚl¶wÞyÇùågxQ±¦¦föìÙ& -- <ˆeË–¥¦¦öë×ïÀ«W¯vwwß¼ysUUUMMÍüùó“““årùÆm6ÛåË——/_îïïïéé¹hÑ"s8 ì^½:!!¡_¿~—.]Zºt©F£Ù¼y³x¥ï¿ÿ¾F£Ù±cǦM›ºvíZ\\\YY)އ¸®ò¿q]è‡jA¸páÂÉ“'!Ñ»Á`P(;wîìܹó¤I“‚¸uëÖÎ;‡ õî»ï‚ƒ-˲ӦM1bÄÕ«W/^Ô¤I“Ÿ~ú)::Úd2ÉåòqãÆuèЦiH#4àÓ4=|øðAƒ5nÜøòåË/¼ð‚Ojjj^^Þõë׳²²¦Nêåå¼oß¾®]»êõz£ÑØ¿ÿ®]»Úl¶èèè'NÀ¨2\ˆ§§çþóŸèèhww÷eË–iµÚñãÇ›L&Žã"##³³³áœ§OŸ>|øp‚ 233õz}ûöíSRR<==-Kûöí£££aÊwbb"ôÅn…R©›––6lذnݺÙíöèèècÇŽÙíö̘1cèСñññIIIâŒ4lµþ•-ðÃŽ¿õÖ[ÇïÔ©Ì^ày^«Õ¶kצX„……ݸq¦:C_×yÕ ŽãGuu5I’û÷ï‡|öÍš5‹ˆˆøàƒ6mÚôÅ_ôêÕ æi‰11¢c·Û‡N§“Ëå‹6,ËjµZð?¡÷Û¢E èxK¥Ò¬¬¬Í›7·lÙ²¼¼Ü9„†Åb1®®®ÐHIIÙ½{wëÖ­óóóY–…-9Žƒ¾+¼¡}KèDäççüñDZ±±V«U|ïÂyȪººÚÏÏÏb±À¿$Iee¥»»»L&+//×h4r¹ÞÁMŸ>ýðáÇ ™0pbâ€6¼2][[«P(\]]ËËËår¹«««Á`¨¬¬\³fM\\\YY™L&³Z­‡ÃÇÇÇd2F±fAžÜ „ˆ7n ß ¾téÒóÏ?OÄ¥K—bcc¡ÉuŽ$‰M?EQ^^^ üñÆ:Îjµž9s¦¼¼ü«¯¾ª¬¬0`@=àñ¥i°â›à…ÂÉ@ÇÏápx{{³,»lÙ2…B¡ÕjM&“Ýn‡Ø8ü£FJHHذaƒ8ö£»A(•ÊÜÜ\†aärùÚµk—-[Ö¹sç-[¶œl6[HHȺuë¾ÿþû¦M›BÑ£GÍ›7×ÔÔܸqC§ÓY,ŽãÀK‡¸q×®]wïÞ=mÚ´¨¨¨³gÏ:ÔÛÛ{ðàÁsæÌéܹó±cÇ&L˜ —˃ƒƒY– –ÉdÍ›7ߺukóæÍ¡ €_“É>äŸ{î¹eË–õìÙóÌ™3O?ý´¯¯o‡Ä+µÛí&“iÒ¤IK—.-)))--­­­Åøß YUUå,臩À¿…¡>L’dŸ>}4MeeeAAA“&MÄŸÐ4‘‘áéééííÍqœL&KLLLOOoÚ´)¼|[^^þ믿RÕ»woaJJJºyóf«V­àU¡œœ¹\d0²³³cbb`1’$ÃÃà ‚8uêTnnnëÖ­›5k*‚æëøñã:tÐjµQQQ‰ÔõÊ+¯Lž<¹´´4444>>Þf³qøða«ÕÚ¦M›êêêfÍš9Ÿ3Ã0LJ·,ÒÓÓccc•Jå™3grrr:vì¨Ó颢¢ª««õz}tt4„î$‰Åb9xð R©lÔ¨MÓ!!!4MŸ?>##£U«VqqqF£Q*•fgg»¸¸øøøƼ¼¼ÈÈH–esssyžˆˆ°X,±±±ƒ!::Z"‘¤¤¤\¾|9666>>Xç+ŒŒtuu½víZRRRëÖ­)Š T(u–õÃv¬¡Û¢fÿˆ€Åñ†aàÝZ„¥ä`Z¿¸±L&ã8F#aˆ^'„q`–e•J¥ F£š…BÁ²,´äf³Y*• ‚ó¨áÕnÛÀÂt0í­±\á¯hš6cÇŽ]·n]LLŒÉd‚ŸÀ:u0 ^çs†]a2™d2xJ¥&WÃÐ8ÛÐ΋£å0ïÂf³ÁùÃ~ |`6\ˆØY¨u$IÊår³ÙÌ0 ìFΡ£CÄP0¢FÓ4ôår9Ä àÐâ4 ¸® ]bè­9¯ð*jØy‘táâ‹Guö ÎOû~Î+ÅŠS‘ÅŸˆ?çfˆ¿…ýˆ=g°m6ÛÁƒ»uëæêê*®.༓:%ê- ?qž1Û;wþïºOçkÏÊùêÄbq¾:(Oçý‹‡Wç@u&´9? þ…®®®~‚: $©T*M&“óà ‚<¡s¡â˜Vmm-ªù÷ø InöÛ;½N„©:Ðnð©Už(A°Fm´±FƒX‚FŒ  A0‚ €A#‚FŒ (`APÀ‚ €Œ HðS« 6Úmj|AÐ…FŒ öÑFûIéc Œ  b!Hï;·È蜠öão‹ŸèB#HoA#‚Fä¡!µZ-–‚4Ôs#¡vƒ³ÅOlûÀ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ €A#òÆu¡ÑF»ÁÙ¿}âë„‚-0Úh£-0‚ ÄBt¡ÑFmt¡ùK]hÌ„6Ú 47YSSƒÕ‚` A¿]À¸°;Úh78[üÄA0ØFì#‚}`´ÑFû÷%7CAÐ…FŒ  APÀ‚ €A#‚F0‚ (`APÀ‚FŒ  A‡0® 6Ú Îþí_'Dt¡Am´Ñþ=.4¶À‚.4‚ ÿÄB #:Ö‚  Èß(`\m´œM`n$ù@ÖÖÖb) öA#òðÆ Úh78[üÄ>0‚   A0‚ €A#‚FŒ (`APÀ‚ €Œ  A¿WÀ¸°;Úh78û·O| AÐ…F]h´ÑF]hAA0‚ ˜ A°Fä0.+‹6Ú Î&07‚ü u:–‚`A0‚ /` b¡vƒ³ÅOì#ºÐ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ €A#òÆÌ h£Ýàìß>ñuBÁm´ÑþZ`ì#H]hiÈ.4‚4\07‚4d‹KÝ!Ò ]hç ±>´Ñ~ìmñûÀÒ€!õz=–‚4`A†*`L­‚6Ú Î?Ñ…FlÑFmlÁ ‚ €A#‚FŒ (`APÀ‚ €Œ  A0‚ (`ù÷ 33 vƒ³ûÄ·‘[`´ÑFs#!ò{@A² E€ ØFm´ÿ‰(´Á`Àj Aj Œ«R¢vƒ³ÅOì#H]hAm´ÑFAt¡]h´ÑFû±w¡±F†Üc  A0‚ (`A#‚FŒ  APÀ‚ €A# A†(`\•m´œMઔ‚-0Úh£ýO¶ÀØF ºÐÒ]h,Á>0Úh£ýOD¡F#VcÒ@aÄ¥îi}`ç´Ñ~üíßú¼èB#HÃnA#ò· S« vƒ³ÅOì#¶Àh£6¶À‚` APÀ‚ €A#‚F0‚ (`APÀ‚FŒ  A0‚üûŒËÊ¢vƒ³ \VAÐ…FŒ  Až8c m´œM` AÐ…F䟄ÛeA°Fäo0® 6Ú Î?±Ft¡ù' M&–‚`m´Ñþ»ûÀØ#öA#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#ò÷ —•Eígÿö‰o#!ºÐ‚ €Á>0Úh?!}`l¤ƒA,Á>0‚ ÿ˜ A°Fä0® 6Ú Î&07‚  È? i6›±ûÀh£ößÝÆA°Œ  A0‚ €A#‚FŒ (`APÀ‚ €Œ  A0‚ )`\Øm´œýÛ'¾Nˆ èB#‚.4Úh£¹‘]hAw0ˆ… Ø#òO€Éͤ!·À¸.4Úh78›ÀÜHò/€´X,X ÒP]h,A#òOƒXh£ÝàlñûÀ‚.4‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚<¤€13Úh78û·O|A°Fm´17‚ ¿t¡¤!»ÐX‚}`´ÑFûŸˆB[­V¬Æ]hAþvãºÐh£Ýàlñ]hAA0‚ ØFmì#‚.4‚ (`APÀ‚FŒ  APÀ‚ €A#‚F0‚ (`APÀ‚ü€qUJ´Ñnp6«R"¶Àh£ö?ÙcA0èB#HCv¡±ûÀh£6F¡ù½.´³ ±nCíÇß?±Œ Òf³a) Hv¡i¨ÆÔ*h£Ýàlñ]hÁm´ÑÆA b! A0‚ (`APÀ‚FŒ  APÀ‚ €A#‚F0‚ ±€qYY´ÑnpöoŸø:!‚` Œ6Úhc Œ ±]h´ÑFûqw¡±F #I’⧨l´ÑFû±µEÍb Œ Òn·c) HC báÂîh£Ýàlñ]hiÈ-0‚`Aì£6Ú¿+¹¶À‚}`APÀ‚ €Œ  A0‚ (`A#‚FŒ (`APÀ‚ü­ÆeeÑF»ÁÙ¿}âÛH‚-0Úh£-0‚ ÄBt¡ÑFíÇÝ…ÆA0˜ m´17‚ ÿ$ÇqX ÒPƒXXÒ€Œ »£vƒ³ Ln† ØF]h´ÑFû¹ÐØ#HCn±Œ  A0‚ €A#‚FŒ (`APÀ‚ €Œ  A¿UÀ¸.4Úh78û·O|AÐ…F]h´ÑFS« ºÐ‚<î` Ax ììRcïm´û· •ÃáÀj A°Œ Èß.`\Øm´œM`n$ù€}`Á>0‚ Ø~ÜlAÀr@ûñNnö.4Ï $ùÛXñ|çÏ?°‡ß… Øþß–š¢‚Ÿæ:>ø0$A’A¢`~—ziš¾s ùûlÀó¼óÆu8x†÷½×Æ4MWWT*)lCQ” ð‚ðÀ‚" ‚¼ÉÔ/½ß[ž¿kç)]šþï›-<ÏÃNœÑjnnŠÞ>ñèÿ»ÁáàëKÔ.Þ»{íM¼5âÎoÜÃÜ”1ôâÅ‹X£S™Ÿ_Åq…B*I’UU†ââ77%Ïób“&ºð'Ïÿ·:¦(’ãø””|F!‘0w¾ÿ­*½Ónw Á©©'hšÖjgÏfÕÔ˜üýÝ„ÿ½] ´²²ÚÊJ½F£¤(ª¬¬öܹlA<=]œ7¦iš¢(Î\Y©W«å‚ 0 }ûvÕ… 9v»ÃÛ[íì¢Ð4˜˜}øðõÖ­Ciš!7·R¥’ÂÓæt¥âUÀSKÖ$$\kÒ$Àù2EžÂÂÂê¢"­——šçž(Š,,Ô¯œ[{ç–j±ˆÄpþì¼¢BŸ]æëëêôý‹³þi‹×Ë04Ç9®]»M’¤J%ËÍ­ÌÌ,--­-.®)+ÓI$ô™3YååºÐP¯»JQ|NjjL%%5nnʪ*CFFIIIMyy­««‚e%âÅ‹¢iŠ¢¨¬¬ÒÊJ½x³Äm(Ь®6VTèÜÜ”P EEZ³Ù¦TJiš./×?«¢BçççFQ¤ äÙSÑò$I9rýàÁkð,Rµn݉ôôbŠ¢†aš¦IPMÓ CÓ4E’ÃÐ CCE,•+·Íf´ CÓ4-VÀð+†¡á60 -*™¢ÈŒŒâ÷ß?XV¦?pàÚŽIE‰í(­¦Æ¸páÞ'2I’¼~½hõê_ËÊt_}uúòå|ØTPPµqãé öœ9“E’$MÓ'NÜX·îdU•qË–³GŽ\‡áóó+¸öì³ñ C‘$•šz{þüÝååz(§+¥ïÔ2¤DÂÀ㘓SI’¤óeŠ6<ˆeeºÌÌ2‚øŸ_åæVÂÎK€¦)؃s9Z‘$©Õš®_/!Ü9.ÿªsÚÎe˜‘Q¼téÏGޤ×Ô˜¡¬®]+¼~½83³ì‹/Žge•õíÛäìÙl‹Å{»Sg9wÌx’$ÏžÍÚ»7…$ɽ{/ïÚuéڵ“'o._¾¿¸XË04hŒ¦I𦠂4­|øÛoÏT‹+ºZ$Iž:•¹lÙ~“ÉN’$EQß~{þÚµBŠ¢³?ü0áöíêãÇo|þùQ(´'æaü_‚ ¢£}““ó‚H˜´´ÂÚZó€Íyž?wî–ÝÎuèÁ²LE…Î`°T5i Ñ(ÎË$¢C‡š¦,®ÿf*‚ ³³Ë²²Ê7ö õäy¾¨¨š ÈœœrWWEóæAv;—]æ)•2P_½zû©§šuí]RRóñLJŸy¦ t{ ¾¶Ù¸­[Ï)lx¸A»v]4¨E‡ŽÏ8yòF«V!b»WRRÓ¨‘·Ngööv%Âl¶;–ñâ‹]BC½ÂÃ=IïÓ§‰ØaÛ½ûòSO5usSrœÃn·?~#*Ê7?¿*0Ð]„üüJŠ"oÜ(Šò ñ$Â`°œ=›è^X¨mÔÈÛáàóó+««M,K7o”–VXX¨mÑ"ÈÏOÃ󼟟kt´/I’ƒUüœ?IÇç啇„x0 ][k*+ÓEEùVW’“sýü4Í›ñ<ûvµÙl--Õuí]^®KI) tkÒ$€çyµZöÔSÍ‚'òüù[ƒ¥}ûp¹Õj/-­áæÍ²æÍ}}5‡ƒ HðY¾ûî”)]ƒƒ=@<Ý»ÇtïCDNNyIIM»va4M+•lnneãÆþ°sš¦þ·_CQRR RTT3fL»æÍƒ‚Ø´éô¯¿¦wëãá¡P(¤&“­  ::ÚwãÆ3QQ>¶€hµ¦êjcD„7xyAhµ&“ÉvölVŸ>MìvÎ`°FGûjµÆ;’_{­/œí¢E{®^½ÂqŽ'°?üàê¶  ÷ÚZ3Ç9‚Ø·/õ©§šÑ4õé§¿Þ¸QrófÙúõ§(Šúõ׌•+¤§ ¨¶SS Þ{ïIR—.å}óM"A\ݶ-±¦Æüå—'RS (ŠÚ¼ùì† '‹‹k7n<}íZ!Ï {ö\6¬$I‘$ÁóüèÑíºt‰2™l‰‰Ù‘‘>õ[䜦©OEFúDFz»»+9ÎaµrÍ›áᡲÛyQ<Ï·oÑ­[´ÍÆùúª¡xýõ~AAîA¤¥EGûŠÍQq±V«5¶mÆq†¡¾îååÒ·olff)A‹ý£ÿôSjIIÍêÕ¿jµF£ÑòÞ{òòª._Î?}:+:Ú·¬¬vÙ²ýÇŽ¥ÛlÜž=—öîM©®6~ú鑜œ Š¢Ö­;™—Wi2Yß{ïøÕÙ³Ùaažb]³uë¹Û·µÐæÜ¸QRVVûñLJµZÓÞ½)ÇgPµfÍÑM›Î–•énÜ(ùâ‹ã••†­[ÏíÞ} ~›’R@ä'Ÿ¹t)¿°PûᇇÍf›Ng^¾ü—cÇnäçW­^}Ôd²R ÝÑ£"99wÿþT¸Åç°Û9›Û¼ùìÀÍ¡a”J%••‚ xž IR¯7oÚtúâÅ\Š"á¿m`y¹>8Øçy«• ñ€+2›mnnÊ}ûRÒÓK(ŠÚ»7åâÅÜÛ·«‹Š´$InÝz¶¼¼–¢¨¬¬²Ã‡¯C§€¢HžçËÊt#G¶9s&‹ã:ÙfãÜŽËhÖ,08ØÃl¶ èV\\ƒãÀ÷0I‚¯¯šçy³Ùž™Y¢×[zôhüë¯éf³íÅ»NžÜžøŠ ý3Ï´™>½'Ï™™¥&t|å•>]ºD _RRík0X~ý5ýÿþ¯Ïرíû÷ozìXÏóƒuÂ„Ž£G·‹‹ ¾y³T*•¼ùæ<[‡ÀóÄ©S™‹í¹|¹`âÄŽà…B#!ášLÆ>õTó²2]p°h;5õvU•áÀ«J±Ë±YÎl4Z}|ÔA0 ­VËiš>|8­¤¤fðà–båÚµ"??DÂ$i0X.]Ê7®}x¸we¥žQ•J:uj· :¹ºÊµZãáÃ×ݦMë>~|G¥ŸŸë­[ûÍ™3ÀÛ[˜xkΜ§Æ‹oÛ6ìĉ žìvGt´ßþýWƒ‚ÜïüJåᡃI~~ššSm­©°PûôÓ-·mKŒ3¦ýÀÍ/\ÈÑëÍ‚@Ì™Óäȶ/æªÕ²gŸŸ;w ŸŸ+ÏóF£µY³€Ó§oÚ펗^êùüó•JöêÕÛZ­É××uòä.S¦t£(²²Ò!\AÒÓ‹I’ tOJÊMHH£(Êáà%æÐ¡knûÛlvPµÃÁ‹ÞrZZÑÖ­ç~ý5ƒ HA (вXlƒ%(ȽªÊ ×[NžÌLH¸¶nÝñ¢"m¯^==]ª«v»ãêÕÛÇ·¾|9ßl¶i4 A 6n<Ãó|»va3fô€»ÑŠšS¿~M 6))G¯·H¥ EQ·n•ÇÄøBõM’„Åb—J%(àûápðr¹T­–—–Ö&$¤õíÛ„ ˆ7J ëªU‡>ü0A©”Z­œNgމñãy!<Ü«ÿ¦K–ü´n݉"(Š**Ò†‡{ed”„„x¸¹)ívܹª*#Ë2ÁÁ>j–eŒF+Çñ®®òììòŽ#8ÎQ^^KÓ´‡‡*/¯²Q#AΟ¿Õ¬Y DÂpœÃÝ]Éq|U•A"¡Y–ÉÊ*ëØ±üŠa(//P!ÂÇG]Sc:z4£S§F‡P\\sýzÑüùçÔ  ÷ÂB­««ÜÝ]Åóüðá­Y–Y¸pÏ… 9:4ÒjMïá¡JM-èÜ9Òáày^psSšÍöÂB-4‰eeµEº»+ÁÝÐjÇOžÜ¹}û𚃗!‘Ðú³g³Gj+„u:‹F£¸¢£}Ÿ{®Ã AÍA€â…òñôt¹}»Z.—p_ScŠˆðž7oB!õòR™L¶3g²¢£ý iVVÙ°a­;vl4zt;ƒÁ¢×[t8~ ³AðL.g{õj|útVVV¹——< •J&Þ¬Š }p°»è*bø^ƒuDx¸×ž=—išìÒ% Êñ©§šuéÅqÏ:Ùnw¸»+)мq£dРƒ·Ü¶íܺu'^}µ¯Ngñ÷×ܸQ"ÊòêÕÛ!!îUU¥’eÚáp V??WŠ")Šà6MSii…Z­©K—(•J¦VË+* $IJ¥A «5ò>v,£¼\g³q©©·ƒ‚<ââ‚ã₳³ËnßÖ¶hL’$Ë2wBåDii­««‚¢H»Ý!‘0ÇŽedd”,[6üŽÂÿ{¥f³M£‘Q]mHJÊíÜ9 ”ODM±²ÒàééBDM‰$ WW…Åb—ËY†¡«ªŒR)C’dy¹.2Ò‡$É;¡c‚aè«W ›7,-­uu•a³q2™~ŲŒJ%ƒ:… ˆF¼J“Hè3zêõf–¥§Oïáâ"·Xl,+9v,šk“ÉVRR3sf/½Þüxy¹xy© ™²Z9Šúo7õÖ­ò¾}›œ}Ób±·jìGM&“ÀÓ°uë¹æÍÅ1'§âÚµ¢Û·«ccý ‚Èϯ$’aèà`Ý»/wï½gÏå°0OAŠ‹k4PJk×?þVQ‘¶²ÒйsÔöíÜÝ•A„…y¯öî½|'zôßàMHˆÇÕ«·_x¡‹L&aYÆÏO³sçÅ-‚NŸ¾ùÜsrs+==UpJëÖìÜ9Òßß$ uzz±R)#¢uëЮJ$ôùó9îÁÁ¥£GÁU(Rð{ÞÍMåíí²}{rX˜×ùó·fÎìEÄ™37ËËu/½ÔÆ~LO/vuU¸»«ÄQY‡ƒ‡®¯¨œ›7Ë@ÿ'ãyã8Š¢H’¤(!(È=+«¬OŸXoo5A­[‡:”FQTBµ.]")Šüæ›ÄAƒZ¸ºÊá.ܼYêá¡"I‚¦©nÝ¢Þ~{Ÿ¿¿A={ÆìØ‘L¤Ng>q"sÊ”®4M=Ì$“'tXìËd’øøö„…yÑ4•’RàëëÚ©S$üý5‚ ´hl0X22Š›4ñê©æz½ÙÃCæ¥PH#"¼’“ól6nüøîî*³Ùåëá¡´Z9FÙ¨‘O^^¥F£ðöv{zº„…y%'çr?n\¼——KU•Á`°FFú@—Œ$ ³Ùå£Ñ((ŠÌÎ.·Ù¸1cÚ‡„x ‚PQ¡ç8>,Ì ›v»#:Ú4\RRæiµrz½Ùh´…†z*•Rè‚U[­\t´ouµ¡oß& Cs'„Z-W©¤žž.ÑѾÐköð÷×DEù”–êjjŒqq!-Z¹º*X–iÜØŸ¦)wwe@€&99W"¡'Nì¨P° ãçæ¦ŒŽö--­­©1ÅÅ…4k*<„ íã£nß>‚a(’$š6 ÈϯÊÉ©h×.,"ÂÛfs4nì§VË¥RI‹AééÅÅÅ5ƒ·÷6,‘‘>^^.ááž C§¦„…yÓŽçyš&›4ñgYÆfãÂýÄ&I¢I“€[·ÊKKkFjê)BAAu·nQ*Aà)Ф(òÛoÏ÷êÕØß_#Ö2 ]çÅ"ìvGT”¯§§Êáà›6 tq‘A76aÊÝ]Ù¡C„T*~– ×®¶oѳg¬ÕÊåçWFDx‹£v»£qc77… ÞÞj—¦M¤RI` »§§*5µÀáàÇŽmvÏ¡iœ‰õPó‡ÀK' þë|_ÅI9bp¹k >žó6uŽŽ´ÓOõ'îÜuÿP%‹ÿ÷ø^g"ž*®¨HûÃfÎì%•Jœg9ÿäÏ™„Ëwþ̪wþΗ\÷WuJ[œþz¯ãÞ§<ÿû¡¨ÿ΄»ï}$ N¼3Š'¦éŸN-.®™6­;ü÷!§aÕŸ\u×ù|p³¨ÿ ½nißy¢`&_ÝÉvõ§Ð¡€ï×®3ÉÖy"qÿÖ™c S2§‰Ê qçÙ­° L u¾#â®à'w›Hü?¡a?Îó¢ÿw2íwî4+Pp–< ×|}5ÍšÞQšx 23ùí’뜤x½w- çŸ;M5%ëÌm¼WQÿï”`ñò›•Uç”îz ê ™ÂÆÎ÷N‡¢è‚‚Ê_Í?¾ÃP÷Ÿð$Þˆ{Í¿ÏEÝõ¿ÎÅâ<=Ó©´‰'Y½ÌÚ…'R=¯£‡'Іê_¬Ú¡pžÌr I’ã ãÜ6âsòÛ¿i_è`ï_xR'ËßyPD¯áÉ-І=ü>¸uÜÂ'“;Õ<ê}|Œ¹‘êÛ®’]¯"Ã2yÜî |>Ô8°óÔ(Aþ7ða¼ž‡ê×qA䯦—Ý_ÃÌ{AEeeeŠ"#h£ý—Ùðò\PPP£F8E”!þ7*]gw<ÏÓ4}ôèÑÝ»wêHX/"È_ møðá‘‘‘<Ï3 S_ê¢fÉ.ž$¾Œ‚ ÈßïB?¸|ŸX\å ƒXò7±`:í]mQ³ÌCîKŒbc/m´ÿû¡´ùH–2Eä;·‚Fä0æFBígÿÖ[Æ>0‚   A0‚ €‘ßù0郱”°”PÀ0©mâĉééé3½üÉ&ínß¾}áÂ…$‰k9¡€3222L&–Ã}ª9‚ ÊËËsss‰'{­"ðãˆB¡À×¶ˆD"‘J¥X(àÇôœ²ƶŒ Aü®äf÷¯Sïµ”ácXýÿuŽî#¼vçfêav[?çÈã†óZŠöžÖÙçï}#ïIp=@tññì ÂYÁ vNžôW¨î–*d3¾¿8á¿÷9{e„ú;kOâQǮĤœåê|—ž¿âyhÖét:–P(îîîÄãc¬ªªÒëõ!!!‚ 8/5ô¸µÀ‚ ”——sÇó¼\.÷ôô„T/w}¼@Ûk×®5³gÏ®¿ Üš*¼!¶Àf³¹ºº: @¼jAJKKÕjµB¡ø}Jø ž‡Ç½ÌqI’}ôQtttëÖ­ãâ⢢¢zôè‘‘‘õ"<‚‡ªAÇqljõ1ÇqÎ;KÐùWÇ9ññÁ¿¿W Ç‚-I’\´hQ›6mà_‡¾~ýºÃáÏDÜÞù°çû«[`’$Fc‡š4iÒ¦M›Æ·jÕê×_¥iZ¼|8%878èž={¾ÿþ{Ñ—v.g¸Š¤¤¤Ó§O‹Û;—ÏßóÔ>ÚÌ'NDEE}ýõ×EÁ-¶X,Íš5ûî»ï`¨(+qFñÿBqÕyŒ€ÿLf@«ÕªÕêóçÏ_¸paÿþý¥¥¥£G†fA"‘Ð4Í0 <|E1 #‘H$ 4&EI$q‡â÷P#B£Û0 ߈ ÁþáûúÝ’$ÅcÑ4 Ë -^¼øìÙ³$IJ$’ &ìܹ“a¸gÎç&Öåpòð=œØ}Ê¡~;üVÜó‰¾þúë/^<|øp÷îÝûôésàÀX¯ÜñÚAÕjµZ£Ñˆ>¤s9sÇ0̪U«Þ|óM†a~[NéïÅ>燴ë·À2{Av»Ýd2½úê«·oß] Ng³Ùˆ; á†Ë„{*\>Ã0ÎÏÑp23ü©÷ÅÝÉd²ÐÐÐðððøøø¥K—^»vÍd2ÆåË—Ÿ:ujòäÉ7n¤iº  `öìÙC‡]²dIuu5I’999K–,©­­…§êƒ>€Ö›$ÉÍ›7oß¾$ÉŠŠŠ… 6lΜ9ÅÅÅ¢3™’’ò /Œ9ò‡~³éŠp8ŸþùðáçL™’’’BÓ4I’iiiÉÉÉ%%%¯¾úªÍf;pàÀÊ•+áF–””¼ñÆC‡ýðÃív;Hº  àõ×_6l˜x’N‰‹ï2R'µßxÏÓ¹&õóó Š‹‹ûè£&OžÖf³ùÛo¿mÒ¤‰R©¬®®ž?þÀoÞ¼IDAAA«V­ÎŸ?ß´iÓ;wÆÇÇ×ÖÖªTª·ß~ûرcAdffΙ3gÓ¦MP³Î˜1£  Àn·÷èÑã§Ÿ~ŠŽŽ>tèPlllAAEQlÓ¦Édòõõ;vì|¯óùçŸ_²dIdddiii«V­‚ضmÛœ9s`Kp5aÝÝüüü–-[ž?>::úwÞ=z4HºsçÎ.\ˆ‰‰ùúë¯ãâât:ÝÃ8ª›g³ÙA0›Í‡ã¥—^*++»zõ*MÓË–-2dˆ‡‡Çq;w>zô(TXpb6›­GkÖ¬‰‰‰9xð`çÎ x‰ ƒmºwïÛ8p sçÎF£±!¦/ƒ®ï¦M›¾þúk’$Å^„<Ú¶m»wïÞ˜˜˜¯¾úªoß¾<ÏÌž={çÎ4M¿ð ›6m ´Ùlð<4¼6\­ø ÆCÚð„cÖ¬Y³&Mš¸»»³,›™™)Baa!MÓŸþ9üäé§Ÿn֬؇ÃÝÝ}Ö¬Y‚ tìØqòäÉ<Ï¿ûî»&>>^„+W®H$­V›ššJDYYü°wïÞÇw8ÞÞÞ‹/†/øáWWW³Ù ­ F£‘ ˆï¿ÿ6˜4iÒûï¿/«¯¾_†‡‡/_¾ì!C†tíÚì’’‚ þùg±æ«­­íÖ­Ûõëס×T§à ]ºt¹|ù²¸Á(O(8–e¿øâ A¬V« 999$I=z´²²’ ˆÓ§OÃ'OžÜ¡C(ÞN: ‚°jÕ*µZ-ÜÁÝÝö3nܸž={—üqmÖ¯_/¸¿÷œÒ†¯]»vÒ¤I‚ ÀÃó‡÷ {Û½{7T÷ .d¦²²Òjµ²,»zõjA^z饈ˆñ2%É/¿ü"‚ |}}·oßNDjjjçÁYÌE9<û·æ§Ž }×x̽l±¢Ñh–,YÂó¼ÉdZ¿~ý+¯¼ràÀˆ"4oÞb-§NZ²d‰ ƒÁÅÅeôèÑû÷ï_µjÕ Aƒ6nÜH’äž={-ZôÅ_äåå?>44T£Ñ8ŽÆwéÒeìØ±ƒ :räAÙÙÙåååÙÙÙ¯¿þº •••µµµyyy111p…R©tøðáÓ§OOLL8p ´êÄ“ÇÿW'‡C§ÓØ.^¼6gλÝ.‘H‚8qâDß¾}}}}[µjõÌ3Ï :ôĉ„Ó2÷÷i¬Äúû÷–gý!Í:›)Ф¤$(«]»vÑ4••uùòe1ˆJıcÇ\]]çÍ›g0”J¥Åb9}úô”)SL&“Ífã8ަé:Û˜ÍfئŽúWØ÷Šùý™ýTVV.Y²dóæÍ/¾øâž={Ä{túôi¹\þÖ[o™Íf•Je·ÛÏŸ?ß¿ÿ… ž?~ôèÑ+W®lÑ¢tL‡^¯C˜u9üyû‘¹ÐÇ©TªáÇ?óÌ3&LX¿~}BBÂ¥K—\\\À©†Ð Çq...Ür8®®®6›$ÉAƒiµÚãÇ—––NŸ>=22r÷îÝçÎëÛ·¯ ééé&L8räHÏž=l6›M&EQµµµEEEÅÅÅÇ͘1 iz×®]~øaFFÆsÏ=×¼yóôôtÑÕ‡nô3¡7Ê‚‚‚âââÛ·oÿç?ÿ óòòºyófÿþý÷îÝÛ®]»I“&A£ñ7;Gv»çù’’ABBBªªª$IYYYIIIQQQHHȬY³œe2™$InnnYYY^^ÞØ±cá.è!“$Yg›gŸ}vÀ€âái†²jQYŽã(Šúî»ïöîÝ»eËwww8y«ÕJ’d^^^iiiNNÎÔ©S;vìH’$˲±±±AÀDç¡ÿywž ñO³X,EQ±A¹\îëë{áÂ…É“'Ã.\ˆˆˆ ¢qãÆÿ÷ÿתU+™L6|øðO>ù„ã¸Ï>ûŒ$ÉsçÎÍŸ?þüùÞÞÞÛ¶m›8q"Ïó¯½öZÏž=ë×èÂ=xðà”)S&Ož,BLLÌ[o½µoß>ç&N¹\NQ”J¥bY¶k×®Ð9räÏóË—/_¾|ùõë×›6m:lذ§Ÿ~‚º÷oþp©Š{#INO©T±|ùòÐÐP???///›Í¶iÓ&ˆ]Õ?¨———Á`€!¥:·‰eYx@===kkkëoûÉGGÿŠnáŸß'HÆ&:wî|8tG322ª««;uêDDyyù¨Q£¶lÙRRR­¨J¥’J¥£F2dÈÉ“'‹ŠŠ>úè£~ýúÙívñÄÇÔ©SgÍšUPPpãÆ ½^ïïïÞ¾ÕjÍÔÔÔüü|‚ æÎûþûïóÍ7ÅÅÅû÷ïoÓ¦MUUUNNNÿþý÷íÛWRR’‘‘AÌQqöÜÇ9ü3ñUèH§¥¥%%%íß¿èС¿þúëwß}Çó|×®]###ããã¯_¿žŸŸ?mÚ´3f€§%0kÖ¬‹/Ο?ÿöíÛ—/_îÒ¥ËþýûAœ999YYY6› ¨Äm:wî|èÐ!AV¬XqâÄ ’$W¬XqöìY»ÝþÎ;ïܸqC ¿?ªøó£*+1 á«•+W™L&ð¼yóvíÚõé§Ÿ>}º}ûöW¯^5›ÍÏ<óÌ‹/¾¸eˉDòüóÏ‹ÃK©©©uÜÔÇ3ýÛg>ñK¬\¹2888$$$000((hðàÁÄ*..>s挸å{ï½çëëëçççïï¿qãF1’qüøñFÁnGŽù /ˆÿýä“O|||¼½½çÎ î®Ñhœ0a‚‡‡G@@@DDÄöíÛÅ#àõž8q"$$ÎY„uëÖùùùøûû¿úê«‹eéÒ¥±±±Ðºœ9sÆ××Ñ 6Àó{~lÃWu¢ÎJÀ`sg»ƒó³ e*Ž^À7F£1;;ÊZܸ~üÓA,Kvv¶N§sÞ9„¯nݺ%ÔCÜ ''GŒ`ƒœcŒÐ“·7YYYF£Ñy'z½>;;Ûd2Ý'øÈ Eˆ'»7(,,ÌÏÏw.@(Cq³[·nUVV:_‹N§+((O¸Î6ñ†Y,0àÂë”êã `1þï¼ø´Z­âü*8PvvvMM ü°ÎSd·ÛÅ;.> HÀ~èï>“Â{0Ã9ÛÚ]#±p¢â<~‡Ã!N¸q~¯¾wÄ·¬s,ç!Dç“t>7ÕB,çþ;qÞU×®]?ýôÓ¸¸¸:{~$A’$Å38“˜8’¸Ûû$õO»ÎYÝçÒœ3â=® ”ð—_~™””´iÓ¦:¡„G82,^&hØù‘/Ù9Áß]Ÿ‡Äú“aÒ:sˆ;¯Å8w$Ä2Á¯ê–ó$¤:»Eüï;7γ¯ÄƒŠÇrþ¯ó±ÄSåüô;Ÿ›¸·:_ÖyqòÎ~`‘:«ËyªÐ]³FÞõÚë\ï]·w"îù/óŸ/·»æÝ¬óüÔyxœÇÿœ61æ\>QÜîѱþäTÊúÅç¼Mýg±~Ôúaî«ódÚúßßççw=–s¤·Îïºý]ý…gîuè»–ùýŸ°ú×òÀë­£Õ:çó¸M¥¼Ï3V?R]ÿ½×cöh¯÷¯žJÉÔy™á®!~´ïc×IŒ~¯a´ëüYG-hÿ^û¼Ì€¶s{Uÿ½<,Ÿ»Ú0Ð*ÆÆ°L°~,Z`—:‹f`ùÔ·Y–…‰Ø?’¸á½€òØRSS£R©þŠÈê¿ ³Ù “j±( (`iÀಲ ¬ ²”° °F[`A#‚FŒ (`APÀ‚ €A# A0‚ (`A#ÒPaœóY#Ò°À·‘¤!·À{öìÁR@A¿Ý…®³‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ +Ì!Œ4ø[ü/¾6ÈÎNd^¢tKÓ´øš üép8ž´yïpá÷Ù€çù'íÙhPEQÔ{í¢íêêêœ[cl@¥KQ¤~úé§_|ñÅU«V:uŠ¢¨'¡®…Ëôðð˜>}úàÁƒƒƒƒÇÍ›7·oß¾qãFŽãÄlÆÿú¶W__ß¾}ûÞµ¢¨¤¤¤´´´'¤L†Ï FãÆwîÜ ‰ð>ûì3‚ ž„´½ÐöÆÇÇçääõ8}út@@@&úßý$|ÿý÷Â}¹uë–T*ÅHÁcä3«TªwÞyG¯× ‚`µZ9ŽûðßSE’dXXXee¥ 6›Íáp@ã8›Í&Brr²\.‡-Ÿ„º,!!ã8‹Åb¿¥¥¥ÐÅ@? ïèÑ£oܸ•+Çqv»]„>úè 0A?þø#¨·~kcµZAxóÍ7Kìß]¿üò < õKƒçyAŠŠŠT* øŸ§E‹û÷ï‡{c·Ûáö<9†ç544Ôb±@«[ÿ‘u8‡###C"‘üëY(Ü_ÀÅÅÅ ]À »;D’¤B¡x÷Ýw/\¸0pà@xv†yÒ*T¸ÞØØX©T*Â]/Â{!!!ÐÆ6çßAn—`l³k×®óæÍ#Âf³±,û$ßK™LÍË}¶‘H$2™ Ÿû¯ÑpOçy’$×®]Ëó<˲¶ybïeQQ4³÷Ú@„šššòòr°ñéGÿ“@kS[[;cÆŒ.]º=z”¦i~ÒžN¨Ë®^½ Hw­ÅI’gΜ©®®¦( Œ~\º4MŸ;w®wïÞÏ>ûlff&MÓ$IÂ\Ž'˜–`6›—.] UX ;˜ã±lÙ²'ªXþäÈßUÝÛtqqY°`V«…Ñ»Ýþ„Œw‡Ö¬Yã}H’4™L“¤Ãd2‘$9nܸÚ"+ŒH$ŠŒŒìÓ§O¿~ý"""jð¶mÛH’ܳgA-[¶Ôëõ$I®[·ŽºÛ£G’$AÝ»wŽŽvtt$I’ÅbÁ_‚ ¸\®———ŸŸŸ··wçÎoݺ%‹kóa$`Ä?àVÁd2ÇŒóäÉŠ[­V‹•››;dÈJœ¦So“&M®^½jcc£V«ßm Þºukpp°D"8pàõU§?úè£Ý»w1âÅ‹,+''§¢¢þ‹$I`û`'wvvÞ»wï„ ºvíêááѶm[8ÇBFüëh˜ N÷É'Ÿ”••Q¢²V«ýä“Oär9ýt—¢Þ+W®PŒñ™ŸÅb•——gggƒÃ#ñ³æœ9sठ,Õ‹…Ãá?~|ýúõ¿è¡ùPoyã?‘€ÿR¼‘þš÷ÖP§Íf3\±X,ð¿°e€‹øù$ç7ú`3ÐÙñ/$àw„PQtý™~çØàÿºFS7`øxçfÔ»woœ¢®0‰@ êØ•••8 D]%`4b!uèÈ@ #ˆ¿E„þÅ;H’$ÆÛδ âmÞ ”ƒ ¦A þ6æñØñ__3ðb!I LÒj%­V²‰’$Á`l6×j5[,¤ÙŒÇÙÄßDÀIIe ‡ H³ÙÄ`0L&+“Éd±H³™$I†@ÀãpþŸÂ)êe2 Ž((ȵ·wuuzyq‘ #=3ºjÕ¢¦M?S«K?Že0™™ñööNNNÒÌÌ\«•8pL‹éõZƒI0‡CTT»v­ïÑcb»võ=)*:Ù½û8ˆ¢À`0d2‡Ã!B«ÕjµÚ?ƒ†¥R)U·Êl6k4HnöŽ™µZ­˜;ñ׈Ð<ÇãAe†?E’#IâæÍ]A´lÙÁ`På  ‚Åbétº¬¬»ÎÎÁ¹¹qEE™žžy©©ÌÊÊ2µº€Í]sw¯ÇáˆÍf5X¹H’äp8$IB–@Ð¥K—Æ«Õê?ÜR}íÚµŠŠ H˜âêêÚ¬Y3¡P¨ÓéjÏ—Åb±³³[¾|ùãÇ9¢×ëÑlŽøSa6› ƒÁ0¿Mx~_DK&óm‚¥•Ï·³ZÕL¦ØÛ»³Ùlzõ*³mÛÂÃ]¾¼½ª*£wïÏY,dáA«ÕŽ=:999<<\©T®^½záÂ…ãÇW*•?kÝ,È?@¯ãÆf³©ü ” KÝù»k¨³fͪ®®öññ1¥¥¥Û·o Ñétµ‹Ä²Ùì’’’ÌÌL¸sZ£'ÔEè º‘#~³rçææ™´¬V«D"ùŬñoU§ßM·A³oß9={~a6›kgÊ4´ÁÁ-B\]½{öìGfÇÒ¤I»ÐÐŽ*UµBavs ²Z `вX,666;v숿yóæéÓ§ïÝ»÷Ÿÿüç›o¾yöìŸÏçóùR©Ôjµòù| -‡ckk ”ckk ôˆ›Íf±X666µíA|ñÅ 7nÜxüø1›ÍŽŽŽf±X, x<$ãåp8ˆÌjµòx<™LV£'І;e2.DÄodÌqrr ò÷÷ üͬ_ ` VƒÚÂǧÉ­;V+C,&Y,³PȘ$ɰXH£Ñd4_*å+•eL&‹R€™Lfnn®››[HHˆV«•Ëå >|¸F£‰D)))ýúõëСCçÎ=*‰Ølvuuõøñã;uêÔ¡C‡ùóçF›óçÏO˜0aíÚµ;vlݺõŠ+€Eÿo߬ƒA¥R) ww÷Ï?ÿüùóçf³ùÒ¥K#GŽNÎd2GuâÄ °"¿………Æ ƒžœ77S£ÑÁd²îÜùI«µ HRõêUƒÑ ´@½:nðàÁ§OŸŸo4}||~³Í…ý>/ãñ\.ŸÉdòùƒÉáð ó-‡ÃáryV«%8¸ÁÙ³¥yyI:¨WÏwÏž³lö9φÃi)—§šL:ƒ¬V«Û¶m{àÀ%K–tëÖÍËËkøðáÆ swwß¼y³ÙlÞ»w/—Ëíܹs~~~bbb¿~ý¢££{öìikkËçó/\¸pçΰc‹D¢;wBõÔ$$$DEEÑÙ¯@ ˆ1c†^¯ÏËË»}ûöºuëØl6›Í†23±XÌår)åD*•nÙ²¥ªª*))I$EEEݹsçÈ‘#Í›7ÏÌÌüöÛo?úè£>úÈÑÑ‘ÃáF4w!~‹èËdr8`–'ÖÏæ2cnn†V[®V«ÒÓÓ mQQÖóçNÕÕÕ¥¥e\®@¥ª¬¬TÉd~&“J£)·Z›ñù|‹Åd0”ÙÚzTV–:‡ j:¨ }ôQÇŽ“’’Î;·|ùò[·n]ºt)---00ËåVVV*•ÊÅ‹›Íf‹ÅÒ¾}ûÙ³g§¤¤ðx¼œœœH„Škyy9Ðdm-‚ÅbUTT¼zõª¬¬ìñãÇ[¶l0`€R©¤×Ñ jå$"33ÓjµöèÑC§Ó …”” ù¯¿þzÅŠ'NœhÙ²å„ ‚ƒƒKKK‘ý"~³,ý¶RÃÆ`µ’*•òðáoy<®ÑhX¶lƒ¡?yr™ÙÌb0 IIñ A–W¯FšL‹Œ¿œœüÀl6¿zõÀjµX,Æzõü¨xCHo{çÎ77·FuìØ±wïÞ½{÷¾}û¶T*…#ÊvÅáp4M÷îÝýýý—,Yâéé¹`Á‚ââbÊ: T õkïpjµúÓO?]¿~½J¥êÔ©Ó±cÇúöíËårahPI:(¦KƒÁÉÉi̘1J¥’Á`Œ=ÚÍÍ­²²ò?ÿùOTTÔÕ«WoܸѮ]»­[·FEE©T*<:Fü*ùÙl6ûúúzxxÀ:¿Í‹ã½80“ɲZf³•Ïçq¹L­–I’&ŽNÇ[®ÉdÖj«U*•´ºZÁápM&“D"ÑëÙtê±vòäÉMš49þ|EEI’žžžA¨Tª¦M›;vL£Ñ¸¸¸ðx¼éÓ§ÛÛÛ÷ìÙ³°°ðøñãmÚ´ùÿ³ÙD­Ù@Æ5ÇÆfëõúÒÒR“É´`Á‚~ýú]¿~}èСL&S¯×óx<‡êêjH® uß Ñ Aƒ‹/öíÛ×ÅÅ… ÈÄŸ™™9jÔ¨-[¶,Z´hÑ¢EM›6ݵk×'Ÿ|R]]‹ñky¯@ ‰D”âöÇûBÃÞÀd2ÃÃÃÍf “ÉèÝ»·ƒƒ£V«ÉÌ|þêUf·nÝ4íÞ½{rrrW®\ñã' xâĉˆˆˆgÏž5kÖL¯7p8l“ÉÄãñÀzÎb±V®\9nܸ¨¨¨.]º˜L¦]»vùøø4iÒ„Ëå®\¹ò“O>™8qb||üŽ;öîÝëåååàà0~üøÏ?ÿüþýûW®\ ‚Cðªª*ª· …B«ÕÖØÃ jeee»ví:uê4uêÔÎ;·oß~ñâÅ_}õUûöíÏœ9SYY â½V«U©TÕÕÕÆ ;|øp«V­¦M›¦R©V¯^=oÞ¼!C†ÄÇÇòÉ'ãÆ+))INNž7o½Ø,ñþVèW¯^s8³Ù\¿~}‡ÚÇ´ïÖÔ©Sß¡g †GùúúÚÙÙñùügÏž999ñù¼7n°ÙìÊÊʼ¼¼›7o6i~ëÖ-6›––æáá©ÑhÒÓÓ_½zU¯žo“&á !À4hСC‡¤¤¤ëׯ§¥¥µmÛvÕªUp¢Û£G”””˜˜µZ½jÕª®]»’$Ù®]»¤¤¤7n„„„ 4ˆÁ`tèÐA¥Rq¹Ü.]º€KFiiiDDDýúõ)«ƒÁ())‰ˆˆ6L&3444??ßÃãE‹ÞÞÞ×®]{üøqÇŽƒ‚‚6lR\\ìèèØ¶m[UPP“‘‘1f̘!C†°Ùì~ýú½xñâÂ… ÙÙÙ'N5jÔŸäŠøgƒÍf™L&9Áýá70#++ëmû›ÍV«ÕK–,ñññQ*«ù|ž¿¿¿Õj½{÷®““ÓË—/™LæÇ|úôiµZóâEZxxxbbâ'Ÿ|R¿~P^^n£FJKK9ÎÇ š'%H‹D">Ÿ‹<O¥R™L&‚ ¸\®H$Òëõ\.×l6ƒ%ŸÏ‡òx<àx*•ŠÇãñù|J|•H$F£±† ¤D"1™Là; Þb±Þ%•JAÓ†2ƒìU0d¨=)‹õz=‹Å‚³h‹ÅÂãñ { †Â3â·q`.—›œœœ›› Á Mš4quu5™Lp0›Éd‚Õ´´ç<èСC~~¾P(tuu­®®¾xñblìí.]º]—Édr¹¼ÄÄD½^—““ãèè¢T*]\\¨þ1™LF£V«wþ ˆÉdjµÿnL„N§çG(¯/¥+ŠÚQMÔE°ZAÅdЖÁ:Å`0T*ñ³{·V«gO&“ 7Ão©‹T÷¨‹¸¿Ù”õžr¿€A®ªªÊÌ|i±‰ÄÑÑÑj%;vì(²²²˜L¦¿¿bb¢Õj¥ˆ¿Ÿ€ßçc$ÉçóOõÄ? C(þ*1A"‘@²!’$…B¡­­­H$zÿØiW;Õ ”fÿS“q¹\.—ûw®'&S ¼ñ¿Äb1æoúàDhz»›‚šÅÙÙÙUUU ã/(/ ¹5Íf3ñ³y8žÑhÌÈÈ0™LÀ~± ãÁƒeeeL&“Ï秤¤DEE………¥¥¥Õ®u £¦žY{ÔtêÊÏÏOHHøCÒY,ú”Â{‹ŠŠ ¡.ì_0Õô·ó×jµ/_¾¬ñ_pÿÇËÊÊ0…ÓLÀôº¡ô3¡_lÓW-Э½½=ŸÏ§®ÛÚÚ:88L˜0áâÅ‹|>Ÿ¾à€´,?ƒZèV«•~½ÆŽ@ÝL_ôgr¹\X^P ÜÉÉ©¢¢¢oß¾:ÎÉɉÅbÑ  Öx¬Ùlf±XZ­¶k×®'Ož´±±Q©Tƒ.//Ÿ5k–er§^jggCƒÚÚÚÚÛÛOœ8ñÂ… Ô„a6›mll6mÚôñÇÃf³¹Æp`náŸÔ$ÔØø¨ÉÆÆF"‘À{I’”H$ööö6lXºt©X,¦Ê¾R“C=žI!õ®sò¶y†Nòx<;;;ê9\.×ÑÑ1==}РAð Ð$I‹¥×ë»vízôèQ©TZ{ൟíw·©¿ÿ/ÜÒÿ֖ߨ®] xóæÍ76 V«uãÆ]ºtÉóêÕ«&“©cÇŽZ­n …‡Á`€\ª×ëÕj5ƒÁJ¥@xÐ?­V Õ‰ †½½=ƒÁ`2™ƒÉdªÕjXˆTçy<^nnî•+W† ÏÏÌÌ|üøqÆ Åb±B¡ØµkWÛ¶m]]]F#õC[[[‹Åd2á¢F£ …ÏŸ?‰DÀ½ NŸ>Q^^n6›éû—Õjݼys³fÍ5jTcÔl6›µF£a³Ù•••óæÍ›>}ºÕje±XR©ÈÖ±R©„ øI’©A£Ñ0™Lj˜ ˜œ8qB(öìÙS«Õ ‚Çr8¡P˜˜˜˜œœÜ¯_?ƒÁ_Çb±p¹\˜[ƒ¡ÓéàC°X,;;;}õz½J¥‚ N&“¸kµZ T{§@0‰‹‹:t(ˆÍ ÙÙÙb±¸¨¨èöíÛ½zõ’J¥@«|>?55ÕÆÆF¡PÀØßñü_µÿµmøû±Ìf3,ôiӦݺu‹ÇãF«ÕzãÆO>ùäéÓ§«V­=ztzz:(ÃV«U,ÿøã+W®Ü¾}{‡úöí{ÿþ}‘HÄãñV®\yôèѵk×¶k×î³Ï>{õêǃ]|åÊ•íÛ·}úœ={vÖ¬Y………Aìܹ3???%%eÒ¤Il6;::zþüùôÓ2X—F£qúôé7oÞüÅQÕÅÇÇÝ`0€ÎRQQ±lÙ²éÓ§DEEmÙ²E¯×YÂÆtàÀ¤¤$'ÞøüªM ñ‹Ðãµµµµ±±qqq±³³srrâr¹NNNçâÅ‹sæÌ©ªªb±XOŸ>8q"ìßñññ ,ˆ‰‰éÑ£GIII¯^½’““ÅbqLLÌèÑ£ïÞ½Û«W¯ØØØ ™L¶`Á‚yóæ5oÞÜÝÝ}âĉëÖ­Óétðáaÿvrrðjggg@žššÚ A¥RÙ¥K—ÌÌLNZ¢ÍÆ¿üòËúõë7lØpæÌ™6l¨®®&bݺuOž<±µµuss#IÒÍÍÍÓÓ“¾ˆmmmœœ~Õ¨…Bá­[·V¯^ÍãñÊËË7lØ0wîÜÆûùùMŸ>}ýúõvvv………‘‘‘©©©}ôQllìÌ™3ïÞ½ [¼W,»¸¸ðx<GGG6›íææf±XÖ¯_ôèÑòòòŠŠŠ“'OîÙ³G£ÑÀ—b2™f³¹OŸ>.\èß¿?I’]»v}ôè‘L&ûüóÏ:%‹?þøãüÑÞÞ~÷îÝcÇŽmРA»víæÎ;nÜ8F ÇÅÅ…Ëå:;;Ëd2ggg6›Ý½{÷´´4''§ªªªÏ>û,%%…Ò8€€W¬XÛôž={Þø|ŠbY?£†¦†"ôDèßy`Àçó·nÝj0L&“Z­>räÈ‹/t:]tt´\.Ÿ:uê±cÇ6nÜ8{öìíÛ·Ó¿‹Årww?wîÇ‹ŽŽöõõÝ´iS«V­˜LfÛ¶mcbb‚ˆˆˆèÕ«Waa¡Á`ؼyóªU«fΜID``àW_}EY‰9NUUÕÂ… Ázd6›gÏž-‰çÏŸ¿råÊ„„„K—. 0 22²[·n*•Š ‡£P(–.]:eÊ”õë×Ѻuë~ýú•lÅõêÕ›;wîîÝ»§L™Ò¢E‹ÒÒRØ2ø|þ–-[ÀZScÔeeeµGM‘½H$²··‡>³X¬]»vuîÜeË–Í;wÿþýZ­666n ¦3R±X|ñâÅëׯ …—/_¾~ýzæÌ™jµzÀ€mÛ¶ýôÓOgÏž­V«'L˜pçÎPA-‹ƒƒÃ¶mÛÒÒÒòòò<<ôOxÚ“'OŒF£R©$IòÙ³g,ËÏÏÏb±Ô«Woýúõ={öüᇸ\.µƒp¹ÜÌÌLµZÝ«W/•Je6›mmm)sˆ…$I–——ƒ|H14Ø}^¾|ùèÑ#àäï9jêH™’ÀÅb1Œ(22rÛ¶m………ÉÉÉ-[¶´µµÍÏÏwuu•ÉdF£‘²±Ù좢¢Çóù|•J¥×ë †“$9zô课úªöó­V«­­íŽ;–,YÂ`0œœœÎž=+‘H(õõÞÚ:ðïâÀð9W®\Y¿~}­Vëîîþõ×_Ož==´¾ÜÜÜ%K–dgg/Z´èÉ“'cÆŒó$øöÔ™°Z­ jÛ¶íäÉ“oܸqéÒ¥ï¾ûÖ®à¥R©400V\#"hõž={vÚ´iz½ÞÃÃcðàÁsçÎ=wîÜíÛ·gÍšEÍ ˆÄÔy5EHÔØáù,‹5‹Å‚‘‹`Z8Nqq1Œš~ð]š?~BBÂ… ¾ýöÛAƒ …ÂáÇçååM›6---mÉ’%‰‰‰t4}¤þþþÞÞÞ5ÞKoX,–)S¦\¼xÑjµ6L¥RM˜0!;;{ÿþý&LÐét‰dÉ’%#GŽLHH¸víZqq±¿¿?ƒÁ¸råJTTÔµk×ããã½½½E"% @H’tpphذ!¼ ºDíz@x`¯úæ›o¨e±X˜LæÛžOÉSÕÕÕ°;P†Ò÷\“ÿž6õ÷q‹etõêUƒQ]]M÷¤l6»ªªêìÙ³={öBuqqyöìÙ–-[ Ã÷ßß«W/Nâååe6›á¬888X(êtºƒŽ=úã?vww ÍËË«AT,K£Ñ´hÑâÞ½{`w¥ï2Ð «ÕÊårSRRbbbæÏŸ¯R©Ö­[g4‡ âààкuk.—k6›™LfãÆ, Ç ¦Ì°ï5e5¥ßÃáp*++Ïž=I‰Íf3œÙ~öÙg¥¥¥]ºtYµjUEEE‹-öîÝûõ×_8p M›6pSƒ€U*ÕæÍ› ‚÷mF£1&&ÆÎή_¿~žžž?ýôÓ¬Y³ºwïÎápV¬X†«+W®Ìœ9³wïÞ$IöîÝ{Á‚J¥òÔ©SS§N>|8“Éôòò:rä‡Ã;õ)U*UŸ>}z÷î Rqí Ð =z”œœÁqÁ`8;;[,–ªª*&“I]trr²Z­ÔE£Ñh0$ ¨úÔö«ÆNy’q8œœœœ .TVVúøøX,“ɤP(Þñü_»ÿí?à˜øßøµ7~€ÚGǰD7n Ff §wˆ`2™fÕªU›6mZ¿~=›Í^¹rå¸qã@j­¡ÿâ^C-}‹U]]=oÞ<;;»íÛ·[,–èèè©S§RG—oì7¦÷T1–/_.V¬Xa0lmm{ôè§D`‹Å;((h×®];vì¸uë–ÏÕ«Wëׯ¯V«kìS¿øjÊÿ‰n–'*P7(°QSª;u´j#{ãÄþb€ý¦¥¥mݺu„ ={ö öµ·=ñ+Dh8çüÍz/¬­ o\ô'@±5¸ƒÃUŠ¥À©Ríç€B%•JáP”Á`(ŠnúðC:ñ©†äYã±l6ÛÆÆ„8§žO=ík 6 ÚCo=sgÿ9u­VËf³…B¡V«¥³wxŽT*e³ÙF£‘ËåRNËo”n~çÎû× LÄuÕ/ý6úGü=}«­þžçücu`ún]C?|£>&•JÕj5ÍC_ý”¿®H$R*•Ô^@P#¼Ž"0Š% 8cЩ·öߨ75)ŽDÿ¥¾¾±?|>_ €2ùÆç×nS“ÆíÄOï ðOi©`LêÕ¿_b±XôÀŒ¿@ƒáÐ7ÙßÂÆÆF§Ó ˜Êyó=uBjfà eüι'…Yþ½¾Ðô4 o¼¦R¥R-Z´(''‡rë…3ºKæË—//^ ¾µŸÃd2Ùl6,hÁ(Î\\\¼hÑ¢òòr*ؼÓÓÓ/^L¹é½í \b àWG¥RщŸNBB¡0!!aÅŠ5"i~ñìŽ2±Ò‡ ±X Cƒí‰¯Á`ª¶X,`]£dãß|–X]]M׫ÿ‚sKjÏ­}HÔË–-KLLàCMÔ{úä3 }ƒ%{Áï#DA~èçÀ¿—ƒÓ,=çI7KB„-H¼ß}÷]fffmç*¼&%%eáÂ…½Áo!Ô‰îŽGj3™L<¯°°ð»ï¾+)) ðj¡PÔh4ïx u$gˆ’[¸p!|þúõëïÛ·ÏÖÖ6úB¡ðÞ½{óçϧBk»[Q¹xà‡5 ¶ÔŒQ¦µ'Ož”••Q˼;,X°téRGGG‡Ã‡O™2ÅÎÎŽÚß(ØS±ÍðRú»,‹T*½xñ¢¿¿qq1˜Óè“@Ÿ“7NýôŽ~@ ¯ º?¤O L]³È7ß|óàÁ‘Hç…`!ÛÒ¢^GõG¯×'$$@ šP(ŒŠŠš8q"¸Ç¾ñ!µ'Šz85óË–-“Édvv„ßå ý‡(9àªÎf³­VkuuµÉd‚ã@ ‰ †\.g±X5¼/`% —Ëe2™ÁK¹à‹D"±X †2ÃÚÙÙiµZp¥pàÌf³Y,–@ H$b±|•@„¦¼©áEàk¥V«ÏÃ1¯T*%Â`0À·çr¹&Áãñ¶oßÞ°aCPÔy<žD";+++I’¶¶¶T´-ˆñ”ŽVe°?Cx½J¥ùÐb±p8ƒ[À{###×­[7f̈šàr¹%%%G=tèPJJŠ­­­Õj¡ 999$$¤6 ÃÉl¬°W‚„ïàà@ͤV«mÚ´é®]»ììì¬V«Á`‹ÅÐ¥R)‘HÀ³ººÚh4Ö˜(N¶k.Ù@B¶¶¶ Á0 †D"â¤z 0˜î ×’Éd¢tø@V«uÊ”)&“ ¸8¥ÁÒ¢ž`µZe2$R«Õp–Q^^Þ¡C‡+W®tïÞ½²²ráÂ…¾“ƒ<¬T*©¼ñë€03ìØ±={ö|ÈÔûÇX¡¹\®Õjݳg¸C4œé%IZZÚÉ“'y<^Û¶ma¡×^m·oß¾xñbPP]dµZ¥RéóçÏO:¥Óézôè1ñ‹eÏž=Í›7¯W¯ƒÁHNNNKK6l, ¹\¾lÙ²ÒÒÒ¨¨¨-Zç¡N›„„„Ó§Oóùü€iW,çææž8q¢²²²cǎݺu£ÇP–6«Õ*‰òòòèwREÌf³]VVÖÅ‹###===Á±Q |X"‘ 8ÐËËK«ÕŠD¢ŠŠŠ­[·uêÔ)***--íÂ… V«õÒ¥K2™¬sçÎ&“ÉÖÖöÈ‘#ööö½zõš:uê‰'\]]u:]Æ mmm/]ºT#›(W¯^·Í‹/zxx 6ŒÍf/Y²D.—wîܹsçÎ0:.— 6Èü±Y³fW¯^}ýúuÇŽ{÷î}óæMH¢2hÐ 777F#•JóóóW¯^­T*{õêÕ¶m[“É”˜˜ ¤xìØ±Ç»ºº8ÐÕÕ• ˆk×®ñù|‹ÅrñâEŸÁƒK¥R“Étüøñúõë?þüÉ“'}ûö²¡Ø)ìÈ‹&÷îÝÉÉɃ …&“I*•ž?þöíÛ2™¬_¿~!!! çÏŸg³ÙÇ7 :t`±X<öJ‹Å²k×®¤¤¤úõëƒÇ“É|ã×ÿm˜yGGÇnݺQ.:(Êäryeeeaaaxx¸³³ó!C\]]ƒƒƒsrr4ÍÍ›7APP,k‹uæÌ½^_ZZZ^^^ZZj06nÜHD›6m:vìèèè(•JÓÒÒÌfó±cÇx<^›6mzõêÅb±¾ýö[³Ùœ››Kxn™Íæ¹sç ӭ[·Øl¶»»{×®]›5kFÄÞ½{I’Ü»w/“ÉLKK³Z­[¶la³Ùݺu‹ˆˆ …wîÜÑëõwïÞµ±± ëÛ·/›Íž2e üŠÁ`¼zõª¤¤„ ˆ~ø$É;wîÔ¾ó‡~sW^^ž³³s§NäryEE…\./))!IròäÉl6»Q£F}ô‘£££§§gvv¶J¥JNNöððŽŠŠ"bùòåqqq:uâóùÁÁÁÑÑÑJ¥²¤¤Äd2µhÑbÁ‚pbÜu×®]eeeeeeÔ‡€AÜ/‹ÅjÙ²eTTŸÏoÞ¼9LoëÖ­ ‚ظq#I’䘓“óüùs‚ <<}ØlvDDÄG}ÄãñÂÃÃKKK•J¥———T*mݺ5}š ˆ˜˜ `¹\^UUUXXÈçó¿úê+à–óæÍƒ€ÞŠŠ ©T:nÜ8¸¾cÇ‚ žzôè.]º¨ÕjxQyyyee¥Ñh4Z­–$Éþýûûûûƒ\zíÚ5‚ ¢££á]‘‘‘¡¡¡$IîÛ·Åbåææfdd0™L0ÅÉM’$™’’BÄ¡C‡¬V«¯¯ïˆ#àžÅ‹;::ÂÆ V«Zµj•žž7ØØØÌš5‹$É~ýúÕ«WÔ'OžôéééÙ§O¸y÷îÝAÜ¿¿¢¢‚ÇãÁ ‘‘‘­Zµ"IråÊ•,+33“$ɲ²2.—»p᪪ª-Zܹsž8dÈ’$óòò ÆåË—I’Ôh4 IræÌ™</??Ÿ$ÉÊÊJ''§aÆ‘$9}úô_gß¾} DP3_]]MÍó‡‰ßeħÜ6mÚ\¿~ýÒ¥KÑÑÑßÿ½@ 0&99yÔ¨QRÛ°aCâç̉”Ù955U¯×þùçÅ’ç“'Oª««'Mš¤R©JKK $“É._¾,‰L&ý<2a»ví …N§:thYYÙëׯ!¡X›@9_³fÍ®]»¸\nbbâëׯ“’’FŽ †Ýºu;}ú´L&£ŸEDzJ¥zúôé_|AÝyêÔ)0_õêÕ‹Á`\½z”sº©P£Ñ¸¹¹5jÔH.—ÛÚÚ …BˆÜŠ‹‹sssÛ¹sçÚµkóòòÌfsBB‚F£ *"‘èàÁƒMš4 †Ð<«Õúý÷ß/Y²D(A¸%‡Ã)))éÔ©S»víÚ·oÇd2===¥RiEE…‹‹ “Éìܹ3<¶^½z:Ž2Q KXXÜàîîäëë[VVyM&S~~~vv¶L&Û²eËÆa“zõê•]`` V« ¸wïÞóçÏ£££çÍ›Çf³á-:ÎÛÛÛÖÖ¶   <<¼Y³f·nÝ¿‘FsëÓ§X,¾ÿ>ݺIE\¸p¡sçÎþþþ………àÚµk]»ve³Ù=Òjµ³fÍZ°`$“°Z­•••àÒ'甾vöìÙO?ýÔÓÓ3//ÏÖÖvôèÑ/^[†««+ýëTUUÁY5óïðêù'èÀ —••õíÛ×h4vìØ|÷Øl6øô‚¹ jø?€ô '7pþ ±~, $á:Xómll***èµ jg ‡§Y,Ðp(»“ÉT(çǤ\꣢¢€3@¬˜ÜúöíKüÊO?³…ÎÓïìׯt ƒÁHIIiÔ¨lLÚ{3L,C„ðÓ§O333áh´C‡`cü ü8sæÌÒ¥K)ËðŽ;ÀpòäINÖ2°FEEBž’`ne³Ù Uêõz8$«ðLn»7$Äàp8°¡@O˜Lfllì£G@åîÔ©¸š¨Õj>Ÿ¯×ëûôé“““Ó½{w±X &L‚V: Z{{{Ðà[ÿÿ1&“)‰èn9ôÓ •Jåëë û”Z­nß¾=lÄŸ|òɽ{÷"##íííÁòDJÖ8z+Dr8³ÙìèènçpN}Êy»²²’>ó8~Cº–•+WæääÈår°=zT¯×CbtPlÌf³L&£È,®f³\pËËËýýýÁÑ èÇÓÓ´>___F£Ó銋‹½½½aW+1‹Å …ôÓWx#xá[­VGGÇÔÔTXâööö&“éüùó°: ‚€’N%%%`©b³Ùûö틌Œ¤'‡¬ ÅÅÅÔ{÷‚ÉgÏž;vÀ€©©©`·³³S*•t‚¤Ú‹ÅÖÖÖd2M:uüøñz½žÏçÃ"c ˜Í¥RéÙ³g­Vkdd$å1 „‘OÔc![íìÙ³ás@2ýĵƂ~£+h6ýÈV¼Õj]¾|yÏž= |e`Vööög×®]±±±ÅÅÅ...A\ºt ²aÂ)=‡ÃIËÍÍ £ŽÀgF§ÓUVVzzzÖðäƒ/ëêêZPPݶ··‡/¨V«O:•””Ô¨Q#‚ ’’’(ö_ö Ê“ÔÙÙ9==:ZÏÈÈÉd`‘¦GžSž3W®\¡ÏüNÀ¿÷,ŸZ­öÉ“'ÅÅÅ ¢°Ùl.—Û§OŸ•+W‚Q ôOðÁxðàALLŒÉd õóóûæ›o@Þ¹s'ˆMš4 ™1cx‰ÍŸ?ŸÉdÁØÛÛÇÄÄhµÚôôôãǃÖ÷ªU«T*UAAÁÒ¥K›5kæìì ÛªZ­îÒ¥‹­­íçŸ^ZZªÑh¾ÿþû™3g:;;÷éÓgùòåÙÙÙ`>ùâ‹/(Á’àÀ£_¿~+V¬ î5j0:6›-“É8 ÓéFekk«R©öïß/—ˉŸóæÐEƒÁ   `0.^¼Ø¿…BÁãñL&Saa¡F£áp8ûöí‹ŠŠ‚­‡ ¢ªl–ügPa·otV§ØéšH ­„ÞaNçîîÞªU+i6 ‡2d¨Ð„\A$$$”––nÚ´)##2Š …ÂäädHd·wïÞôôôšÍf¡Pxþüù¬¬,‡³lÙ2“ÉÔµkW Bzê\‚ >ÿüóGýøãB¡ðáǽ{÷NIIÎÌ> W€& !15ùãÇ?wîÜéÓ§%ÉíÛ··oß‘çµ] àŸµgþËY,–B¡øâ‹/®]»Ö±cG™LÊìÙŸ~úiDD„½½½§§'ä(d±XëÖ­KLL„|«{÷î2dHPPD"qsssvv ðÈ‘##FŒhÔ¨œC;vÌÅÅ…$É+VLš4)00ÇãÉd2™LñvvvM›6U(û÷ïI ˜L&™LvòäÉÑ£G7jÔH(ÆU«ViµÚ+V >¼iÓ¦666Z­öèÑ£nnn&“ ¸"5Ã!ÄòåË?ûì3êÎ#Gޏ¸¸'Q©TŽŽŽ'NœèÙ³çBBBÆŒsøðá   𧦋zÚš5k4M§N\]]ËËËGŒ! ÁðáÃøá‡ŒŒŒ~øáîÝ»ß~û-Äٽχ Ú\.—ró€ÓZÊa’Ô€£Pý‚ 8Nƒ3é¾}ûFŽÙ¢E ''§ÊÊÊÉ“'Cz½¹sç¶iÓ¦ÿþ§NêÛ·¯··w```^^õð©S§VVVæååMœ8±gÏž*•ŠÇãi4š¾}û‚:½qãÆzõê …Ba žÑd2EFFΞ=û‹/¾pvv.//ÿòË/‡ IyÆŽkggçââÒ AƒââbØhúôé3uêÔ„„„={öp¹\8U>|xVVÖgŸ}æää$—ËGŽ9mÚ4°ÂÐËçó¥RiQQÑýû÷-Zôž3_‡ƒèa$I>}úÔl6·jÕª¬¬ Äcd FóæÍ‹ŠŠ$ B6 £Ñ(‰ªªªƒƒƒ Í ŸÏ7›Íñññƒ¡I“&p‡ïyyy¾¾¾îîîÅÅÅ¥½ªªÊËËëéÓ§*•*<<\"‘FˆXtvv†ªÕê'Ož˜Íæ¦M›ÚÛÛ+ ·ª««ÃÃÜœÔj5xtÀ¯JJJlll„B!èOŸ>U*•p§F£‹”³³3(¢………n*//ÏÍÍËåBf'''`)¥¥¥ð4“’’ ëׯ "7“ÉŒ‹‹sww¿uëÖ¹sçΞ=K$|O³bEExn¿-++³··‡ôŽÐggg­V[UU{biiiè–Éd@Æ0üòòòÐÐP__ßêêj­V+—Ëá€Åb={öL¥RµjÕ ò+5jÔ¨wïÞ:îôéÓׯ_cžV«år¹ÁÁÁcÇŽ?~üýû÷ƒ‚‚üüüÔj5(5c†`oo™™™¾¾¾!!!° ÀaN.—7kÖŒ$I¹\îææ:í“'OìííJJJ8xbI¥Ò—/_¾|ùÒÛÛ›òÌLÔ`‹ŠŠêÕ«·oß¾óçÏÇÄÄÐ]MÿÉLùÙƒÔ¤V«©ül”{*X˜€ù€]„*ƒ¦¡Ph6›u:¤‰£2¡¦QæTRxpÛ#‡Ãø$‹ÛH $vpÛIÜÂà”ƒ48ÐBj8êWÐ H@¥¨;Á2€çÃÍ`¶î馂⠶ÁÓ€áÀñÅE"œvðx<º‹õ¯©Ølê¥Ó‡î ÿE¸.uC [WÃðõz=eãp8à§ ÿK& ‚Éd½zõ*//‹‹:ð4çëë;lذµk×Bp•r„z}°9r¹\£ÑH9Hƒk | tÖ›ÅbµDyò€i’ïS¬µö`-‹F£ùÍ3_W=±(ƒ!pjéÔ¸K}˜#0“@Upå£Ô<ê·Tü*õê6h«ʤl›”ÎI= ˜ô8 ø/Øþßø+ªQãN*÷uæDåÊ„Â%0*äæŠ*tW ·ô jÈ`Ÿûmkˆ>½$IÒ3¥Pýyã) <½Ã5†Oï0 ŸRÈaràƒÂNíââ’0dk ×|||à»Sγôù¡–ñs?8¢g·¤ìØÔñ$øSɨõFg‚Ã-ÊBþÆÁR)æk$ùp90ˆ+o òzÿ6ºEMÐ/þ–n± H¦Ô®>UGÇûEr„@ŸT’àÚQ1o»FhÝ;·ÿ¥Ùß)BSæJˆ[0”Úö‹°0º;"ÿ Ðc›éëám׿e’g<0¡H$ÊÊÊZ»ví¥K—À¥æ}âcAoÌËË»ví=æþýg´©eP#ïÒÛ®ã¼q<0 ‚‡¶k×nýúõ=£4lY#–~̃111à³JEÏÖx~íc*Ù]E€ø°Ô³·xãuÄo1býÎÚH¯tûöížžžÏŸ?×ëõ`( …àI yTúu*{°@ €œ;‹ªþRÙdmll »X ÁÌñ«`¸®‘ÓçWõÛØþW×F[|jjjnn®½½}||¼½½½­­­H$JKKKNNvsskÙ²%d…Bôë EÃÑh5k–ݹsç/^L¿>{öl8TÔh4“&Mzþüybb"¤¶“H$6l`0/_¾|ñâÅ×_]YY IR|}}333gÏžM¥ƒGó¶ÿUíÿœü¶ ð³Ù»wo³fÍ>ýôÓ²²²€€€9sæ?~Üd2:t¨iÓ¦ôë'Nœ0™LO3bÄ¥RôùçŸ_½zU¥R-^¼866öéÓ§gΜí ­VëäÉ“ëÕ«ެhAüÛX¿9/tm˜L¦ââ 0 †zõê™ÍæŠŠŠ²²2???꺯¯/”䫵R©'wwwHIWXXøÙgŸ Ÿ¢¢"zÊoðX†è9¨°µ‘þ€ÚHÄÏ9Öe2Yqq1DÒòx<¬“J¥666ù•~]$;žD"¢|>߯Æfüøñ2™ìâÅ‹"‘èþýûmÛ¶%hîuôHÎ_ÕglcûŸT‰Yãéma¢olÓ…g*ìàÁƒccc>|èáá¡V«×­[×¹sg¡PØ·o_úõµk×vêÔ }T*ÕíÛ·]\\ªªªŽ9Ò©S'‚ ^¿~íêê*‰ôzýÁƒY,ðÛµW~mŸ±í@û¿ÇH_s‹U^^>tèÐ[·nuîܹ]»v\.wÓ¦MJ¥røðáwîÜ¡_ß°aAv?cÆŒ%K–¼zõŠÍf/X°Àh4Ο?Ò¤I©©©\b±X ç=„wblÿË90£¼¼ü÷ÔF‚äÉ A4mÚò¹ðx¼«W¯ÆÅÅyzzöíÛW"‘èt:6›]ã:$ÔÎÊÊ’Ëå^^^?þø#—Ëíß¿?d?‹Å>¼}û¶——WÏž=;Dæ-b¬HÃÄ)9ó˜DÖüÃsÅaöRÃL¾‰½o0“`˜­Ö+ÅÚYÁ2)—©5“L¤`ⓜ !›IjÍWеß5²cL‚x/6ü+¢‘ÁaI ƒÖBê-$*¡ÄÆI‚Ïbd«毓mß—€I‚d1 wû?I•L&#èˆ? ‚°ZI7›Ã$Hâ})ì×Y¡MVL~@ü¹dÌù5Úé¯ èç±PnF þt}øÏ"` ò_âÏgÂÿyü·v”â»ãÛ3ÿ¼Ï{ÿú¾½çé™è?(übÿÿ®Ïý÷â}úéù%Áwêú*ðXz‰-‚V™ò÷<¼Æ3ßñö?¿ø^‚ `t¿ÿíï?ðEÿ… šÁøÅ{蟞z»õQûÎß?LjÆÞ6^(Îúoc×ïKÀPȇZ B¡ðy=dug2™ùùùôŒð,«´´T.—ÿæ­ #??_­V¿­Dd¥þC¨è&ôÇòÆ÷R£«Qµà7€Ïç¿Ï˜Lfuuu~~þ; vA9’œœœw0aÈ JùÀRå…B¡X,‹Å2™L"‘@(‹õ‡€Íf—•••••±Ùl>Ÿ_{U0™LµZ Å„‘€ßðùW¬XñòåK ·/^¬\¹’ª6FíµôœÝ5v_ú® 7˜Íf±X³zõj›E‹ÅÅÅA|?D,ìÛ·ïèÑ£‰ ^½ñáôFWp8œE‹%$$À3k ,«¸¸¸¼¼ªºPY¦kó jŒTa¡Úo§J4ñx¼%K–Pcy#§‹Å5F÷F~U£KРËA<oáÂ…÷î݃$»oû&“I$=xðà‡~€r­ôŠÁÄÏù·¹\îëׯçÌ™ÕÆ¨JÂÔ=l6»ªª Jo2 ±X|áÂ…ýû÷K¥Ò 6LžŸÅòÄb1ôœôŠÁ`H¥Ò|ÆËçó!îfŠ?êÓ§¿¿¿Éd’J¥R©¦‚ŠåfeccC,| ØÂ`°&š’$áíðA©Êrz½þþýûÊ—Ëåfee¥¤¤p8œ@ÑÐŽ;®X±âáÇAÜ»w(–Ú1¡·D" ÆTe±XÌçóÙl¶ \‹Å0úâ„n 0ÀÕÕ>™X,†!S‹–Z„PÈþ Ö']ŽøÇTfx¯ÄîAˆD"*ˆÐ'//oÓ¦MõêÕ›8q¢££c||üž={t:]=¬Õjù|~NNÎÉ“'§M›F’äâÅ‹ РAƒmÛ¶r¹Ü—/_¶hÑ6K.—{åÊ•ƒúøøäää4mÚ”ÉdæææîØ±C©TNœ8Q$>}úâÅ‹PÙ}ذaééé'Nœ€Á³fÍÚ¾}ûÍ›7ƒ‚‚@g³ÙÇ¿téƒÁèÛ·odd¤V«‰D|üø1ÇóööîÞ½ûúõë“’’x<Þ_|ѤI(“ %g—.]úâÅ ''§¯¿þZ¡PìÚµkþüùl6{öìÙÇ Z¾|yFF†P(œ0aBhh¨ÅbáóùÙÙÙ˜>}:$¾÷òòêÓ§Ï… è£c0¥¥¥›7o.++kذáäÉ“©xL>Ÿ¿oß¾;wî°X¬AƒõèÑãÁƒ—.]*++kÞ¼ùÈ‘#•J%—ËMHHhÛ¶-I’J¥Ož< ™|èééùâÅ‹³gÏ ‚§OŸ¶lÙrúôé+¾ví/**Ú°a¬O(JN!¯½Îëbb÷÷âÀµX°F—.]êîî¾mÛ6¹\~æÌ¥R¹téÒ‘#G®\¹òÌ™3ñññPîÌÑÑññãÇ%%%¥¥¥û÷ïòä ‹Åº|ù²³³szzúãÇ!Z˜Çã½~ýzÙ²eC‡ýì³Ï@}5™L . XºtiffæÎ;«ªªN:5kÖ¬ï¾ûîÀAœ9s¦I“&Æ »téÒ‰'æÎÛ¹s犊 ±XüâÅ‹­[·.\¸pòäÉ{öì),,äóù:®K—.aaamÚ´Ù¾}ûãÇ.\Ø­[·ÿüç?ÅÅÅ<Ïb±ˆD¢õë׫ÕêíÛ·»¹¹­\¹²AƒJ¥òðáÇ.)) ß²eË‹//^6þ|¨jÉb±”Je\\Ø«’’’ÊÊÊJJJ~øáúè,ËÂ… CCC·mÛ–——wüøq©T ìôìÙ³§OŸž3gÎСC—-[–••¥×ëcbbzôèѹsgbÙlö­[·ŠŠŠ,ËéÓ§½½½¿ÿþû»wï>xð ¢¢béÒ¥ ˜?þñãǯ^½*‘H óéÓ§PüºªªêñãÇ"‘hõêÕjµú?ÿù““Suuµ­­í™3gnܸ±nݺ¾}û®^½Z§ÓQjçXAÈåòÊÊÊ/^<|ø°qãÆF£‘.¨K¥Ò}ûöeggoß¾Ý××wË–-l6jâ=þ|åʕÇŸ={öÉ“'ÏŸ?/Ξ=ëãã3lØ0˜Oú ¾víšR©T©T§OŸŽˆˆ˜7oÞéÓ§aó‹Å©©©‹-êÞ½»££ã¢E‹<<<¶mÛV^^~üøqdþ¥˜¾oQ |}}SSScccçÌ™ãîîþã?šÍ梢¢²²2«ÕzïÞ½öíÛ+•J''§ @á•>ú('''==](†††‚þßX(>|ø000°oß¾A´hÑ‚Á`dgg †1cÆðx¼Å‹Èd²… >zôòTVVÊd²úõë1‚Çã­]»¶OŸ>‹%00P«ÕÚØØØØØüôÓO;wÞ»w/‹Å2™LV«ÕÍÍM&“¹¸¸ØÛÛ߸qcÚ´i~~~~~~W¯^ýì³ÏŒFcUUU\\\‡®\¹BÄ“'Oªªª–/_>~üx£Ñ¸uëV£ÑøðáéS§z{{:´~ýú €Ä ŠìM666=ª_¿>5:‚ òòòrssaQr¹Ü;wîŒ=>ÌÕ«W‡Þ Aƒ \½zõÚµk 6 8p`uu5õ‰DUу‚‚>þøc@ªR©>|èïïÿÑG †5kÖH$’¤¤$H){$h@u?üðƒ¯¯ïG}tãÆ ³Ù|ëÖ-;;»ØØX•J•››ûêÕ«ÐÐPºJ_c…p8œC‡ݾ}ûéÓ§Ÿ~úiTTTrr2Ýžd6›===ïÞ½eoo|U(^½zµeË–]»v%bøðáW®\iÑ¢…——ðpFSC³]Æd25mÚ´gÏžA”––ŠÅâüüü‰'FGGƒœåïïësÞ¼yB¡ÊP×XÞuž¿ÿ1e£‡†F£™7oÞ Aƒnß¾=mÚ´gÏž6UUU•™™ ŒB­VwmÞ¼ùÇÇŽk2™Îœ9*=E=2™LF£"øõz=èK …ÂÉÉ©uëÖyyyß|óR©tww‡ÔРÓ*•J¨áÖ#¨²m4AF€\K–,bÐð°¡P¨R©À^• ©šÝf³9//Åb}õÕWF£Q&“q8‹åàà5©¡<ªÕjmß¾=躠ÚÁ®Éd2Aû0 "‘ˆ>:NÇáp´Zí«W¯üýýGŒ¢;äý’H$PÃ^*•êõzè‰V«¥˜ÅA÷S«Õf³Ùd2A± ¨U]UUâççGÙ“¨jÌpJû —Ë5 F£¾<öbPŽè/åñxPn&Âh4~þùçëׯoÖ¬u®ýªTªAƒÍŸ??==}îܹgΜ¡Tk½^Æ<È£¦)’$«««áC¼ñä LjµÒ³€¾£P(¼½½?~l0´Zíܹséë“Rþ?سî?ňrŽ££ãõë×y<‡Ã¹q㆛›—Ë5k–¿¿ÿš5k ~Jhh¨Ñh1bļyóÚµkçèè¶­VÛ²eËøøx…BîááqäÈ‘6mÚÔ0r † ¤¤¤Èår‡“ŸŸo2™||| Ejjª££ã¶mÛ–••¥Õj§M›Ö¦M Rè$¤é¾}û6¼´°°ÐÆÆæÎ;;wîœ1cÆ®]»€ùCÇÀâÍd2===/\¸ ‘H ’““ÀƠԓ··÷¬Y³ÆŽëáááââ²víZWW×   eË–¿}û¶H$ÊËË›4iÐ<m¬¬¬4›ÍF£±  Àb±„„„ÐGg6›=<yòdæÌ™³gÏž0aBYYYÏž=ÁÎl6›ýüü‚ƒƒÇ³A’d£F:vìHL&›0a¼yó|||Š‹‹G]¿~}ƒ¡R©ÆŒ³`Á‚Q£F©ÕêæÍ›wìØ”ÃÚçÀ,‹Éd‚0B’¤@ 00““'O¶±±±X,wïÞÛì€6mÚ”˜˜XQQ!“É,Ë”)S-ZôäÉ‹ÅâààP]]=~üø¯¿þzĈV«ÕÅÅeþüù”‰(::zãÆ×¯_¯ªªòññ4hT¢¶ܵk×½{÷Ž3Æ`0Ì™3‡ÃáTWWGFF¶oß~ñâÅ—.]*//9r$‡Ã1jµº[·n‰‰‰&L …L&sÔ¨Q`À¯qh»›@ +%ñù|àÀ€eË–Íœ9³M›6áááÑÑÑÞÞÞeee3fÌÈÏÏŸ1cÆš5kœéEÝö»¬¨¨øÅ¬”°¿Z,–ÔÔT&“Ù°aC j‰D’››[PPàïïïääÖÝW¯^Éåò† MO–g9V«îd0Z­Öl6K¥R¥RÉãñà¸%55•Ë庻»ƒÌÉçó 4h"–Ñh|þü¹——T0äóùjµN À4’œœìêê õJ{€JÖ Aà$”æ–žž.‰|||ôz}JJн½½¿¿¿V«¥ŽRZ­~þü¹££cýúõ‹‹‹I’´µµ˜’F£IMMuss«W¯žF£©®®ó,I’©©©¶¶¶ööö äs8œçÏŸÓG'JJJ²²²üüü\\\@„¶Z­ ß&'' …Âàà`ƒÁ ×ë ý|ŽÁ`TWW «Õj8wQ©TpüÃãñÒÓÓ5MãÆaS0R©”ÇãåççËåò€€“ɇ.ååå999õë×7›Í|>vÕ””6› ‚u„+‰ EzzºL& 2 ¢¾¬–ªª*™L¦P(@Å€±{xx”——gdd¸¸¸Ô«W ŸÏñâ…N§ e0z½^£ÑÀyu‚¥V« ‚‹ÅUUU‰Äjµêt:8—ª®®†­M§ÓQ ²²Òjµzxxdee½~ýÖ§Z­®¬¬tpp€Çþs²Rþ"S2*,JN4 ¶h.—«×ëM&¬<8Ѓ ’ÔLQz¬Ð~‰ŸSØ™Íf 5‡tç¸4éé8© ¦žl Ú¶NúTÃ|²ÙlÊaö ¨êJ?q¨1i”nîP¯ûÿ9Úaà›Ò‡c4á‡0Qt]…Bí³”Þs6L5d*­" ¶?£ÑXc}‚õ‹®ÿ+¸†ÉŽ.‚Sߌþꌞøß‚ˆÄ›ª$ÖnÐç—ž€šþÌÚvˆÚ _§ŸÐw_ê±µ_QÛPT£Ÿ‹…ªØô¶!× 5co]í÷Ò»M&Îß8“µ¿Ní7¾ñJI£—P§ß W€®Þ¶Zè“ùîg¾£«µW]‰¥ÊÇ×%C½í±ÿ\YYù‹~äÀj¨CpƒQ{'ûƒT(«ò_œnV$QBÁ_0Fj€ôÅÇårÁ–þ œîI k€ËåÖ>æù+?=°tµZ ,—réC_èÿ ò¨ªª?JJr...~£ƒÇk,Ñ]akü“ò  6õ÷PÿUûæöIÐk_¯áy[ã9µHÿ õúoaÆ#GŽ(•J˜ºóíÛÆXã!5FýÆã>º68„Òý¢™Lf^^(½pç[£{ï~W©£ßL@.ÍÎÎ>sæ ´5~X;fè}¾ýzãm=är¹EEE'Nœ`³Ù¥¥¥¥¥¥”BAŸáÚ¿ýG𻋛†–ŸŸ?vìX…B~§k׮ݹs'Ø Åb1xÃvH•Û¦") §)m\`_Gk±X Ú2%/Ácù|>¨dÔÍTœ øKž8qB­VÃ1,]³¢^×Á*«Ÿre±XT¨Ýû´8PÏ`í‚Û ZöìÙƩŠc¤NG¡ðªt—i0 s8êºlL¹(ƒèôéÓ¥¥¥Ð˜@°}ûöÄÄDø,‹z;},ÔtÑûC?§…Ùû9¥UBµg*¢ÞšwïÞ‹ÅG‰DàžMQ @  ¾€ÁS fþW$Ñ¿)|pÕK°¥Q–p¤§æ–ËåìÝ»¢bΞ=+‰`Ja,”á K_{ÿ˜âf¿p v…Ö­[{{{ïÝ»W&“kËçŸÎápT*Õýû÷+**À¤\UUFT³Ù nÔûD"Qqqñýû÷ ŸÏ‡¨´””p«ƒŠJ¥"FtßU©T †W¯^%''C$€N§«¬¬„VTTètºœœœíÛ·?}ú”rQ‚“•”””§OŸÂ¯`ƒˆÏÊʋŦ¢¢„RNŽÓ</11ñÅ‹pV¡P(ôzýóçÏÁÊ‘‘ñèÑ#ÊFñÔFc¼wïØØ~222âããáíÐǧ§§]A¡ã’’pº¤v.ø-õ4¡PXPP°{÷î{÷î™ÍfðpHKK+//ÿꫯ""" …F£Q«Õ0{Ó ÃÏÈÈ0™LP~Y ddd<~üˆ“ŠÔ“§ÁBW*•&“)//ïéÓ§”ž¦ì3gΜ8q¢¢¢‚Ãá888ÈåòG™L&˜‘HôüùógÏžA”(}8¹¹¹<+7'?yò„ú¦Z­V£Ñ”–– óùü¸¸88O† pš'hål5M¿~ýú÷ï¯R© çqqqÅÅÅð[±X,—Ëïß¿o4éAÿWÊ_4b †)S¦Lš4iÒ¤IèÒ¥Kƒ nÞ¼¹~ýzww÷ׯ_ñÅýúõûþûïáä399ù»ï¾Û¸q#8I$’S§N=zÔÃÃcãÆß|óM@@ÀÌ™3!h–Ïç¯\¹²  `Á‚AAA …¢ªªjõêÕ...z½^*•8pàÒ¥K!!!ééé!!!Ë—/¿yóæùóç7mÚD’ä’%Kzö왑‘a6›Ïž=ëïïïååFÎU«VeffÂg^µj•Õj?>I’åååýúõkÛ¶mttô¦M›ÜÝÝW®\éèè8iÒ¤Y³fUUUétºðððyóæ­Y³æñãÇ666óçÏß½{wjjªL&ÓétË—/C+åM!‹/_¾|èÐ!{{ûÜÜÜùóç·mÛvÉ’%)))à„¼|ùr•J5oÞ<{{{¹\Ï?wîÜ¡C‡6l˜íàà°|ùrÐuE"Ñ•+Wàiyyy ,xüø±V«½|ùr‹-Ξ={óæM™LöÝwßmذáã?öööž:ujHHÌÞªU«êÕ«÷ý÷ß'&&¦§§wíÚuÚ´ik×®‡ƒ±åË—;88F@ðòåËE‹999}üñÇ£FÚ·oßõë׃ƒƒ_¼xòí·ß‚kו+WÒÒÒ øZ¦§§¯X±¢¨¨ˆÁ`¬ZµÊÎÎî‡~xùò%ƒÁðööÏp8y:vì~/[¶ÌÉÉiÖ¬Yà…æîî¾téÒ¬Zµ*,,,??_ xzzÊåòììlpONN^ºt©½½}QQÑÔ©SÛ¶m«R©`•šL&±X¼nÝ:.—ûÕW_M›6ÍÁÁÅbeffΙ3§sçÎ111û÷ïwrrR(‹/vssƒÃ‚†ë—=±˜L¦F£iРA·nݾüò˼¼¼Ñ£G+•Ê5kÖ 6lË–-S¦LÙ°aƒJ¥‚ÓØÔá@ÎZËÊÊvïÞ=wîÜ-[¶´oßþüùóÕÕÕ;vìØºukNNNRR¬ª‰'îß¿_"‘ÄÆÆ‚' xáyxx¬^½z×®]?NLL„Cè¡V«åp8³g϶··Ÿ:uª¯¯¯^¯çóù………111K–,9|ø°¯¯oUUÕÄbñîÝ»W¯^}øða©T*“É ógÏúôésôèQ¸mûöí·nÝÊÎÎ6ÁÁÁG•ÉdR©tëÖ­;vìÐétwïÞ…îÑ÷íÛ×¹sçíÛ·ñÅEEEOŸ>Ý´iÓîÝ»…BáÝ»w EddäÖ­[¿ûî»+W®(•Jî¾ûî»]»veeeedd@˜a§eddÌœ9ÓÍÍm̘1!!!%%%¡¡¡‡®W¯^UUH¤f"cÓÒÒbccwìØ±fÍWWW8C>räÈŒ3öîÝÛ²eËììlsX,ÖªU«:uêÛ»woqq1„[®X±býúõqqqEEE|>_¥RõíÛ·k×®-[¶0`øl}ýõׇR*•/_¾¼ÿ~bbâÁƒ<Q ›Íæ}ûö 6lçν{÷ÎÍÍ-//oÙ²å®]»Ö¬Y—ŸŸ‡Oß|óÍáÇ‹‹‹mllvìØ1qâÄ3gαfÍšž={nß¾}̘1;vì¨as¯¨ŒYUUµmÛ¶:\ºtI«ÕnÞ¼yîܹ;vì Ý»w/Gÿü>Š2ø Œ5***jòäÉ^^^III £C‡UUU-Z´°±±ÉÎÎÙÖuNÀçó³²²d2Yhhhyyù˜1cL&“@ ˜6mšH$Òh4°º¸¸¸ººZ,–Ž2$Izyy™L&{{ûÐÐÐ/^¸ººRö3xľ€S|NN›6-((èÓO? Iø«¯¾²X,*•ª²²²k×®ñññ®®®2™Ì××wóæÍS¦L'ââb6›Ìd2ííí›4iòÍ7ß…B¹\^Ã~]ãÆÛ±cGJJJ÷îÝûõë·iÓ¦F9::–••­X±Âh4r¹ÜgÏžMœ8ô=“Éd6›ýýýE"‘Á`°³³£NGéOëÙ³çǬR©Àrï O&PùÌf³««+Ìž““Aéééðv£Ñèíí s>jÔ¨%K–øûû4(,,L¥Rñx¼òòr…BÑ£G…Bâíí––Æáp —Ë•J¥ð9¨¤à®l2™<<<ìììL&“ƒƒƒÙlÎÌÌT«Õ3gÎ$I²¢¢¢¨¨ŽsY,Öøñã÷îÝ{óæÍ?þ¸M›6‹ÅÎÎn„ pž tqqb”žžžAAA$IÚÙÙ ‚ŠŠ ¹\¾ôjµZ¥R) * šŠ9óªX, IÒÑÑQ£Ñh4šC‡:tèõë×à¾N9ÞþŒXïEÀà`kkäïïÞF£Ñl6ÛÛÛkµZ½^ž àÔ¦º³-‰D¡Pètº¤¤¤7®[·ÎÝÝ}ìØ±p@Bwo Û“JAÅ‚c8͇pS*Ä<1€À­rÔ¨Qƒ~ðàÁ´iÓÖ­[Çç󃃃ûõëW]]=uêTGGÇ-Zܾ}ûøñã:tF:vìØÊÊʉ'úøøœ>}ü‡322¾ÿþû¥K—6jÔhÊ”)à@¹"ÀרQ£;v<þ|óæÍr¹ÜÉÉ ¶9©TZ\\,‰Ž=úèÑ£µk×VUUM:úl2™(ªóô§mÛ¶íåË—ÑÑÑ`ÊBÑ”nª Ïø6i4˜4¸G¯×÷íÛ·OŸ> ß~ûí—_~Ù£G0ûÄ$•J­V«F£‰…cÂþ< ¹~ ï‚ÃE•H’¬W¯Þ”)S***&Nœhccϯ®®nß¾}ÇŽ“’’Ö¬Yäwøða*7nUž’ò½-ÆOîÝ»·ŸŸÄxP*;5FJ㣂I@GûüóÏa3‹ÅƒÁÞÞ^­Vÿ3Òt¼o4ÌHUU•Á`0™L^^^¾¾¾ëÖ­+,,ܸq£T*õ÷÷·±±¹{÷î«W¯~úé§ÒÒRÊ>ÌçówíÚU\\<þü³gÏ‚ÕÊjµÞ¹s'99öuµZ ß@§ÓÑCgx<Þ£GÒÓÓÏ;—‘‘Ñ´iS™L–ýúõ'Ož€•U§Ó¥¤¤€o—Ë-,,üôÓOåry‡À*Ó­[·»wïÂ+bbbŒF£¯¯¯T*½~ýz=L&S·nÝžL f‡5Ù¡"4õ•U*UÇŽ_½zUXXèäätîÜ9…BAY¿ÇŽÛ²eK‡²²2ØýFã7233a*ÀGr°¥‚ÌìììÂÃï^½êääT\\|ãÆ 0ãSIÒH­VS‰„*++ýýýmmmïܹãîîž’’bµZ= =ÿ0köìÙïOï_¿nܸ±ƒƒƒÉd‚#PQæÌ™#üýý/^¼(‘Hš6m 'L\.7,,ìòåË—.]ò÷÷5j”§§§Z­Þ³gÙl òõõutt¬ªªjÙ²%D±Áa0 H¸¼¼Ö¯_ŸÏçïß¿ÿÞ½{Гzõê988p8œ={öTVV6lØÐÃÃÃ××·   E‹à,ÉårCBB.]ºtúôi›‰':99yyy?~<66622222²^½zÏŸ??yò¤½½½··7äî`³Ùááá&“©¨¨(,, $RúÓ¤Ré—_~)Á©S§BCCY,–³³3°#p·±±¡Ïž««kDDD``àþýû AzŠŒŒ´··?~üø… š7oþé§Ÿ‚Än6››7ož™™ùã?VUU}ýõ×®®®……… 4Ðëõ¥¥¥Íš5£ô#ggç›7o‚u@¯×7oÞœ$É¢¢"__ߦM›:88:tèæÍ›®®®­[·v*‹ýüü~ú駘˜??¿Ï?ÿÜÏϯ°°ðàÁƒÀÏÏ/((ìÌð´ÂÂÂúõë»»»ƒ½½iӦ͛7þüùÑ£G_½zÕ±cG777ˆ‚T«ÕZ­¶mÛ¶ÅÅÅŽŽŽAAAùùùM›6µ±±)//çóùM›6â?{öluuuÏž=-Ë¡C‡ZµjIêº ýËžX5Ò)1˜v!†ÄƒÁÀårÁï¦üZ)–&G8¿Ë$Äú²X,ˆíæñxàe ç´ %:88,\¸ÅbA 0H†p ¥×ë!B6lpW¦'4ƒ:* œ=€EƒI†Šq½âãAG‰D“=7 ‡ÜÞ¨×ë©×ÁéˆF£‹Åz½Þh4‚¡ îT©Tà6¤ÓéàºF£Cl0ÈÁ †%Uûi ÄšÍf³ÙLï¸à S³G„B¡¸{÷nÛ¶m…BáØ±cû÷ï?hÐ P c`z ÜŒE"‘Z­¾ È¢ ‚Ò‡Éår™L&¨ß IÁÙ/pT±X QÙb±˜ÎºáX"~µZ-,ét:×áô‘ÃáПf2™àìM«ÕR=„3H*VŒº: Fu˜Fè',§V«a=@ü†N§ûgˆÐ¿Ž€)Ń:Y¦¢1)OW¸Bù»Ò¡é7ƒÚC¢¨+ô·X,[[ÛM›6Æ3fTUUQ:Ï;~^»·`G‘ *º™jÓB=Ÿ š9e©ñFJa£".jt öüÐßN×»ŸV£WôÓ¯lÚ´)##Ã`0„††N:ÜžjLÝɉò?¡ ô×HAÿÜ5ºñÆWPO®=Ãï˜ ê"ÕÃß‹~¥èÕø²Ð¨1“ÿ˜ì³ïKÀo$Ý¿¦‹µ·Äûè;b±¸´´„^`z8-ÿÀýž "+˜ ôŒÊø¬E¢VŽ.Äûl|”‹?nÿÞ` ¡Ë—/C^|‡S\\|ùòeXô´RÄÏ +éÞíèwRŽòoü-]9ƒ *4´öóá!µßXûηõ­ö{kÜIuõï…Qÿ¤?žiý?¬ñ¿À§e2AgFêýã}96oÞÄ?º&â/¡k„b_Ú°aÃÝ»wCBB–-[vüøq>Ÿ?{öl¹\îââòÍ7ßÒÓ£SwþôÓO:næÌ™)))ÎÎÎ ,¸ÿ¾X,ŽŽŽ~ùòeãÆW¬Xq÷î]™L¶dÉ’›7oúûû/_¾üĉôçÏŸ?_¡PÄÇǯX±¢Aƒqqq_ý5;C!¬)S¦p¹\''§Ù³g———WTTÌ™3ÇÑÑQ§Ó?žîcðÍ7ßTUU¹»»ùå—âmkk«V«çÏŸÏårÏœ9³xñb‰D’žž>sæL@7wîÜÀÀ@x,—ËMJJš1cF^^žÍwß}wïÞ½ˆˆˆíÛ·Ÿ?žÊ,KDJJʬY³ììì*++§L™b0òóó§OŸžœœloo³sçÎÐÐИ˜˜E‹A>\£ˆßËk3d`ª/_¾ôóóëÛ·o“&Môzýµk×JJJ.\(•Joß¾}áÂ…iÓ¦xLÝ¡V«u:]```tt4œÚ>}ºcÇŽãÇ //¯ôôôÐÐЧOŸ;vÌÉÉÉÝݽ¨¨èöíÛÅÅÅðü7n\¹rE&“™L¦¶mÛFFFÆÅÅÁÉ*œ,\¸ÐÞÞ^¯×Ÿ:u*''ÇÉÉ©¬¬,""¢qãÆ;v¤2réõúììl(êìì|èÐ!—*Š/¾ø"))I,òÉ'Ÿþù€ú÷ïçëë»|ùr;;;'''ˆR`2™mÛ¶]¹r¥Z­îÛ·¯­­-—Ë ½ÿþÀ›6mZYYÙ¾}û &|ôÑG&L â³Ï>;þ¼§§ghhèÆ ‚€Ú\]ºtéܹsrr2œŽâE¼‹€é±„o b¢¢ÏAÉf¢×ëW­ZµjÕªÁƒûøø|÷ÝwñññjNNNà `0V­ZµzõêÁƒ׫WoÁ‚/_¾7‚ ||| *øÙ³gàUPPмyó’’[[[@P\\ܲeK^7ð|¨dÛ¿ÿ²²²/¿ü’ÇãMš4 èáÐÿìÙ³ÅÅÅ^^^à{Ø Aƒo¿ý‚  >R©¼²9Òºuë™3g‚þœ9sÀYÄrð%&IÒÅÅ¥¬¬ÌßßëÖ­ ~Ów‚§DNNκuë_¾|YéÀ†¯T*ëׯQAAAEEEð N§Ñh¦OŸ¾eË–1cÆØØØL:òøQÙžkÛä±ý¯mS4ûË¥UÀË|ôÀ´óúõk°ÅÆÆ.^¼˜ÏçÏœ9ó‡~èÒ¥‹­­íÖ­[ ‚P( ²Â*¼sç΢E‹ø|~ttô?ü0jÔ(( ²³³‹ŠŠöïßáÂ{{û9sæèt:WWתª*­Vëêêúøñãòòr(†ϯªªb2™—/_îСÄ ®\¹2gΜŸ~ú ÖO:õìÙ³óçÏñüùs÷üùs¡PxìØ±œœœ¡C‡zyy5iÒÄh4¾~ý:++k÷î݃á“O>©W¯ž««+ƒÁX¹r%A¥¥¥`Ù‚ÜK………;wî”J¥kÖ¬‘Ëåǧ¼8Niié¦M›vîܼnÝ:¨X q}þâÅ‹^½z‘žžIüìˆÏãñ®^½:xðàèèèƒΞ=û§Ÿ~’J¥ƒ^’ëŸQ˜ ÛTiöûÌAŒ1býúõ¥¥¥$I^ºtiÆŒ|>ÿæÍ›111‘‘‘………:ujß¾ýž={¾üòË&Mš\¿~}òäÉ!],ߺuëìÙ³‘‘‘={öd0ÅÅÅ+W®´··?}úôÒ¥K¥R©³³ó²eË\\\._¾Ü¯_?77·¦M›~ýõ×;v<~üø°aà täÈxþ•+WæÍ›§ÑhÆ7jÔ¨—/_S}þþþ ¨TªgÏžΟ?àÀL&ÓÅÅÅÙÙŒd"‘hçÎ>>44âœûõë×¢E‹¿1wâCÆ{9r€çjjjêÍ›7™Lf·nÝêׯ§D111ÙÙÙ7îܹ3œÙÄÄÄ”––¶mÛ6""TMPäÎ;—““Ú»woˆªûì³Ï’’’:tèдiS«ÕZ\\üÓO?A (]e6›/^¼˜••viHn~öìÙÒÒÒ6mÚDDDp¹ÜÇß½{×ÁÁáã?†´ïàL›””tõêÕ°°0±XlccÓ¨Q£ôôôK—.1™Ì¨¨(///H9Àãñ Å™3g EǎÂ(**:þ<Ä'Av™LæééYUU5hÐ 8sºuëÖ³gÏÚ¶m éÈ•J¥\.oÖ¬”q:yò¤P(lܸ±Z­nÕª•^¯?qâ„““S¿~ýÀ -‹ûôéãàà™ñ[µj>º·nÝJHHðððèÓ§—Ë=wî\ãÆ}||@8G j0Týx·L¥#„ü÷Z­–:‚Ð_“É -U`ªKÑåu¸o?~¼xñâ‹/ÂÁ)ÄÀé¸ÂÃ[¨Ðbêd¸Æó©‚àp þžTj5Q×NÉÖ‚€3dÊ-–ÍfC‰mêDäpˆ¤“H$ãÆ ýꫯ ¶´"‘ ‚Á¡¨Uõ~ñ`‹’J¥f³*ÑÏ©0ø$Â!%°÷_ÌÚí§ü^LÑ0åM÷¹ÿÿÜ€í(+åßÅÙê 7*&p]"HÀ @ü:m´ªª g¨«øÝÕ ±mlÈÕ ‘#¨#$`Œ@ ÿ/ÈÿÅŸÑ*¨à7ã;öçuþêá‹_Õs*Âäy`;߸NÞçÓÿžO𷯜ßKÀPׇÂîZ€P|ù7ŽäçÄqïxToú¿䦭sÔ Ážïÿ)©xÌßÿ@(ÎD¸P(„xÌ·Ýó¶™¯ÑøU‹óo_9¿‹€ †B¡ÈÊÊÊÌÌÌÌÌ|ùò%丨}øTcw„ÿ¢ k¤¶¤þ ¨7!!áÒ¥KP¸™þ«·íš5¶aµZ ¡‘5’POc³ÙEEEEEEl6NÅ;vÜ}~Ÿëo¼Çb±ÈårªHw±Ôèví¹¢³µ?¯çod8ƒA.—×~ií9„ªb/^¼8}ú4Tñ­Í¡,¨\.§¢)kÜF­ &“©Õj333)'~@p÷îÝØØX( Ô«Õj_¾|I…‚׿ÿ$I–••A6U¹\YÞ=êJ•ó¡Ñð/0ä…ݰaÃÌ™3·nݺ~ýúÕ«W—””H$âçÚv<&‹‹ÂìCñ8Á‡äÒTau‡Ùçø|¾Ùlæóùqqq.\€´8d”F—˭͸j+“ÉRSS9bkkKßwø|¾@ àóù-àüùóçÏŸ‰DPYO"‘@&ÚÚ4Àf³éy°©ÍPƒBÁ ¸¿…@+ª.9 A&“­]»Öb±@)mê]íÒŒÁpX,–D"Dð|‹Åçó­AVƒ7öœšX>}wþýGD¥Ý•J¥Z­výúõvvv‡¾YC?©ž@)Y‘HôâÅ‹“'OBÂzª7¼†éÒ¥C‡I$X]”äEðÕœœœM›6Á,Y,>Ÿ{óæMHØoÌÉÉÙ¼y3”’a2™tQÎjµŠÅâÇoÞ¼ÙÖÖ–Éd®^½Z$A…á¡&+‹!OƒH$¢V·–è—5gΜ_”D"Ñ?þØ­[·o¿ý¶C‡½{÷‹Åùùù@™PBÖÞÞžÉd&$$”––ºººRÅ*++SSSœœx<d~urr‚Zá #55U¥R9;;s8œgÏž©TªîÝ»3™Ìªªª'Ož@6“ÉT^^N­K˜_³Ù¼|ùrOOO‡êêêÕ«WçääTVV>|øÐÑÑÑÍÍ ª¼çææ–——WUUÈàïïÄd2 …Åbyúô)‡Ã’¼ôP~‹¥T*õz=”ÛT*•<Á`@’=­V Å2!¹4›ÍV©T*• Š\Â?!ÁN§ƒjô"‘èäÉ“gÏžU(/_¾|ñâEóæÍ!ñ—Ë5›ÍñññÆÝÝ dj4šøøx’$!—%I’¹¹¹¹¹¹^^^&..zéA(þÆd2+**à±PêVyee¥N§ƒ¥ï3"(Ì %N7lدP(4Mƒ 0Cª'öööPµôÕ«W%%%UUU¯_¿ŽŠŠ‚Ò交ªª 2º°X¬mÛ¶õéÓÇÃà ˆäääÂÂB˜4½^É@¡þxXX˜D"~(=z$ÜÝÝ322 .´X,·±±©¬¬d±XPdÜÕÕø§P(ܲeK·nÝ=ztñâÅêêêää䢢¢&Mš@~¨ùg±X\\\` /^¼Éd*•ŠÅbùøøÃøA)AïEÀàÂ… ^^^ááá ·ðx¼… wèÐaìØ±l6; `òäÉééé÷ïßïÙ³çƒfΜYTTtóæÍ«W¯&%%ÅÇÇ;vŒ ˆ–-[Λ7ïĉ¯_¿>xð ÑhlÞ¼ùÇårùG}t÷îÝ… ;v¬aƶ¶¶“'Onܸ±««+”¥•Éd|>õêÕ½zõrss#JW§¥¥ 4¨aưßoذáÙ³g>\»vmß¾}Ož<™œœÜ¦M›Q£F=zô(##cïÞ½>>>~~~þ¶ È;½k×®&&&~ùå—QQQ\.wÖ¬Y6lèÒ¥‹Õj1bD@@@ppð¼yó‚8tè››[@@Àĉ+++;tè°{÷îû÷ïGFFVWWÂ;zôhýúõûõëIÛ¹\nEEÅÌ™3333/_¾œ——×¹sç”””¯¿þº°°ð§Ÿ~Òëõ­[·Þ½{÷êÕ«årù™3g>|÷äÉ“ƒ@º, Hܳy󿤤¤®]»>|xË–-ÇOKK[½z5ŸÏß·o߀ÞsD‹¥iÓ¦jµÚÓÓóÆ×®]ëÒ¥KÇŽß ‚ôôô9sæäåå8qÂÙÙ¹aÆX³fMaaá­[·lllúöí;cÆ ‘H¿lÙ²>}ú‚äääøøø1cÆ †… Þ¾}ûéÓ§·oßîÚµkEEÅW_}õâÅ‹ÄÄÄíÛ··k×N.—/Y²¤oß¾ðix<^BBÂ… Š‹‹ÏŸ?ÿìÙ³^½z%&&._¾|ذaëÖ­Û±cGqqñ‰'Š‹‹ÛµkUé/^¼8fÌ(Iß¼yóÈÈHÐiÉÏœ9³  àôéÓjµºM›6çÏŸ_¸paYYÙ¹sç®]»6tèÐM›6=þ¼K—.驎éÀðÁŽ;6uêÔI“&mݺ•Ëå~õÕW±±±?üð“É5jTNNN§N¶oß¾jÕª„„„‚‚úþóŸÿ9r¤¬¬ÌÁÁaÛ¶m_~ùåÙ³g Fuuu»víÖ­[·xñâÇ+•JX‚&“iÍš5ãÆÛºukïÞ½·nÝ*•JW¬Xáãã£×ë9ŽJ¥ZµjÕ²eËŒFã/^\VV¦×ë4hЯ_?¥Réâ≵ÜÝÝ׬Y³eË[[ÛîÝ»ûùù)•J(ö¥R©†¾uëÖO?ýòÔBˆrEEEnnnVVV£FJJJ Ejjª\.ùòeaa¡N§ëÖ­›Ùl†{JKKSRR´Zmnnn—.]œSRR***òóóŸ?n±XRRR"""€7ÚÚÚ–––Ι3G¯×»¸¸€Â&‹wïÞíââ²mÛ¶U«V=yò¤¤¤dãÆÝºuÛ´iÓâÅ‹÷ïß_\\l±X¼½½—/_¾aƇöèÑcçÎíÚµ;{ö,¥’ggg—””4kÖ,%%Ål6§¦¦¿xñÂÖÖ¶[·nï9¢‚‚‚ˆˆN2‡Ã™6mZyy¹‡‡ð|‹µzõê>úhëÖ­cÇŽÝ·o_YYÙþýû.\¸nݺnݺAÎ@“É;>I’”Ïç_»v­iÓ¦B¡ðâÅ‹ÙÙÙ»wïÞµk—F£yñâʼn'\\\öïßm6›A=6 F£1///++ ‰¬\¹rïÞ½IIIqqqèJ¥Rùùù­\¹rÑ¢E·nݪªª’H$ׯ_¶··‡2ß_ý5âa˜ÏçoÞ¼¹yóæ›7o^¸pall¬\.ßµk×äÉ“7mÚÔ«W/…BÁ`0 2øh€üå´²ºÉh4¶iÓfÀ€•••666UUU 6ìÛ·ï7ß|síÚ5½^œ‘‘1~üxÒ ¤ ““ˆˆV«ÕÖÖ–*€âååe6›ƒƒƒòóóAI«¨¨P*•gÏž=þ|ee%I’ÆÙÙ¹¶Y‚2´FGGÇqãÆI$’—/_B¦0ÙÛÛïÙ³'55õðáà SYš]\\L&S›6mΞ=[QQÉñ€ÕØÛÛ÷Ýwîîî<ÈÏÏ;v,dŠ !!!ªv̘1ÅÅÅqqqööö...aaa?¾yófdddeeå£GŒFcxx¸Z­CK¿~ýš7oþèÑ#F#•J!ë]vvöàÁƒM&“D"9tè\.///ïÞ½»R© òööNKKãr¹îîîÐÿzõêyzzBÕ_…BAåÜ?räHZZZhhèèÑ£I’¼ÿ¾@ èÓ§ÏíÛ·srr7nlggçââòþ#òññÑh4 i9288øáÇPr v:¹\~÷îÝøøx ª””''§ ÀÖùôéSèAËvÆápärù‹/¾ùæ‚ @•àp8ååå[¶lár¹[¶léÛ·¯Ùl‹Åööö”¸W^^¾víZ¥R9nÜ8¨Ý÷4lØ0###<<œÒ#‚ƒƒ)K5$BŠ‹‹›8q¢Á`0™LC‡mÒ¤Éýû÷««««Tª’’’Ï>ûL§Óùøø8pàÕ«WL&twwwGüoŽ·:FÀÄÏ©¡BBBàŠR©4™Lééé®®®ñññ‡:uêÔÖ­[Y,Ö¨Q£¨úë 3X­V£ÑÈd2éAÝ‚¬Ž 1™L ±áÇÛÙÙU ’3jµZ¨»)‘H¢££-ËãÇGŽT]] µÛ-KóæÍ5Á`àp8IIIÇŽÛ¾};·€ÍRÇh4‚(Ë`0t:Ý'Ÿ|2`À‹Å"“Éš5kvøðaŸ!C†|ÿý÷ýû÷'¢M›6ûöí‰D .ܺuë¡C‡š7oN’dãÆ/\¸pîܹ3f<}útÏž=...l6’W6kÖL­V·hÑÂ`0°X,°3Aú{¡P˜ ¦ANgccc±X «6ATnwØa&)ûÅb™6m˜ˆÄb±¿¿ÿÎ;;tèЪU«5kÖ°X,èyëÖ­ß8¢¶mÛîÝ»—>¢ˆˆ@Àf³µZ­£££«««^¯‡´~"‘FDD¿~ýŒF£““S~~>•]”2†Y,°5¸„BáÕ«W}}}«Õjƒ!•Jóòòìííá ›Í¦ŒLP$ÕÕÕuÕªU‹ÅÖÖöáÇ”M­VS+þ‚B O,'&&²ÙìFi4™LæääB2,8|ƒÁÆ‚W¯^±Ùl`?0ªfV–_îÅåž={öäÉ“›7o^»vÍjµîÝ»÷Õ«W{öìÙ´iSzz:|Ôêêê‹/¾|ùÖä‚…Ôª#¦ÂŒ\¾|933sÇŽ§^½zJ¥R¡P8::\¸pÁÖÖ699ùÎ;\.÷ðáÃðÍÀVQQáàà Õj¡º'H8V«˜ÆÙ³g_¾|©Õj§L™ÒªU+FsõêU…Bé×a]ž?þÕ«W[¶l ¶µµ…îQ‡z½¾U«VwïÞõññqqqÏž=kÞ¼¹Z­ŽˆˆÈÊÊb2™®®®W®\iÕª•N§óööf2™¹¹¹ 4hÒ¤ÉÕ«WCBB¸\îñãÇóóóÙl6ä—U«Õ,+''çÇd±X]ºt9tèPFFÆùóç§OŸ.‘Hš7o¾fÍš¬¬¬mÛ¶ư°°ÊÊJ*/4¤›…£ zcØ7ÃÂÂnÞ¼Ù¨Q£×¯_kµZ­VÛºuë7ލI“&ô]¾|¹M›6•••GŽ*9PËF¥Rñùü‡^¹rÅÁÁ¡I“&çÏŸ—H$yyy§OŸnÔ¨ÇÛºukzzú™3gÀjhooõêÕŒŒŒãÇ+•JƒqûömH!®Óéºvíúðáûwï>{ölÒ¤I………ݺuÛ¿JJʹsç x<•±˜ž<ôÒ¥K‰‰‰111ééé­[·V©TP}V«ÕÂD‘$ JÙõë×[·n ÌÖjµR’6ÇKII9{ö¬H$jݺõŽ;²²²:4þ|77· 6¤§§Ÿ>}¤ªôì‡Öܹs‰Ÿ“eÕÈ·JµÁ,œ•••–––žžžššêééùìÙ³O?ý´I“&L&óÕ«WC‡ÍË˃³ÀÀÀúõëCZæfÍšAÒö   777•Je0Ú´isåÊ6›_PP0gÎ''§òòr±XܸqãfÍšÅÇÇÿôÓOr¹¼gÏžb±øàÁƒ5rppFŒºsçÎöööTW©ÍØÛÛƒ¡…ÍfÇÅÅ%%%y{{ …B;;;__ß .H$’‹/J¥Ò™3gÂ)µÅÂ.‘H ·»­­-Çsvv†4îb±Ød2µlÙÈápºuë,Á`øùù…‡‡ÃÙX—.]lll<èíííååJn¥§§ÇÆÆ¶iÓ&$$D«Õ9r¤  `ÆŒîîîaaa¹¹¹'OžT©T³gÏvvv.))qrr 6 åååM›6•H$0]Às¨žƒÉår»wïâ_Æ CBBt:T*­1¢6mÚ¼qD û8q¢eË–tï‘HtãÆâââæÍ›‡‡‡¿|ùòرc¹¹¹;vôòò »pá£G7nxïÞ½ØØXggçððpwåÊ•I“&™Íf“ÉäéééèèxäÈ‘„„„#F´hÑJIíß¿ŸËåÊåò:ØØØ¨Tª-Züÿze±***lmmãããïÝ»7qâĈˆˆŠŠ £Ñغuë’’OOO???H]îááqüøñ &PçjÔD …¸¸¸äääÖ­[7lذ°°ðĉÕÕÕP;²mÛ¶<ˆ‹ÅÕÕÕýû÷/--…OPc¶ÿ®öÿ¾g8!œ(Pu ÑŽYWM&“H$ÒëõPï x/”í‚3[“Éd6›Y,˜?ÿüó¡C‡FEEÁ z½žÇãA•m‡GB¡Ðl6Ã+ôz=½n=•–ZµôüÐb±@¨{Æf³ËËËGµuëV8º€âC”hMõ^ÐÏ ÇTpêiÙ¡¾•Þú­H$ªQßN\¹\.ð ‰D£&~Ng/‹áhÇh4 p3‚¼¶Ëår¡ºâ±ù|¾V«ë#0cB¡ʬuŠªØ– ƒÁâ+èíB¡B-x L&ôVˆpÞ'aP‹ÒS ¥~zzºR© ƒþ€” n ¸¦¥¥uéÒ%))é?ÿùÏ®]»œœœ`UPß–øÃ@‰Îö®]»æææ¶fÍ8d†É§jÖ8î 0„¼Oe†Îk`– ÔZ¸®´\ç°ùQ™YA’H$sçÎíØ±cÏž=•J%e[‚ûAÓc±XTtxr B¥vzǨœµ0Ñ”ÊMÐRRëõú¹sçFGGûøøP%&j«ýÔs¨áC߈Ÿ³´S}¦úFéKôß¾19;½“Լѧ†O=NBô5ôÆd·µo£'â§&:¨NÖ~E홡ÞKõ“zT·ÓçÀ€fèï…Ÿðùü‚‚‚uëÖét:µZ=räÈîÝ»ÃWC8¢—7Î!,!„M ­F¡‚Úë ¼®\¹ròäIææÍ›çêêJ•ò¨±Hˆ¡2Ãû±Þ¶åÔæ~µo¨ÍÙj,Ž7á»Ûïi{{Ûýôbïÿœwôómï}ãoß燿ŒïóõÞ_|NM§Æü€Ãf³KJJ¤R©P(¤*$ÿª5@¿çmúYЩnˆÅbðArvv¦D­3˜á¯ÎÈñ¶‰û‹ûðÆ=ñ·‡L7,ÊÌþ×ÈžÍfƒDý!ç0_údý¿HQYj´ Ìýÿ÷µí¦ÿW®ÏDlþí"4ø0Á¬a•þ{ãØÆ6¶ß§ýßs_…BÛQ‡90¨«Œ‰Ý±í:צþ"F ê0PF PF ¨cÛØþuÅÍP„F P„F HÀ @F HÀ @ #HÀ @ #HÀ @ #ˆ÷#àšIî0÷¶±ýÁ·ÿûà ¡ŠÐØÆ6¶@@ü@#Q‡Á®]‚@ @ þ|Æ¼ÐØÆvkX ø€¡T*qÔ0xF#¶±]çÚÔ_Ô¡0@F €0@F HÀ0@F HÀ0@F -cbwlc»Îµÿû£‘¡ŠÐØÆ6¶Q„F P„F HÀâOÖFB #ˆ¿…€1­,¶±]çÚÖFB þ`TWWã, ¨#$`ñþŒF,lc»Îµ©¿¨#(B#$`Œ@ #$`Œ@ €$`Œ@ €$`Œ@ €Ä{0VfÀ6¶ë\û¿1œ@ŒmlcûoàÀ¨#u(B#uY„Æ)@ ê.°6Q— ˜Ju‡@ ê¤M7jhëÃ6¶?ø6õu`¢ƒ¡R©pˆ:,B#ˆºJÀXZÛØ®smê/ŠÐr`lcÛȱ$`Œ@ €0Œ@ €0Œ@ €0@F þùŒ•°í:×þï_ŒFB cÛØÆÚHâ×Eh¢.‹Ð8êÀØÆ6¶ÿ+´Z­Æm ¨«³RbÛu®MýE¨Ã@@ÛØÆ6ŠÐEhEhlcÛ¼¨Ë§@F HÀ @F HÀ @ #HÀ @ #HÀ¢.0f¥Ä6¶ë\›À¬”r`lcÛ'F¨Ã@¨Ë"4N:0¶±í¿Ã ­ÑhpC ê(ØTª;Q'u`:GFáÛØþðÛÿÕyQ„F ê6F HÀâ/'`,­‚ml×¹6õu`90¶±mäÀX0@F HÀ @F HÀ @F HÀ @ #ÿ|Æ´²ØÆvk˜V@@ #$`â_GÀhÄÂ6¶ë\›@#"4ø;Á¦ø2@Œ@ þBÆ¼ÐØÆvkS‘#(B#ˆ¿ ­V‹³€@ Œmlcû¯Ö‘#¨#$`Œ@ #$`Œ@ €$`Œ@ €$`Œ@ þZÆ´²ØÆvkÿ÷/F#!(B#$`:0¶±ý/Ñ‘#uhÄB PF °6@ü-Œy¡±í:×&°6"4ø;ÁÐét8 êÀØÆ6¶ÿj90:0@F HÀ0@F HÀ @F HÀ @F HÀ @¼'cbwlc»Îµÿûà ¡ŠÐØÆ6¶±6"4øÐF,90ø;€Å͈ºÌ1/4¶±]çÚÖFB þ`èõzœ¢®ŠÐ80ø;XØÆvkSQF P„F HÀ @F HÀ @ #HÀ @ #HÀ @ #ˆ÷$`¬Ì€ml×¹öÿb8!ÛØÆ6ÖFB ¿(B#uY„Æ)@ PÆ6¶±ýwX¡ ncŠÐâ/'`Ì ml×¹6õEhEhŒ@ PÆ6¶QF (B#$`Œ@ #$`Œ@ #$`Œ@ €$`Œ@ €Äÿ0f¥Ä6¶ë\›À¬”r`lcÛ'F¨Ã@¨Ë"4N:0¶±m´B#ˆ_+BÓ ÷6lcûÃoSQF ê0F£g¨Ã"4¨«Œ¥U°í:צþ¢@ Æ6¶±@  @F HÀ @ #HÀ @ #HÀ @ #$` @|ÀŒie±í:×þï_ 'D cÛØFŒ@ Ј…@ mlcûC¡‘#ul’$ õ—¢llcÛl›¢YäÀDÃd2á, uÕˆ…‰Ý±í:צþ¢@ÔeŒS€@ Œ@ PÆ6¶±ý«Š›!F PF HÀ @F HÀ @ #HÀ @ #HÀ @ü¥Œie±í:×þï_ŒFB cÛØFŒ@ Ј…@ mlcûC¡‘#uX ÛØÆÚHâïÃl6ã, uÕˆ…S€@ÔaÆÄîØÆvkXÜ @@ mlcû7‰ÐȈºÌq $`Œ@ €$`Œ@ €ÿ×Þ½ƒFÑõqžK²‰’ `#^H¥­ I%6¢–66¬±òÒ© "©L+¢`£‚‚ÅK!ˆ "ñ‚…ÉÎÌÎ[Üä3&|//Äç)–`‹ÌìùÍ9gæÌ 00 À€ƒ ,k€=Z­®\=÷évB0„ ¡ÕjµW«€!4ÐéœÄ‚Š÷Àó‡Ôfjuç×s'­Š¢ps``ÙìÁîjuåêÈ»‘  ˜ƒ90`¬V«ÿÝËÍ ¡Á`@€A€``@€XÖ{°»Z]¹zîÓÝH` B«ÕjïF‚š0s`àoØ»‘Ôꪾ©Õj9ŒAU{`•U«+WG^­]À*~ ``Ùì$–Z]¹ºýi †Ð€  0 À€ƒ 00 À€ÿg€½™A­®\=÷évB0„ ¡Õjµ!4B.n?) ¨d<ÿ!w‘gÿ©Õ_·?{ʲŒã¸ýÙž«Õꎭۙ5s`àoͪØ«UÔêÊÕs³bChЫÕj=0à$0 À€  0 À À€ 00 À€ Ý¡'Ïs{*Ê9 Ê=ðµk×ìXö!tš¦öTAÇqÛÝüwñ¶¥iVz·Z­ºå6MÓöm*áÏ¢(ê¶î=lø_hµZukÕ$I’$µÝöv½jÕªÁÁÁù ZÛÐwúA7I’¢(¢(Ú³gÏÁƒOŸ>}÷îÝ$Iêp¬ ›¹fÍšÑÑÑÝ»w¯_¿¾(ŠW¯^]¾|ùâÅ‹yžÇq-î? ›¹víÚ;wþ±.Ë2I’GMNNÖdŸTcÌŠÍ›7_¹r%¼ÔüüùóQõôôÔ¤ïݶmÛ›7oÊ&&&Ö­[÷[ÝÝ-áÒ¥Kå’^¿~Ý××çLA™Ž?þãDz,gggóܵkWh»===u; †íݲeK___Y–ÜüpzoÆ a&¬Ïéî—µ͑‘‘£GFQÔl6FËþþþн,ñÞÞÞþþ~í¾{ÆÕý×[­VÇ<kµZF#œ¶©ío9==ºÙžP–å·oß>}új­_€ÿ¦ÐÛ|ÿþýСCÃÃÃwîÜIÓ4\®[ë DzgÏž… H<ŠEÇñ½{÷¾|ù’$‰ p§LÿÒ4½ÿþŽ;öïßÿòåË4Mã8k9j",Køùóç‰'Â!ì· EÖxœüîÝ»ùWMž?¾wïÞ¨W€ç·„ñññ¥WbMNN6J¯ÄêµÐíqFFF8066öäÉ“š¬…Ž~-^½zõðððÐÐP–eSSSY–Õp'lß¾½}SÚÂ^úéÓ§oß¾µºGPµ½i±nÖÀ»óPÕõíx±³²uN‡‘a{áQ=wÂ_¨gÛàüo`í+![:cIEND®B`‚httrack-3.49.14/html/img/android_project.png0000644000175000017500000007275115230602340014420 ‰PNG  IHDR@µ6E Êu°IDATxÚíg|Õ×Çgfg¶·ôJ¡„„Þ„š4éE¤ ‚± (UA¤ ÒD¤RDšté½÷@¤H$¤—í»Óžça܈ @à|_ìçd³;3;3¿{Î=÷Î= H‰…ÄS€¼Ywàþ•Æ÷êÕ+$$D:Bp¼AT®\¹W¯^¡¡¡î}u¦M›êõú'ÄðòÂ(]º4(Êårq'( Žã\.¯FÅ#ø@½^ߺuëîݻ׬Y³¸€/^ÌqÜõë×?þøã>øàöíÛÇ}ÿý÷î†~ò† rssÿüóO›ÍÖºuk÷}öÙgv»=>>ÞjµvêÔ ÞŒµZ­™™™•+W.~lòú÷~ ‚xûí·EQdYVr’î°,+Šâ!CЇ¬ FÓ¦M›·ß~»sçεjÕ*.àŸ~úIÅåË—åp8DQœ;w®ôØlëÖ­EQ)ž:uêĉAÔ¨Q£L™24M»\®±cDZfÍšääd‚ š4i"Šb›6mЇß!^cä5†çy™L¶}ûöqãÆÑ4]¬Õj‹ûa0òšÓ*(Šøàƒ-ZGGGÃ8 yã4L„ÝnïÚµkVV–*Ûl¶®]»fgg»îJêÝ»w¯äÿÖÉ‘”””ŸŸ¿cÇ…BñWIQÇÕ©SgõêÕÝ»w_³f»—ÎÌÌ$IÒÓӓ㸀€§Óɲlnn®··7AN§óq}`¯.ò†Ò2™,%%¥W¯^ûöíA.—4èÒ¥Kîq5ȬZµj»víòôô´Ûí ÃI}=²§ÍóüñãǧL™âççg·Ûår¹{@NQ”(ŠeË–=wîœÉdª]»v‹-l6ÛØ±cW­ZuïÞ½‘#GþñÇ‹-ª^½ú˜1c.\HÄwß}·aÆû÷ï7lØ0%%åøñã$I™þyƒZ4M>|øã?–Ëå“'O^·n]õŠ¢Ø¼yó .øùùQ¥R©hšÖh4 ÃÈår¹\. ¹£Õje2Y›6mÚ¶mK„J¥’Éd*•ªH “ÉæÎûóÏ?ûûûËår•J%ŠâŸþyûöm‚ zõêµtéÒzõê;väÈ‘Emܸ±K—.•+W¾qãFÓ¦M-‹MHà¸0òfÑrï޽ׯ_ïîT!@Õh4Ó§O÷÷÷w:R"IrûöíW®\Q*•2™,'''11&<'`Ž3Fª SÍó<Ã0ëׯŸ7oÞßÎÐ|Ò^ù' yCy¤^Ì~‹t§9Žƒwxž‡ÿB“I,âá2DΜƒMâdKä ðž tï?»ònð§FKÀÇybcÔ¡C< RR,=‰ H‰ƒÎËËó€ %UÀ˜ÄB’ Nä@0‚ /%„þÛOˆ¢HäãÆ´H’xÜli‚ .‚ /MÀ MÍ5ƒY,¢ÊA±ˆDE‘ I‚¦å‚Àñ¼Èq8œ /IÀW®dña±•ôÀÚ“7õ”_ØÚ>ãFàq6\vøÅÏ2™,===11Q¡P°,«V«u:\‚SÀ0 DÜñãÛŽ|Š"ív« p.—Ín7³¬KÄ»w¯¬_?§V­÷ÓÓ÷¦¤œ«U«cõ,ˆ­XñmÆ3!ábzúÆV­¦À@=Ã0jµÚl6K·I’F£Ñáp¡Ñhˆ‡eã¤Åéa¸;Ý…Äó¼Ùl~æS §ì‘gME½^ÏqœÝn‡GÏÔj5EQV«Ä©R©ärùãöù4×CEXðÁd2=ƒxž×h4jµš –eá¬þÓû@E£Ñ(‚ÅbÁtã ¡ …B¡€Ê ÿQ $G:´Œ ˆ¨¨V$IJå H’Édv»ýîÝã~~ÉÉçÒÓo—*•rõ*•——e±Ü§iuzúþ  2 £å8 IR¢(Êåò´´´¸¸¸¦M›ªT*p¼ÇýþûïU«V%âĉPÙM©T:x޹fÍšÉÉÉyyyð¾(ŠN§SæÍ›ÿÓþ4N§³k×®~øa÷îÝ ‹œDš¦wïÞíååU½zu‡Ã¡T*ãââ¬Vkƒ àÏëׯ§¤¤ÄÄÄ—®N§{ï½÷BBB¾ýö[iÁÁÇG7ªS§N%''wïÞeY£Ñèr¹ÇSŠß`0\¹råÀv»½fÍš111PÚý‚æ“7%Š¢B¡Ø¸q£V«mÑ¢…Ýn—jE1ÿwpçt:I’t¹\Ï’¢'A©ô EiK—Žá8öÎÛÑÑíjÔè±gÏâüü[:ô—ÉHXuüØ… >ùä“Ó§Oët:Žã(Šr8±±±3gÎ [¼x±B¡0›Í©©©ƒÁår 6lïÞ½·nÝ’Ëå°gxx¸Óé,W®XŠÉ%›$IØ8Ü…pŽ`í_Xì[Å7näççÃBžð_h xž÷ððX¼x±Åb9|ø°ÕjU(&LHLL¼|ù2øÌ™3g&%%uìØ±  Ë—B󖘘»~8l.ºw`G°ÒŠJ¥Ú»wï¾}ûzôè!“ɾýöÛ*Uª´k×ÎjµR Äÿ®T*‚^¯Ÿ;wîŒ3*W®¬×ë—.]½lÙ2A(þ]©'§–€afÙ²eÁÁÁíÛ·‡ƒp«Ö'}±xÇyæÐ/00VÒ‚ÿoW6“!Õ©Ó—+#++¥øJ™N§-""ª|ùHž·Õ¬Ù<.n/ÃP5k6ª\¹éÆßpÁ)ÍÖ‚Z›t?)•J—ËÕ¢E‹C‡éõú¸¸¸V­Z-_¾¼^½z‹…çù®]»Š¢.×ËËë÷ßÏÎΕ*•J¹\n³Ù@™F£"I«ÕÊó<44M›Íf¥RIÓ´Íf#Þ„ŒÔjµÉd’/Šb»ví¦M›–­ÕjïÝ»—˜˜XPPpãÆjÕª™L¦«W¯vïÞJËzxx˜Íf™L¦×ëAÏr¹\§ÓÆììlFC’$ìQ©T* “É0›ÍùùùãÆ;v,\È•+WöêÕ«oß¾œëõzAl6›^¯Ï,õôzýÁƒ§M›6wî܈¢xõêÕFÍŸ?ܸqYYYžžž<Ï[­VN'Š¢Åb¡(Цi¹\;œ ³Ùl³Ù6oÞLDaa!I’Z­–$I³Ù¬Õjaï4MCÈg·Û¥Õ^gμð<ïëëgj¾ì‰{‚WªJ•z¡¡5yÙÔjE™ŒS«i•ŠE’çE—‹u¹•J©×+ ³(Jö¿3=Džçÿ Ü<ÏÛív»Ýîp8xžw8ð§dÛl6Žã8޳ÙlV«U&“;w®OŸ>'N¬S§ÎáÇU*ÕðáÛ5kÖ¤I“O>ùü‰Z­þóÏ?;wîܤI“˜˜˜ß~û Ú<¨m¥V«srrÞ~ûíµkתÕjh Ng­Zµ¬VëÍ›7===Ož<©Óé*V¬xðàAƒÁ’’’‘‘Q·n]ØÈ_|ѸqãÆOŸ>].—ÃòÜ©©©Ý»woܸqëÖ­?®R©†¹wï^¯^½š6mÚ´iÓ… Êår­V»|ùò±cÇ&''ÇÄİ,»uëÖ=z€zwíÚÕªU«ÆwëÖ-11Q¥RIWZ.—/]º´J•* ÈÊÊÊÈȨR¥J¿~ý.]ºät: ömÛZ´hÑ´iÓ¶mÛ?~\­V«Õêï¿ÿ~̘1üqtttLLÌöíÛÕjµ\.ÿòË/øáøÌ©S§ÚµkפI“:\¸pÁÓÓóÖ­[½{÷ž2eJݺuýõW½^èŸ'‰Å0ÌÝ»w=zúôéãÇçååIÑß¿)` §ÓærÙ¥н’âÃÈÊ+9ùö‰»!V}úôé»wï?~¼‡‡GVVVÏž=5Í’%Kºuë6|øðÍ›7 –eU*•Édêܹ3Ïó½{÷†Î'DõåË—7 çÎS«Õ{öìiРA×®]÷íÛÇ0L||<Ã0•*U"âÃ?Ü¿ÿŒ3>ÿüóÙ³gÿòË/:N©Tž} aÑã;wÆÆÆÖ¨QãÉuF§q‹%+++777;;Ûår=sº~š)*¹\IQ”R©"IŠa°ò-Ã0r¹BøˆˆJÛ¶e¦¤\iÖ¬o™2aË—o£é …a¢²³¯²¬$eRó×¢>)‡SÏБ$IÓô²eË"""²³³{öì9oÞ¼†aNŸ>½~ýz¹\¾qãFžçW¬X!—ËcbbîÝ»wáÂ…öíÛÓ4íp8zôèáçç·yófÈ(À©ä8ÎËË«jÕª°÷ùóç'Mš>{ö쬬¬K—.•)S¦|ùò½   zõê;wî:thBB„ Úµk×®];põjµZ©TÆ.]ºL˜0!<<¼mÛ¶999S§NíÔ©Ó÷ßïr¹Ê—/qúô阘˜ÂÂBš¦Y–u¹\J¥ÒýT‚À0 EQ3fÌhÕªÕ¬Y³rrr7n7gΜ·Þz‹eÙ:uêÌœ9³   Aƒ•*Uúí·ßš6m Ç T*gÏž]£F+V8Ž:uꄆ†îÙ³§jÕªEýðÃ111™™™}A>E1 ÷ü5ëaºÌ•œ|Ëf˱XÌ7oÞt:mééw¯]ó5™L™™Yr¹ÊlÎËË3eYÖlµæB¥RÉó¬Ó™å᜗—árÙF.¬€ ¼Ëå¢iÚjµvèÐÁ=wú £ ééé2™¬E‹ß~ûíéÓ§åryjjª‡‡ÏóW¯^­P¡‚\.ÏËË+,,œ‹“œNçèÑ£ß~ûí&MšôîÝûêÕ««V­Úºu+Ã0P¿ »¾ÿVúÎ;<¯îííýl]HÙ§Ÿ~ú„~¶Óé**êàÁƒ{÷îõôôœ7o^xx8I’7nT«Õááá«W¯V©Tßÿ=YYY‘‘‘‘‘‘>>>111.\ؽ{wAAÁøñã6lXPP——×¼ysF?'4Mß¿?==eY aÀÿN,y÷îÝǵ4M[,–)S¦„††š”JE¹råA8~ü¸¯¯oBBEQ;vܲe‹Åb½qãz5ÀćWLII®Zµjff&Ã0;v”’CÐU©TEæBët:É Ã®5Õj-Ò,‰¢¨ÕjEQ”æ$»Ï¬–6éYø.ÌQ(ÆápÈår˜A-“ɤТ¨Óé »Sdw0ç&*0Ìf³IA Lƒ9‰f³™ã8˜ Yn†a`´pÞ›L&Øœj°!쇑p­VKÓ´ÓéT*•p±‹Ì½+•J«Õ ý‘"ßu:f³†…ÌfóÑ£GÓÒÒ Çq0å ž†±Ùl¢(B&Ìáp@[f2™†Ñh4p&Q½Ïïåry|||rr2<ÌP³fÍ€€–eÿå‡ oÁ²,L¼~ýÚ©S§š4irïÞ=µZ`2™víÚuôè‘æÍ[JÏÈ劸¸8‡Ãž””äããYXXèïïÇ!4Üdî?)??ß=›)Yé÷¦(Aà .¤[¤ÌŒRBvWê3KïÃŒ(‰´ ˆÌ‰bOóÀ *˜1"½YPP EþÐÍÍÍ…?a¶$4Oî{$BšM%e’aî¶”O‚4›tÅr€9=î{‡Ï@³Rü»p`ùùù¹¹¹6› Úø®Éd’>?™¢(»Ý. ò=òr Ï“Ê*2µáßF‚û ??ÿöížu: ˆðÂÝ»w)Š*W®\\\œ p={ö4™LƒÎÏ/¸r%>"¢Bddd^^žËå*w¯ÑöHåüñÇ“ÿ¶·••uøð‘#G?xðÀh4Þ»—rþü…¼¼ü³gÏÞ¸qÃét>}¦\¹r'Ož0™ ¯_¿ADZZÚùóçÝ'"/ ˆzôèÑ¿xFÏÉKŒ¢ …V«Õh4ÐÓyæ,ô“úÀð K«V­’’’žùXƒ‚‚:ó0{é<çâÈ¿+ci þÙýùã,qóæMéñÔ"Âmé éPÜSSÐÒ@þ/‚üûùß X©T>O¸%Š"äBù×ùû™X}ÎÞžhy9Fù!È«+`\]AJ°€1½„ %XÀ˜aB,àçÏQ!ò2ûÀEÆo)1–ž*F¤ä ˜a< RRü„‚¼êÆyí‚FäegJ"H 0ÎÄBôÀ‚ €ÁAÞÐý" A0‚ ÿ‰€¥B¦PAïß}téù«¤"È›ÉÓN„†ê»°X´R©üÛ29P3â Ê”–Ã…¥g¡†ËßfÔž¼ˆîs.±‹ ¯¡€AÐh4?ýôÓ¹sç ƒÓé,]ºô!C4 ˲A@iY©¤5˲æÆ‹/ž:u*MÓP[(' ª¦i<¹\.OJJb&00PÒ°T:¶,†­–>Ãó<¹…‚fP²ª‡@q]¼ÒÈBC•k×®UªTiäÈ‘Ÿ~úijjêŒ3”J%ÔÚƒêg:JÈB©¾€€€Áƒƒð@öE©ÕjA†Ñjµ6›M©T2 £ÓéV®\ùÇèt:© MÓz½ÔßR*•jµÚb±À~á¨t:hÞh4* »Ý®Ñh €½F£šf:/3‚!4SªT©òåË1bĈO?ý4++káÂ…PsÖ¬Y«W¯>tèA111 ¸ÿþŽ;†.—Ë,XpîÜ9™L6hРèèèôôô¹sçæææÊåò1cÆüñÇ/^T*•aaa­[·¶Z­jµzÁ‚V«5'''33366¶qãÆ×¯__´hü÷ÓO?-_¾üìÙ³ óóó »uëwóæÍ * >Ü`09rdõêÕ,ËFGG4H*. o––îûÂÂÂÜÜÜÔÔÔuëÖùúúêtº'N”)Sfüøñû÷ïß´iÓ„ Æ¿~ýúcÇŽqæÌN·aÆøøøU«V½ÿþû ,à8nÞ¼yJ¥ò‡~¨ZµêW_}Õ¡C‡Ê•+7hÐ &&Æn·CYÝ«W¯fggOš4©Y³f?ýôÃ0Û·oŠŠZ»vmPPÐâÅ‹U*Õ•+WxžŸ:uj“&M¾ùæ›-ZÌŸ??..îìÙ³ÙÙÙsçÎ9rä’%KŽ;vêÔ)¨ˆ×û¿“‘¯œ†®¦J¥Úºuk||¼ÍfS©TcÇŽå8ÎÛÛ»sçÎÁÁÁ3gÎlß¾}DDAíÚµ;pà@ÿþý!ô=}ú´\._¹r¥ÍfËÈȸpáBZZÚĉ5M¿~ý4h ×ëµZ­^¯7YYYÐ^Èåò¶mÛúûû×®]ûÈ‘#f³ù£>:pàÀœ9s}ú˜L&???¨ŽMT²æyjÅNAö‚ €Î•J%Ïó_~ù¥¯¯/˲2™ J×W¬X‘ã8(™Çó¼û~¡ì5¡V*•Ó§O‡ê˜‡#11±Èg ø­\.gY–¦i‡ÃB~~þ»ï¾ ¥·ñzÿ§êe&--M£Ñ †"Wy™I,’$Y–U*•ÞÞÞz½Þjµ:NxTQ«V­={öX­V‹Å²gÏž:uê€&åry… l6Û€ú÷ïÏ0LHHˆ‡‡Ç¾}û ›:bÄHƒP%ÜSÍ<Ï;Î .´k×®Q£Fv»ÝétÂg¤q#HeAòÙn·WªTÉjµ6kÖì“O> Q©TØ~1ÎÈÈ0™L04€çäEx`÷² ÒŽÔõ…7A0 …Âét€ ¨ÅÓÓ“a³Ùܹsç»wï~ðÁAT­ZµC‡—.]‚ 4hÒ¤I={ö$¢lÙ²7þì³Ï¦M›våʳÙÃ0Œ§§'­ÑhE±J•*]ºt:t¨——Ïó£G.Ò¥/òÑ~d÷õ}n!šþÿçÛ¤‰xnÿ û/Ífgg?Mír¹H’dÆý2»\.˜àA’¤J¥‚ȶtéÒ …âúõëãÆ[±b…\.§iúÎ;4M—-[ÖjµÊår§Ó™””l4­V«B¡HMM•ËåžžžPÜétÊd2+fYV¡P¨Tªôôt§Ób2™”J¥Ëå*òé8išÖh4<ÈÉÉ)_¾<Õ/Ì Ã™…10éæ–Éd/fñm)v…}Á`øÓº¯ÿè+ð»AP«Õ.\ðöö  =ä~³=€áŠJKÀ»ßîS, üyïÞ½‰'̘1Ãf³‘$©T*EQ„‹ Ó¹ …Ëå‚YàO÷ÝA9h›¦iÐy‘ϸxo®´Á¦^Š¢ôz½´â§Óé4™Lÿé -]½^­ê?Úµt2F£ ð•§lq)`—Ë…êz%Bh°¥¼¢ûuO6‚´@f*•ªW¯^õë×—:ÉÐÅ…{‚xXõ›$I)Ü‚n­t0OSº3À†#Òùé`ôÝÕû_‡7FæääL˜0¡  ÀårÆV­ZµmÛÖáp9f8N÷–ΪtÌE>ã>.PäwIÆÔ©Sá|êtºÖ­[·iÓÆét¦àIߤ}étºáÇ{xxŒ7Îd2ÁÕ‘Îmñc€ƒ@kåþéð0ôýïBhê5ðî",nC´Æ²¬O§N4FJw€»K/ò]é“Üû÷™âoÿärd2™Ùl^¸paRR’V«½ÿ~ß¾}ß}÷]©ÁkµZ•J%…0r¹œ š¦µZ-Ã0¢S«ÕP:Cj˜AP(:Ža˜"™^Ôøá‡'NhµZ™L–––Ö£GÏ?ÿÒx° µZ-ÍlU*•ðIif»Ýn—º<ÏËd2­V+—Ë!’ô¬ÑhÔj5ô<<<.]ºÔ¼ys‡Ã¡Ö‹<áBgÿÛ…©Èof2V©T&''רQcÇŽmÚ´!âÊ•+uêÔ‰ýþûï³²² ƒÝn¿víšN§ ‡a°ÜÜ\___“ÉÙÒ¥K»\®«W¯.uïõz}bbbzzzhhhpp0Ì„“LÓtDDDÿþý§M›ær¹ärùòåË tôèÑêÕ«§§§ݺuK¯×ûúú*•ÊÛ·oçää”+WÎ××·°°PR2EQ<ÏÆÌÌÌ;w†šÍf˜£j·ÛoÞ¼©P(`Ðår­_¿þÓO?=sæLaaaPPP©R¥0„~A!ô5<õfºÂèW^^žÍfËÉÉ©V­Ú—_~9}úôQ£Fyyy>}zÈ!‹Åf³µnÝú§Ÿ~¢iºwïÞ:.//ïþýû0ÃìðáçOŸÎËË«S§Îš5k S=räÈ•+WÂdò/¾øâ‹/¾b]i×&“Én·gffjµÚÖ­[Ó4””¤×ë[¶lYµjÕÇûí·#FŒèß¿ÿ®]» ¥?yòä~ýúÉd²víÚ †uëÖ±,»råÊqãÆ1 c±X>ýôÓÑ£G‹¢xöìÙ÷ßßjµ²,[¹råÍ›7÷Ýw«W¯V(=zôèСèQ£pø…Q4p}šPí'Øî@’œa»Ý^»vm§Ó™žž£nMš4¹uëÖ¡C‡¶oß¾xñb½^Ÿ•••‘‘±jÕªëׯ¿õÖ[Ÿ|òIPPÐåË—÷íÛwêÔ©eË–yxx,X°`þüù«W¯ŽŸ1cÆøñã·mÛf0Ü“‚ @pàíí}àÀŽãÀUæääh4šãÇ¿ÿþû£FÚºuëüÿÙgŸÅÆÆž9sF.—›L&³ÙÌ0ÌÉ“'‡ 2a„۷oÿøã“'O>sæ EQï¼óNµjÕâããÏœ9sçή]»~óÍ7'Nt¹\Û¶mëܹ3Œ?e· íg³¥WÊ=ƒåžÔEûÙìǵ”–Ëå;vì0›Í£FÊÍÍ ïСÆ  wлwïêÕ«ûøøtîÜœ­F£iܸqÕªU“’’‚X¸páàÁƒ;tèÀ²ìûï¿ß¬Y³~øÁ½º¨wóæÍ=zôèÑ£GóæÍد_¿Úµk›Íf’$¿ù曆 ’$¹dÉ’ñãÇGGGóù$&&f¹Š¢³èÒÓÓGDD„Ýnw¹\<ÏW®\Ú‰ÜÜÜ´´´Ê•+ÃãÜÙÙÙ‚ $&&j4­Vët:-KÆ [¶l Ã0/àégA»'TÝ ä•è¿ár•ü!ÏóìÝ¿¿F£)]º4<¢¼wï^«Õ*‚^¯×h4ò¡"µ¯RrÖK`¦°°rÔ2™,??_¡PÀóð1™LfµZ»wï>cÆ Žãhšv:ÒÈ04á†$I•!Õœ——§V«Ý…ËåªY³æš5kÒÓÓiš6 ¿þú+Lt‡\´ËåÊÈÈ -26öää B˜Íó<ÿ“xA°üâúÀÒÔ+ƒÁ R©¼½½7oÞüã?Ž;–¦éèèè¼¼¼;wîÔ®]»nݺyyyÑ•b×ÿhZrJ0q…¢¨&MšüòË/N§344433sÓ¦MmÚ´1!i×ÐåfY633333SJSÃ6a‘ƒ   5j,Y²„¦é7n>|¸}ûöî¾±E‹§NE1**ªvíÚׯ_¿wï^ãÆÇþýû½½½}}}'OžÜ«W/h`å­V+µ& t¹\V«Z0¬V+îcõx/=mÛ°ÿÂsÇóügŸ}S³fÍwß}wĈŸ}öYvvvóæÍ‡Ú±cÇ=zôêÕ«yóæ—/_f&77f­Á]S/àÏ‚‚«ÕJÄôéÓY–­^½úàÁƒkÕªU®\¹‘#GÂð´ëÜÜ\»ÝÎ0 MÓ2™LÊ'qGSb~øá‡7nÔ®]{РAð06ÌK‡•‰AøðÃëׯ_¥J•÷Þ{¯uëÖï¾ûnrrrDDĈ# ôî»ï¶mÛvÑ¢EÇgY¶lÙ²$I¶oß~Ë–-Z­ö‘Yh—úâ‹/êÕ«g0†Þ°aC­VÛ®]»þýûëõzi¨yzd£F³ð¯!QQªT©† ~óÍ7½{÷¶X, žöíÛW©R%%%E¡PLš4©W¯^f³9$$¤~ýú>>>Ç)•ʈˆˆ5j€–üüü6lh0zöìɲlFFFÇŽ¿ûî;­V+Mwƒ&9888::ÚÏÏ;‘º—4M‡††Ö©SG©T:ŽR¥JuéÒ¥°°0//¯_¿~“'O&B.—¯^½Z©T¾óÎ;.—«W¯^¾¾¾ÉÉÉ¥K—ž?~:u ZµjU¹rå»wïúúúΙ3§E‹AAAÕªU3›Í¾¾¾•*UÒh4ÐúoÚhšŽŒŒ„ŸMÓuêÔ©P¡®^ö,Þ";;Û=¯Eà„µç³‰‡“±ôz½4ÓÐf³Ùl6÷­Á`€yQ‡Æ] ƒÃဦ°ØXaa!äay0xø™aز ’J¥c€È`wÄÿ>'¤ÓéL&|š ½^¾žîööö®U«V``àŽ;222†1àÃaÔéà­V«Õj•!S«ÕgÏžU«Õ¡¡¡ÒÜØ"ù*FÃ0LAAV«¥i:??_š}-©不|ö‹$I2''›±ç Š Šç_ 1+õ^Š$Š¥pzËÄÃù•’ê Í#Mi„•ô/â矉T‹ìÎ}n‰´MhG ó s6“““xéÒ¥¥K—öëׯ  æcIÉ'i›ÒÂàîo²,«R©.]ºäëëëþ4’H‚(Êþw§Ð«‡–Îý×!˜…~¡2APá!§,œÀ‹D%¹Ï$‹ß¯îïHÏüí¿Ñ)zŒŠÑ=mùð.]ºŒ?¾E‹ÒdŒGîë‘»€Y+xw?E Š”S¤™AÂÒN%å£tŸ+„FüÌê•„çÜ,TV ’±A’Yòá‡J„ý0ì7.§Ël1ÿ¿—~úí„Hˆ4MgffªT*XcX$ MÎqœÈr|apòŽ¡~… HÒ%ËÍ=Kk54cåDªß $! …9Ù$I*žÑ%’„À— ðEAàZFñ¢¨a¨;fnÝ=ËØJF/¢~QÀ¯Ú]Oè*ÇɧÚ8;_¢ì[pÏø=’EŽ$HpμH8xÑ :šÂÑ!ð+x§‹I0$9øL6M‘x>âö" «‹¯î­äñì`øÕôV¹NÞ%ˆnAä¯ðD$’ Ô2ÊCŽN=ð+y¨hìÚ=A$8œb…~5÷‹ümK‡ €ñÖDÿ§ž" A0‚ ÿ~–PpÞúÉ}IEÉpš+‚ü·~šÊ ð˜B¡ .ª¶>¹:^¯7™LÄÿ®{Dü«+ÓnVø Úo`q³¿È…‹Ž=zõêUØJõêÕ6l(Uë Ü*Áv•Jå½{÷vîÜ9hÐ x$ v,ø’@‚çZ¥Ãr]úŒÔRÀ'áQéQ8xºvá^Á}•Øo‘ÏH%Ü?#=ì†KC ¯‰EQ¥RmÙ²…ã¸-ZΚ5ëÎ;ƒæyža‚ T*•J¥"Âf³ÁJeF£„Þ–D„bEð˜8<’îãã3kÖ,??¿¾}ûfeex Ê”™5™L°,#¬·Äq\aa¡ŸŸŸô­ŒŒ ­V«T*I’´Z­°@,ƒJ<­ Gh·ÛaÑ•J%“É`E ø Ã0J¥â léÑ~õ=ðÓŽ3 Ó´iÓ¾}ûQ­Zµo¿ý¶k×®GޱZ­Ç¿qãÆæÍ›I’ìܹs¥J•hšöóóƒ…TÏŸ?¿}ûvOOÏwß}T½aÆK—.………õïßïÞ½Ôjµ¥K—®Q£<.—Ëá3åÊ•ëÙ³§\.ÏÏÏÿé§Ÿ2226lØ®]»Ý»w÷`%š+W®üþûï …âwÞ $bóæÍçΫ[·.,ËxõêÕ-[¶ÀÂ*ª/^ÌÍÍ•ËåZ­¶víÚ!!!‰‰‰çÏŸïØ±#6íHÉÈBK½VÉßJQe‘B„°Ä„(ŠÙÙÙ°fâüùó>qëÖ­Ñ£G—)S¦téÒ£Fºÿ~^^Þ÷߯ÑhΞ=;sæÌ˜˜A¾ùæN·bÅŠßÿ½E‹.\øê«¯üüüôz½§§',­5òV¬X±yóæ-Zœ?~âĉr¹|ܸq,ËvîÜyéÒ¥„oyxxxzzÞ¼ysÒ¤Iµk×öññ™0a‚\.ß¶mÛÒ¥K5jtëÖ­iÓ¦‰¢˜˜˜(áÈ‘#SRRl6ÛäÉ““““+W®¼wïÞ?þøC­VoÛ¶íôéÓz½Þ½Êî#Ï Úh¿D[z}*,DÑ·oß¶Z­×®]‹•Ëå_~ùedd䨱c4h0xð`‚ ’’’6lØÐ­[7ƒÁ@Óô† *Uª¡×ëwïÞwìØ±Q£FÁЇ[¶l©^½z¹rå«V­š™™É0ŒÙlÞ·oßW_}U¥J•;wšÍæ1cÆ@yÑ   øøøöíÛ—)S&00°J•*_~ùe@@@õêÕÍfó† Ο?øðá>ø K—.õë×?sæŒR©\³fûnܸ±sçÎåË—Ÿ2eŠJ¥ÊÈÈØ´i“ËåŠ8pàs–öyék”9\3ýMÏBâ¤åÊ•kܸ±Íf‹-S¦Lvv¶L&ƒš·uëÖµZ­$I–)SææÍ›° ¹Ëår8yyy³fÍbY6** :¨F£1''G§Ó 6ŒeYX+ªïÉd2XIúLll¬ÙlÞ¹sçõë׫V­š›› ‡þ¶ÍfËÎΞ7ožÓé¬ZµªB¡p:þþþV«ÖvƒEÛªV­*á­[·`”ËjµÚíö¨¨¨µk×îÙ³‡¢¨êÕ«K+Âϱ´Ý“FüÇ˹ï…5¥ÝÓõ/òxÐþÏûÀÅ—á~ä8põêÕßzë-‡Ãz“Ò¹2™,88øÒ¥K$"...<<î¥R©ÑhÂÃÃGMĽ{÷ :½wï^DDDBBÂâÅ‹GŒÁó<¡…ä³Ñh$I299¹bÅŠ·nÝZ½zu“&M¶oß¾k×.£Ñ˜‘‘ëò<¯Ñhd2™N§+[¶ììÙ³ ‚¸ÿ¾··7MÓ7oÞlܸ1Ô+¡iŽð½÷Þ#âÒ¥K+V”Òà<ÏûúúÖ¬YsÚ´i]ºtñôô,,,,²^ÜÓÛîu÷Ÿá§I­ä?ÚæSÚÒE…v»]µZ t°°°pùòå]»v —ªr—žž.—˽½½Ap:™™™ 䦦úùùeggÃ;AAA‚ 8ŽìììÀÀÀ¤¤$‹ÅRºti‹ÅòàÁƒ€€¥R cÚ™™™AAAP H©T&&&®_¿þÃ?ôòòr8J¥rÉ’%¾¾¾;v¼wïTrHHH8uêTtttXX˜‡‡äîܹ#BXX˜Á`p¹\r¹Ül6'&&Bóííí]äê#%ÃÃ+˲Ðwr_Z}zVv»Ýf³)ŠÔÔÔÓ§O¿ÿþûþþþÇÁ¿ìv»ôaÈ?I5ADQ´ÛíRÃÎÇý3R}¨…)}Ñf³A>ø/”ðäy>((ÈétžaÇŽ/^ŒŒŒt­À”Ò˵á•vWó¿ÒBÀ˜S^^¤:ÝÇ-^d’½  À½Äî“É,‹4îBæÞ7†ZîqŸ³9|___—Ëåçç' ²ßíÛ·?xðàéÓ§†ÉÏÏ ‰ŠŠ‚!ˆ <<<üüüÖ®]Û¨Q£FµoßÿÐh4¹¹¹õêÕ#I²eË–Û·o_ºt©\.ÏËË‹‰‰Q=Ôð«åžfù§N’çù¼¼<½^/Mº2 c2™îß¿¯V«ƒ‚‚ ¼µL&ËÍÍ…Gš ‚°ÛíV«ÕÛÛ›eÙ‚‚§%Iž‹†ùfÕªUAAAÍš5ƒøÙý`7--ÍåryyyÀŒèüü|…B¡ÑhH’´Ùl)))>>>ÞÞÞ ü””—ËN ’ß»wã¸ÀÀ@OOOT/ ø ‚aXNÀýM˜ñ"—ËA`YÊ[ÃÜ"kŒ@ÏYZ“@JËÁŸ‰‰‰»wï0`€Ñh,ÒÇ–öÂ0 4%ƒ­¹ïE.—CÂ{¹\ñ¹”Ó–6"½‰—ü¦Pd¼Ôý}÷)ÐîÅ¿ëþ>|‘a˜m۶ݼy³eË–uêÔõ¹—âi°âk­™ù\<‹öÈ70òìñ9Œ{yyA2 A#Ïèca*…B¡€§ö^Ì~a.W‘ä󋇢(©ëþÂ~;RôfÀSðœþ–Ë“ËåϹŽÇ?òØ/±ñ‚Ç'Pº(à’-`‚ ²²²Ìfó›v+Se±X Þ(à’ª^žç ƒ /Øý¾ pg4!£Ž7öK°Œ¥ŒÞ4ÞÌ– =ðk…(ŠÒóol'yi~ÊU)Ñ~‚Ù¡ýÒj#a %ªÈóÀ6Ú¯¦ý×+z`)ÁO‚`6Úh¿„=0‚”`þýU)ÑFmâE­J‰A0‰… ÈË€ÌËËó€ èyá– Unõ`ÑFíWÙ–^KLý¸5âäM橆‘ˆÿ]y*†/6uNüïZ' ÃH°ÄáÓx?•J¥P(àkP#ïøC÷ЇP [Üÿ¨™òÌ¢»"‹Ëÿ+×ý ÷K9¼§ÜÔ‹Œé§9h†aΞ=›5f£££ýýý¡T‡TûCòÉ{G*Þ Hå¼É‡¸ûy¨Ù ï3 “°fÍšñãÇæŠT|5cûý¶þïnµZ •Ó‹o J"þííAÓ4T9t?*žçiš†uÿÜ/œiaê⢕‚A)â+bü£SDÓ4T™(¾ü}‘.îåŠl å‡ñOÀ}åíÿôxª,´ jµú×_Ý¿?T…Ú–$Izxxx{{k48\™Læéééíí­R©à¹\îåååååe/¥_¨Óét:···^¯—ö¥×ë½¼¼ Ú€——×Å‹úé'­Vk6›oÞ¼ Ÿ×jµEʼ\õB‘n÷¼ñ°È¸R©|dâq>ç½·¦t¯?rûEÒãÒ¥K&“ .P‘í¨Õêâ%Q‹Cfff||¼ôué¨ôz=Çq‡Ãý+BQå®j¨/\°‘"UáHНDÿ¸Ó“““såÊ•">üëÿØCZ¢"oºKÑl6CÖ'_°†<áì½,¾îÝ»÷èу ˆ~ýúíß¿ÿ³Ï>ËÌÌ\¾|yZZZãÆëÖ­+‚ÅbYµjUAAA›6m"##EQLKKÛ²e‹B¡èÚµ«ÑhdY–¢(—ËuêÔ)š¦Ïž=Þ¦MŽã†Ù¾}{|||dddûöí¯_¿¾qãÆÄÄÄzõê©T*­V{ðàÁ3gÎDEE5jÔèq ^päi06mÚd6› PPP P(xžçy^©T¦¤¤°,[®\9(ü w-ÏóR`A ”,aVi— EU·ª¢î[A§Ó>|øêÕ«Ÿ|ò ìš ©· 2™ ê SUdkE\Д)SFU¿~}(/JøLQ/]º¦V«¡ Ô‹!%•nݺu÷îÝ+W®,,,4 ‡þóÏ?¿øâ‹U«VíÞ½› ˆèèè:NAôzýœ9sš6mšššzëÖ­‘#Gæçç{zz.Z´H£Ñx{{¯ZµJ¯×Ûl6µZít:5jtýúõ‚‚øá$Izyy;–aø¥<σø¡[?ÙétêõúË—/¯[·nÕªU‹dÉó¼N§;pà@jjªËåR«Õ}úôaÆŒ¡¡¡ï¼óÇqS¦L©S§N›6mÌf³\.w:jµ:>>~Ú´i¿þú+MÓp:ƒaïÞ½{÷î={vJJJaaaÅŠ9Ž“>—C*²ëò>—¦ž^À »vír8uëÖµÛícÆŒIHH¨R¥ÊôéÓO:¥R©¾üòËÜÜÜÀÀÀ?þøúõë999#FŒ0 &“髯¾’¢bžç§L™²yóæ   %K–,_¾ÜÃÃcΜ9›6mªY³æ† V­ZM¦B¡€Š¸‰‰‰'Ožôóó›}:66¶Y³fÇoÑ¢ÅñãÇýüüF¥Óé®_¿m±X^®ûÕh4—.]¢(ªnݺ¹¹¹sçÎMJJr¹\}ô‘Ãá8|ø0Ïó«V­êÕ«×Ì™3¯^½*BûöíûôésäÈ‘_ýÕd2µnݺ~ýúÓ¦Mãyža˜Ï?ÿ¼|ùò÷ïߟ:uªËå*Uª”Óé=z´Á`øî»ï._¾,ŠâàÁƒ7nÌqÜíÛ·óóó›6m*ÂÆwìØÁó|Ë–-‡º|ùò .(Š;wî´iÓÆd2]ºtI¡PL˜0ÁÃÃcܸqŸ~úiùòå×­[wÿþý/¾øîiAfÍšuíÚ5–e[·nÝ­[·ï¾ûÎl6ÿðÃ_~ù¥§§çøñã333U*Õˆ#ÂÃÃO:5þ|ooo«ÕªÕjyž‡=æååµnÝú×_­T©RõêÕI’lØ°á… š7o®V«ÿý÷ÈÈHN+ò2 ãåå%“ÉŒF£ÍfÓét¡¡¡r¹\«Õ{zz:ƒÁ`4½½½ƒ‚‚|}}-ZôçŸæææNœ8ñСC›6m"I²B… Ÿ~ú©N§;tèЪU«H’,UªÔĉ¡%R«ÕëÖ­;zôèĉu:]BBBAAAýúõ¯_¿¾~ýz‡ÃqíÚµR¥Jñ<Ÿ™™ùàÁ…BQµjÕ+W®|ÿý÷‡# à›o¾J«'NLJJ 3fŒ‡‡ÇîÝ»×­[Çó|Ù²eÇãÆË—/Ûíö­[·šÍæ… ~òÉ';wî\»v-ÏóuëÖýøãÍfó´iÓ’’’xžïß¿LLŒÝn6?L=¥ûµÛíÝ»wŸ3gÎæÍ›,Xàééyñâʼn'®X±âþýû2™L¡PÌŸ?Ïž=;vüðÃ.]ºlݺµuëÖk×®-W®ÜO?ý¤V«gÍšåïï¿xñâŠ+ž={Ö`0¬]»6!!aݺuŸ}öÙ?þ˜ŸŸ¯Õj8áååuêÔ©uëÖÍŸ?ÿÇܾ}û;wòóóüðÃß~ûíÁƒW®\q:çÏŸ‡ð;,,ì½÷Þ»víÚ¢E‹&Nœ¸zõêÓ§O_¹råÀ×®][·nÝ Aƒ6oÞìr¹žù–~Ú>0D†P„ÒÛÛ;///--mÕªU;wîôöö;v,I’999IIIË—/w8]»v ¤(ê»ï¾E1''‡¢(‡ÃÕnyž—Ëåjµ:##ƒ ¥R9sæÌqãÆ5kÖlݺu{÷î…Þ…R©„,ÄÞðÝ—Þû…LfffBBBïÞ½NgµjÕvïÞ=iÒ¤FÍž=¢h»Ý®ÑhŽ?Þ»woooo__ßèèècÇŽU«V­R¥JM›65™LC‡ݹsçôéÓU*•ÅbIMM6l˜^¯oРÁæÍ›Y–=þýÖ[o­]»î–9sæ-u¥1¿àà`£ÑèééÙ¥KéH)—Ë?®P(*UªÄó¼Z­æ8ަiøí=Ú¿TTôEY–­P¡BÏž=‡R©LLLt#‹_ß"2¶Z­‚ dddŒ=ºC‡µk×¾|ù2 tMN§‡‡‡”ùkҤɦM›êׯ¯ÓéN:¥P(*W® ‰†Zµjýñǃ¡L™2¢(:tÈf³µoßÞb±(•ʇÃñÖ[oU®\Ùl6Ã9„Ì“(Š<ÏOž<ùäÉ“'OžÜ°aÃÌ™3!A 4H”èõúR¥JåççðÁåÊ• [¸páÁƒùå—½{÷Ž?^:Õÿ~ Ís¿~ýÚ´i£V«ÃÃÃüñǪU«Êd²ï¾ûÎÓÓÓËËkáÂ… 4`fÙ²e!!!)))cÆŒ©U«–Ï?þ¨R©œNççŸîéé 10Ïóz½¾qãÆ999C‡íÛ·/d¹êÕ«ÇqÜ·ß~;pà@“É=dÈÜÜÜÐÐÐaÆA]ùwß}·qãÆÅËÒ¿HàÂ;v,&&Æår †E‹ýú믃 6l؉'àgBÚ©V­Z›6mbY6))éøñã 4°ÛípO»\®øøøæÍ›×©S'77×b±hµZŸ­[· ‚oµZ Edddnnn=ºvíêr¹ŒFãþýû£££!4­V­Z^^^³fÍ &Žãàî–‚xXÆét*•J‡ÃqïÞ=‡ÃqéÒ%0$Ÿ¯_¿®ÕjÛ·o¯P(²³³!Iît:!=ȲlŸ>}5jTXXX¥J³Ù|äÈžçãââ`iûƒFGGÃHi•*Unܸ‘”””››{úôéZµjÙl¶„„„fÍšÁµãy{yyy0~áÞäY+_*2², âýû÷óòòºwï^ªT©ÌÌL»Ý^¥J•ÔÔÔ . †‰'nܸ‘a˜ÀÀÀ9sæäççÏž=[©T8pÎôÝjÕªuþüùR¥J©Õê°°0›Í–™™Y¦L™   8p`¹rå8ŽS«ÕIII7nÜà8nÇŽÕªUËÍÍ}ÿý÷+W®œ »Ýîp8$ÕåææÖªU«W¯^.— ÒQJ¥266zJ U²‚=¶jÕ |oTTÜ‹/Ë CìwéÒ¥ìììúõëÛl6†aÚ¶m;uêÔ>}úØíöØØXš¦ëׯ¿sçÎ… ~ðÁ_ýõ AƒX–íÔ©S½zõvíÚåççYŸ!C†Ì;wýúõ ÃxzzÚl¶qãÆ}õÕW}úôÑét«4hФI“zôè!ŠbÍš5«V­zãÆ¡C‡Úív–e›7ož0pà@èì5hÐÀ`0€ (ÊÏÏz¹z½Þ`0Ð4Ý»wï9sæüþûïµk׿8.00ÐétvèÐáØ±c;v,UªTéÒ¥Íf³J¥ŠŠŠš|øpƒÁ¶fÍš3fèõúÞ½{{xxÔ©Sçã?Öh4¾¾¾íÚµ;uêT@@ÇquêÔY·nÝ·ß~;a„޽{òÉ'F£‘¢¨¯¾úªM›6'N„“ùÁÆâóLžÖ—<åà îs¡¥9UpÆ¥CÿogbA»¾víÚ:xyyqƒˆ‡å$O"MjyÎyÿ–€Ož9¯ÈŸEBÊÇÍï‡k½Ø2Lz™îgv*—Ëišv?ÎGîNú 0}2áÐ|ÀÄ*ˆÿ‘'š'mC‚¹%ÒO€Ã†»¥„ øi&Ù¾ú~d®õqíÑ“ç-»ßÐ*•*55õîÝ»åÊ• %Íp”îÑâgïé§F?åqÂm-%‡¥c(þ˜tËé˹?Ž"¹Í}&lñŸó„ÇyœÏ°ý"sÚ¹»'œ:âYŸÍ(*àüü|,nöŠØR¶I¡P@.ÄétJaž´QÜ ×ÄzeÝ;Å;‘kyñÃTò/Œ#òê k#¡v‰³ ¬„ ¯Co “XR²ûÀÑ~õméCh)áA0‚ (`Až2??Ï‚”TŒÕ ÑF»ÄÙÒ+z`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚<¥€q]h´Ñ.qö_¯ø8!‚ Fm´Ñ#‚I,Ám´ÑÆAÿ4„ÆÚHh£]Bk#‘ØŒ!&±yáÆ…ÝÑF»ÄÙÒ+z`)Á`A°Œ öÑFíVÜ ChÁA0‚ (`A#‚FŒ  APÀ‚ €A# A0‚ (`AžNÀ¸.4Úh—8û¯W|œA0„FCh´ÑFûŸ„ÐèChA^˜ÄB -Ö‚` È 0® 6Ú%Î&°6‚¼………xûÀ‚ €yzc m´Kœ-½bA0„FŒ  APÀ‚ €A#‚F0‚ (`APÀ‚FŒ È‹0.ìŽ6Ú%ÎþëŸFB ¡Ám´ÑÆA0„FŒ ÈÖFBôÀ‚¼ã²²h£]âlk#!Èki2™ð, öA#òôÆ$Úh—8[zÅ>0‚`  A0‚ €A#‚FŒ (`APÀ‚ €Œ  A0‚ O)`¬Ì€6Ú%Îþë'DôÀh£öKðÀØF †ÐR’Ch<RrÁÚHR’,-u‡ H‰ ¡Ý“ZæúÐFû•·¥Wì#H †4›Íx¤‡Ð‚”Tci´Ñ.q¶ôŠ!4‚ Fm´Ñ#‚I,A#‚FŒ  APÀ‚ €A# A0‚ (`APÀòú +3 v‰³ÿzŧ‘=0Úh£µ‘ù'` %9„ÆS€ ØFm´_FÚb±`3† %Õ㪔h£]âléûÀR‚ÁA0„Fm´1„FChÁm´Ñ~åChôÀR’=0žA#‚FŒ (`APÀ‚ €A# A0‚ (`A#RŒ«R¢v‰³ \•AУ6Ú/ÓcAJ0B#HI¡ñ öÑFí—‘…¶Z­ØŒ!H …––ºC¤DöÝ=2'h£ýêÛõy1„F’íA#òÂŒ¥UÐF»ÄÙÒ+ö=0Úh£ALb! A0‚ (`APÀ‚FŒ  APÀ‚ €A#‚F×_À¸¬,Úh—8›ÀeeChAPÀ‚ €ä0&±ÐF»ÄÙ&±ChA^&´ä—AŒ È 0® 6Ú%Ζ^Ñ#†Ð‚¼ H›Í†gA°Œ6Úh¿è>0z`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`A^¬€qYY´Ñ.qö_¯ø4‚`  Aì£öÒFŒ %Lb!öy`m$AŒ ÈK0® 6Ú%Î&°6‚` ÈË„´ÛíxûÀh£ö‹î£Fì#‚FŒ (`APÀ‚ €A# A0‚ (`A#‚FŒ ÈS vGígÿõŠ"†Ð‚`6Úhcm$ÁAWLb!z`A^XÜ AJ²Æu¡ÑF»ÄÙÖFB×ÒápàY@’Bã)@0‚ /CÀ˜ÄBígK¯ØF ¡A#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#‚Fä)Œ•ÐF»ÄÙ½âã„‚m´ÑÆÚH‚ü0„F’Bã)@ì£6Ú/# ít:±C ¡yáÆu¡ÑF»ÄÙÒ+†Ð‚!4‚ (`A°Œ6ÚØFChAPÀ‚ €Œ  A0‚ €A#‚FŒ (`APÀ‚ €ù㪔h£]âlW¥DôÀh£öËôÀØF †ÐR’Ch<‚}`´ÑF³Ð‚üÓÚ]ÐØ¶¡ö«oK¯ØF ér¹ð, H ¡)©ÆÒ*h£]âléChAŒ6Úh£F“X‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚ €Œ È+,`\Vm´Kœý×+>Nˆ èÑFmôÀ‚` A0„Fm´_õ=0‚”`hQI’”^%e£6Ú¯¬-i=0‚”`H–eñ, HIMbáÂîh£]âléCh)ÉO‚`Aì£6Úÿ¨¸z`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`A^¨€qYY´Ñ.qö_¯ø4‚ Fm´Ñ#‚I,Ám´Ñ~ÕChôÀR‚ÁÚHh£µ‘yÇáY@’šÄÂS€ %XÀ¸°;Úh—8›Àâf‚}`A0„Fm´Ÿ)„FŒ %Ùã)@0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`A^¨€q]h´Ñ.qö_¯ø8!‚` †Ðh£6–VA ¡yÕÁ$‚”pìRcïm´_}û¯¤ÏóØŒ!öyáÆ…ÝÑF»ÄÙÖFB×ì#öÁ>0Úh£ýÏŠ›a B#‚FŒ (`APÀ‚ €A# A0‚ (`A#‚Fä… vGígÿõŠO#!†Ð‚`6Úhÿ“š~• ‚ ­€ È û·º{ª>0Ea¤ /AþVÃãEQ¤(êöíÛ©©©ð'8îÿ_m´Ñþ·m’$A(UªT¹rå@Ã#`P¹¤u÷Í ‚ “É<¸yóf™L†)kù¯¡uéÒ¥|ùò‚ Ð4]\ê’fIAžÆ ãiE—Bÿ}ø lLb!È‹ObQõ¸N«¤Yú)·%e±±—‚6Ú/Æ~*mþm È+ vnŒ ÈK0ÖFBígÿÕ[Æ>0‚`  A0‚ €‘ûC¤ )1À ÙùóçÏŸ?Ÿ$qá¤×OÁk Œ1¤¥¥¹ÿ‰ €‘’„\.Ç“€FJ¶F°Œ  øßs,ðˆ²ûü²çß Þ ¯Å/Ç¿u­1„~Zÿ]!R¬Ï³l|ïW’$e2Y‘õ(žíA6þ5^R¦ä XŬ¬,Žã IÖétF£ÚlXÁà¶™››k6›K—.--€€¼Dìv{~~~`` ¤aQ322ôz½Z­þg÷÷Ã¥žf‰V ¡_DÛlµZëׯ_©R¥š5kÖ¬Y³\¹ríÚµ»ÿ>EQüC@Þ jŽãàM¸Ò¿àO‡ÃA’ä„ j×®-­Ä+mD äà‹îíºô/AŠìyfÀa9r¤|ùò+V¬ (Šã8’$G•*UÖ®] cÚî×ÈýB»_,¸.û÷ï¿víšûõzÝ\‚*3À¥¢(*55õ‹/¾¸pá©S§¶mÛvçÎ6mÚ°,+“Éhš¦išaŠ¢`IM†aàMXþ%Ee*•JÅ &œ:uJjª¥Èd2i§ ÃHCÓ´L&ƒÏÙ)á¶ÊË]¹ÿ‘Í_‰¨<À²¬ÍfûôÓOïß¿/g“Éär¹¤P«È9‡ í~±àºôíÛwãÆ4M»·¿¯Se†’ô<°tÜEùûû‡„„”-[¶aÆ¿þúëµk×’’’¦OŸ¾ÿþwÞyçäÉ“2™ìÒ¥Kƒ êÞ½ûo¿ýFQTffæ„ 233aS·nÝš0a‚(Š·nÝ:~ü¸ÔLüøã]ºtú¨lÙ²Ò "Ã0üñ‡(ŠãÇ÷÷÷_¿~=A—/_†ÿ†……M:U:¯òoÿG¶ôJ ¡‹{¹Wdž”çyN7sæÌüRSÕªU[·n¤:DQ,W®ÏówïÞÍÈȸ}ûö_|!Šbnn®ÕjMMM2dÈ÷ߟ“““ššš››Û­[7©ßEÄöíÛkÔ¨j·Ûårù!C–/_žŸŸ¯P(àR®Ž­[·nëׯoݺuÇŽ»uëvðàA8ÑîK„¾ÜóöÈÈå·œœœ‰'þòË/ƒÞ²e‹T`àĉ*•j̘1v»]«Õ²,{æÌ™·Þz뫯¾:sæLÏž=g̘Q­Z5–e!ãe6›Ý;À%è<<Ù.©!´L&3™L_~ùåÅ‹Ï;wçÎT¬XQ*t82™Ìb±Pe2™ÒÒÒÒÓÓY–ýðÃEQ /S¦ÌÎ;·oß^¯^½ÀÀ@ø"HÎjµêõzH“$©R©(вZ­°ehÿ Õ€>UûöíãããK—.ýã?†……Íœ9óu®xñ°,KQÔÚµk·nݺråJOOO¡aà 999###11qÈ! 4 IR.—GFFQ»vm˜iš†œÅë<\‚:îx__ß   Éò<÷)Ši ‚0|øð˜˜˜"yï½÷.\èr¹FŒQ$ÅW¹rå~ø¢(èWÇÇÇ ‚àççG„Z­.’gþå—_êÕ«·dÉ‚ –/_>hР>}úÀæ«vÓ”  ’ƒƒèèè?þxèС2™ ®¬N§+]ºôºuëŠ|kÿþýK–,éׯ_ïÞ½ïܹ#Æ¢(*•Jb|-»ÁTñøùUοN§ºšÐ±¡(Jò8áçç×»wïŽ;=z4--íûï¿oݺ5ü·ÿþ.\HMMíܹ34ê,ËB„‚‰¢(Nš4©I“&°££GV¬XÑßßßÛÛû½÷Þs8°ño¿ýV¯×ûøøÄÄÄ4lØp̘1¢(vïÞÝÛÛ;00°L™2;vì’m/÷\Ob•ˆë WgÏž=!!!™™™Ò‘9r¤téÒëׯ‡/^¼8 (((00ðÓO?u8“'OŽŒŒ4›Í‚ œ8qÂßßÿĉ¢(.]ºT«ÕFEEÁ–KÐ}þd[z%¥"ÂO(nöªÙ.—K ¨Šaã8f\H™¤ÜÜܰ°0wGTd›ÐäK“= ­Óé¼½½Ý?–ŸŸo6›CBBÀiC‹ ˆììl‹ÅR¦L÷dÛË=WpÆOÄ·ß~˲¬4ÏáÕ¿¾î×Q:¥Ð%†aaŠ¢X–½wïž^¯'Âl6ët:éÃǹ\.•JE’dVV–(Š~~~¯Suë¿Ê‹¾Æh®¤¾(Ïó’æŸÐrï¾òòxm¦RÒEfxä¨Ú%Î.rËâõ}ýì’÷0ÚÿԆد/ñú7Cü:{`xX¯ïkìqÞßëŒÕj%B£Ñà©x]A#HIÎBã)xÁ•Ñ#‚A0‚ (`A#‚FŒ (`APÀ‚ €A# A0‚ ÿ&t‘²1‚” ði$)ÉxË–-xAä…‡ÐÒ ÷‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚¼Ú<²j1òZ]â×ø·Aw‚  Äæ¥[™L&=¦ò<ÿ¦Í{‡þ„HåW‘W Š¢(Šzc»d Nç~Cã½øUot)Šâyž ˆ·ß~{ðàÁ³fÍ:vìEQoB[ ?ÓËË+66¶C‡!!!<Ï'$$¬_¿þçŸæ8Ž$߈çÏàgúûû·jÕê‘NXEŠ¢Î;wõêÕ7䜔Œ˜Œˆˆˆ7Bm¾ AÓôâ{£¢¢Åb?~<((¨ˆ‹~½ï„ß~ûM|"wïÞU(˜)x…bf­VûÍ7ߘÍfQN'Çq³gÏ~LQI’eÊ”ÉÉÉEÑårñ<}<Žã\.—(ŠçÏŸW©TðÉ7¡-Û»w/Çq‡ƒ} ÐÅ@¿Ž·gÏž7oÞ„Æ•ã8–eEQüþûïß±iÓ&Poqoãt:EQ=z´û{½ÏÆüwBñ³!‚(ŠiiiZ­üò©V­ÚÎ;áÚ°, —çÍ0ܯ¡¡¡‡¼nñ[–çyžçoܸÁ0ÌkË ٵkדœžž^Ò\²»C$IªÕê)S¦œ={¶]»vpïÒ4ý¦5¨ð{### …(ŠüùÞ+]º4ô„Ñç¼”`¿c›7þòË/ ‚p¹\r¹üM¾–J¥ÜË>Ã0ŒR©Äûþõ‰5Jî¡ ‚@’äéÓ§-Z$‚\.‡´Í{-ÓÒÒÀÍ>î¢(deew? øeÞ¦°°ðÃ?lÔ¨ÑÁƒe2 ¿iw'´eñññ0€ôÈVŒçy’$Oœ8‘——GQ üªtÿd2Ù©S§Z´hñî»ïÞºuK&“‘$ s9Þ`Z‚ÝnŸ??FSX–}CƉ‡ƒC .tHcYBQccc‰7c"üÆ}ûöqÓŠÀ²,Çq™™™8üÊÝÁA”-[vùòåpãΛ7ï °Ôþä“Oîß¿ï>jòçŸvìØ‘xF€Ýï„åË—?y&ÖÕ«Wåry‰ž‰õÎ…–Äiܸqÿþý-ZtáÂ…7d.4ñp°ÑhlÔ¨QÙ²eY–½qãÆñãÇY–}OBÆ ¥‡ÒŠ{éË—/§¤¤à\èW1‚zcŸFzœ›ÅÀ_Ϧ굿—•}Âiˆ ¥‰GoæIxÂÞÌ{AAAAAAAAAùþi$S¢¬4‹‚IEND®B`‚httrack-3.49.14/html/img/android_progress.png0000644000175000017500000010210615230602340014602 ‰PNG  IHDR@µ6E Ê„ IDATxÚíe|××ÇgÝwã."xp ¡¸-´ÐR¬ÅŠKñà.Å­…i!P4%@  $ž@\6YßÝy^œ‡é6@å_šr¾/ös2Ù™ßÜsϽ÷‚@¤ÆÂÂS€¼_w<‹ÅbýÿmOÓ4MÓמ9왦i‹Å‚§AþNÝr¹\6›ýÊ팤߸“Wng³Ù§’˜«~¶Àò'ÛF¦I´³³sww‰D$I–––V}ÏëÔKÓ4›Í¶Z­¯|CŸ>}\]] ‚ÈÏÏ?sæL5­tÕý°ÙløøW¥‡‚Õjýý©IØÙÙ;öÂ… EEE‹DRVVvõêÕ¯¾úÊÍÍímÚ^‡ Ø6Å`4hРgÏž………à“çææöìÙ3$$¤j£mûg¥&ÚöϦõF»ÛÌf³Åbñ˜1crrrè×STT4cÆ …BaÛC®¤:™LÖ«W¯-ZØêËåñÝwßÁöFQMÓ;vì`Þ`û‘öíÛ2ÄÇLJ9Bhx ‚¨_¿þ!Cüüü‚‹Åááá;vìСCxxx«V­«qãä¿Ã××E’$EQV«”EQ$I‚ðš4iRµõ?V.—GFF8044´ª€wîÜIQTRRÒ—_~9nܸôôtŠ¢Ö¯_o+`è';v¬¬¬ìñãÇz½>22Òö‹¦L™b0=z¤Óéºwïîââ’šššžžž–––žžNÓ4¼¿’_ ÿñÞ/A½{÷¦iÚl63¤-f³™¦é1cÆT•ˆY"‘|ðÁ½{÷îׯ_Ó¦M« xÇŽ4MïÛ· ˆV­ZFš¦7nÜȼvIÓtýúõ ‚ˆ¿~ý:AMš4ñóóãr¹$IΙ3‡ ˆC‡effÚÀøñã AU]m俌Åbáp8§OŸž7o—Ë­¦¢(ŠËånÛ¶m×®]•âX\.×jµ¶iÓfÒ¤IÐ\Wï¾Þ»wÅbíÙ³§jw‚R˜˜( 9NiiiVV£(ðÆgÏž #U©¶X,<ïèÑ£›6mzã Í¿ y都Aû_o¥î4EQ°Åb±Àá‘“=‰—CY¯›}M 'v ï¡€¡~¥Œ™U¶ýgÛwVýT¥©ÑÌpí‚ Õ>Œzõê…gAjª€™õ‚Ô8¸J¥Ï‚ÔTc Aj.8 APÀ‚¼úï iš X¯Ób±ˆ×Ía&¸`yg¸ñÛ\3˜ÅBÓ LÚj¥­Vº’Diš`±.—oµR MQ8œ ïHÀ‰‰Å hŠ2³X,³ÙÊf³9š¢hšf‰DïÿΨ—Í& âÅ‹lGGwww±[aùçÌ"ëÚµK›5ûX«-º}ûW‹•ž~×ÑÑÅÅEžžžmµŽnÙ²‡Ñ¨g±ØŒ€y<¢¬ŒØ³gSdäø°°@//šÃA#HåæË~(ë"`‹ iB£)àr­aT«KŒFFóŒ òY,§òò<‚ †|€KQ¬—éXAp8´@À¢i#ŸOs¹'C*³)I3ÿW.4‡Ãƒå"§U«žgÎd7n^§N ÅrL,–ÖªÕÒj%9‚Íæ²XM[)Šæryl¶å¥˜QÀò;ØlvII‰Z­†Å†®®®‰¤š%GIÀ4M‹DN$X»wÿ(!áçV­¶lÙ);û©··_íÚ-³² E"!A(FŸ/µ³ã<{–g2Ùs8,Ž.*2„sf‡mÀö[ Cñ2;IÕüÊd°¬äOŸÇê—•Á‘0û¯úg5ÉVþЂµêwõ–ù´ý“;ålXàŸqž9N~~~VV–@ 0›Íb±X&“Á%ø; Ã@AÅÅ6ËÙl–Á ³Z)’Ô ³™´ZéÌÌÄ£G74múy~þÅœœ;M›öiÒ¤õ–-ヂzK$ii÷òówíQpô<O,k4æ¶c±XvvvF£‘ ‰DB¼,ÇdÁ5 |>îN[!Y,Fó§O%œ²Wž5š¦år9EQƒ–ž‰Åb6›­Óé@œ"‘ˆÏç¿îÛá ßæzÐ4 ÔjõŸ’Åb‘H$b±˜ ³Ù gõÞ4MÛÙÙY­V­V‹áÆÌ…*3ü‚X 9âòå=A´jÕ•Åb1å X,‚Ãá †ÌÌ8W×àìì;ùùéÞÞ9Ož°•Êb­ö—+ÎÏÿÅÓÓÇ“R”–ÅbÓ4Íçóóòò>>Ë–-c¾Þ»ÅÇÇggg8Ðl6ÛÙÙ‘$i4ßRü …"11ñÒ¥Kƒ!444""J{ØVЬ~W4M ‚ãÇK¥ÒÎ; fQ+ŠùEQ&“‰Åb‘$ùçœç·u¡¡d³_'«Pè`µjÙl©¯oE™32ÒÛµëѤɠ v–—§öêõ ‡Ã‚¬CÐŽ%$$Lœ8ñæÍ›2™Œ¢(6›m4Ç¿zõêÚµkïܹS h4šÜÜ\…BA’ä¤I“.^¼˜ššÊçó!g`` Édò÷÷3>9c³X,Ø9Ü…L¹7«Õ ɾišNNN.//‡¤ð_xX,{{û;wjµÚ+W®èt:@°`Á‚¬¬¬‡B›¹zõêgÏžõéÓ§¢¢éKáñ–••_ýrØœ¶í ÀA¦‘HtñâŘ˜˜Aƒq8œeË–5hРG:ŽÍfà â÷™J­V«\.߸qãªU«êׯ/—ËwïÞÝ®]»={ö€Ë`µZ«~–é‰À©€0<oÏž=^^^={öƒ°©ÖÇ|°jÇùÓ®Ÿ‡‡dÒ‚'þ³Æÿ9³ÂJì¾}g“daqqNÕL™&“>8¸U@@ˆÅ¢ íôàÁEV¿~‡ãÇ×TTPAV«‰™­.4#6æ~ …$IvîÜùòåËr¹üÁƒ]»vÝ·o_Ë–-µZ­Åb0`MÓÐä:::þôÓO%%% R¡PÈçóõz=(ÓÎÎoÞ¼9sæÀ…}Z,óùü¹sçnݺÞߣGððð^½z%$$888¤¦¦6,**ªE‹‡–ËåXþ¯±x<^ff毿þzóæÍ¸¸8¥RùʤíUÀ &“ž$ Œh[Iñ¥gå˜~ýúyð¯]ûéÎ3b±“kFF"‹Å·0›››“““““óâÅ ¦ÇÅzI56‚äêÕ«7oÞœ8qbƒ †~æÌ™•+W®\¹òüùóóçÏ···/..ýôS©Tûé§ŸvéÒe×®]&“éã?†Nôáu:]jjj³fÍàZðùüÒÒÒ lÛ¶Íf_ºti̘1;wÞµkW``à!C=z$—Ë333¿ýö[ww÷mÛ¶Œ3&))I&“ݾ}ûÉ“'У4hPƒ öìÙãââ2|øp•JIÏœ93~üø&MšT_gy›FX«Õ—•••””$ù§Ã Ü·ù2@Äç Ùl¶P(b±Ø<ž@$Aù>_`µZ‚ƒë:U”““رã?¿Úûöâr<^«’’'f³Åâ0¸öàõ1®8Ô˜ú!‹Åår÷ìÙ\RR2xðàM›6ùøøðx¼›7o=z”Ïç?~Üb±ìß¿ŸÏçGDD<þ|xäÈÁtSš¦CCCÏŸ?¯ÓéÜÜÜÁW_}%‹§M›F’äÈ‘#‡ V·nݯ¾úê»ï¾+..fîf£ÑdggwæÌ™I“&ñx<Š¢"##çÍ›'“ÉBCCÕju½zõL&SÆ »téBÓtiii~~>ÔàP*•R©ÔÛÛ;???==ýóÏ?OMM={6õXºti³fÍöîÝ;vìXæ'ÀS@"‘Èår£Ñèéé©ÓéÆ]ߤ¤$±X ~ <úõë·téÒgÏž@™ùùóç7iÒ$**ÊßßÿâŋӧO÷ðð€’³50„.—Ë¡˜˜8|øp(wRíÚµKKKÇŽ !ý'Ož888”––V:íÈ_l{E"ÌY‚1…¿.4<Ølv“&M(ÊÂf³zõêåää¬×ëÒÓ3š4i’‘‘Þ¥KN¿ÿ¾gϲ׬YýãÇ?üpà±cÇš6múðáÃæÍ›&k6›¡¸8ì–$If€‘™ud4™ž<¢,KU§šÅbÁ óNè B,ÞÕÕ500pÆŒÙÙÙ=úþû ‚µk×®Œ?þîÝ»»ví:pàD¶ËÊÊ Åþýûûõë·bÅŠ©S§ªT*xv˜Íf//¯ÌÌÌŽ;šÍf³ÙܦMNçééY«V-¥RÙ²eËîÝ»÷ìÙsÞ¼yööö›6m =xð Õjýì³ÏZ´h±{÷n{{ûîÝ»ñàÁƒŒ3¦°°ðÑ£G3g΄q•JeµZù|¾““Stt´¿¿=,X0xðà>}úôìÙóúõëçÎ;}ú´——I’l6[¥R5êܹs=zô˜0a‚P(<~ü8‹ÅŠŠŠª¨¨X°`Á‡~øÉ'ŸtíÚõÈ‘#%%%Ó¦MÓh40ø4vìØ6mÚ—––vêÔI¡PØÞ7l6»°°°nݺM›6%Iöf0ºtéc•;vLKK‹‰‰quu3f ›ÍnÙ²¥££cçΟ}úœ}ú0Á!肊D¢Js¡e2ÓÃWK$NWé±DÓ´T*¥iš™“l;³šÙ9„gá³0D H$£ÑÈçóa5‡Ãa¾”¦i™LÑJ_sža¢2Èôz=ã¤Àt1˜“¨Ñh(Š‚¹åæñx0žpàÞ«Õjø 8Õ`ƒÛ#áR©”ËåšL&¡P»ÒáÁìøv¡P¨Óé ?Ré³&“I£ÑÀ°F£ùõ×_óòòEQ0å VÃèõzš¦!f4áY¦V«y<žD"3‰êýë-0ŸÏôèQvv6,f uww7›Íóbˆ[˜Íf˜<˜”ô4>>><<üùóçb±ØÝÝ]­VŸ;wî×_¯vêÔ…YcÀç 3³fDH˜¯Ïœ¨²šfPÁŒfcEEãùCw´¬¬ þ„ÙNpðx²ýF‚ ˜ÙTL$¾ÂÖfâIfc£ê"˜Ócûíðx¬Tý,XyyyYY™^¯‡g |V­V3ïŸÌf³ 3È÷ÊËü•PV¥© ÿ0Üåååééi -“Éœ­VÖ!dff²ÙlÿX­ÔàÁƒÕjõèÑ£ËË+× Q*•$IVò»ªÖh{¥r^7VQõ&¶}'óßJg¶Ûž/Û÷¼å×U¨ŒQ)ÌVõͶmß\éë^÷sªÿöW~¨h4¡mû]¯<‡Õ_2ä/F¡}||À‰³þøÃãÉoìm_¹rõêÕ+vvvÏŸçܽ› T–ß¾};99Ùd2yzzÞ¼yËßß¿°°ÐÞÞþÆëjµ*))™ ˆ¼¼¼»wïÚNDÞà 4è“O>5’xNÞ¡-¤R©D"žÎŸŽBW׆…,]»v}öìÙŸ>VOOÏË—/Ã<tÀÞ91yò÷ʘ¨ÿóíùëÌ’’Â,O­A!lRO0‡bš‚' Ä?ñ‚!Èßï¿QÀB¡ð¯¸[4MC,A¿7ÏÄ‚¸è_ì}á‰Fw#`”‚ü{ŒÙ¤ ÃKRƒŒ&©Áþë1*AÞe¸Òø-‚ 5FÀ̪bAjž€y<ž©©®¦ð‚ ÿvã¼vA#ò.Œ3%¤ gb!¶À‚ €AAÞ°ùE0‚ (à¿Tåû·RM9ÔàØ˜r°ã;QÀouEª)¦önO:$Á‹Å¯;6èðWº5+ÕhµZ­¶o€[ʼÍ=]µã+g›Ã¡þ;W’@i©TúÊ'S‚£Òµ®zÝ«n±Z­‰¤ú4Ȱ(òW&£€ŸÏ …b±X"‘( ¨FYéj±Ùì7f©®¦9ú‹-Üvéé鉉‰U#s,K.—Cy¨®d+$¨“J¼¬‘ ?Ù'”P‚öÕ'›Ífê0/KŸ@Q’ª‡š™™yÿþý·¹ïß^!‹z9ŽR©¼yó&X©¤R©TÊápŒF#T“bJ^ñx<¨öÀår9‡Ãáóù¶÷‰Õj•ËåÑÑÑIII"‘èu-X,†:t¨¸¸J¢¢P_ÇÛ®dXºtivv6Ô¡oÓ¦Í!Cø|>Ô­%^–~Öh4 µk×vtt¤( nxNÃ.0T‘`îrh9Ô"ƒjCP†Çb±ÀþmW,ƒQuçAˆD¢mÛ¶effžúè#¨Ò$“Ébcc/\¸°zõj8‡P™©_û_²d‰‹‹Ë”)S¤RéºuëÖ®]‹*ý«-0‹Åzøðannn«V­ìììÖ®]»oß>‰DÂÔé…¢{£FJII‘J¥pÁŸ–ñ,‹L&ãñxÌ“Z6³Ù,‘H ‰ƒòÓP„nhx s¹\Æ€zK"‘ê¶H$6› ‡.«P(„’ˆPôûï¿¿yóæÊ•+ÇŒ³sçÎgÏž >Ÿ_XX¸yóæŒŒ 8€ÄÄÄ DFFŽ9Š îܹS­VoÙ²%88xÅŠ¶¢âr¹Œ»ߺu .¨¨Ö¼yó©S§:88@Õ?™L<Ô.äóùAÀ™4›ÍPÐl6K¥ÒJõ%‰Ùl†ªÐ°(Î .Ar¹(“Éà% ¡h¥H$‚ o¶[ÀQ’ÉdPÝÎ'øYP,..—ˉDÄËB)))Ë—/ÿì³ÏÖ®]›••uøða¸Ê‹åâÅ‹žžž=zô˜6mÚ_|1eÊNçääÄ[3ß}÷ÝøñãíííÍf³Åbùé§ŸJKK™‡B¡øå—_¾ÿþûÒÒR“É4hÐ 6›}úôi(1‹Zýó-0¨¨^½z³gϦ(ª]»v999ÑÑÑßÿýêÕ«íììf̘áââ’íââ²zõj¡PجY³Å‹_»vÍÑÑqâĉ:t8wîÜÞ½{Õju£F&Ožìàà`6›…BaZZÚÆ_¼xáéé9iÒ¤ ìÛ·ïäÉ“f³¹S§N&LXºt)A+W®Œ_³fÍœ9süýý¿þúë{÷îyyy}õÕWM›6={öì7ß|ãèè¨V«AWkÖ¬qvv5jTEE…^¯oÒ¤IDD„¯¯¯———@ P*•µjÕâóùË–-kß¾ý³gÏ(Šâñx‡2dHëÖ­ ‚J¥z½>%%eìØ±NNNŒÍËËsww7™L<¯¢¢¢¤¤J®2n$Óud$}çÎ>}úìܹ3##C(Þ¿¿cÇŽsçÎeú„[¶l‰‹‹[±bEffæºuëÊÊÊüýý§Nêíím2™A^^Þ† ÒÒÒœœœÆ×¾}û7nlÛ¶­¸¸¸uëÖ“'O‰D›7o¾páA={ö?~üþýûïܹãìì|ëÖ­¦M›.\¸ðÈ‘#·o߆-Í›7Ÿ6mšL&Û·oßñãÇÙlöˆ#†š™™¹jÕªÂÂBOOO@  oݺuôèÑåË—Cu’$'L˜Ðºuk±X ·‹Å‰DÐmiÑ¢< e2Ùõë×åry—.]4 ‹Å’H$×®]ãr¹5Òh4vvvE8p ^½z¥¥¥àÅ‹'Nœ>|8œO³ÙÜ¥K—ŸþyÀ€8[áÏ·ÀàzñùüÔÔÔyóæ}úé§F£qøðá>>>7nÜHLLÌÎÎ>{ölHHHDD„^¯oݺuppðÆ£££§OŸîíí½dÉ’´´´… úûûGEEݽ{7::zA,kÉ’%eee6lÐëõ‡NOO?t蔱߲eK||¼··÷É“'+**®_¿ž‘‘Q§Ne˖ݼysÞ¼ygÙ²eÏŸ?_²d‰L&ëܹ³R©är¹$I¶iÓ¦aÆP›$ÉF)Š]»v3¦I“&5§NR©TÇ///çr¹yyy—.]Z¶lÙèÑ£ãããaWÇ`0€—K’$S©|ùòåƒ º{÷.¸p¢˜@èùùóç111$IæææÆÄÄÔ©S§yóæ{÷î}òä ¸‡Úºuk×®]}}}§OŸ.‘HÖ­[—}øða((%Ö¯_ÿèÑ£õë×Ëåò={öÎ;—Ãá|öÙg‡Ú¹sgJJÊñãÇnjӿÿU«V=|øP¥RAiˆï¿ÿþöíÛjµšÙrøðáÄÄĸ¸¸•+W<¸gÏžQQQOŸ>ݵk×;w ÕÌÍf³··w—.]ÀÁ6ÁÁÁ 0 %%%¿üòK÷îÝõz½H$ŠmÞ¼¹H$‚2®f³ùСC;w† Ãp*ž>}êáá! Fãõë×ãââ Lî¥K—”J¥\._»vm×®]ƒ‚‚À…!IÒßß¿¬¬¬¬¬ W­ÿù˜)¾U§y<‡ÃÉÈÈ:thãÆoÞ¼ùüùsww÷^½zååå-_¾¼S§NNNN¿þú«û¬I“&‰dÙ²e /^¼pppÈÍÍíÞ½û¶mÛnß¾˜˜Éåroݺåëë[PP ‹ïß¿îÜ9ƒÁ0zôèîݻ߽{733Ól6·jÕÊjµBU'ðÐ, EQ\.W­V[­ÖÂÂÂ'N¬]»~ \.×jµjµzøðá8·l6ÛÏÏoòäÉ·nÝ:qâ„Z­ …6lèß¿ÿ_|NAzzúÕ«WgΜٰaC¦†¸——×7¢££{ôè~÷îÝ‚‚‚¨¨¨N:¹¹¹²hÑ¢§OŸÉd²ââbçêê:qâÄâââC‡©Tªª[>|hgggzÉ™3g’““###GíäätíÚ5Š¢<==]\\ ’0S~Y.—O˜0¡U«Vaaa*•J§Ó¥¦¦4êC¡°°ðƒ>P«ÕÐå&B¥RAOÇ`0üðÃF£±¢¢âܹsV«uöìÙ111f³ù£>úæ›o„B!”J—Ëå4Mk4™L†µÅÿ|‡ëÖ­Û»wo``àÞ½{¹\n—.]nܸqúôéöíÛÛÛÛ—••AÔÑl6CdâÙ³g‰d„ ÞÞÞ«V­êÙ³ç•+W&NœxñâEhµH’œ1cÆÄ‰SRRfÍšuðàÁ¬¬¬I“&Ö®]ª×©S'88ø‡~xþüy§NL&“Åb±Z­Ïž=sssûâ‹/ø|>´TÄË:·Pø›)yÎápòòò¸\î¸qãvîÜ™››{çÎèèèììì]»v-[¶L©T®X±n”ÐÐP“ÉÔºuk’$ ´!Ї¯OQÔ¬Y³~üñǦM›ÚVë„(·\.···‡.½­°Õjµm o‹ÅâííýàÁƒ””¡P¸dÉ’#Fܽ{÷«¯¾:zô(t•u:ݘ1cæÏŸŸŸŸ¿hÑ¢µk×B{§:44´uëÖׯ_Ÿ6mšÁ`¨U«W£iº¢¢HLIqØÏ’$¹\nAAZ­3fLHHˆN§ƒ/|Žœgf£ƒƒÃ‚  ßTQQ!—Ëoܸáêêêççg2™ «|ìØ±ððpˆe2Ÿ…Kc±Xììì6mÚ´mÛ6—Y³fýðõjÕÚ²e‹Z­ž={vlllBBž={Äb1 E¡þUš è¢ìܹóÑ£Gp£´oßž$É¢¢¢Î;ÃÕµX,wîÜ1 6,,,ìÞ½{‡à9úÙgŸÕ©Sî¿;wîÀHƒÉdš4iRqqñúõëýüünß¾ýäÉ“’’’nݺ¹ººj4‹ÅÂår;tèð믿ŠÅâFÙÙÙÕ©S§¬¬lÀ€-Z´àóù;v$"::úêÕ«?±*•JxüËåò#GŽ@G.''Ç`0ðx¼ž={®^½ºk×®:u …:tðòòrqq9vì˜@ ¸råŠD"qqqqww¿téÇ»qã›Ívww‡ç‚Åb …žžžÌc‚ºf³ùÚµkÑÑÑLJƒ1™LAPe6›á^$IÜ…B±iÓ&­V»jÕªÒÒÒ &ðx¼7ÚÙÙݸqƒ¹ïgÏžýàÁƒÕ«W·lÙòÒ¥K>>>R©ôäÉ“·nÝêÑ£ÇÆ³²²4M÷îÝe2è`!I’ŒK [ gÑ´iÓ’’’Æ<˜¦é-ZÔ®]ûÊ•+×®]»zõ*4›z½þÅ‹Œ"‰Ö®][ZZºhÑ"¥R ¿ýÚµk;vWY,?}úôñãÇýû÷gœ,ø¬‹‹Kyy9ý‹/¾`±X:t6lX×®]£¢¢„BaHHȨQ£ !•ÉdܲeË™3gD"ÑW_}Õ¸qã.]ºL›6­nݺuëÖ5‹¥}ûöÇoß¾½³³³Ùlþúë¯/^þøcF3qâD>Ÿ=4«­_gµZ…B¡‡‡ÇO?ýÿcÆŒñññqvvÝÉÉ zƒnnn|>_&“ÙÛÛשSgΜ9‹/NLL6lØÖ­[ŸÿìÙ³ .Ô®]{úôéƒÁÓÓ³wïÞ%%%­ZµÒétA‚˜˜˜víÚy{{3à …A)hW.\èééI’$Ç †¨xRR’@  "IòéÓ§¾¾¾ööö°«WÞŸï§ý›fKJJÞFèð‡¾ 9˜L&­V;zôèÆ¯X±¢¼¼\ $YRRâèè(‰X,V~~>—Ëõôô4 ¨¨H«Õzxxðx0›ÍÖét%%%ÐP03+E"Q\\\«V­\]]¡?Sé‘iÛËb}º°°päÈ‘ÄËeɬ—0ÇÀć«ïÎÙ®"ˆ'¢uëÖðì€yb±˜ÃáÀ,_ÛVÑv·L©ÒO†1•¼¼<³Ù ‚ôññab¼°:êéÓ§Ó§O‡]Û§‰H$JJJ*((hÒ¤‰»»û¯¿þ;wî\ˆ}z«V­ÆŽK’¤‹‹Ë† 7n\PPPVVæäätÿþ}www__ßû÷ïs¹Üàà`˜®”“““››ëïïïææ¦ÑhrssÝÝÝÿ“ËåªTª½{÷:88Ø®cÖŽët:Û›Í^ºt©«««^¯÷ôôÔjµAAAR©T(ÚÙÙÁd âââ´´4ww÷Úµk›Íf‚ îÞ½k2™5jCİз¨¨ÈÓÓ“ÇãÁ0/‹ÅJMMuttÔh4b±æ Θ1Ãb±”••:u*###22ÒÙÙ™±===E"QzzzIIIPP££cAAN§stt¼ÿ¾›››¯¯¯J¥‚µVpö¹\nnnn§N–/_n2™t: ÒÀ"Áï¿ÿ>,,,(((//ÏÞÞþرcJ¥rìØ±ƒ¡  àäÉ“6lhÔ¨Ñܹs:´fÍš‘#G.X° oß¾"‘g cøÕ±…BáááQVVF„½½}£FH’LHH˜>}ú®]» —,Y˜žžîâât÷î]˜·4a„½{÷nÛ¶ F)×®]ëíí½`Á‚µk׺¸¸À¢P{{û… 6iÒD¡PÀ$'Æ}‰‰ÉÍÍ8p mV6›]¿~}½^/‹£¢¢¢££ÃÃáK,‰nݺ5oÞxð€Íf›ÍæÍ›7±Ù좢¢¡C‡nÞ¼ÙÃÃcÀ€{öì‘H$C‡ݱcÇž={òóósss¿þúë›7oZ­ÖV­Z%%%ñx¼-[¶Ô¯_?99™ÇãEEEíÞ½{ÇŽ€Ä»w‹Û°aC```FFŸÏßµkAQQQß|ó ŒT³X¬ÒÒÒÂÂÂ]»vÉåònݺ1ëì+**ž>}:kÖ,˜J³5 $ 8Ïp!L&SÓ¦MO:¥×ëk×®-•J"##U*N~ß`Û®¶©4aƒ±)ŠÒét0 Ÿ¢(½^o0':É£FÚ±cGnn.‹Å:yò¤¿¿ÿåË—srr6lØðÁÄÄÄx{{oذÁÉÉióæÍööö¯‚I¿'NT©T0©€iù׬Y3þü¤¤$˜€Á¬"=zt×®]{öì™™™Éåra°>e6›×¬Yãäätñâž}ûîÝ»÷Ö­[?ýôÓ'Ÿ|òã?†‡‡r¹\“Éäçççêêš’’’˜˜XZZš˜˜˜’’¢P(Áñ^±bEDD„Z­V*•#FŒhݺµB¡˜7oÞÈ‘#[µj%•J7oÞœœœ¼uëÖO?ýôÂ… ,kÏž=B¡P«ÕŽ9r÷îݱ±±õë×_·n¬ „Ž®T*ÕétZ­v÷îÝ›6m’H$‹…Çã•””˜L&'''.—{öìÙ9sæÜ¾};--mΜ9‡ª4ÂqD>Ÿïææ–••e+Ý×]G´ÿ36óú¶ úae%Û¶µ¬W¯žX,æóù!!!>>>ŽŽŽƒ!--Åb%%%}ñÅl6[¥RÉår˜å Kp×­[7xð`¥Ri0”J%4Â5¢ÿþ 6ôóóƒÎ3ãB·oß^*•šL&HpÁä¯âñx°†A&“Mœ8±¼¼¼¢¢B(~þùç[¶l9}úô AƒÂÃÃF#<;7nœ “ÉÂÃÃ>|ÈãñBBBœµZm½zõ† ïd±X°v—ÍfËd2ÈÂb±à1!nܸqëÖ-µZ——W§N±X\¿~}…B3C!S<} öé§ŸŽ1B.—GDDL›6mäÈ‘r¹œ ˜UR—ÉdÅÅÅ4M»»»C‚‘.s9Ùl¶H$ªf‚'‚ÃH¿…õ™UuÄË4Œž üf·23= CãÆ»wï˲E"LW¦(J >>***99yÆ nnn^^^ðrvvæñx°_§Ó ‰Dâàà?Íßß_.—oß¾ýþýûGŽ 'VøùùÙF°^wÑþÏØÌ+gÖ¬Yoì3Ñ,­VÛ¸qãºuëÂ*’$ÛµkÒ ‹BóæÍýüü”J¥··wëÖ­Û¶m«Óé<==?üðC‹uñâEH¿ã½ÌxiEEEpp°“““m{k{0ôªP(ÂÂÂ`Ý9¤×°··‡oqsskÚ´i‹-¤R),9îÓ§OË–-4hŸ––öñÇ0æñÁâ5³ÙÌãñœœœ>øà‹¥R©‚ƒƒëÕ«gµZU*UíÚµ›4iâééY^^N’dûöíkÕªU^^n4»wïV\\üàÁƒ   Þ½{ƒógC¥RµlÙR,_¾|¹mÛ¶ÌØXXXXffæÙ³g¥RéW_}^ƒÕjuppxúô©R©lß¾=ø ÁÁÁ¡¡¡à‡s¹ÜæÍ›ÇÇÇ_¹r%22²_¿~4MçççŸ?~ôèÑÄï'-c_ñ=é³JKKßÒ…†…„f³™I*‘H µ‰DàpJ¥RHd!•JY,´´b±|NÈ–‹Î+yÀ’$™õñ¯<È5 ‹ï@„°E£Ñ@îEFÇ ®µÅbÅwà Ã!ÙÎæ“J¥–ƒ4.ð_˜L¾ä„‹àâêõzgk …BøN …0SJ&“Á²g±X¬Ñh˜á;8u°ÂÖÖÅàóùyyyóçÏ_¹r%Dé+">ŸóÕ`ìÍÎÎnÁ‚^^^ãÆƒìèR¾3±ÞþÝÌj8¦dñ2«0“”šk¸S™·1ïa>U ÛØÌë`v[u‹í¿lŸ¶†«æg±]ßWéãÌOc~ˆí:![›yš0©´ŸJ?¹ê9aÆÎÎîôéÓiiiS§N­º–™Ô³_îܹsñâŹsçV]O‚ €‘wL S©T«.zÁfƒsÁ,3Ƴ‡~÷+ñÖÜk„üþúϱu(ªßã8Tóž·\ýónO>}þ·ÃH¯¬ëõ×{\Ïɹñßð£lç3¿‘ñŸ™³ut_·ÀÂWEAŸ¶j Ò‰Úf{bòË@> È¿óºÅŒLZJ'Yv¬¦ø¶¯_3ô–WäuGøÊ+‚üá˜)íaÛñƒaÒ¿rgÀBFCQ íüïî¤WÞúPÓ &Z3åZই‘$ÈD[ø±°skUš;«ž>}jggÉë$‰Édb"Þƒ5€Lø béz½V2¥ ƒÅbIKK³³³ƒ4WշðTƒÉ@d0 Z LD±}úüíT³^úm®¨t„U¯ÈßµPôý0tÉRSS/]ºñ^z‹Å½{÷†ñ&|eÛX1Y”˜-¶ªàf½páÂúõ뜜 Ë4SÑ˶t¥í£—Ù§í¢\âeº,&u–m)PÛ}¶©›%ɳgÏÛ´i•¸ Ï;©°ÜÜÜ @ÄÉ“'“’’|}}a>6¤¡‚™ÞaaaL”Ôûäɓ͛7/]ºÔËË«¼¼üúõë>>>0œkµZoÞ¼Éb±Zµjëx“’’N:Åãñ àããÃáp²³³üñG’$###î\¹rèСիWCM©WŠÃá¨TªóçÏÑC¬M›6‹/9r¤Ïرc,Xо}{x$½Ñ¿°uL˜:iL”Î6¶˧fΜÉçóW®\ 3UÞòŠAQ”H$züøñœ9s¾þúëvíÚAöyÂfRíéß¿Ë^ðî]hX©[XXxöìY‰D’™™)—ËårùàÁƒ¡R,š³³³áÁŠŒ¬@{b2™ ‡4ÅF£‘ÃálÚ´ÉÛÛ{æÌ™ZM¡Pî˜ C‹…I˜fgg÷4›0»Ðb±hµZ;;»O>ù$((hÁ‚………0ûŸÙÔO€ù°æaáÂ…OŸ>--- …•LOž<9qâDÿþýõz=Ô[¸paNNÎСC?žššºqãÆ„„„íÛ·gddwîÜ™)³¬­[·>ÜÏÏoÏž=¿üòKJJÊŒ3êׯOÄÍ›7<˜ššÚ©S§ððp‹Åòìٳٳg4H­VOŸ>}ß¾}æ‹/¾0`€L&[²dÉ’%K:uê¿k×®Y³f1£D•–ÂÈÙ† ¤R©‹‹‹Á`ðððhÑ¢ÌB1™L™™™P0Rva4aÚœB¡€ÂˆÌ¨<¯Á3¢iÚÞÞÖK =$»¡ÂÜRWPPªcÌê¯|;LJ…ὌŒ ½^Ïçóííí‡H$Ù^,nö' jiÓ¦MLLLyyyŸ>}"##—-[¦Ñh~þùg‹UVVæééÙ¥K—Ç?xð 00°ÿþl6{÷îÝ>>>™™™ååå ð÷÷ÏÍÍ=~üxIIIÇŽ#""öîÝ )‚KJJêׯŸžž~òäIƒÁлwo(V¦Õj!cð€ öDZcÇÜÜÜ’““;wîìãã³iÓ¦çÏŸ·jÕªgϞǎKNN.))‰ŽŽîÖ­[zzú‰'ŒFcÏž=[´hqýúõÜÜÜ~ýúÁBB³ÙܶmÛ>úè믿f~fqqq¯^½¦N [ JJJ.\X§NI“&©T*.—;f̘ììì«W¯Úv‰e2ÙÕ«W ‚///÷ððX¶lÙæÍ›™™૯¾Š‹‹ËË˃·o߆ñ[‚ ®]»–ššªP( ôÅ_‘pëÖ­¶mÛöë×oÞ¼y………0^MŸÏ‡'#S0\ƒ#FL™2Æ“JJJ¼½½ dx7*::Úh4öêÕ«Q£FPßäÞ½{pÉÄb1dð}øðaBB‡~(¶mÛ*‰îܹãää”ЪU«N:q8œÌÌÌãÇûøø@vX‰±ÿþœœœê¯|;I’'OžLIIqvv†Jˆùùù§N4häâe³Ù¶WÄjµ*•JŒuýÉ „R ¯*EQ09!:::!!R¯^½úèÑ£C† Ù±cGZZÚŒ3vîÜ) ƒƒƒoÞ¼™ššºeË–©S§r8œ† Ž7náÂ…4Mçå奥¥Õ­[w̘1NNNR©tܸqGމ‹‹ûñÇe2Yß¾}¡11{÷îÕét<¯^½z«W¯.,, ›;w®V«…LÅ:®¨¨(??ÿóÏ?‡½M˜0áûï¿7/^¼`F¡E"Q÷îÝsss™d@àòåË©©©l6û«¯¾òððX½z5,x¼}ûv­Zµ„B¡ŸŸŸƒƒCVV¸”Ìgy<^BB‚¿¿?ŸÏW«ÕÌZ ¦¬fÆ  Å•+W˜Å[-[¶Œ=wîœV«µ··¯U«–««kpppbbbAAAyyyXX˜V«õññ …OŸ> W©TR©ôöíÛ«V­6lØÀ!=L~~þãÇ•J¥——I’ .\±bE«V­Ìf3ŸÏñâÅçŸîââœásçÎ|xݺuÌSÌvĈ±‹‹‹ƒ‚‚àþƒi[¶9‰ 7:Óá$I²víÚ …¾¥qãÆžžž*•ŠÅb={ö—_~ñóóƒÎ³B¡°³³+((_—Ïç'%%]¾|9 `È!LÖ±XséÒ¥òòòQ£F}úé§vvvLe&‘HtîܹâââE‹9::>üÌ™3ðD‹ˆˆh×®tj §* íííÁ†òN@¡P,^¼8((¨S§NW¯^åóù999ß~ûmDDÄ|¸É“'Cööê¯Èˆ#Nœ8‘––Ö Aƒü166öÓO?…²téR¨ W$44T.—‡……8p`Ù²e»wïF¹þ&IR¡P¸ºº‘œœ|èСÀÀÀ’’ˆl›±D’$ÝÝÝwìØ±víÚ@áèJA«¤¤D,ïÚµ *JŠÅâ²²2‰DâååHøR“Éäââboo¯T*¯]»vóæM(ÀÁãñ`}2¬R´Ý[:u ¬<l#·¶Sµôz}—.]ºuëf6›gÍšõé§Ÿ>þ¼víÚÏŸ?Ÿ>}ú¤I“êÖ­ ‰~*ÍG%~Ÿ<¬êÎ+Å Ó®P(öïßOQÔÑ£G ÃçŸþóÏ?÷éÓG§Ó?~Ê”)“'O>xðà¸qã`·L4H§ÓõîÝ["‘4kÖŒÉÅ MzŸ>}FU^^îææ-³mʱââb‰Dœa‡3oÞ<š¦?ÿüs…B1nܸ–-[BmˆNA ëK v  ÝÝݵZmII Ž‚`;,f¾víÚ­[·ª¿"&“) €Íf—––úøø@,ΪÙl®¨¨€J)¾sçΑ‘‘ÌD.ØWƒøcïþý}WW¥RmÞ¼¹~ýú»wïöõõ…\³Ìâah222bccW®\yêÔ©GíÞ½Z°ÑÛÛ[­V?þСCãÆëÛ·/D¤Á ³íCÅ€ÔÔÔÝ»wüñÇPŠ’ \CAÛ½õîÝ›ÍfÃðLÕŸÃDÚçÎ{ëÖ-¡PXZZ m»Z­^¼xñW_}Õ§OXÄ÷ÊÁUØÈTc”c›ãްɥÿÊÏÏwvv†Ð\.×h4qqq«V­²··‡e†P|„$Ið±AEløðá¾¾¾¶!4‚ ]\\˜¡f=£íž0aB÷îÝ>ܱcÇøøxÿåË—CŸq !ÔF&Ô•ŸŸŸžžîìììëë«V«SSSU*UYY™\.OKK{›+røðáÏ?ÿ|èСðñÂÂB&Å'ÜÌ Ÿí»£Ð¯hßXÜÌÖQ„¾ üË`0ÀSV"‘tìØñÒ¥KP"Ö—ët:ð¬H’¬¨¨ptt¼wïÞÙ³gƒ‚‚D"„pµZ-t2ûöí 2ÝÜÜ añ£âåbFæýžžž-Z´Øºuë‰' ˜‹Å ŠŽŽvpp˜>}ú¯¿þ {+**Ú½{÷Å‹oܸ±téRˆÇ2;/°bÅŠÎ;_¾|¹S§NžžžŸ}öYFFFrròÍ›7)Šúðàx*ŒåÚ[HHÈÍ›7mÓq ¦: œ[H‚ fÿþýçÌ™³dɃÁP\\ܱcG‹Å’˜˜8{öl‰DòàÁƒåË—FF£Õjá´CŒ—©ôÅ<ÀÅ IR¯×ÃS Î ¨Tª¾}ûž>}š9';w%ÑÑÑiii|ð¬»0›ÍMš4‘Éd£Gvvv6 ÐeàñxË–-S©T‹¥G5jÛ¶íœ9süüü ÝÝÝÝÝÝ[´h±eË–7^È%4räÈqãÆEFFB-6›žž¾zõêU«Vñù|(Ue{E:wîìââ¢V«mÇ ÌJ •ÞÒg6›ÍµX, 6„gvll,Ç«]»vQQQHHd‡ €„o­Zµ¢(êòåË¥¥¥Íš5ƒßyòD£Ñ4iÒ„™TDQ|{:uÀ»r劗——B¡€5ŒW¯^õððh×®Z­Ž/--mÚ´ipppJJJYYYË–-m[-³Ùœ”” ƒÛ‰$!!áÞ½{uëÖ…1ÞÄÄD­V cE…††B¡  @©TÖ«W|{è&hµÚI“&­ZµÊÃÃE’’’ììì úD³³³M&¨Q,çåå]¾|™ÇãuîÜÙÞÞ–1ÆÄÄ$áêê*“É~üñÇ+W®lÚ´I¥R½r²t°ïß¿ïéééççLFã½{÷`ýpBBBpp0¸¾pNš5k^tBBÂãÇkÕªÕ¶m[ff˜@ HIIyøðaÆ ¡âäõë××®]«,ƒ‚‚`ÏåË—ÝÜÜ …ÑhlÖ¬YQQÑ•+W¼½½Á¡hÞ¼¹J¥º|ù²§§§íiÞ¼yíÚµÙlö£GRSSCCC‹ŠŠx<Þýû÷Û¶mËx7b±øîÝ»<h×®$'Ä<ï•… ¹)ÞXZ…™KQh‚ `|1XÁí-,d²ºBÊUXXY&¡éæp80t{ƒ?!g2| Þi›M¾¦%Á*EÈ· 5õ¸\®D"¡( F§`zŒ:ÂJCh~msŠD"˜«D¼\ÏEÕ 7ÇÃȆIa58 &Œdgg÷ý÷ßß½{wùòåLÂg¨åÇœkˆlA¸Ø!²¥ÓéàmÌP*¬—T*•óæÍ›9s&´læª×–g3ª‹ÅP™U"‘@^8cpNààÅb1T¢³ƒq,&õ¯T*ݶmÛ’%K.]ºùà!g›Áùçñx0Öƒgz½ÞCǶח©.ŒF#œL¸£ ÷n[K ¦”1cøX'©r ü6&~ŸÉvb ³Î®R­Û$ï¶%¼l;ŸÌ{àmLh&lcë(Vz¿mp¥šaD•Â%•†Çª®òƒΪí9aÄl»ÀÐö³¶eË–µjÕ‚¼B¶½ef‰¥mt€yí!Áûe2ÙåË—išîÚµ+¤›¬æº€fl{æÌÉa~ã+Ï?3¹ªRž}ÛåÖ?Žïß¿¿½½=³\¾”y Úf´gª2ïalæúÚNÌb®šíå°ºg;Uë$ýI©¾·/4wW¬rÄCóõNüFÛ*0[ ¯u › ]éZ¾+aü½E®^Yð~ö•Û™ðïÛï¶’[Xµ¤è»5adìÁþç¿némòBWòŸm× þíù~ˆ*åp¡ëX©íŸÈ!ÄÀøÆo³ÏjîìªEq+Å™Þx<•J~¿²|qUãŸÏ½d;N`nªUN,¨·P=LŽX˜VC°Nõ•A…jÚ«×Õ§®ÔòÀÄwˆÜ”——+ŠJ«F_·çW¾Çö[ Ö¡²J¶ý½ÌkÇ‚A¬·iH_w$ÄïËÛ@ô¢J0•'* , ý6êe³Ùß~ûí©S§H’lÒ¤ÉäÉ“]\\˜€0´i¶‘*H(g{+Ûn¥ü¶©¡ Ë„yŸ>}jµZ[´h?bĈ7öêÕ«¢¢‚ÇãÁ’íE˜lì™ xOÕª%}êêêúå—_†‡‡GEE=þ\(Þ»w/""bΜ97n|öì™H$ºwï^§N¦NÊb±Ö¬YsîÜ9±X}ú¤¥¥­[·.55µV­Z‹/>wî\ff&‡Ãùú믇zíÚµ€€€}ûö;vŒ¢¨ÈÈÈÉ“'?~üxíÚµwïÞ …³fÍjÚ´é®]»N:e±X:tè0sæÌèèè‡.Y²FV¹\îÒ¥Ky<ÞgŸ}ViˆËåÂÔ (wÌL™ ž1c¼Íh4.Z´J¨DDDètºçÏŸtèÐaäÈ‘sæÌ¹sçŽÝèÑ£ûôé³sçΛ7oBºŒyóæEEE=~üX"‘|öÙg}ûö6mZ·nÝÄb±““Sxx¸P(ìÖ­ÛÝ»w‡ BTIFƒ6ÚUíÿŸ–[}e¦j^EEE:uH’,,,ìÒ¥ËÑ£G½½½¿þúë„„„‰'r8œéÓ§—––ÇÆÆ†„„´k×nÿþýIIIJ¥’Ù²oß¾gÏžýôÓO{öì™2eJXXØ¢E‹²³³×¬Y“œœ>~ñâÅaaa غuë?þÈf³ããã >úè£ÔÔÔŸ~ú)111**jøðáS¦L9}úô7š5kÖ©S'fÇ“Ëå¶]YX`øôéÓ¡C‡Î™3ÇÖχâ/£G:tè¼yó¬VëóçÏcbbd2Y@@@FFFLLŒT*…òegΜ7nœ‡‡ÇÌ™3³³³5Í¥K—***Z·n½}ûöØØØõë×7nÜx×®]¥¥¥=zô T*•æ`ðx<˜üX)ŒG`E´__™áÍQèW³···/,,¼{÷î°aÆ 2iÒ¤ÒÒÒÇ‹Åb¨ýýá‡òx<˜ U«V-ØÂçóKKKããã]]] M&SEEÅéÓ§SRR8xðào¾ùæóÏ? uqqqpphݺ58Ã&åMž#FŒ˜:uªÅb¹sçŽD"±··ß¼yóðáÃÝÝÝiš>|øpÆ wìØ!Ú´iS»vmfbyÕpF\Ñ~«ê„Õ÷™â‰¤°°P ¸»»ÿòË/ÑÑÑ `Š0…ä¡áÒh4°ø–™ñÃlŧ´´”ËåN™2Å××Ö÷áëëëêêj0lCPðø ( "XàÕCI{X| Í©Ùl®U«Ö7ß|‡·oß¾õë×7oÞ¦é½Òý`úºF£1 àÈ‘#Йg¶“$¸fÍØ³ ¡»ÎTTÓét0õR À©àp80Ç–OUTT 0ÀËË+66vݺuþþþ7n„ùÕP³‚ÃáÀr_ÈÑY)&ý=´«é¿¡†54ÎÎÎݺuûùçŸwïÞ}îܹE‹%$$Ô«WÏßßÿ§Ÿ~º~ýúwß}'‰êÕ«Ózáæ†µ¾Pý ¶@¶ÄÐÐÐÂÂÂæÍ›GFF †°°0ŸŸþ9>>~ܸqŸ}öÜǹ¹¹>„E…V«µuëÖYYYÇŽ‹ŽŽ¾}ûvË–-™9´0¿W \ºtiúôé=zô˜1cFNNNVV–N§ËÉÉ©:í‘™ÏüXˆQÁüjÛ¸tNNΑ#G¾ûî»}ûö=þŽžMÙ²X,NNN7>{öìÕ«W¿ûî;£ÑؤIXÊ¡æeË–ýôÓOóæÍ‹ŒŒ¼}û¶V«-(((,, ÉÍÍ}úô©Ùl¾råJ½zõl×3akƒößPJ ~ùå—F£ñ›o¾¡iÚßßöìÙööö³gÏŽŠŠúòË/e2ÙâÅ‹===Åb±››Ì¿óôôäóù‚-ÞÞÞ‹å³Ï>{öìÙüùó ‚hÖ¬›Íž?þ¢E‹&L˜àìì|äȑ˗/‰DÞÞÞ}úôÚN8:‚ümãÀÄËZ ¸¸Øl6»ºº‚ªaÉQQQôašd~ÅÜø¶Ð4 kbø|>ŸÏ/,,…Àà”Étrr‰D0*S\\ «sL& M …Âââb‹ÅâêêJQ”äär¹ÐÂH¤G³Z­Lú.X‹oûsàƒon…uEŒbÁ7†`ülwéííí!±3¤ª€*’$óóó!§'ÌÜ€ Ãb±¸°°P«ÕÖ®]²Žá 0ò7 ˜ñ'aV#x†Lm.è‘2“+`6ñû5I̘z»‚^%³XÊë] £Ë¬³©ô)PŽmÊ f±»íA2喙ºÀ¶âÙ[Η$~Ÿ¤¦Rç^™'W¥SÁü@gfVäÀïâóù°Î§p ÿ+Wºƒ«ÙX)^ýJã•»zåäÊJáÙ×}×ÛÏŸ£’›ý‡ÎO¥¯®‡¨æ¬"Èß/`AþU`¼APÀ‚ €A# A0‚ (`APÀòð[f¥Dm´‰š•AlÑFmlÁ ‚  6Úh¿Kú·À•*‰VJuYÕ®úg5«îÿm¶¿ñ=ÿ0¯Lú‡>Xý)z›Ï"ï oÎJY)§,äâ`2'3o«T'éuÿªTôµÒþ«þ‹xM©XÛ-Lá<&QF¥÷T­ÁKT©ü§m«ÕÊd™fÎL¥ªÅ¯|ÖTÝ'³½š4¯¬žñÊs^éÙVxÄ*»Ä¦2Ã%n+]¡PÈãñ ‹*$‚‹ÅAèõz“ÉĈR¥ …B‚ ´Zm¥< …ÒDBÉYÛã³³³ƒ#ƒB ¶Åµ äƒ `•¶/ËÛ§@Øvvv°Å`00÷´P(„Š'UóÚ½Ò®z6lO‹@ H$°Å`0ÀnáOHÇiûì°-D^uŸÌ…1›ÍPáémÒtئ¡‡ËÁü^¹\I¹à”B6lµþS-ð[ºg\.W ¤¦¦&%%uèÐA …¬¬¬£GÒ4=dÈ???аÕj‹Å‰‰‰'Ož‹ÅÇwqqa ‰Åâ3gÎܸqÃÝÝ}èСP îBwäÈ‘û÷ïשSgðàÁ\.n80vîÜ™žžÞ¹sgHg·mÛ¶¬¬¬ˆˆˆˆˆ«ÕªV«¿ù曲²²Ö«WÏb±¨Õêí۷Öúõë 8€TTT´oßž›m©´J.³…q%lb ‚´´´sçÎq¹\ƒÁЪU«ððp½^/ sss׬Y³xñb±XÌ<&L&Hši´+aP(gÏž_ºt)yz ÃS);;ûرc$Iöëׯ~ýúz½þ‡~ÈË˃ÝvïÞÝÙÙÙö9‹¼A,PoIIÉôéÓ§M›vøða(ÕUXX8{öìÚµk;99-[¶ ²ÏAÛ›’’²pá¦M›Z,–U«VAz:«Õ*•JwîÜyðàÁˆˆˆÔÔÔ+V@¾Hš¦ÅbñÊ•+/\¸Ð¥K—¸¸¸­[·J¥R;;;Ççó—-[öèÑ£ððð­[·ÆÅÅÙÙÙ-Y²$++«S§N[·n}òä Ç›1c†Åb Z°`R©$bæÌ™°eáÂ…¥¥¥ÐY,–íÛ·óù|Ø¿½½½(“Ãá@™LF¼¬ åààe$ ä^wppppp€Jhb±øÇLJJ’Édl6rSB³œ••E’¤———\.¡¬¬lÉ’%R©”Ãá( ;;;±X,‘H øOž<ĶE˜« lÀq*•ÊéÓ§;88Ξ=ûÙ³gB¡pÿþýƒ¡V­Z)))S§N…‚r¶N5„þûy¡opРAÙÙÙ b±˜ÃáüôÓO 6üôÓO5Íõë×ssskÕªÏ÷ß9hР6mÚLœ8±¬¬L*•Z,ƒÁ™™¹`Á‚ÐÐP''§¥K—BÕ"6›­T*KKK—.]êççg6›¡aß±cG·nÝ8ΣGNž<©P(.]º”“““‘‘‘‘‘qäȹ\~ýúõÌÌLð«çÍ›GÄ•+WÒÒÒ 6lùõ×_}Ú¯_?‡sâÄ ÿ!C†X,–ÜÜܶmÛV“4³’.Ïùóç&OžLÄýû÷/]º4qâD©T:bĈºuë6¬C‡)))mÚ´Ñjµ˜@ï¿ÓW_ÜŒx™ñÜÍÍ-,,ìÅ‹®®®Æ9))©eË–E•••1õ~9ŽF£ÉÎÎnÑ¢ü ÊdÃ>-˲eËjÕªEÓô¡C‡Úµk'‹!Ð"V­ZeggG’äñãÇ;wîLÓtAA^¯wssóõõ=qâÄÙ³g•JeïÞ½ãââêÖ­+ F£^¯‰DÙÙÙµjÕ"tËårŸ?n»ŽM©Tž?þ“O>!IrïÞ½W®\iÛ¶í™3gŽ;&—Ë/^\VV6tèÐ]»vÝ»w ˆ)S¦€z—/_þèÑ#š¦gÏžíàà¶jÕ*FóâÅ‹¤¤¤¨¨¨Áƒ_¿~Ýö¾xñ"''ÇÇÇ'??ÿ›o¾±³³ÓjµAAA~~~ÉÉÉ6lH$µkמ4iÒ¹sç:vì}éÒ%6›]TTT«V-¦žñúÂVÌv6›]VV§¡’FEEhûêÕ«7nÜXµj•¿¿HHÔL'°PØ¥¸ÙÊ‹2¶Åb!I2''§C‡šR©TîîîÐxÒ4moo¡¥Ri4]\\Ølvqq18«ÐÒBFuGGǨ¨(F3aµZÍDŒ-‹\.Ÿ9s¦³³óСCµZíâÅ‹I’Ôh4|>ÿòåËÙÙÙ}ô‘‡‡GZZš§§'—ËÕëõeeeÞÞÞüå—_’““á¿<ïСCÌ___.—ûÃ?Ô«W¯^½zYYY,kÞ¼y~~~¥¥¥7nÜ`±X£G†^±B¡0›Í.\prrZ°`AgÏžmܸñùóç¡óLI’? 8p`xxø¥K—Ö¬YóÝwßÁy3›ÍYYYãÇïÕ«—N§»té’———³³sHHHãÆ×¯_ß½{÷>ú¨  àüùócÆŒñóó»~ýºR©¬¨¨0™L^^^¶¶­´Â$ †¦Þ¶†ØžmtÅbÅÅÅeff&%%Õ­[W,3Á,ÏYÓí·*/ÊØàa*•J___š¦Õj5AŽŽŽ4MçååÙÙÙ) (wPVV&är9´B®®®P‹‰3/^¼8))iݺuPÌ„ 5 ¦M›f2™–.]j0hš.//çñxQQQ~~~ß}÷݆ Î;§Óé4‡‡S3 J}üñÇgÏž-//÷÷÷wttlԨш#`‹ŸŸ_:u²³³oÞ¼9bijÙ\PP D"EQƒA&“oß¾ýôéÓׯ_/((¨S§ÎãÇ›6mJ’diiiII‰ÏÓ§OÁîÝ»¿ùæ›   ww÷É“'7lØpäÈ‘EAÅ6(ȪÓé|}}­Vkrr²ŸŸA999PwæùóçÞÞÞV«õéÓ§r¹ÜÞÞ^§ÓåææÖ­[j);::2¡{ð\ ƒÁ`€žÂ… îß¿dæAÔdl;6yòäU«V8q"''ççŸV(àœcköµÀp™Íf’$ù|>EQB¡ÃáÄÆÆ6iÒD @Ù¨s A_ýµ[·nP”€¢(™LeŠ>L„Z­†‚ƒEñùü¥K—:;;ÏŸ?Ÿ)}B„Á`HOO1b„p¡" x\.÷öíÛb±¸víÚZ­vôèÑ$IN˜0¡gÏž2™L¥R1[ºwï.—Ë×®]îééi±Xrrr$ Èé—_~5jÔ‘#GÁÚµk333¯\¹âââb±Xt:TÑjµPE±mÛ¶3fÌ€:ÉPÉiذaÍš5»sçÇsuu…áœììl‹åææFDAAAçÎU*•Édjذ¡Åb)..îÚµ+ô“åryQQ‘V«­S§Î­[· ÆZEE ¶ ‚ÌÌÌ«W¯ ›=xðàÅ‹»wïæp8ð´X,>>> çr¹ééé:t€rLEdT „ ]Ó[à·F‚°*›ÍvrrÒëõ...ÁÁÁ‹-rss+,,\¸pa||üþýûW¯^]»vm—¹sçr8ׯ_¿Ó§O_ºtiÓ¦M[·nýæ›o>þøãÅ‹———úé§Ož}zñâÅ÷ï߇r';w^°`EQ)))2™L$õíÛwîܹ$IfeeÌœ9ÓÇÇ'**ªuëÖ—.]š1cFQQÑ‚ ¾ùæ›ÌÌL¡PèààP^^ž——çããCÓ´N§;|øðˆ#JKK½½½ ‚HIIñðð% ÄÄD///&jªóööþä“O˜á"___@ÀR«Õ¶nÝúøñã“&M’ÉdZ­622R«Õ’$¹eËooo8žnݺañ´ÿ,qy£€y<^QQ‘R© ‚Ù$IÆÄÄ˜ÍæÈÈH…B‘ŸŸŸ™™Ù¢E (Ÿ{ñâE@еkWˆ0¶jÕêÉ“'*• ÜcŠ¢š5k¦V«+**š6múàÁ½^¯×ëÁclݺunn.A!!!4M߸q#++«E‹0¼)nݺ•’’Ò¶mÛÀÀ@“ɤÓéîÞ½[·nÝ€€FÇ[êÔ©Ãb±Ö¬YS·nÝþýûCŸyÒ¤I 6ôòò*))éÕ«O»uëVNNNóæÍ C:uAzzzIIÉ;wJKK×®]k2™²³³¯]»æëëÛ®];hlãââ222Ú´iS¯^½¢¢¢Ç·iÓZÔÀÀ@ƒÁššêïï/—Ëïß¿_XXؾ}û´´´   ¡P¥R™——×°aÃääd…BáîînÛ®:&µ‹m£\Yüå—_ŒFc×®] I’ÉÉÉ¥¥¥0€×¬Y3QÇô{'`FÃ0]™'(“ÉX,–F£X @'ÃáÈd2š¦5 ´f0K$15¡67”ÃÖëõb±0ð/­V ö0§J*•òx<ˆ9CF"‘ðù|èÂ% øØÌÜ f Ò¡Ç ƒÕC† Y¸paÛ¶m)Š‚Y_AH$;$IrÑ¢EuëÖuvvÞ·oßüùó›4i?jÃ, š¦áØàH¸\®H$Òét<ꆳÙlˆ–Ã9—ËÕétÌ¡PåΠh# ÂÁ–jdöº UÌaf¿Á7BÓ —Õûž ˜°™ÍüÉL*f¦Uš„\é_•&÷ÛΔ¬4ìYi¢r¥ØŒmЕ¹#™Jˆ¶Yf 3ù ª_¼x±S§N]«4µ†Ïç?þüçŸ6 ½{÷®_¿¾N§cfbUs$Ðó´=°…°™ƒm»…™ŒÁ|u¥_ñöT:í„ÍÜrâåräýðç7³X‰Z¤ê»ý0µ˜içñvAPÀÿ , (zcƒVi1‚ü{ྟ?ûêݾÍÛä‚ ‚ €A#‚F0‚ (`Aþ‡ƼÐh£]ãìß^ßω‚.4‚ (`A°Œ6ÚÖFB¤A,©á}àJíÐQAí¹Í¼¢ 5¼FŒ  A·†U^^ŽgAjj ü–µ‘ÐFmâßW [`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚¼¥€1/4Úh×8û·W\Nˆ Ø£6ÚØ#‚A,Am´ÑFAÿ© µ‘ÐF»†ÖFbUTTàc A0ˆ… È?.`LìŽ6Ú5Îf^±F öûÀ‚`m´ÑþcÅÍÐ…Ft¡A#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#‚FäíŒy¡ÑF»ÆÙ¿½ârBAAt¡ÑFí?âBc Œ èB#ò.À ‚Ô`¸Œc ºÐ‚üƒƼÐh£]ãlk#!È–J¥Â³€ ØFŒ ÈÛ ƒXh£]ãlæûÀ‚.4‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`AþYcbw´Ñ®qöo¯¸ AÐ…F]h´ÑF]hAA0‚ ÿ3°6‚` Œ È;0¦•EígX Aþ°Ôj5žÁ>0‚ (`AÞ^ÀÄBíg3¯ØFt¡A#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#‚Fä-Œ•ÐF»ÆÙ¿½ârBÁm´Ñ~-0ö¤ƒ.4‚ÔdO‚Ô\°6‚Ôd3©î©‘.´mP‹ÀXÚhÿëmæûÀRƒai4< Rƒ]hAjª€±´ Úh×8›yEA°Fm´±FƒX‚FŒ  A0‚ €A#‚F0‚ (`APÀ‚ €ä¿/`¬Ì€6Ú5ÎþíW#!¶Àh£6ÖFBä€.4‚ÔdO‚`m´Ñ~Qh­V‹1©©-0f¥Díg3¯ØF ºÐ‚.4Úh£.4‚ èB#ºÐh£ö¿Þ…ÆAjr Œ§APÀ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ÔDcVJ´Ñ®q6Y)[`´ÑFû]¶ÀØF ºÐR“]h<‚}`´ÑFû]D¡u:>Ƥ†ÂeRÝ!R#ûÀ¶-2:'h£ýï·ëó¢ 5»FŒ È?.`,­‚6Ú5Îf^±Œ Ø£6ÚØ#‚A,A#‚FŒ  APÀ‚ €A# A0‚ (`APÀòß0¦•Eíg˜VAÐ…FŒ  AÞ;c m´kœM` AÐ…Fä]ÂeÚeA°Fä0æ…Fíg3¯Ø#ºÐ‚¼ Xz½Ï‚`m´Ñþ§ûÀØ#öA#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#òÏ ÓÊ¢v³{ÅÕH‚.4‚ (`A°Œ6ÚïI[`©Á` A°Œ È»k#!¶À‚¼c^h´Ñ®q6µ‘]hAÞ%,ƒÁ€gA°Œ6ÚhÿÓ}`lûÀ‚ €A# A0‚ (`APÀ‚FŒ  APÀ‚ €A#ò–ÆÄîh£]ãìß^q9!‚  ºÐh£6ÖFBt¡ù·ƒA,ÁAw7CšÜc^h´Ñ®q6µ‘ä?Ëh4âY@šêBã)@0‚ ïBÀÄBíg3¯ØFt¡A#‚F0‚ (`APÀ‚ €Œ  A0‚ €A#‚Fä-Œ•ÐF»ÆÙ¿½ârBÁm´ÑÆÚH‚üÐ…FšìBã)@ì£6Úï" m2™ð1† èB#ò óB£v³™Wt¡]hAPÀ‚`m´±Œ ºÐ‚ €A# A0‚ (`A#‚FŒ  APÀ‚ €A#ò;cVJ´Ñ®q6Y)[`´ÑFû]¶ÀØF ºÐR“]h<‚}`´ÑF£Ð‚üQÚVÐølCí¿Í¼bAj0,’$ñ, H v¡©©ÆÒ*h£]ãlæ]hÁm´ÑÆA b! A0‚ (`APÀ‚FŒ  APÀ‚ €A#‚F0‚ ÿbcZY´Ñ®qöo¯¸œA°Fm´±FƒX‚.4Úh£ýow¡±F —¦i‹Å¼2ÊFm´ÿµ6£Yl¤Ã2›Íx¤¦±0±;Úh×8›yEAjr Œ§A°Œ öÑFí?TÜ [`Á>0‚ (`APÀ‚FŒ  A0‚ €A#‚F0‚ (`AþQcZY´Ñ®qöo¯¸ A°Fm´±FƒX‚.4Úh£ýow¡±F ÖFBm¬„ È»€EQž©©A,<RƒŒ‰ÝÑF»ÆÙ7Cì#‚.4Úh£ý§\hl¤&·Àx Œ  A0‚ €A#‚FŒ (`APÀ‚ €Œ  ATÀ˜m´kœýÛ+.'Dt¡Am´ÑÆÒ*‚.4‚ ÿv0ˆ… 5¼¶u©±w6Úÿ~û· •ÅbÁÇ‚`A\À˜Øm´kœM`m$ù€}`Á>0‚ ØFm´ÿXq3t¡]hAPÀ‚ €Œ  A0‚ (`A#‚FŒ (`APÀ‚ü£ÆÄîh£]ãìß^q5‚  ºÐh£öq¡¹o£r«ÕÊd@äûFݽU˜ÍFOAþi¬Vë5ü†˜¦i6›žžž›› BÃýÿùxÐFí¿Ûf±XV«ÕÛÛÛßß4üƒÊ­ÛîÎjµr8œØØØ'Np8 Y#ÈÿZÿþý¬V+—Ë­*uF³,«Õú60žVy'.ô›ûÀÕ´À`c Aþù ›Í~]§•Ñ,÷-÷ÅD±±—‚6ÚÿŒýVÚ|£ È¿ìÜ" Aw"`¬„6Ú5Îþ­·Œ}`AA0‚ (`A#‚FŒ  APÀ‚ €ù‹pñ HU^¹¬¯Òªøª‹þ`^£mÉ×} ¦FVÝÿMžS)äUÂx™Ê¢R2W[(Šâp8Œta ~ÕUú EQl6»¡þ¡ä(`y&“I­V»¸¸0r²X,%%%†Íf»¹¹AÆ Û–3%%¥¼¼<((ÈÞÞžii©Éd‚888ˆÅb‚ ÔjµJ¥‚¶šÍfC¶9š¦ Aþ$‹…ËåN›6mß¾}éééNNNEq¹ÜçÏŸ7iÒ„¦ig±XD"Ñ´iÓ¦L™b±X8Nzzúˆ#žÑét©©©999û÷ï'">>>;;;##C§Ó½Íq2¯„A—˜Íf«ÕzàÀ:uêÌš5+((ˆ¦iŠ¢hš~þü9‹Åºxñ"ý¹\>wî\š¦W®\Éãñ #­¨¨(>Ÿ¯ÕjAÀsæÌaö³jÕ*¡Ph±X`'±±±,«¸¸˜Ùí:`FBßÅ®X,ÖŽ;:wî}H’|üø1øäÐC†ý”——óù|«ÕJQ”Õj5™LÐÈÖª¡éêáÚæ”Å<€h¿Ï6MÓ'''çÖ­[«W¯–Ëå¡¡¡Û¶m;pàÄ™ù|þèÑ£ …ÉdÊÈȘ>}zdd$h²aÆ  ˆ0Ëd2‹URRB—Ë}öìÙõë×-KrròÊ•+—-[ÆårM&—Ëe*•ÈmÕ[Í13šåVJ©óÊX6Úh¿¶Õje³Ù{öì©[·nXXA3fÌ;vìÖ­[¥R)Œ1¢yóæE%&&îÝ»·gÏžáááU#Á¶ª“J¥§NŠ×ëõÅÅÅ«V­š9s&Ä·ªCªÞ†WœÈ ÿÔ49~üø³gÏ7n ]bµZ}îܹBŸ³K—.;v$bàÀ—.]Z²dIll¬››Û‹/ Î ¸Ù*•Цi777‚ T*ÕøñãW­Z¥ÕjëÕ«W^^þG{ßàBã•CÞs þÌåroܸ‘ššºuëV@`6›Åbñž={¶nÝ:hÐ ðm˃Éd2NGD¿~ý¾øâ‹²²2GGGø×?ü •J4hÏ.—Ëf³årùªU«>úè£1cÆøùù‘$ o¶Ôñ‡õˆÃHh£ -MÓ½zõjÔ¨mCLL A999ÅÅÅA¬Y³æöíÛñññ0Œôí·ßÒ4­Óé6ltõêÕäää 6±sçN؃££ãW_}ÅÄ«êÖ­Û©S'š¦áϳgÏñüùsxˆ¼å1ÿnÉöï?ú³+žÑF»&Úð§Z­ö÷÷?xð EQF£‘$I³Ùl2™êׯ¿mÛ6­VëçççååååååééÕ÷ë×O¡PØÙÙyxxìØ±ƒùW³fÍ–/_ÎŒ'ÇÄÄxxx$&&Â\½zÕÇÇ'??Ÿ…~KÝÁ+‹)"\Mq3´Ñ~l‹ÅBQTÕ™ŒV«•$I%b6òx<â÷uÆ‚P*•0 úÃ0×&?CÈ ÞIQ|¼¢(÷‡Žù·ò¢XvA*u*muR}·™ÃáØVðdË0ûò¯ìÿm®ßRÀÌ—‘$ €Å ü¤ûÆÑWÛhSÕ÷Ø*…EUÅVZ«øG+ÚòV¥U˜½ët:‹ÅÂçóy<ž­K@`Ù ´k¾ýææîõK ™í•Ö VÚù+5_é ¬´ÊÛ=¨T¯×‹¡lÿ¥R©ärù]ˆŒ È_çÍ-0¨úñ"‘¨ê›óòò4M%/m´Ñ&þâfoé?$©×ëíì쪶ÌÏŸ?çñxîîîK§A?пý[«YúºEµ€y<žÙl¦(ʶÝjµZ™L†§Aþ½f±X"‘¨´´´R”<77W$I$ôŸäŸçMäP*•z½^*•òx<Š¢”J%MÓµjÕÂ4‚Ôa0Ôj5Ì)“H$öööx¤ÆAš×¶¥ê 1‚ Ø#ò¿oA#‚F0‚ (`APÀ‚ €Œ È¿.¬D¤&‚3±¤&·À'OžÄ³€ ‚ ÿ¸ ýÊ"¥‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚üû`±XX.ã?~‰ÿÿÃáÀLïjʲýWuËáp˜e*ð§Åbyßæ½Ã¯æ V«õ}»7jl6û½­öbûà …mÝ9l±®]6›m±X‚èÝ»÷èÑ£×®]{íÚ56›ý>>>‹%--íèÑ£{÷î¥(ŠÅz/ÖŸÁÏtssëÚµë+aš¦Ùlö;wž}úïÁ°í°oß¾êgb=yò„Ïç×è™XÿÁ¹ÐÌBœöíÛòÉ'Û·oOHHxOæB/§ÛÙÙ………Õ©SÇl6'''ÇÅÅ™Íæ÷ð$´mÛ–Y”Vµ•~øðaNNÎ…þ7zPïíj¤×5³˜ü¿ù¨úÏßǯ‹Ê¾î4x†ÌÄ£÷ó$Tó†÷óÞ@AAAAAAAAA~Çÿ MA “z½IEND®B`‚httrack-3.49.14/html/img/android_permission.png0000644000175000017500000014041415230602340015132 ‰PNG  IHDR@µ6E ÊÀÓIDATxÚì]wxUÚ?Ón¯i7½'PB½ƒØEÅ‚m‹ŠmíuÝU×U×µë'–ÕÝuu±+"Hé„Òû½¹½ß™;óýñÊìxoBOàüž“¹3gÎÌœßyË9ç}ÂÀÀ± ð+À8³zðÀz½^j!G°N«Õ^xá…S¦L‘ò¦i„Ð|#ÔÆqœ +W®O^2gΜeË–¥§§‹-1‹;vì²eË233Åó³²²–-[VPP0ˆqzˆ‘‘‘Œ …BÇñ<LƒÇq¡PˆW\\-ë@ãÕétçž{îå—_>qâÄh¿õÖ[ÇUWWß~ûí·ÜrKCCÇq/¾ø¢”À`'¯ZµÊjµ8pÀçó{î¹ÒÝ}÷Ý~¿¿¢¢Âëõ.]º” ˆK.¹ÄçóUUUƒÁë®»Nl Ædý"„.ºè"AX–…¤,Ë ‚pÓM7E3ȬV«Ï?ÿü‹.ºè’K.)))‰&ðÊ•+Axï½÷BÓ¦M ‚ ¼üòËâ Pí¹çž+ÂØ±cBÛ·oÿùçŸBÅÅÅYYY4M‡B¡+V „þóŸÿ466"„Z[[ÿõ¯!„ž{î9»Ý.“É¢¬XcœÎ‡ÃE}ýõ×>ú(MÓÑn*Žãhš~ã7Þ~ûí?MÓ<ÏϘ1ãÎ;ïq=¸»wï^‚ Þ}÷Ýhs\Peee&L¨ªª'–ÙlF­ZµêñÇ×jµ ÃüüóÏAlܸ1!!Á`0ÄÅÅýðࢃïML`Œ3 <ÏÓ4ý׿þõ£>¢išã8)½išÞ¸qãwÞIQ”ÔÓ gN˜0aÍš5III@`7ü‡M&Óe—]ö駟Ÿâ 0Ûl6›÷ïß/Âõ×_?cÆŒG}!tÎ9çÜÿýñññ‚ PŽn¹\îõz«««ïºë®üüü[n¹…çù~€ Œqš–U$yã7îÝ»W”Ã<ÏSÕÒÒ²lÙ2Q–²wâĉëÖ­Óëõgpã¨õæ›ohµÚË/¿õç7uú‚ .øÇ?þqÝu×ÕÔÔPÕÜÜlµZá'A@ìCyùòåñññëÖ­+..öx<.—K 01Î,#„ü~ÿÒ¥KÍf³¨*û|¾¥K—Z,éì®ÈÞ~øAŒ‡ò¡ææf»ÝþÍ7ßÈårå4&I’ã¸É“'ðÁ—_~ùþó©”îíí%"&&†ã¸¤¤$·Û-Byyyvvvvvv]]]uuµÕj%I2‚À4þºgˆ"MQTkkë²eËÖ­[Çó¼L&»á†öíÛ'Õ«fEEEkÖ¬‰‰‰ñûý ÃD¸¾úµ´ÃáðÖ­[Ÿ~úi“Éä÷ûe2™T!âåääìÞ½ÛårMš4iáÂ…>ŸoÅŠÿþ÷¿ÛÚÚxàï¾ûîÍ7ßœ0aÂÃ?üꫯ‚zÿÀœwÞyãÇŸ7o^¿8&0ÆäТizÓ¦M·ß~ûÊ•+Ÿzê©?þ8‚½‚ œuÖYk×®V©T"„Ôj5Ã02™Œ¦iqZH FCQÔùçŸ/^ÿKµŠ¢^~ùeAÅAáÀàÍZ¶lÙC=4uêÔ+V¼òÊ+Ap³mÛ¶k®¹¦££ƒ ˆèõXxjãÌhËW_}õ'Ÿ|"ª ßÔjõ³Ï>›˜˜ Á¥DÄ×_½ÿ~…BAQT___SS,oD‡`>üðÃ0Sžêp8Ì0Ì'Ÿ|òÊ+¯v…æ5;ú8&0Æ‘~'ÿ¾æ4Çqp$ï0dÀbOth‡Lb T'æ0ÆG`hýÒXÜ(µŸ¥gF_çK¯‚sNÉ01r£ŒŒ ü00F(èyóæá·€1R ð[ÀÀ©ÆN, Œ‘ ¼”㔨Ї=ã°SYéà‚ à0 §˜ÀE BT˜¯î_¸“” Ì–c``œÛlA ‚À–Ï A¤K»Š#¯×!“)ÕjF­&±ÆÀ85®¨ØŸÏ²þÞÞ.‚@N§E¡P*•2§Ó-(;{tBB:ÇqR]™ P0ˆêꤤ&%Ôj/ºÆÀ85…¼! ıl ±¬!BŠ`Ћâ8I$ù+› I"A“$"IL] ŒH¯ /ôîDBýE$$d´µybc“t:}ggM3ZmBÆ û¿NÜ!Ý&zØ?ãŽîòc|Çñq0†B`ŸÏçr¹ ’^||<Ã0'ŽÀBOO Ç A€lžç8Ž„0BÈé´65ˆ‹íóµ»Ý–øøŒ¸8SeåÏCÃÈÎ>Ÿ¯)%e²´:ˆpͲ¬ô L&ƒ}ÏbÄ)É!(Yt÷‚ ¾ÇœAº,DEVA´1’phP£I’<–»‹`†$ÉP(tD‚†ÁKãyþ¨Û#“É ¥f×Iã0EQ°uñXÆÍ!IàÎÎZ„PBBê¡;jq.W·Riðx,^¯S«õØlD0ègYI2>_‡Z­#IFXðc‘$éõz­VkRR’¨6‚ÐÜÜ‹êééÊÅX'‚ ÄÅŹÝî`0(nz†-šr¹<99ùè^_8^¿~}aaavvv(ŠÎaÓÞÞ.—Ëccc!¶°ÕjeYÖd2ÁŸv»Ýív§¤¤D3Ša˜-[¶hµÚI“&A›i EQ===';;;èáœxV«µ³³“㸸¸8xG4–ÃÐÔÔÄ0LJJ ΋yr ¦ åm¢•r°%%GˆEˆÑj“yžw¹œ‰‰éqq9ííÕÁ 3##Ÿ ~Y }Åb±lß¾ýâ‹/†paFì矞:uªV«­®®ùìõz!ÏócÇŽmoow:À‚ C8Öëõ)))¬@ªÜŠÚx¿¯xÜápu£Õc¹\^SSòìâÅ‹!lBii©ËåZºt)ÈÌýû÷»ÝîÌÌLœRýŸ ·Û-]‹0¤eŠ¢::::::²³³I’,++‹‰‰IOOgY}¡X§L&;pàÀþýûF£L&«­­MLLœ3gŽô¦b ¥^Œªuuujµ²ˆŠ’ôB¬c_öªT*Pâ`Ä?N,A@™™Å<ïóûÝýÉ1Îh4étFžçââR¬Öv’$ââƤ¦¦ý¡ T K§‘DeX‘B¥¤¤,^¼¤Êwß}7gΜ„„È|‘••¼Z³f\._¸pa €Þ /Ô{‚ d2h’ ÃÀA8@M•ª¾ C´15¤½<--­¼¼" BTÞP(äp8bbbB¡ÝnÏÊÊ‚g‘ÞøL’$Ã0r¹B+•‹7íˆP(T\\\\\ ²¾¾>'''77ž4[–e#$3œÜÙÙY^^>}úôüü|„Ýnÿúë¯+++'Nœè÷ûår9\Â0 B ¦É …BbÃX–=ûì³BÁ`ž·ŽÅq´–$Ép8Œó\+•J•J‹Ššˆ‰I½>Ÿ»ßßF ž¦Iš&"¥BEÉd$Ëú  \„ô IRL#>èiYŒLSèšf³¹¦¦Æ`0455M™2%==}ÇŽèÑd2Mœ8‘¢(š¦m6Û¾}û<MÓ………¹¹¹À†çy†aÜn÷öíÛÓÒÒ €ŠàZà8Îét¦¦¦677Ëd2•JÕÙÙ™˜˜Ø××çóù †;wvuu!„²³³!ó I’çÇìééQ*•ÅÅňÐëõ–––:Š¢òòòFEQTUU•Ãá3fÌöíÛyžoiiñù|Ó¦M“ÉdmmmÁ`P§ÓMž--- –••effΜ9“eY½^¿jÕªÞÞÞ””Ñn‡`åºhõû÷ïOMM:uj0LJJêëë;pà@ZZhÐ0“É´zõêÆÆÆäädš¦A½¯¨¨ˆ‹‹›7oÇqñññ}ôQGGGLL A3gÎLNNöûýX‹>.^hÇRÏPl`Þívpœ†|žç¼^—Ý® …B~¿Ÿ¢èP( ²2™ŽçC„xŠ¢縀L¦ýá0®c$™Ñ…æ‡8Žûᇎ®[ˆV´Ïç#"%%¥¬¬¬··ÜÝäÂf³éõz’$ƒÁ`(š4iB( )Š}ûö…ÃásÎ9‡¦éˆVA˜L¦ÆÆFÈé¯T*†éééÑGÓ´Ãá bÛ¶mÀ%¯×ËqX› ÛÁÕét²¨¨hÿþýMMM&“©  @§ÓÆO Áæä8. ƒA³Ùüé§ŸÂè&‚Çãùõ’U""Z"ÌHÇ“›› …à¡ÛÛÛÁíIW*•F£ÑétÂÝAª{½Þ@ ðù矃³ã8·Û'ø|>ød˜ÃôaéÁ²ìÁƒ{(ŠâùpyùF„ÂMMåçååÁLŒ¤EEE?üðÃ×_››k³ÙÎ9çø|xc÷qôB;Nðkò}:(@Àh4F¥R™’’b±XÚÛÛaŽ:111 ƒÁ””˜ÆÒøØÍ=¯×ëóù`¢^¥RõZbÙ²eƒÜ†eÙòòrF …hšÒét‚ ÀܦÓéDeff¶´´°,k·Ûãââúúú²²² ½ÇãìŒ$IfddHe&ÌÃBñ L&ã8Nª2 qލ{ „¤ †À]„%€ƒ ΢A •HÚa¸L,‹î¨ç×xŠ¢(éqqyƒ´ñÐržÀ± Êè â h­¸´ª…5 „aqÌx‹­›½VL_8ŸJdñÚp8̲,L ±,{á…z½^±NxðPP\_ 6Í ô90ŽNÛl6·Û Ÿ ..Njg/4Ïó C;öžžž¤¤$X¡T*aìïêêJIIÌEöõYy>ìr¹ÀÏ …¤íãy>z¸I¤¦à@K £‹?Ik€†)öu‘HÒãp¾¸ †ª~ o‘âéÚɈƋvè–‹¸c¿Í¨,m•ôx„—"{Gœ3е,ËÂÜ£h³D¿ ñ‘Å ùÇ"‡Ñ1¯N=ÌXƒ‘ª—ýžÓïÉG}»*?ì]†ØŒg(çD©[&"VGi#1ŽÝ ­Óé4¨å/4hž@ «««»»ÛçóÁª`³ÙS”v»=æÕjµÙlÖét>ŸO.—÷öö†BA»ÝŽòz½‹%bzãT÷,Ëfggƒá yjAQs'v;!(]AtwwwwwÃÁÎÎ(QB»ví‚é ñBøI­Võ*+ŒÁa,N‡Ž—H;ü4ÒÌ™3;`Gx&¥Ë [‰q í.ŒÓ‡—À±±±ÇòÕÅ˧€ÀÇfú§ŒÀ˜~ÃØ:ÅÀÀÆÀÀ8%*4ö0a`Œ`ãPÀ#˜ÀxÆ&0ÄÅÀÀ‘ÆË¤00F0ÅQ p—qyØ–EÎþ"£·&â2.ãòp.ÿ’B /´ÂÀÙ*4~ #؃…%0&0V¡1001000100FÏÀ Ç+uÞ[‚q |ØNFÓ'|‰õpëè4MCΗc¤89¬[Q|·C| âiGôÒŽ=÷4Æ0"°Øi uµXŽ&*Ayí„~~š¦‡ÒÑ#r2‰Ù‰ Ø-$L‚ìG¨ñAØív›ÍÖoÒ± b{‚€Hg²,k6››ÄDÌärX¶Cúb™Lw‡ÂŸHÌT~Ø—Œy~ A Þhšv¹\•••‰‰‰4MÛív(3 Ó××W[[ ©7¡kò%ÖŠ'Ã]G(ÂÔ=e¶ÛaÏkµZ‡Ã‘àt:!¨Édr:)))$IVTTôõõ1jÔ¨´´4ã†éêêjhhA¯×3†a˜ÖÖÖ––„P|||aa¡Ç㩪ª’Éd‡C­V›L¦ŽŽŽ@ •••••Åó|ee¥Åb!bôèÑ Àóêêj—ËÔjullìž={ü~?A±±±¢Ø„ô3]&“¸NNNNKKëíímmmMOOÏË˃ì~ …¢´´ÔãñŒ3F§Óµ··oÞ¼Y¥R¹Ýî3fÔ××·µµ!„222òóóA¨¬¬loo§izÔ¨Q™™™0l‘$¹oß>·Û]RR¢T*!s$I’^¯WÔ~}>ŸÇãQ«ÕF£Ñív———Ûív½^_RR„onn®®®–Ëå&L0 íííµµµ,ËÆÄij,kµZccc«««•Jåþýû)ŠŠß·o_ww·B¡;vlBB˲2™¬§§§··wÊ”)£F‚´Ìv» ³Ù\]]âããÇG’ä®]»d2™Ëåây~ìØ±©©©.—ËãñdffƒÁŠŠ ‹Å¢V«‹‹‹e2Yii©F£±X,S§NU(˜½ÃÝ&Â`08NÇ …òóó­Vk ðûý 6›mÞ¼y£G®ªªÕf¿ß¿ÿþììì™3g:Ž––—ËUUU5vìØ)S¦tuu577ƒ‹‹›9s¦ßï?xð`IIIAAAmm-Ïó---5ƒ,ÊÎÎÖjµ©©©IIIeee<ÏÏœ9355uß¾}ÌVT ÇÏ?ÿ¼uëÖòòrxŽãdÓdYÊ¡P(@vÜ`0 ý~OOÕj·Z­ÍÍÍYYYåå凣£££ªª*++K§ÓmÛ¶Íáp€ß®ªªª¡¡!##C£Ñð<Ïó¼Z­–ËåN§Ójµ †a¬V«ÛíÖjµ ÃìÚµ Øî÷ûËÊÊ@ßT6›­ªª* îÙ³G¯×Ož<Ùl6·¶¶²,ÛÚÚ #Çq ƒáÀ---ãÇW«Õ{öì ƒ K½^/I’Z­ª¤¤dÚ´i.—kçÎ ÃŒ=º½½ýÀAX­Ö¾¾>4÷îÝ Ÿ{zzH’,//7›Í'N$I~²Z­]]]z½^TC0‘†¯!ÓÜÜÜÛÛ«T*“’’ZZZzzzhšV«Õ]]]E544pçñx\.(r}}} …"==ã¸)S¦$yðàÁ¤¤$“É$BnnnWWWbb¢J¥2™LÆh4‰äe2Y(²X,$IŠ5»ÝHTMQˆ8»Ý>mÚ4Š¢²³³[[[-KZZZ„R'Õ«¥{)‰C:]¡*ñĉSRRü~qq±Ýn÷ûý2™ÌçóuwwÆ1cÆÀìu8}}}………¹¹¹ ð½µµµ«««¦¦fÒ¤I`ÀK‡W¸»Ûí¦iz̘1 …®…B(‚×XUU-|,¸‹pR—¡tì†_].—J¥*,,¤i¾B(‚‘].—uz[Œ“¡Bó<µÛíñññáp866¶««+&&†$I½^Ïq\AAA~~>x¤xžç8Îh4z½^»Ý®P(ÊËËëêêRRRºººÀ lii´iR·­Ô z;Ôœ——5‹ü„[( •JÕÒÒ"“É@8ÄÄĈîPA8Žíz›TGü ç‹F ÕjeY6==]&“gµZ;;;ëêê¾þúk·Û ÚòÌ™3NgEE…t(1 5 <AF­V+•JŽãòòò ƒL&S*•áp¸»»»½½tÔ@ ðÓO?iµÚiÓ¦ñ<Úl6‡ÃᘘŸÏ—žž¹×u:´?>>^«Õ‚¹ÞÐаÿþ@ `2™xžollìììlmm5ࢳÛí---r¹\­V‡Ãáp8 î`0˜Ï0ŒZ­[““£Õjň1Uhè.111 d€œƒÁ`0ƒÁ‚‚‚½{÷®[·!¤ÓéRRRÀo¤Ñhòóó÷íÛÃÿ¨Q£ÔjuZZÚŽ;@8äååùý~ð‚€ÓKœ5Q(Ç5jÏž=P³^¯Ù•””TWW§ÑhJJJvïÞ½yóæP(4f̵Z-Î^Êårh ¨ÄJ¥RôÐFü):–Áù ¢ Nà8.33³¯¯ï§Ÿ~2 z½Þï÷çææZ­Ö={ö€wÍ`0€v3~üøšššÞÞ^p¹ò¢Ñhbcce2™Z­Öëõ2™L¡P$9yòä}ûömذ¿ &0 ã÷ûiš†)4š¦ý~?˲*•Š¢(Žã aEA«€l!ŸÏG’¤ØHqŸçyh*ü·P'I’Á`pýúõééécÆŒ ƒâiÒôÎ`¨T*–e¥x8¶é p´L–®ÑýV¤®Ô¦ˆgB/'{І)í‚bÍ¿ÒþIh³/¢ᯒZÅÞ¬z óÅ)"©¶Ñ€ÂFßKú«X³´Ñw u%ˆ–¿ôõF´A:@H‡Ý蟤u ×­[—’’2eÊ”`0(ÞEj×D7r ×ˆ12<¬ ]Q4ân1”š:gˆ­ê÷4é²*X¥#º OÉÆ86ðp‡N|ß:q·JÍ3ÄVõ{štÙ©Ñhì©zÃg.1Ž¢Eƒ1²€}XÀbc```c```c``c```c```c```c``c```c``+†º”²ß;'Ãs=}DdV4À>§ˆÍ˜â†øˆÚðŠ(ŒB`ˆEŠ…ªMó'‡QâÞ=ˆÝé{3†^!ìË£ÛÀ>a–eáu‰¯âx@„1P+ìõ•r[ˆ¶‡¢v_c`=I’ìîî¶Ùlðglllbbb8Þ³gϨQ£ z„ ‰Øþ:Ä#ÑÒža˜²²2ƒÁ‘‘1.!îŒx‚L&+//×h4¹¹¹Ó`ðpvÑG"‡KKKǧV«¥»s¢[K’¤Óé´ÙlYYYÀF«Õê÷ûÓÓÓ{zz,‹XaFF†Óé”Éd‰‰‰ñ ±±Ñd2uuuqa® z6„¼Éd555<ÏÃ{éîÜ览–áGúÔƒ|5ŒoÖú¦¦&»Ý®R©h𮍍¨¯¯ckÀnoˆ_#Æ‚‚€Ì“EdZ¿GÄáâí¤×BxZ+ÆÜh/r¹v¥Ã pSimÒ3ňó ÃDÜN …B¥¥¥Y¢±B >éHqEQgçÎ)Îb±477Ëåòööv³Ù Ay†ˆ{÷î  …¢ªªª§§Ó¨Tªööö¾¾>x·" Þ­B¡/ §uÒ4]ZZ …´ZmoooUUlè=Ч†W W‰ù.0Nš¢(“ÉTPPÀó|lllYYYNNާßív766BÄfN‡êèèèîîV*•999@ƒææf³Ù¬Óé²³³!ÎK]]ÃáHJJJMM¡ ½ª§§§³³S&“åääK! Ä¡(ª¯¯¯­­$ÉìììØØXøU&“555Aô9^AÓ4Ä£FeffÆÄĸ\.«ÕJ’dOOÉdJKKƒØ=>Ÿ¯¶¶ÖjµÖÔÔ¤§§3 c6› ý ýF· ×ëkkkcbbôz½È1‚ ’““'L˜`ˆÉÊÊêêꪮ®†ÂYgÅ0L~~¾R©t8:nìØ±æÈCQÖv»Ý999F£Ñf³¹\®ÔÔT„Pkk«N§³X,}}} n·Òe…@ YËÄÓb±€ØÜ¹s'Çq0JÂpÖØØèt:5 MÓ ¥ Ã0æHŸ"]ñ<¿k×®p8l2™***ÚÛÛ±>}$0ðR+@ÌþÑ£G‹‘A&&&"„!v4D±3‹z*BH£ÑL™2b…›Íæ’’½^ÓÒÒ’žžý¾¹¹9;;;///55µ¾¾Ü?¢Ë0 D‡/((…B í›››g̘ 4µßd2;!äv»›šš233AÖA–3‡Ã™Ù EZZZOOOFF¤53fLrr²Ïç³Ûí.—«··wÒ¤I­E‡‚9Ž7îûᅦ€¬ÀaŠ¢ÌfóÁƒC¡F£;v,„h7 ---iiiÒ`è×!æÇ%''=šã8È„/ªÐ ä§§×ÔÔ$''›L&‡ÃÁ²lFFÆO?ýtDOÝÝÝ““ÓØØˆ*))‘´±±1-- Óã4!0[­Vk2™8Ž+,,Ôh4Ð!Â8˲UUUápX­Vk4¯×[^^n0@Uƒ€¯I!4~üx¨òå'ÖÆqœJ¥‚8ŒcÇŽ™/ÕB¡PLL È«ÂÂBÐ ,‹R©”FÏCƒÁøøxH}¤ÕjN§;^ Ý&Ö … ¯Š“d#EQ0úD´V|30ŠUUU%&&Š!ûRRR&Nœ£I8µÜjµÆÄÄTUU‰? î; ‚ @ÀJ`¯4 ´9 A¤Èp8 A°¢ŸZô„G?u(òù|j€¼08Ûài¥BCž®¬¬¬ôôt -Ê ¹\®T*çÎ;oÞ¼’’’øøøªª*“É´`Á‚ÜÜ\GMMM‰‰‰^xaVV–è5™0aÂÂ… §OŸÉÁ Ë* ‡Ã²²²@ MM –0‹W(û÷ï‡<£cƌٱc‡¤!¤V«ûúúÀ1ùA¢©D‚TKÏìðˆÖJ}Ñ6%..®¶¶Všñb²ŠSJåååééé3gÎdD¬bYü‚.—K­VÃ@®)iôOÑwHQÄd·Z­ÑO-ä¥þ9Nçp8@K²Z­2™,"Õ#ÆÈvbA†ø~!Ôk0ÌÌÌlkkÛ¼y³˜±Žƒîc|8Þ¶mØÀñññƒ!55uëÖ­©©©½½½éééV+çååíÙ³â$Bn!H¼Z%˲999Û¶mƒä§  òîA²¥Ý»wO›6 NÎÍÍݱcÇÎ;Á±\RRât:Eá –EýB¡P„B¡ýû÷çææBæxjj’’ÑZÑëb™eÙÂÂÂŽŽqÖ§££¤"˲yyy===‚ @Š‰Ñ£GïÝ»wÁ‚bhåèhrAtwwïÝ»×årÑ4 ªD0ܹs'¤È@‡Ò/VTTLš4I§ÓÕÖÖVVVæççoß¾žÚçóö©ÁOQXXØÖÖ¶}ûv½^ßÙÙ9qâDœ-eD`Hae¡Ç€Dú]m6›V«…NÐÙÙ …’’’4 B¨§§Çår%&&²,«ÕjÁúêëëÓh4ÉÉÉPgoo¯Ýn7 P-¸Ž=OWW—B¡HMM%IÒf³Éd2•JÕ××)Hü~gg'EQiiiïrL³,Û×× Òƒ¢¨`0ØÑÑJMM•Ëå@ÀãñÆè'"I²¯¯Ïår¥§§;ÈŸàv»Y–…¬k===‡CÚZpäÈç™ÐY–‹‹s8n·[@çW*•âÜroo¯Á`€©2‡ÃAQ$(_¸ËåB¹\®`0˜žžK>àÍèt:Èí V«Ýnwwwwjj*LG ‚‘‘"žòÂA6š¦£Ÿ:33@ ””¤Õjq˜»Ó‡À0ØKSý"¾iBø‹“´¢´„„} é‰ÙÀï%]·é¤ë@С,Õbþ.ñÖâíÄLÓp;1ò;\(ÊO$IÀ g‚Z ·‹~"h3øÆÄ‰¹ˆúm-(#¢4χ‰€ôRÃ’’‹3FÑïVÌ]oUTË!×6Ì“ÁÑ4 'À“ŠsæC|jH 'N¤“$ÉqfïéFà¡xªÑk›¤~N¿Ç J.5S¨aâñ!z=bNƒ6ѹ©tÑ¥øì˳¢ËC.¼~säÙÀbo8l?¼,¦ ŠèRÔK?Þï9ýf÷è·må=9¢ö ±©lð÷6x›û£_QDÑÛ'†ò\ƒäˆÁåaU9KAr: Œ9½œ@:¢ã2.ãò0,‹ÿã ý#X…ÆÀÉ*4~ØÆe\ÆåS`Ó£ÃMäà2.ãò)/‹œ%afIü_ºÙ—q—‡gYüÛÀ#tôÊ!¬¨à2.ÿò/óÀX…Æe\¹*ôñ”ÀýnW‰e)ðHËg„Ž??âÂá6ÂÁ¾Â¡Œ‚âA,pyäI`±º_6F %nsèq7¬xß~Ï|«àawä /~ Í‰â¯V«U¡P(•Ê~3¤Hß#ì7–F`Å’—Oª¢³«_a éN Ž¡\.ïíííèè€ÈŒAÈd2ˆ}ÂÖsnµµµÇED]‚àãxM<QT)Š‚ŸÄC4!Á÷ÐKÂqhªª…D&“A¼Š¢Z[[ív;ü ?Iù ÏÕ²,[[[+dÇÀ8É &L˜0öB†i€Hš¦@WW˲:Îï÷ClôØØX™LÆó|WW—ÇãQ«Õð! ¹Ýî@ à÷û+**”J¥F£‘ò ‚6B|fˆ; Âá°×ë…¸“"E»»»Å@Š8æóù`˜ƒ@@Ì«àóùxž7›Í@n8Žƒd1*•ÊápôööB„dŽãôz½F£ªl6ÜZn ZDjooohh0 ÷'ŒáH`È–ÐÒÒb0Ĉ.—«´´4755ù|>š¦ÛÛÛY–U©TJ¥ò矅BÐ8##Ãl6oß¾ÝápÈd2‡Ãáp8 R”\.®îÞ½Ûb±ƒAH–Édííí»wïæ8®···½½=--M„Ý»w»\.‹Åb·ÛM&ÓöíÛM&“B¡Ø¸q#Ã0)))¥¥¥Û‰eY†aJKK›››yž?xð` HOO¯­­-++s¹\ñññf³ùÀ¡úúz¹\¿cÇ‚ ’’’*++›ššB¡Pcccbb"Ã0;wî„öwtt †ÖÖV¿ßŠ Œ“†!õ9AªªªöìÙbJL€‡gΜ9oÞ<’$SRRRRRâããGåóùrss§NZRRáÝ úìœ9srss ”J娱cµZ­8:!!aúôéS¦L€o¢z ±¦'OžŸO£ÑxöÙg+•Êêêê’’’™3gŽ3¦ªª lxš¦!AÉÔ©SçΫV«ÛÚÚº»»ƒÁàìÙ³gÏž ‘¨Æ/—Ë‹ŠŠ"4 Œ“z(ì%"33S©TBøE³–••år¹¾û˜˜Ñ£GOÄ8¬‹å§Ÿ~]ìg…BF#p³!H “ÉvìØ¡P(@ IE²øÂìóù6oÞ,Ƶ·Ûí@ 77×ãñtwwÓ4 aåEÃjÖh4 …Âãñ¡V«!J£B¡0 .—+..Ž Èl! Ãápyy9Ïó^¯W«ÕÚíö¸¸8„ßï‡àµ}}}¡P($5¹10†A æäääææB9qhˆ¾µØr< Œ1ò$ðˆyHIPì¡Xû f£³{ 1ưsbhD¯Ü.ˆÎT£ä";¢úèÖÇ¥ýRà ƒ˜À‡ïXÑ{&¢w ¾w§ß]JÒ#Ѩþ¡¨’ˆ‰3g@ ¼¼\ºUÀ0Lkkkee¥˜*w]]]ÝÁƒá§ègï·q÷ˆú‡ò  …vîÜ)M°Œmà_1ö¥ ¤¨|ŠN8BXÅr¹®OÒ ŠU±, ›Dgx¿ÄI)˜ƒQ#µ±‘džYLíÑéÌ–´Uâ9à6knn¶X,Ó¦M °àY±r°·Y–õûýÒLbàσäÆbäw·1ASÁÞW›Ã;·vIë—Þz '÷„À"pÜË1™¼…ÿEöÚíöææf„PVVVll,¬O4Mççç³,K’$,¶Ûír¹¼ººÚét&&&¦¥¥Áƽ––’$³³³cbbZZZ”Je||¼ÏçkjjÊÎÎîêêâ8ÎétBšl›ÍÖÓÓŸ™™ ”®©©ñz½iiiIIIbRL’$-‹F£ÉÍÍ…µà÷nnn&Âl6ëtºÜÜ\ dmm­Ýn7 ÙÙÙEµµµ±,ëv»›››=OCCCBB0¶+õôô(Šœœ`µtÿ0$ nhhP«Õ~¿_«ÕB«àÙãâârrrÜn·ÙlÎÈÈ@ÁòoFÓÖÖ¦T*B^¯×çó¹Ýîìì줤$th A„<É999PmÄ“ÑÔÔd±X`á:6ÚÏtäIuuõÆN§¸ÿÎétîÞ½[¯×ëõú]»vÁRä}ûöù|>˜_… ›ššêëëu:Ã0eeeÐ)<ØÝÝJKKM&“Z­Þ¶m˲‹E&“ƒÁúúzH9]SS 7mÚär¹RRRêêê:::†Ù³gO8ÎÈȨªª²X,°±‘a˜ººº¶¶¶üü|ÇSQQ!.®¡²²Òl6§¦¦¶··WUU)•Êôõõåçç÷ööÖÔÔÀŒtCCä.‡ÝQ&TTT$ÙÖÖV__Ÿ““‡÷íÛ±i™$É`0¸k×.™L¦V«ív;ìµÚ·oŸÕjÍÈÈhkk«¬¬T(õõõÁ`0 íÙ³Çl6ƒ¾‡-KYYÌ—––ŠJ;Ã0•••ííí}}}ûöíƒJÄ'-//W*•MMMuuuÉÉÉ|øL—ÀÐ{Ìfsww·Ç㉉‰™™˜˜8fÌ„ËåjjjÊÌÌ4 “'OF’I#’$ »ººz{{KJJÔjµÑhlmm5 °+877×d2î „¨‘——ë«Gm4­V«Ûí¶ÙlN§³  @¡Ph4šÖÖVÂÇ@æy^¯×wuuI×9*Š‚‚‚„„P|>_^^Ìëõz§Ó ë. aé¨Ãá`Y699Dn8NHHÐëõP¹Ùl–ªî@³¶¶6XƒIÓ4,–v:6›máÂ…jµZ­VÿüóÏF£veÅÅŹ\.—ËE„ÉdÉ\PPàr¹º»»ý~?L†{½ÞîîîÙ³gÇÄÄÄÄÄlذ¡¯¯/33S|ÒÎÎNŽãÚÛÛ óòò`£^"†Uh„š0aBVVÌŽŠk¡ãããBH«Õ:Ñw‚¢²xƒA˜Pmmm7&&F§ÓM›6­®®®ªª*%%%..NÔÏ¥®˜Œ …B°#À¶{¸Qcc#P(66xHQ”Ó鬯¯‹‹ƒÂè×3I°ÁX´Hûúúš››<¸©Ú Vh8†{·Ýn÷ŒF£8A`0ûŠEC=ÈårŠ¢<\.§i: ‰+,,ìèèèèè™à <²X?ÌcÃ"6Ç6Çq@ ººž”¦i°¥U*•ÏçE7îågºÖ ƒ}(vFÓ××'—Ëår9Ø`„R]_¡P$YTTtöÙgO:5''§§§ÇçósÎ9sçÎmhh°Z­C¡Pˆ‰çÊù§‘$9yòä… N:599YÜhQSS“=oÞ¼ôôô~·FhµZ—Ë[ö«««ÇŽ;{öìÄÄD1’¤É¶@ EÕÖÖšL¦³Î:+''GH­4Óé„-P0¦¨Õê@ àóù@ȇÃa™LßÛÛëõz“““•Je}}½Éd’V(}j e8v»Ýz½ÔcFSUU%>)x†±Ùlo` !㌓ÀÒ¥KàÍÍÍݱcÇöíÛB~¿òäÉÐ5û½çy­V›––¶uëÖ”””ÞÞÞìì츸¸={öôõõ¡ÕjU*UBBBee%ÄÊ€ aí$Côló< …ââââââ6mÚd2™z{{G•’’ HJJª««s8 ⤭3¸³³³µµuôèÑ Ã˜L¦ŠŠŠ®®®®®.¥R ëÉ€HÐìššššš£Ñò-99¹¾¾~ãÆ°¸(*®ÊdY6))©¥¥å§Ÿ~2 ===YYYZ­6##c×®]IIIùùùEiµZ’$µZ­L&‹­¯¯å!âíq'—Ësss÷íÛg6›»ºº2335MBB‚ø¤pÚ¨Q£öîÝë÷û}>Ÿt=Æi‰£\‰r ÜN¡””¹\<Ñh”Š_Øp B•¢¨ÞÞ^»ÝG’¤ßïïìì$j@™ÍfpÕ ‚`0Ün7EQ†eY§Ói4!BH§Ó!„º»»Ýnw\\ì”ή®.¿ßo2™`2ÌE±,»}ûv9 ÕjM&¯££¶ƒÁ˜˜i› ‚èêêB%&&Úív£ÑÁ \.Wbbb(ÒëõÁ`eYƒÁ ww{{;Ã0:†'p}ÃŽbÐöAÕ—ÉdJ¥’ã8­$IŠO‡áŽ@€eYøÕjµöõõF1bØÉâ“Êd2›Íf6›a{³F£‰ˆ=† ŒDƒBgÀBر¬´nQŠ‚› f}Ò°@œÃ„‰_àì"ù&­\<³©°Û!BøÃ\.ØRñ¸qãÆÙ³gÇÆÆƒAñ’ˆ“¥m†_¡…`dJ WÁè m4 *«‚Iop³.#½¼}ÄÚàŽâðÿƒ/@tžE4^™*´ôÉAˆ.c`ŒDôáS¢BÓ'óAŸYÊXA01Fi#úvD??9í¡¥tŠhÄq/÷ûðp$ú'ñ-ˆ'à2.ŸÂò@D;ªØ‡¥ùÄq þ?•N¬ˆ·#•ÏÃVUŽ`ì@®œ“$O¤̄‰¨¢_&3Æp€Øu ‚ày~ þ9¸è>Q>9˜tôˆ¥<Ïáóù"}ÄƂ (Š~Ųø?Ïó$Iž4]’–оgED³WÔã¥÷ ³fÍZ¸p!Ã0˜ÃʽÇ­[·nÛ¶mJ¥z2I’"±¡íÄ:Aœ9{’¼Ð£C¿Fo8V©T¿ÿýïµZ-î1é©©ååå¡Pˆ¢(±Ÿd¹Xú´~¼ÊRñ­Hó|2–RJŸ-Z­$Àcø3y ñ‹¢V=œ„ö 9¤í;¾åˆ«_Æbc G _9|¢9%þòlàè™^Ñ/ÝD Œá/„QÔ:Â,Õg“§êÉûØpçÀìðÝœB—ÍÉ#ð K¬ú]8Š1ü9|Ê;-y’»_sScÄÙÀä=§>&V´cÄÉáS%qP; ŒãÀÛS%{ÈSõ ¢u,~1F‡‡‰Ý‡%0Æ&0&0Ʀ?ЧћEý¾Z‚@Ä©ûÒ§v¯Ù)ìåÒ­v˜À‡/ r`¢ :¡)#„`¨dà8±ÑƒÃá0ì#—n%‡ƒÐ’p8þ„ó!þI¿¿J+<:`êbÉxI w@°zRÒm„8¥Iý ÃO¤Û»ÅƒN§“eÙ¸¸8„P__Ã0z½þ¸ßtƒ4=ØÇ=v–»Ýîóùôz½F£ÁÃ>¼ìÝXͽ´&è "‚øŸ"M(À ãR©ç®R蔜) ¢áü£Ð ‚Ø´i“Óé¼øâ‹E1HQÔÓO?]VV¶~ýz„ÐÕW_]TTôüóÏÃOÇåÁ׬YÓÒÒ2cÆŒ &@&Çóå—_úýþË/¿Üår­_¿^¡P‚ Še’$ý~ÿøñã†Ù»w¯R©äy5EQbH£Q£FA…Gó9xž$ÉG}ô¿ÿýï_ÿú×[o½•ã¸Á‡Œ3—À‚€HyƒÂ«kC}A#'xኴ %Cìk ?ðQàÙe £š±Ü¯ ’œ8Bö"„À=÷ÜÓÑÑ1eÊ”ääd1j¡ßï÷z½Pöz½~¿?BåUVÛ@$1ÌP]Œ“&*Æâ¨ñÊ+¯¬[·î™gž™0aB8&IÒjµ>øàƒ‹eÞ¼y7Þx£L&ãy^«Õ½A…BøÃt:Ý3Ï<#“É‚P«Õ‚ ¸ÝnŠ¢‚Á૯¾š““ÃqœL&›íÛ&¶Yl[Ä>3¿ßïr¹B¡œÀqhX¯Æî6¯à jÁ ýÈg½Š8ÐÁßú¾?AK„£Œa!^@qýŸ¯¤¤äöÛoå8î™gž™5kÖüùóB===o¼ñÆí·ßn2™B7nܾ}û#<”Å8H6`Hïp8Ìó| ;vìþð ó{ï½çóù–,Y2yòd±ñ“&MB•——¯\¹R§Ó-_¾\¥R!„¬VëŠ+RRRÆ÷öÛo_~ùå_|qooï|PVVFÓôôéÓ¯»î:µZ Úò¶mÛV¯^m6›“’’–-[ÕÂórGDCCÃ|àõz—-[6yòä£V·‹Év„R¿ô`¿}f )‰£SOè£foš½èP(¬p8 ÖÚ‰°“e4’Ó¾ µu9„–>~l*ÅM‘áÓÓÓ³uëÖ?ü°  à™gž)--2eÊ ÃMÓÏ=÷ܳÏ>{à 7$&&~ôÑGß~ûí·ß~k2™¶lÙR^^^¿~ý_þò—‚‚‚«¯¾!ôÆox½^÷'å0A,ËP(Ä0ŒÏç“ö’`0È0ŒÝn‡QÃívç†A±,KÓ´Ëå‚“ív»\.¡µµõµ×^3¡ŽŽŽ¢¢"‹ÅrÖYgÕÖÖæååy<ž?þxóæÍï¿ÿ¾R©üꫯn¼ñÆ@  ×ëÇ'Ÿ|Ãtq•Jå÷û—/_¾eË–K/½4??úýH6ÙðÀÿGsXjb >úK¯=ºMÅäQ³ì"Žã8Žîq‡Àþ¡P( ±Cɳ–ùÿ…yDõ'œˆÙÏ>ûL¥RMž<Ùd2þûßÿdäFÕÔÔüõ¯}å•Wþþ÷¿ßÿý[·níëë{þùçBW]uUUUpãÆ©©©?þø#Ø“µµµ×\sX‰Ø­VûÏþsæÌ™sçÎ9sæå—_β¬Ø«hš–ªîRÍ–$Ɉ_¡LÓ´L&KLL$IrÖ¬Y¯½öÚ’%K6oÞ ï¾ûîššš;wæçç¯_¿¾ºº:?óÌ3ðÿŽ;~øáŽŽŽ§žz zhÛ¶mK–,ùè£ôzýi0½ýYìØý\Úá£û<×@hõ¦Ú£”ÀÀ^žçe2EQC—À pAX–U*•§ê雃§þïÿ{Ýu×A ë;î¸cÅŠ.—«ß¸Öð¼ëÖ­‹‰‰¹ì²ËÂá0˲jµzÙ²ekÖ¬A-X°à±Ç«««ËÉÉ©¨¨xúé§_xá¯×ÛÔÔär¹fÏžm ƒ9 Þ&‚ À vì¯" ªTªW^y%!!!4jÔ¨K.¹¤¼¼|ÕªU^¯nÇq\cccSSSjjêµ×^k0n¿ýv™Lf0Dýƒ>èéé)))yçwärùHWža`R( Å… }çypõ‰ÃîI"0( èÎ=1‚†gè‹eeeÕÕÕcÆŒùÛßþ†²Ûíf³ù‡~¸üòËô·ÙlF£Q¡P€&Ìó|RR’ßïƒYYYiii¥¥¥½½½ …âšk®yùå—wîÜÙÑÑ‘–––™™á1¢(Êív?üðÃwÞy'¨Ð‹-::?BÄ÷¥i¼ÇAôõõÝvÛm6l0Æï÷ƒ0w8Á`P§ÓQ‡ Ã>(j$IZ,–p8ìóùG||üéá4"A$ªY, ½'Ó4 ‚ša˜¡(ÞÇA…–r¦Î@×<õÇl0¬Vë–-[¶lÙR[[›‘‘ñÉ'Ÿ r¡Á`p:¡P,’$ûúú”J%0sþüù7nüüóÏçÌ™CQÔœ9s¾üòË­[·Î;WTÚ£š¦år9Ã0ÇÑß :¨Ùo¾ùæçŸB¸¬¬,))‰eYAt:L&óx<ÐŒp8¼sçν{÷Ÿ@ 77÷œsÎill|à8Ž;]wŒãîB ÑQ¿òè>í™ì¸Å5|ñÅ·ÜrËêÕ«¿ûî»ï¾ûî‹/¾xúé§7oÞÜØØ(²Kja‚žl±X¾ûî;Š¢ ˲«V­š?>8–.¸à‚={öüôÓO—\r Bè²Ë.Û´iÓŽ;.¸à‚hý ¨‹Mà û=s ¥X*="µBíííJ¥2))I¯×ïÛ·Ïn·«TªP(”“““žžÞÑÑñé§ŸZ­Öwß}wþüù÷Üs–@ pùå—¿ýöÛùùù›6mz÷Ýw)Š:víà´— 'œÀÒøôg拆^øÉ'Ÿ´µµ-]ºTMð,X°@.—¿ñÆ!Çãp8à‡ÃÞ©¢¢¢»îºkùòåO<ñÄÛo¿½`ÁŠ¢xàx™%%%‚ ¨TªââbA¦L™B’$˲%%%ѰÓéôx<~¿_ÔÙxž·Ûí}}}0½$v 8دƒeÙ¾¾>»Ý.R‹ã8›Í¾k8²hÑ"š¦ßy碢¢‹/¾¸¯¯Ïb±´··3 sï½÷rwß}÷M›6íÁÔjµ÷Þ{/¡Z­¾ë®»´Z-Ã0°ê®»îòûý°Z#B„^pÁ)))ÅÅÅ"·5͵×^ëõzÁà„ó•JåUW]e·ÛSRRPTꤤ¤o¼Q§Ó©Õj8ûûßÿ^©Tžç—.]ŠZ½zµÇãy衇¼^ïöíÛÁQwÍ5×ÄÅÅ­ZµÊl6ŸuÖY×^{í¬Y³BçœsŽ8 ]vÙeíííUUU•••3fÌÀ‹±Žsoüýï¤Cx°B¡ACÏ$í+ˆpϲ¬F£yíµ×`qßP¾4,ºè°ñ׿íçÂG¿åˆ PˆCoüN1.:–mGçϹ‰ ¢[~º&µ‚çòz½·ß~»Çã9:/t¿ÂÀív‹³9G±Œ>ÂŽN ’åLS¤£EÂ\˜Ò¤ëœÅ?Aé•ï÷L4ÀÆ£¶¢¨…âf†è^ñôÑG"Œ-b»ôû,ààÛÖoS1"ÄØÉP¡±þü?çÁ}Qºp"ú`´sk Ë:aðŸ†~Pê²üÈ,ý)‚«ÇkƱ:±¢³ #ù‹$„ãsƒ8•XÇQõµ'i7 ÉÑKaÈ1ªXr† ˆ$E¢£~\)dG0€†,*« yJµßˆŽ—Þ.UM¥ÇˆÞàcoa¿z;Æ‘ªÐGGcúXî ÆÏà7'íöíÛ­Vëœ9s´Z-LrÀñ={ötwwOŸ>=!!aýúõ ÃÀŒèÐÅ&/ x-qÖú“¬œAü‘¿‚@A3ŽÎŽ'…!{°"(­yž{o(ïPFXJqä¨[uìrÄþgŒ“$‡8faµZ{zz<8yòd–e¡»»Ý*žçaeOrr2Ĉ8Rú=¸X>!ƒê°ñGê@& (^KœWÄÐÔhÑ ‹%===55!ä÷û8 ÓéF ”¨®®öxÇÄÄhµÚ#&0ÔO¢ó‹ŽCʬxï½÷ž}öÙ[n¹åÍ7ßDÁ޹1cÆlÚ´I£Ñ˜Íæ¥K—šÍæï¿ÿ>66VtÞ‚À„‚ÅbÙ¹s§N§7BK¬xP\d‹zá…>þøãÞÞÞÿþ÷¿‡cíÚµÇþù111¢+XzUÄö®]»öücMMM ËåYYYü㯼òJq¯¢¸BVÚÑÌ‘*_$I655Ýwß},ËΘ1cîܹPIt ¢òB®²Ùl›6mš;wnll¬DŒõqz+ç'Õ }t–7A¡P(--­«««µµ5//¤n}}}vvvgg'̃íÙ³G¡P‘ ý+^Û ’<2OØÔ©SµZmSS¬D/--U«Õ}}}uuu%%%MMM‡#''§   z¶‰eYŠ¢†Q«Õ°±Aä tÙ ÝGy$''ç²Ë.þÜÿýn·»²²2..N4¹¥WIY¨sß¾}Ë—/‡ýý“&Mª®®þî»ïî¹çžÌÌÌ©S§ÂØ$m­XC¿Ò^„ÜÜÜ•+Wz<ž©S§¢C³ Ñú¹´a-$IÒáp\uÕU ât•üáOà“-hû"AÇiµÚŒŒŒêêê¼¼<†aZ[[ý~nnnSS“ØEŽÅš¢NÖ÷…ÖÆÖÖV³Ùœ’’RVVÆ0ŒÇã)///))©­­u: ,€H”,Ë~ÿý÷õõõZ­vþüùùùù¢áGÓtMMÍÚµk ÅâÅ‹ÓÒÒ ³¶¶¶®_¿¾¯¯/%%åì³ÏNLLmeêÔ©*•Êf³}þùçz½^©T~ùå—guVAAI’ëÖ­³Z­ééé‹-ÒjµŠÒ믿nµZ—-[öÞ{ïÁ‘[o½uåÊ•/¾øâÇ {Ö®][WW'—˧M›«; ‚ظqc__ߌ3JKKkkkÇ¿hÑ"„ÇqÙÙÙ° #dzfÍšÖÖÖ˜˜˜sÎ9'-- !T[[»gÏž‰'ú|¾M›6Ýpà  ˜±aÆmÛ¶¥¦¦®ZµjÆŒgŸ}6,™øôÓO222.»ì²˜˜˜Óu‰È1ú¢éc¹Ó‘ áÂÂÂÏ?ÿ¼¯¯/11±ªª*55È‘õa@dfffdd8p ££#..®¦¦Æh4Úl¶ÒÒÒn¸¡®®Žã¸qãÆ ‚Ð××·|ùò~øÔÈÄÄÄ×^{íâ‹/æ8N¡PŸR©¼é¦›ÔjuFFÏóçÆo\³f (ÌZ­ö¡‡‚¥ÚúÓŸÊÊÊrrrÀºõÖ[ÿö·¿Y­Ök®¹Æf³mݺuÒ¤IÍÍÍ¿ÿýïwîÜ ‚%33óÿøÇìÙ³?ûì³Ç{lÊ”)çž{.œ?þø#EQ7n ‡ÃçœsN[[Ûe—]æóù&L˜°víÚ—_~yõêÕ………§«> Lž4©å÷û“’’4Mcc£×ëíîî.,,úèúõë÷»ßmÛ¶í…^NÝÛív—Ë¥R©`±´B¡ ¢¸¸øïÿûwÜAQÔK/½ôÕW_Íœ9󫯾Z¹r¥Á`xæ™g~þùg‚ ôz½J¥JIIùüóÏŸþù¸¸¸÷ß¿¢¢B§ÓÆøøxðB=þøã;vì¸úê«×¯_ÿÄOôöö>þøã!µZûûï¹ç¾ëÕþøÇ?¾÷Þ{N§såÊ•Ð㡇 ‡Ã»wïþÏþ³k×®”””;î¸c¤‡ã^N,Ñ“qD—Ð4=zôèúúzA4MJJJww÷%0I’¹¡¡! Å‹³,ûá‡VVVvvvÆÄÄ7Æë¯¿~ÆŒÅÅÅ_}õÕîÝ»ëëëU*•Ïç›9s&lÁãyþ§Ÿ~*++À––»Ý~ÿý÷/_¾\Ü`‡!bƼyóÀZž5kVFFÆwß}×ÐÐPXXxóÍ7ÇÄÄPõí·ßîÙ³' Êår˜p‚]S‹7E÷R0\·nZ­¾óÎ;Ï=÷\„PEEÅo¼ñí·ßΚ5 äóòåËÏ;ï¼óÎ;ïçŸþꫯ¶oß>jÔ( £P(,˶mÛ’’’nºé¦‰'æææ~ñÅõõõ½½½J¥Òáp\xá…«W¯–ëଂÐ\.—‹çùîîî7¾úê«RK©T>òÈ#—^zimmíi)„:˜ÎqpbÑ]A‹ÎÍÍ­ªª:pàÀäÉ“aÇH|é0r?^£Ñ8p ±±1>>¾¸¸¸¹¹ùwÞùæ›oúúú233SSS!ÈÎ-·Ü …Àïp8ºººÄ`&ø"%%E¥R9N¿ßÿý÷766>óÌ3¯¼òÊèÑ£¯¸âŠÛn» ÚÉýÞívCc ß·¶¶RÕ××W\\,Æyommu»Ýr¹΄}ÿ>ŸeYpzI½e6›Íáph4šŒŒ P¡ÁV‡A¼SÁ`Æ‚œœ–eÅ]‡‚ 0 ÓÙÙéóù´ZíÒ¥K!\œc±Xhšæ8/¸ý¤&‰P†$I³ÙÌó|FFŒø‚ ¤¦¦Êd²ÎÎÎÂÂBà¸øHEìaÒétéééõõõФ2\ºß¨Q£öíÛ¾VP>C¡Çqr¹< Íž={çÎß}÷ÝO?ý´qãÆ|°¹¹ùµ×^“Æ£Dc‘ÉdÇÅÆÆ>ðÀÁ`$I˜“ƒ`±pr||||||wwwSSÓôéÓAÿâ‹/þú׿N:õÏþ³L&ƒØkàM„Xð …B|p…B?¹Ýn¸©øAËåÀó{ôõz½ÏçKJJ‚&‰Þé$3 Šñ!€‰´GOà#$ ôéüùóap&]|ñŃáÝwß½òÊ+¿ýöÛßüæ7eee!¬!ÝÓ }!TRR¢T*m6Ûĉ!ÀÚµk§L™¢R©ÄwJ¥rÁ‚¥¥¥ÿþ÷¿§M›–‘‘ÑÚÚúöÛo—––Μ93...33³¾¾þ›o¾)..v:›6m¢( ¶C%õõõ¡ÎÎÎ={ö¨T*1 duÈÉÉILLìèèHLL¼öÚkB»víR©T±±±Á`¶Ë Ô©ÀÌ&I2+++>>~Íš5sçΪ¯[·<è§t:…ÓH'U…>ÒÍ Ð×År¹\¥RA™¦i“ÉÄqŒÖf¤èH0TPP°aÊ¢ fº^¯5jTmm­\./**‚‡½÷Þ{ó›ßüéOúâ‹/ÔjõÖ­[“’’*++BÁ`°±±qþüùééé¨uÉ’%111 Ãüë_ÿjmm-)))//w¹\3gÎDùý~˜°AÅÄĨT*³Ù|Ýu×]uÕU=öØ5×\óÚk¯-^¼¸¨¨ÈãñlÛ¶íÎ;ï|å•W¤!×î¸ãŽ-[¶üôÓOçž{nrrrwwwggç”)Sî½÷^øuÛ¶m¯¾úêöíÛN'L‰]qÅð­u:ÝË/¿üÃ?ÀºñãÇÏŸ?ßívƒAŸÏç÷û ÅwÞy×]wÝqÇï½÷8–§L™²}ûvžçƒÁ Œ5ÑÐh4¡Pè³Ï>cY¶¨¨hÅŠ·Ýv[bbâœ9sÊËËÿüç?ÿñ¯õiIàcñES ("6%£cDŠúÁr#9¶»‹ê1ÌŠÞQ1V„_´hgæ.GX‡ëêêrssoºé&ˆ¨ê÷û›››‹ŠŠ~ÿûß+ žçóóó‹ŠŠúúú:::Çœ9sþö·¿effvttTTT\}õÕYYYÛ¶m‹‹‹»í¶Ûn½õV„ТE‹‚8pà@YYI’·ÜrËÃ?,“Éjkk»»»çÌ™3}útà\WW×××\š?¾V«…x7‚ \ýõ<ð€Z­–n1W«ÕçŸ>Çq‹Bd^tÑE/½ôHþœœœñãÇwvv677‡ÃáóÎ;ïå—_NNNFý÷¿ÿmmm½úê«ív{ww÷”)S^|ñÅ´´4¯×»{÷n£Ñx饗ÆÅÅçææB<Ï…^ø×¿þÕd2xÄ ýýr0¢ü¿ÿ(":”уeY/?Ä ÐÑ·cÈ1R†Xx§ÓI„N§‹>ÇétÒ41ƒA¿ß¯ÑhÊK]Êãñ@"Çq0WÔ¯Ñ(6&ø|>ñ´ˆe‡ƒ¦iH /ºè¢ 6|òÉ'‹/6›Í2zˆÒ†—Ë%“É £"TbµZ ÃpØN|â"r@ 3•JÅ0LD€Á!©ÐâgßZtjùc÷BCœá~£žääØŸ$Iª,qÙ³ô5Š?‰Ád¸<ºZžç†Ù WÑ4 ÎÞ®‚Ó PW:±M¥( ´ iS!ù¸¾½ý*´ƒÔpX7§8´‰•ÄÆÆ¢C‹ÏÏ¿TDþ¤~Ë"g飨÷(ã1 ®§Ù»>ì$ÉŽúÛ‡(¾Xñ'ðNKä —~Ý!^5øi5U­V P åïà1Iú}ØÁûÒgʃœ––ð‘Ãt¿Êíak9¢{$ùý÷ßçææN›6 Òäž™¡yQ«†˜‰ã¨G#­<ú×·Þz+ ¦0”­G·©ðk8ÉL;Ž^è~%å@|”þJŸœ'‰Èµ öº˜ ¨¼*§Á`úŽè*©™=ÌMÜx"F1ïñ0é®ä¯ŸÙlbb®`0kwpܼ“ ]$€”üõ¸?Ztg>Ž„Ýn÷ûý'g©ÂP¼ÐtÄ߃Öa]YGúü$IîÚµ«®®b—7n̘1A”——Ûl¶„„˜äÄ8é´cÇŽÕ«W?ñÄ0ë>Ä^>Ì'`áAÚÛÛŸþù»îº+''r¯™L¦ã(-9ŽÛ¶m›Åb))))((€™Ô“iyEs˜ì7ã6:‘Ÿa©,„^°`Áå—_>eÊ”ÒÒÒÖÖV™L‡m6[ZZšR©Yê(¸g£‚ÈŠ–Zâ%¨êHK NÚKC‚ÔÔÔ¼ýöÛ~¿_úStË¥™ë`¿A]]]0”6{ zÆ¡4rj£&‡µ@‹åÍ7ßìììDÝwß}sçΰöu Q>ÿüó³³³KKKaõxÄThñQÊÙ“7¬ÂÜ@UUUAAANNN83fLrrruu5ì#5jÔšj‚ n‡âÈDÈ:øIŒ‡q‰ô8H‰èªºÅ ·–ÊL˜×0Â'—Ëå0Ïi¾#z¡ØrÑ’„é¨ÒÒÒY³fÁT¶4bœ)í^=ã@‚]ÚHш^wÝ0éqXNQTLL ,ºé¦›žþyhÃ@¯÷è @Hõ «»O¹{ŒŽ°‡îû쳯¼òJZZšÓé4~øavv6A_~ùåÝwßm4Aðx<+W®\¸p¡ ¿ûÝïÚÚÚôz}ggçO<±|ùrAöïßÿÛßþnÑÙÙùØcÝvÛm£ÒÑÛÛ»dÉ’ñãÇ·µµÖÖÖË.»ìõ×_‡©xš¦o½õÖŠŠ –e{zzž}öÙo¼tŸxà“O>IMMµZ­©©©ÿú׿222þüç?ïÝ»W­Vß}÷ÝW\qÅ“O>i±Xn¸á†$$$tvvž}öÙo¼ñ†\.§(ê³Ï>»ï¾ûbcca¹Þ[o½µ`Á‚ˆUðgMMÍÅ_úè¾}ûvíÚEDYYÙ7Þñ¥†'9zÒhè ’ |ìö0 „r¹<99¹®®.ÃF³–––ÔÔTqÐrärwóÍ7gffîܹsçÎýë_ÿú׿îß¿Ÿ¢¨~øáé§Ÿ~ã7vîܹcÇ•JuÍ5×ÑÙÙyË-·üæ7¿Ùµk×îÝ»—,YrÅW˜Íf‚ ®¿þzžç·mÛ¶sçÎ+V<üðÃAÜwß}™™™{÷îݱcÇ=÷ÜsÇwTWWqï½÷JßyçÕÕÕRåváO?ýtß¾}ÿüç?ÿóŸÿ|ðÁ@†ÞÞÞØØØÍ›7—––^zé¥Ï>û¬Ëå¢(êµ×^{ï½÷V­ZµcÇŽ­[·†B!ˆ%ðÞ{ï=÷Üsn·û믿þãÿˆºçž{!}ñwß}·víÚ'Ÿ|6$ß{ï½7ÜpCiiéöíÛ'Nœxýõ×CÔè.DÓ´×ëÕétßÿýÞ½{Ÿzê©gžyæ§Ÿ~Ú°aÞ={^zé¥üã{öì¡(jõêÕO=õÔÊ•+wíÚµyóæêêêçž{Ž$ÉÝ»w¯X±bÅŠ{÷î]¿~}FF†Ûí;MÓà+æ8î–[n‰øR•••‡Uï‡.ÒN¥#v) he)Ú#¤|†Y"–e§NÊóüêÕ«·lÙòÅ_hµÚñãÇÃVØä†·ñ¯ýë³Ï>ƒÀ°‘ ­­ !ôî»ïÎ;÷ÒK/EÅÄļôÒKùùù<ÏñÅ*•êOú“L&“ÉdO<ñÄâÅ‹ÇvîÜùæ›oÆÇÇSuÇw$%%­]»!äp8 RMÓ<ðÀ† âââBGzüÇ„ãÒOn¸á†ôôt„ÐÅ_¼hÑ¢O?ý¤Ÿ^¯òÉ'õz½B¡¸è¢‹Ün·×ëåyþí·ß¾í¶ÛfΜÉó|RRÒ‹/¾¸sçÎ={öÈd2Ø[!Ö¬Yóì³Ïfff†ÃaØ?ôŸÿüÇëõ"„¼^¯R©$B£Ñ|ôÑGï½÷Þ ËƒAX¾|9lÀZºt©N§»óÎ;SRR(Š‚=•---¡×^{mÙ²e\pI’™™™wÝu×wß}‡úüóϳ³³ï»ï>™Ls×]wõëXŠþR­­­GmvãÀ¡O iIºú°+0z8™1c†N§ 梋.ª««s:cÆŒÉËËY1zôh ùˆÃ …¦¥¥=ôÐC;wîÿ,0DµµµÍ™3Œ%‚ ŠŠŠþýï#„ª««333ŦÑhàø‡~¨P(`·0Hȶ¶¶ÆÆFAž~úé»ï¾{„ ÅÅÅ‹/¾êª«àîO?ýôwÜ}\*è ì!bìØ±_}õ:EÝï÷ÃÞ xç Ã8N»Ý^RRf$„Œ5 uuuÓ¦Mƒò „ššš†)((}È<¨¹¹yìØ±O<ñÄ3Ï<óñÇOš4iÙ²e ,¼§z½^h3ØSâ"JØ{(ÆعsçYgÏh±Xìv{(jkk5jøS@žG÷Ÿè/æÛÑñ ²@Ož<ìícï®å ëw*W,‹œ’k ±sèM,((‡ÃA&“•””À»€À 6"6ö"„B¡Ð’%Kü~ÿO<‘••ÕÛÛ{饗F{¢·Î‰™8¥'š¦/¿ürqÿÐo~ó›ÂÂB‚ Î=÷ܽ{÷~ûí·?ÿüóŠ+þùÏ~üñÇF£qáÂ…Òãï¿ÿþªU«D—Øabdv4ÀÒyi2g©(c¡Eˆ qË1BèøÃ’%KÖ®]»uëÖË/¿üª«®‚ÔeŠŠÕF÷Æ@ 0yòä ÷ Þˆ˜Ã ¤m/Hu(î…BQXXÈq܉°¢¥Ÿfp‡Ö8±Žâü!|¤@ Ñ¥X–eYVŒÞ4üýÏܽ{÷–-[ÀS#v¦ÜÜÜÊÊJ1ÔSssó»ï¾ûä“O}ûí·bÈ‘P(ôä“OÞxãcÇŽu¹\óæÍƒ´,"úúúÞ~ûí›nºéŠ+®¸âŠ+xà­[·.\¸ð…^¸õÖ[ÅãcƌٰaÃÒ¥K¥²¢á$ ‘nÊËË! L´ÜÏblll||üŽ;.»ì2˜^ª©©q: NS©TAäçç‡Ãáýû÷çååÁ™»víR*•™™™k×®}ðÁo¼ñÆo¼ñ«¯¾ºîºë`eÅPŒÉ~7r!„ŒF#MÓ¿ýío#.ÏËË[½z5A0uáx¤®]p¡G)8çèT‰sH'B[<Ò:O^XÙˆ!¤ß##ȆD0ï¼óNOOOuuõ­·Þ ©ÖB7ß|óöíÛß{ï=·ÛÝÚÚúÛßþbÓ\rÉ%¡ûï¿ßn·Ûl¶{ï½wåÊ•J¥²¤¤dúôé—]vÙþýûNçž={fÏž½{÷n•Jõÿ÷·ÜrK{{»Óéܾ};I’&“‰¦é•+WFOJJŠ˜–P*•o½õVMM×ëýÏþ³nݺßüæ7èÐÆ@iw„DAÜ~ûío½õÖW_}åõzkkko¿ýö³Î: ô(•JÇSWWçv»333/»ì²x`ß¾}^¯wÓ¦Màdž@++V¬øË_þÒ××g³Ù`¯lllooïwÞÙÐÐ Ê=@Äbè?Ai¿ãŽ;>øàƒÿû¿ÿs8f³ùž{îùÃþ€ºúê«{zz{ì1›ÍÖÔÔôÄOˆ5ˆ!Öbbb4MÄ—‚j?øàƒçž{n:±Ž`ø¤I­Óf‘3èÀ‰‰‰Ï=÷ÜŠ+Ö®]KÓôyç—““sðàA„ÄÜxòÉ'_zé%¿ß_PPðÎ;ï‚ÿþûïßqÇëׯA­VÿððÖïý÷ß¿õÖ[/ºè"£Ñèt:/ºè¢üü|•Jõõ×_ß|óÍgu–B¡p¹\úÓŸ¦L™BÄ·ß~{ÓM7‰Çüñ3fˆ¹‹D+â¶[­V‹ÅrÏ=÷\vÙe°"B‹&·R©ë}ùòå½½½wÜq‡^¯÷xùä¥R9yòddÒVõ%&&þío‹øRuuu^xáÖ­[÷íÛ÷ÐCÜÄõ×_D<S6 y½^ø‡ÂL¹\~f©—Eê+! ÕjGJDÑ›R__Ÿ’’’™™i±X`%üdµZkkkõzýرc¥—ƒÁòòr':làakjjúúú222Àu,£«¨¨ðûýyyy} ãÒ»ôôô¿ýöÛ³gφ…¢ëóùœN§ÉdeÛï÷;Ž„„‘9G266¶  @ê>ñûýeee©©©Ð<ÐN»»»Å‹w÷xûlˆÏá .¾øâ¡Ü⌠ÅzÆâdÏCzXw%FK€?B#1žŽèEvÆôûüÊqÃ0ï¼óÎÁƒ/¼ðBу¥Tß|óÍï~÷»Q£F †Õ«WçååÁ\Ô¿þõ¯]»vI <È-Z”7”–£_;–û}ú³ß ºDú¢Î±{D8ú[i½aK]ÑÉ,5¨`V,ú'ñØâ¯V«!Pk„Ø|á….\øÉ'Ÿ „‚Á Ã0Pg–*Éâ¬Cô-Ä!Zrޏ`»ßùªˆs"lli²ÒNä«Â1IO <ô—=]Q|űZÚxˆ>™„Äù Ø8I’¤Óélii‰èÇ$IZ,–ææfpÂGOŒ›ÍVTT a}¸8÷‘Ý‚¢(—ËÕÔÔ$ è ·èëëƒP'Òé-‡ký~¿”á@>Jkk«Ýnfo0„9â‘P(!VàäÖÖÖîîn鄘 Ý: · ‡Ã#%¹ìéCà¡ûH /BTñãIr¨ÕjXZ4"¾"<¸Õj½îºëæÎ»xñâI“&}ùå—Эß|óÍ¥K—þío›9sæüùógΜ ÉAa÷Õ=÷ÜSRR²pá«®ºª±±Q³ ÅIUUÕôéÓý~ÿG}4uêT³ÙüÑGÍŸ?¶HÕÔp8üä“ONžûì_|ñ¢‹.Z°`Aqqñ3Ï<#nÒ€±ã§Ÿ~***ª®®†Kššš&Nœøã?±yóæéÓ§Ÿ{î¹sçνä’KZ[[á…<ú裂 F«gŸ}véÒ¥ÀÞ%K–Ü{ï½sçÎ5k–ÙlFgjÐÿa-A5jTbbb0LOOÏÌÌW«æææj4š@ ’’’——×ÙÙ9Rvò<å•Wîß¿ÿÃ?üöÛoçλ|ùrX Ö®][UUõÁ|öÙg>ŸoÅŠ  žþùüãÿûß¿ÿþû¹sçîÝ»WŒÂ ¢2;;ûý÷ß—Ëå .ü÷¿ÿo±X:;;#º5I’ùË_^ýõ^xá›o¾¹ð o¼ñFpï?õÔS?þøã?ÿùϯ¿þú¼óλôÒK÷îÝ+FŸMç‰'žxë­·^|ñÅ5kÖ<òÈ#>úè›o¾ ²´³³óí·ß¾úê«×®]{ã7>ùä“{öìÓ;!„¦L™âr¹¾øâ hÉ÷ßo6›gΜyðàÁË/¿|Ò¤Iß}÷ݧŸ~j³Ù®¼òJǃ2›Íा®®.†ÌfóªU«.¿üòüã ëÒÃÎaÖ¬YápØçó?¼V!…B1wî\ðf‘$9yòdµZ="¦‘`ÿÝòåË!;9Bè©§žúè£jjjrssyžOMMýÇ?þÏrã7¾ôÒK÷ôý÷ß¿ï¾û®¸â „P~~þ®]»:::¤5«Tª &$™˜˜8~üxèÐRË8`6›ß|óÍwÞygñâÅ¡§Ÿ~zýúõŸ~úéc=¶k×®ââbÈ'üÜsÏ%&&Š2 "===o½õÖ³Ï> ×feeÕÕÕ½øâ‹°( >úè£Ë–-CÝwß}o½õVuuõÔ©SÅØz½þâ‹/þúë¯W¬XA’ä·ß~{Þyçéõú‡~8--íµ×^ƒ{}ôÑGcÇŽýòË/¯½öZŠ¢`O€aøÖóÜtÓMwÝu¦â) ð©Ðb`J©¢.€Ž …¤Ÿy˜K`†a®¼òÊÏ>ûì›o¾ñz½`Š>!XÁ/MüGÓtss³Ó鄱 vCbŠˆÊAÏdYVê—Šxç555<Ïùå—°±‰a˜ÞÞÞ „î¼óÎÛo¿}Á‚ .<÷Üsï¹çqÐgUMM8¤ÂBå… ®\¹²££ò°k4h¹è?‹há•W^ùá‡Ö××'''—••ýãÿ¡¬¬lîܹâÊÍ”””ÂÂÂ]»v]{íµÑ»ÿ¥AaµZ-´ddy@Núˆ”íÁX#Ë ]pùòå°™þšk®Y²d‰”i`7J]²°·6ŠyœŠçŒ~½R:zЄ…¨à‚†XvK–,ùä¥K—nÛ¶mÖ¬Y›7o¾ð ¯½öZ—Ë%å 8Ø`u4@&“ÁØ*uJG„_–:ɧOŸžœœ¼nݺŸþY©TÂXØ‹"unËår©ï*:p¢8`A$ÌÆ“-ÏLsãÁƒW­ZõÕW_Í›7¬ÇGyd—Ãq\BBÈaˆ˜Ì9RŸ Tk2™Àí·ß>a„MgË–-³fÍzòÉ'Bû÷ïŸ7oÞêÕ«¯¿þzª¡ÔÔTˆ&áõ†©¯¯§i:11ƒV¸äâ‹/þâ‹/âââÎ=÷\ˆ­•’’RSS£ ---çž{®t–A´Ž.„*Æ)“À§áÈGÓEíß¿!ä÷ûÿò—¿x½^0z£÷ñÐ4  Ãüùó_zé%«ÕªP(¶lÙ"fµŽÂÒ™RéθŘ1c&Nœxë­·öõõAî¿ÿþM›6qË-·ÜvÛmàeHLL”²æu ¦OŸþøã»Ýn…BÑÝÝýÌ3Ï,^¼X¯×ƒAš¦¥Œ(pÌ•W^yðàÁŸ~ú ¬e„Ðõ×_¿~ýúï¿ÿZøÜsϹ\.ð6çääTVVöôô0 ÓÖÖ¶qãF­V;xýÃË>­Æ<’äy>33óöÛoÿãÿ¸jÕ*¯×k2™ EUUÕùçŸ “=  ¹ÝnxWO?ýô%—\2yòäôôtP/!kÜn7x@¨Š—ûý~ðëBT«®ºjÆŒùùùííí Ãüîw¿“Édï¼óÎ 7Ü0}út“ÉTYY9mÚ´Ë/¿\œ¤…Â믿~å•WN™2%++«¦¦&//ï™gž_N§tžÏívG,oùرc‹ŠŠ:;;§M›ZÉ…^xÿý÷ÿæ7¿)..öûýÿ÷ÿ9®½öÚO?ýtúôé™™™^¯×år‰C’ôI1ŽF >99ЯWSJˆ€mÍ#+"ÇÏ?ÿ¼wïÞ¬¬¬Å‹ïÚµK§Ó3¦±±±««kÖ¬Yðmmm---3gÎ3Ïáp|óÍ7N§ó‚ . iº««kêÔ©5oß¾=11bh´¶¶¶¶¶ÂåenÚ´ipwŸÏ·víÚ¶¶¶´´´ /¼P&“fÞÝݽ~ýz»Ý>zôè³Ï>;"Ÿ-”ý~ÿš5kÚÛÛóòòÎ;ï!Ffˆ"my¿×¢C»)úýN¶Ûí>øà÷ßî¹çBž é:j1œ}D¼‘ˆ§Ÿ"âv#ë니èÛCçű?ø±ÚÀCßtzX ||ó¾H'?Är!#âH Vb j¥ç^³t\J×é÷ÚˆƒÑçÈd2£ÑxÏ=÷@šµèÓÅÊí†?øC¦G ¡#Ú›ëødxèñbKà‘îƒÑç4ÞR­Vÿío;“ýFDZ¯žJ Zä¼:^ѽÿ¨/ wt‡( NŽ: ëÕÏÌ 1RÊñ²ñÒÇ2x` ,E}}=EQ999G곊R=È[=¬Ëê„XcUÇ: £_aRžï¾ûnÈ;ô¯¢lëÖ­×\sÕjECHžRlÏž=7ß|óÅ_üè£vuuP ÆÉ&0†È@thý°¸• Ü{âOÙz¤î„Íf«ªª×3„ÃapäJ+ë—+CyݺuçœsNww÷èÑ£?ÿüóK.¹Äét"¼«öŒ_Á±+“ ÄJóIÃGJgY¤~KÑa»dÉØ !=NHˆŠçù?øàƒ9sæ@âß믿~êÔ©›7o^²dÉas…`` |¦«Í<Ï¿òÊ+S§N2eÊ /¼ îæxùË_¦OŸ>mÚ´GyÖB>þøãÏ<ó lKaýúõW_}5Çq B;¸výúõ‹-š:uê9çœóí·ßŠù„{zzn»í¶)S¦Ìš5kåÊ•ÀêW^yåã?†ÌRIIIjµZºŠ£ö’$ù /¬X±â¢‹.ºï¾û***vìØûrA¸þúëß{ï½[n¹åÖ[oýàƒî¾ûn‚ ôzý«¯¾êr¹`µÍ[o½ÕÛÛKÓtccã7ß|ã÷ûB›7o¾üòËóóó}ôÑ’’’«¯¾ú믿†W‹-ª®®~ðÁ/½ôÒxàwÞ!"&&F©Tò<Ï0Ì»ï¾Ë²,¤§Áî ¬Bc ÜH°îÕW_…x4¡+¯¼röìÙ°Óà‡~øþûï«««B‹/îîî¾ñÆ_|ñÅM›6-Y²ÄjµîÝ»÷ùçŸGÑ4m4Aã}úé§Ï;ïø ÇqkÖ¬™;w.y}T@€çyHÂ;ôz=Žæ8®§§çý÷ß{˜¢¨™3gоýöÛ …âÞ{ïÅáÑ110/ãââX–µÙl¥•¦iqë¼L&‹‹‹[¿~}ôµçwÞŸÿüç>ú¨ªªê/ù‹´NFÅ0ŒÕj7˜\.÷x<½½½(oúôéï¾ûn´>Z¶lÙâÅ‹ñÌ3 ,ÂèÑ£!ô$A …Ân·744€kñâÅ555«W¯†óÀ{ï½çóù €Û¢E‹þøÇ?êt:¬*4Ã0¡PH.—Ïž=ûƒ>@) ‚ ~ÿûßCÄÆÅ‹¯^½º®®êljjúè£ÄÉÞiÓ¦-\¸³Kà#ó圱†nO?ýô5×\c6›ÓÓÓ8ÐÖÖ`çÍ›w÷Ýwßpà kÖ¬1™L?üðƒV«½ôÒK … K—.ýûßÿ~ýõ×+•J³~¿ßb±™ÿô§?þùsçÎ1cFyyymmíêÕ«!€ÞæÍ›çÏŸÅWPµzõêóÏ?Ù²e<ÏÓ4}ß}÷mذa÷îÝd 3ùÌU\\|¤¼…´à¡ƒçL&[´h—ν„ð¨Q£fÏžÝÜÜî¾ûî‹.º(??¿  €çù³Ï>»¨¨èàÁƒ‡cÑ¢E/¿ü²F£Õd2%%%-]ºÔh4¦Y𦳲²fΜÉ0Lllì%—\b³ÙZ[[ _{íµ‚‚A ÅÒ¥Kããã‚Áàþð‡|Z²lJJ Ä‚Æì=qeÙ5kÖ@‚ëã²™ Ç=Bséö†cŠÈAQTbbâ±lf÷CBDµZýú믟9Ž:äEôi0'„åêpøÖ§UDŽcß“É!¤û/­ùuHÄá?$‹k•Å-bä é2æˆa"!K“ú&Œ~ÔIBRŠA-þ§;IæŠ"b€`Œ qáJôÑuÜcWÕA€náp8%%% AÚ>ˆ‡:b,93ÈOéc"¢XiP tZGžÖÓq¬Müÿèª=IéE¿MMM?þø£Ûíí¿¥¥%" ÆðA 8pà€B¡>M:•#· r¹œ¦é]»v™w¤ÆIFGG‡8™7â |Œº¬=ÊÉÉ ƒ•••°(wŒá úy\úÿq±O±íÛhfΜY^^îp8À§…{ Æð,Å)((8vrXHàc’$ƒÁ Äæß¾};vÆ` s„Ãáã覑2è8±Ž]ZÂ4I ˜%ÃÆ©Q5DÈ_´yA@)1ÄÍ dq$FO|lµð$‰xqaôòuН÷±å­ü ×(d"tÿG…tœ–x}]è•ß( j‚@èÉÏJñÀb9T~Ôàxtÿ‡þñéÔõseh½¼6Ä……û/ƒŽ@¿:B DÈ^þ>´¯%L‘hq1ý»9²‹îùÿÚ™²Y£¨ ÿÔ—ÁǖȳÈ-5áOv†^¾N)£‘€1Ìx{Ôl:ÖýÀǘc'Cmоæð¸4òú¹LˆC7¼ãï´ó$‰ÊZ©±Äó˜ßÏa–/`tJÔi¾+cÿós¾L]7ßÒÇOÈ Zúø·³Bû[ù/J¹y…ô±·0„ö·†7Vqßìã|AD!Ôbá›Ì¿ª5∀Ð㫃{[Â](¿a®lå†Ð¿·²J²y„m œ€Ðþ¶ð•Üþ¶°€ÐÖ:ÎåG2 ÂéÃ^t,óÀE…B!·Û »y¹ãÔî¤tÄÐhB5·€þûÕŠX ñÁÏ,I ‚@%YÔ¬QôüBz~­`A@y‰äÇ;؆^!¤` î>O¶zdÑ?·†æP“³)^@$qôí!ú|{~£”¡Í5ôg9ƒä¿ÞZ*áDè`¿­ž{v™bZ.uþú–³dn!„fäSõÝ<Ðv>+ž¬ìà „öòSs)¸öØ´˜_Áôáÿˆ#C‡×ëµ]{裠.ä€HΕKˆŠÊ¥ý'úuz–e ƒ4¡Ɖӥý!Äóˆ Є ª®‹GiäÄg»¹m¼Ë/LΦ®šÁ@A-'þòEà_·¨@E-.fVïfW|¨í ¿|òX! DÈé¶7„ß¾A¹þ÷õ>vѺ_Ÿ–xþo¶ð‘¤'x!J¦¼ÖJ2©u8§_h2ó×Ïe¶Ô„~ÁââǧëVóp8ÜÔÔÑ#ägt^i!B]E’œI¤ÕIrb‘$IQÃ0$f(ÕÙue1$^(^tJ”d$Rc£: …ÑÝçËš-—{Y’ñ%£Ñ-gÉÖì猡G%‘Â1ˆ_øàª8¥ ¥ÆSr¨Ú.¾Óƃ¨â…_þ‰„€;M|°Š,*H¡H‚ØPÉñZR„´¡’£(bT2%ŽAGo« ápXZtr‘4M: -fyƒ €H(Ý !–^ÌÔ¯ÔHÞ$C¡F£Á–ðIa.’3¿t媎pN‰ò…ÐeSé˧üOLÑò•Œ¸ç|ÙëëB2 ÉsÉí2!ƒJ6Ór©_¤âÑ~4hæjÎ@¿]é'ä «Ã×Í"1$"‰_QŽÈi„ʈ#ÝÁæô*!ÔÚÇ+eH£  %ˆ·±E¤^EdÅnc“ „I÷˨t,&«F£á8NL Ù¯ÓYV>Ó4Í0 MÓýæ%ˆRÎÒÑ4E¨´")ÉE Œ$ {W£) ÂVzâýaŸý™ãQ³™¯îä¿,e›ÍüŸ/Uë»ùêÎ0FF%Qa…$ tñ$fkmøë},uHNpadË!‚8zÿXÎ =üž¦ðÓW(²H¡w²Ÿîb¯›Å²¸…ºn>Ì#A@9&¡_ÉN ŠÒ©ÇWÿt©ÜáÞü1tÙ†¡B(/‘\ùcè÷seBÅÔ?bo?GF(Ì#êØ–>( •JYø¢et˜ ñÏ횢(){£3ZR†ÿé¡}r!Z… bŠPôëÔ¡Ñ—ƒÚA´¬¦( Ç”=9â77‘ü±’ÛPÅÕÄ›×+sL$F¹‰ä¾æpe{X@(È¢×~«H6’N}êîóe{yµü—F‘(5†PÊu(AÚq›F5æ—®xå4f{=×fåsLdmûÄç^@zé:EvYÝy苞¿Jñ·«¯Üõo¿€Ð¢ ôÍgÉ€¢Å™Ô¸tjBI 4!“—Fg‡ÔAÈår¹\^4BêF06¢,•Õ"¤¿}—Ò‘åÈĈêÑîWÁi̲¬V«]¹r%äÂÆ¢øÄãAü"Ž` Š+(êUY¼€I…0E¢cÿJ!1BÄ/T膱c„q õçáÈ Ïc`Œ`œ2GliÀÀA*t´]zÆ«ÐX…>vÐÃíÕHwc` +©; ãLÐʽ,Ëöc8H]’$Y–Vs¸Xš¦Ýn÷ÿûßóÏ?ÿXB]c`œˆþ‡×¬Yãv»•JåðÅÄ 7ÜpÒ^AôLwDl-Aü~¿\.˜(Æî.ŒSkèB‡ ƒJ¥R š3P÷“©BÒÃê} ‚ R© ÇJtžÜ«0N~·”ÆT*•ôÆ*täûâyBÕBY\¤L(Ü<Æñ¼Ò²ó5z&p?oPº«#"æpÿ0Î4Jc/ôÑ“Y´œq¯Â8ÉBxØŠá+ѯ7XFĵÅÀ8iLÎ]Žžìí73îR§œÆÃ­’Ãç5õ»Ë ÝŽ'§OóHŸ’÷íšê÷Èð·@0ÎK8úÏaÒ9‡»z׊q’UèA:ä©ê™ôp{SýFÃÝã”÷Ì~³ŸrCŸÌ·gEõ‹ -޶ƒ1¬<ÜìaúT½‘hZ€K`Œá£E÷Kì3Å\búb` +÷«EŸ’~KŸÂ—"]›1‡ñâgŒaÂÞ~íáS®KÓ§·ý²Û½ßÀhÐ0î'“Òô©}5Ò å€è#Ïa KVŸrö¢S¾cEÎ8à;Æð7†O¹|ê½ÐV.Þ3ˆ1üéaÂ^t ½Ð‡]P‰iŒ1‚ø|&®ÄhV ãôϧ!R˜±­‹qzðöôwb .{1“1N“ø4W¡±Ñ‹µè‘m#¼Ð óvDK] ŒcÎŒ Œ Œ Œ Œ Œ Œ Œ Œ1\´~Àe\Æåa[ÿ§Š‹‹ñ0†%0.ã2.Ÿl Œm` Œ ¬Bc`Œd¿ lã2.ãò)°i4ä0ó¸ŒË¸”m°#GZÃ^. ^ƒô×Þ<”š‘$qíÊ™Çþ>OÄ«þõ;üß?ôëäZC¬DzùàçrΠ? Çñ¥æ¦(Rú I’ é#“Þ C¹ôC$™Œfr(Š”žÜoóA B¤å ' ¢i2`yþ—>2Äç%ˆÃ¿™è·7”«†ˆ£« ˜À0$I‚€(ŠdêÐ?’$‰` ‡Å»!^Nƒñ¦ÉLEýª×Á·“t ê '0URR2”¯âvA` Þ] Àz½A…‚1Pü´¸þ”þ$‚Åâ‘ËiŠ"ᜈ1ýÐ0ÿKYüI$RW—3dÕjytÏ£(Òç ùý,Ôï󅺻‚€”JFÚoH’`*`V&£ f·;ÐÓã ‡•J&ÃÐÝÝÎŽ{B‚º\~†¡="x@BÚT’$<ž@{»=&F-Öv¨ûþòZH’p»OP¥’ñ²%APi·{ý~V©”E<8Að±ärþôzƒÇ3 _¹§Çéó…ÔjùÑ †3E ‚@Ódg§½½ÝFÓ¤ $IÔÔtÙl^š&iš’Éhxƒ0úÊd¿ä–Éhñ'A@6›‡ãxqe2¦8¬Êd”8 ‹à˜ÍæÝ¿¿=âÚÚlMMæCC€È^"dKK[º»r9cµz*+;ƒA®¶¶Ûbq‹'mªªºJK[zzœERÑÙi¯­íá8¾¾¾§½ÝFQ¿¤;§iÊéôµ·ÛòóMhšìëóìÙÓ°‡´™åA C*´Óéw¹ü4MRÁ0$M“ð2M’¼=¿Ÿu:ýAbJ¼Jl­øà•多E4M‚ü•8-âìv/¼v†¡ÄÏWQÔ/-‰`¯ÍæÝ·¯­«ËβAOÐfóÚí^§Ó_]Ýi·{ÓÒbz{]¡P˜$ûWb¡Ÿôô8[[­r9ÓÒbmn¶8¾îngyy»×”ÉhqСi’ Ž ïßß~ð Ùë Ÿ%Ÿþ—Úöík ‡ÃÐø††^›Í+—3ÝÝΊŠŸ/ÔÕ娪ê<“%0=Äóôz¥Åâæya¨¾>w(ÎÌŒã¸pO‹ç“IGÓ¤ßϲlØã j¹œno·!„L&E‘,NMQ(’$ìvŸÓé3Õ:B„ÿoïÚbã¸ÊÿÌœ3÷Ùݵ½ë»{Ó$mÒþ«ªVâÒ< !@*ÏHˆ'.o€„ê¢o¡"x¡H@K)A…^ QêÄIlÇöz×»ë½ÎÎõ\þ_2lmÇ 4´qöü¬ãÙ33ç|ç»gfp`l@IKŒñÅÅ*ÆJ&cpΗ—³³…Ç‹—.U+•N©äÞðœß]׌cbšpO¹Ü>vl||ܵ,­\nÍÍH’Ì9—eiy¹1=·,-Šc¬Ri»®Ùë…®kRJz½H’¤v;p]3“1dYŠcº¾ÞÉdŒ~?r]“RÖéQDE.•²µZ¯ßFFÛÖ(e–¥år¦$I„Ðr¹ge³f긴Z}Ç10V¢ˆA\(ؾ¯­õl[qã½^D)õýxr2çûq£á9Ž^(ذ@33 ÏÆF›Z,f4 €Ԏ_(8¶­At€ÒïGW®l?>9:ê„a’$tz:/ËUUjµžïG¥’‹Œ1êvƒ‘‡–Êç¥,åßaY}?:x°81‘“$þæ›ëëë­™P:˜êyA¡`_¼Xu]óرñ8&”²("aH\×­À"B«V»ss#qL¡° KKµS§¦ ›RöÊ+KF¿TÊ$ BS|+Á’Ì·m=Ž)!T–¥k×¶ffò+o¾Yn·ýNÇ_X¨`ŒÊåÖ¹s«í¶Ÿ$ô_ÿÚèt‚­-ïܹ5„”FûreS×ñµkË—7ã †§ªxq±zñb%ŠÈŋխ­¾$IËË[IBÁ@Â*Ž»½^¸¹ÙÍfÍÔLq.aŒ*®kf³¦®«a˜PÊ ' ‰®«ŒñÔ§”•JÙÙÙÈ¿ï¾iÛÖâ˜4›}×5eY–$ŽÒë…QDŠÅLMÃkkMÃP§§óŽ—:~ýÚµ­ ˆÿõ¯r%IBÏ[…V«×5=/zãÕçüÊ•ÚÊJƒzáÂz§À˜{½ˆzîÜœµ¹Ù$I²,Ë—/o‚ɺr¥Önû¾Ÿ?¿N[YÙ*—Û+o½U¾t©E¤Õòßzkƒº¸¸¹´T×u|ùòæÖ–‡ráB¹ÑèõûÑùó딲$!çέ–ËmÏ‹.\(ÃRrÎE)—[š†ëõÞÅ‹UƸ,K„Ð$!A,.Vgf `±’Ã(Š ny’зÞÚØÜì*ÊuãÏÃØ¶õ("”òLÆ·™¦ëêÕ«õvÛ7 uee«^ïv»A¿I’tþüºçEªŠ; \nÁ½€ÎA<8V©t’„Æ1¥”;޾¾Þ*œ|ÞöýX–eÇ1|?‚µ.ô®ÄØu¦§”mmõ“„ÎÎŽ¬¬4a'NL;6îû‘ç…A<8úÿ7Ï9ïtü£GÇÏœ™ÏÂ|?r]«ß××[§NM819=]ØØhB“„9R:yrjtÔét|MçOOƒøÝ0žRµÚ~å•¥FÃ;v¬Æ9×u¼²Ò@H™› ‚ÄqtpË›M/ “µµ¦®ƒ¯ÈS¯Ìó"B˜iª”r‰u]]^®û~Ã0i4z‡—²Y# Îy$ªŠŽŸ8yrJÓP‘õõ–më<0{ìØ¸a¨¦©õza.g>üð!ÃP77;§OÏœ8156–©TÚ„0ƘëšËË[Žsý,]W CÈŠ1Ëïya¿ÍÏ^¼X-•²ÇOÌÌjµn&œK÷Ý7sâÄd½ÞSUtòäÔ™3³–¥Å1I–ÏÛkkMÆØéÓ³§NMcŒêu/Šˆei'NLœ81©(R@RJ&„¶Û¾$ÉÙ¬Y¯÷ÖÖš#Î%Më«[¶­e@Ÿ2ƘD4›ýË—kårëF%% IjÛzÆqL*•öµksçVûýhf¦`šj’0LšMïàÁb£áQÊLSãœ_ºT%„Žeî½wì¹,ËqL£ˆLOƒ#ÐMŠ‚1êõ‚\ÎL#jBhŽ ¾iŠZßOÖ×[ÓÓ„”v;HúÆkçϯcŒ(åIBs9Û÷ã\Κ™)¼þúÊùó륒«ªJ¿g³F«åe2¦ijý~¬ë<.EQÇðý8Œsι¼-û=:êœ>=«i¨ÑðEfŒcŒ*•öêêÖ䤻¹ÙLQäƒÇVW›W®Ôâ˜ärVZ¢à\RR©š†9ç“[ZªW*S§¦ÃÂ~?†œÆhuµÇ´^ïU«Ý0$”2ßMSÕ4ÜïGŒIš†; TÊÆ1›캖,K››ÝBÁQU±®«ŒIA+Êuw´X¼~–¢H†q]gɲdšZ“õõv©”eŒû~Üjù¯¼²´ººå8F¿é:¶,Õó¢FRþüçKµZwz: çÜ0Ô­­~©äÂ’„ê:¦”y^ä8BŠçE’$ë:†€<Ž cüرÒÔTnf¦Ðnûà†x^´¹Ù=t¨H{ÇH‘K.g>\œIÝœ0$’$Y–æyh0L²YóÌ™9]dž¡B76Z¹œeÛz§ÌÏÎÎ*& C"IòÀbÉa#$ë:žœÌW«n70MUQdJ™ª"!, ‰ãèƒ2ï^}Éf••†,K.!”R6;[˜ž.Äq"Ix8 –Ífv¶pðàØÂBeaaãôéÙ$¡–¥s¨*‚ÈÖ¶("ªŠ0V(eIB-KCHaLbŒônmyQDfg #UÅ`ýRsêºf¹Üöý˜1ÖlöG/•²9pGGI⚆ y&˲ï'ºŽ0V’„j^]m¶ÛþÃÄX‰cç¥TÓ H)×뽉 ×÷#p°!†¡)ŠED’$Œ„Œ• ˆ³Y7Mð¨*â\i6ûù¼‰¦aŒeÆþ}–¢(š†ã„g³æúzS–•“''ã˜"$ß{ï„®«IBT¯®6!ßE±ï'§Oφaò¬†j*\ŠR&Ë’aà0$Ýn0=¯T:–¥‚O¬i˜RŽ4˜6óýX×±,ËËW®ÔJ%×¶µ("Š¢@jÛ×E…1®ëê‰SŒ1¶¢È¾«*Ö4Üë…ù¼uüøDY–“„QÊ2cy¹!IÒÑ£¥y)E–å ˆDªªBÁ Q¹ßu]•$>:ê€1g^Q”(¢š†T­­5eYÊå¬Á8\ð.~´$IŽc\º´ùÐCó…ŽeÖ×[†¡Öj]×5UÃ2(Š\©tVVŒA캦ïÇIB5 åóöµk[++ JY«å?ôЕ•†¦aŒ‘çEqLl[_Zª†V,f¡b]ZªCáÊó£GKõz¯Ùì80zàÀ(äºßzkƒ1ãèÑR%ðk«å:4fYZ¹ÜŽ¢dvv$I¨¢Hޝëª,Ë£å寕+µ£GK•J;IØè¨cš*ð½¢(²,!$/.nŽŒØ÷Ü3‘$DÓp·´Zý~?Êå,oY– Cu}y¹A)»|¹–É”rßm[#„ŽeÊkk[ž…a23S¸t©ªëc ž…B)Ùpck«Ï=㪊b–¥]½Ú(•2årëÈ‘qÏ C…hyaac|ÜuC’dËқ;ª*)cc™µµ¦®«årËq ×µ*ŽÉ²Ôë…#„J)cܲ4ÓT¯^­»®U«uOœ˜”eym­ñÉ“Sq|]Òj5_×±mk  A‡& I …Š"w:®#h vÓ8¦îbLr½Óñ§§óŽ£SÊGGµµ¦¦¡ååúÄ„«(òÂBennŒ¼$IN`*”šÆÇÝþ³mY:cÒÔTþêÕš¢HqL66Ú÷Ü3)Ë×S¢|Ó0X’$EQ2£XÌ‚ÿ麦,KõzÏ4Õ‰‰¥Ü¶µtm’„nmyù¼=77ÇÔ0p&chÎfzÝ£”9R²,=ŽI.g‚s¥i8—³ºÝP×1x°œsËÒǨպœKGŽ”l[ï÷ã$¡®kQ á„P×µ HÛn”²Ã‡‹Ù¬É‚˜1žÍš`gc®kiš iÒLÆ ”Å1!„e28f)½^D)w]+âééçŒ ^Œ‘a¨®kaŒ’„9ŽnšZ6kAñØXfdÄQUEQ”|Þæœ[–fYZ­ÖSåèÑ’ªâ$¡ù¼­ª(›5}ÿúY…‚ ÎKê@š¦^,f¡`žÏÛžu:þØX&Ÿ7 a¹œåБtÊÜÜH>oEq]K×q&cȲR¯w³Yóðá"cL–¥|ÞV…šÍ| §Û }?:t¨èº&cÌó¢‰ ×45°·)‹‹›““9Ç1ëÀh¼Qí—)epwJy¡`ƒNO=[EQt]-•\„Ƹ뚒Äëõ^©äNO ~IJ¸6¥4—³t]…PÙ4µ|Þ–eÉqtÃP s  jw8!å+_¹õ->)`olŽHËi\2ίÿ„ š!|QJ¥ª—7¸D&„aŒ [6œÂR€ ;ÀEÀT9Ip'B DJ»öŒš(W6cDW¯ÖNšVUté»~:4 ¿ †š–î¬â\bŒƒouêÔý÷ß/”¢€À{ÆXÇïºâÁ]»jY– !·²ÍC´E[´oc{íUéO·úJ›UYD[´EûÚ¾¥x仌h‹ö"º»Öä¥U‡ö1„ ìgÞ¶‘#­‹¶h‹öÛNÿŠX´E{_¶E , b`!ÀB€ßOˆVB Þ—€ èúÓŸZ­ÆX¼¹âfTÒuýêÕ«¯½öš®ëïøœ€à÷Ôª´ÛmBˆ0/{S)‚^¯'/|Çc,¤÷NQB‚B€ïDQAJ°€€€`aµçCeáñm¹Ê~y‘òà³Ñw8þS’Ý^*!„àc¥)Bƒ;‡ÿ#E°ï²·A€cƒß1€ÅÉI”RxË—$Iƒ¯øºA$©,Ë{Ô]dYîv»œs×uo6£»OÂá]1QÙ¶=8/Ïó4MSUõ?š¬¦iŒ±mºà.`Î9B¨Óé´ÛíTíiš622¢iÚàÃï£bKïž¾^svv–sîû>BHUÕ;pUcÕj•R Z!T(,˺™ Cy†RšËånƵaJ’¤ëú]ã9kš¶ººúÇ?þñÑG½ï¾û‚ @%Iòì³Ï>üðÃ÷ߊ¢¤DƒÚpiZÇbŒ{,//Û¶](Ò#Cƒe@MLLLLLŒSJFJ2Y–Óú „PJ>Y–K‚Ð[;= Ñ6÷iðjÛç¦(¡ôîŒ1×uÇÇÇ%IÂ7 ß÷SE³ëÕÞñÿ;ÛB)Íf³“““ããã†aT*•~¿?HœmÙIÉÁªªv»Ýv»=¨°v^dß1Fyùå—›Í&8V’$%I†t·eY¶m[–ï‘Ò4Í4ÍÁ_UUÍd2þóŸ—––öpaîòXUUðNóù|­VƒwR·Z-Ã0z½ža®ëÆqÜív“$Ñ4-›ÍbŒã8ö}Z’¤~¿ÿꫯŽollPJWWWÏž={òäÉ}DåöÚ BD !ÆX«ÕÚÜÜL’D–å$IÊårEº®÷ûýJ¥²Ôjµ@Ì’$©×ëÀ—œóf³ z´Z­ú¾¯ëzår™‚ò}ccTF½^ït:Û,g£ÑhµZªªRJËå2øWý~¿Õjm38Š¢BÊår†º®·Ûíz½®( ¥´R©À€=σ۽ÇÜ  ”‚"‹ã!Ôn·777A+• 8ŠƒâW©TºÝ.P¬R©¤ÃŒùûT«Õ}º±†ý¡}h}}ýÂ… ¦i¦»#„¢(úõ¯½¼¼<66¶°°ðÜsÏɲì8Îßÿþ÷+W®d³Ù—^zéâÅ‹®ëRJw~a(,0ø! œœsxíÔÔTêýæóù|>Ï9¯V«ãÉÉIY–s¹Üêêj»Ý.‹¦iAຮïûã(ŠÀTJ’ä8N†aÎÍÍY–ÇqµZM’DUÕF£‘ËåJ¥Äu[[[`6Óuõ<¯X, BÈææ&ØÐÍãb±xíÚ5˲ æi6›ªªÎÌÌ(Šâ8ÎÚÚZ’$Q%I233£iZ&“©Õj`Šß—5õÄK’¤ÕjMLLÀ|766Úí¶ã8Ò-Ùív;I’ùùyUU !+++ý~¿X,&IÂ+‹”Ò]ûd³Ù}'Æ g§§§xà³gÏaBø·ãá yä‘ÅÅÅ_|ñãÿxê V*Œñ‹/¾Eða­V Ã𡇪ÕjÏ?ÿüÃ?<11Þç/IhöÔÁ‘†³<_¥ïß¶ðð„OE£€Ñƒ)ƸÙljš†1¶,«×ëqÎóù|Zû¶¶æy¤¬²Ùl6›M¿à–†1`—À¤är9Jéúúz«ÕšššÚiÐ@GH’dšf©Tséõz’$‹E0ÈëëëÏ|ÏüLH,ƒcÜét4MÓ4-IÎùèèhZçÜ6EQ TI§ŽCšØƒ³­OjÓÏó€ou'WËÓ°(Š¢¹¹¹'Nœ={è*ØqœÏ~ö³žçaŒÁ D]½zõâÅ‹GŽyá…>ÿùϧ”L¾¡³ÀÀâaöûýZ­¦ªªa)߀`»®Ûét`¿A«Õò}|6EQ Ãð}ß²,ð¨Á'4 IJZ­BÌ–æ1ƶmonnöz½$IšÍæÆÆÆ¶!Õëõz½Ç1Ä~éö’A^„_Á€7›MÈB÷z½µµ5°íé[o«Ó¼H’$ß÷+•Šïû£££@UU766‚ ˆ¢hss³Ñh¤I,ÐkAÔjµ8Ž}ß_[[ë÷û ºqmoÖ§ÕjAå¨7›Mp^îXÛ›jí(Š>ð8ŽZ˜1væÌ™ååå^x¡Õj-..þüç?¯ÕjI’<ÿüóÇŽûä'? OqC¡Q–å­­­V«µ¿=øàƒïRÿAÈA¿ß÷}_UÕ±±1pö‚ °m*Lº®‹ôz½0 GFFÇ­Ì ^ jMÓÇ¡”꺎1n·Ûžçõû}×u]×eŒÙ¶MãQår9(>¥]×»Ýn¯×ƒ"ÖÈÈH,çR>²,w:ØÇc¤<Ïó}j3º®+ÃÁ|>¿k±*µ{/^œ™™Éd2à¼K¾ù„X!T,A'*ŠbYVNÇó<Îy.—ÃC.Ú¶mŒ±¦iN§×ëyž§ëz6›…‚¶çy½^϶m]×wö­‡²,«V«!„t]ßÜÜ4MœÒwÏmªª‚2:|ø0èÄwÅ»u»ÝJ¥rüøq]×)¥†aär¹ùùù\.—ÏçMÓ|ã7–––fffî½÷Þ×_Ýó¼'žx!4::zþüù‘‘‘ÑÑQI’Þzë­õõõ{î¹g=®,õ«_½-Šp›×7h{·å )¥ðÅð[ôEÓ³`×ÁàÆˆâv½e dg(©,0ÎpBÆ8½ËÍn½k ö›ßüæƒüàÄÄÄm1Y7#iêùCÂ6fì X`îàI¦Ñ d Ò¤;û ~Jk[ã¶0‰išÿüç?ëõúÇ>ö1°ù·Å§×ŸB!]×Ã0ô<Ï0ŒL&>ˆªªé¤”…0Æ Á®xp¹|ÛÚCô !Ç­G’7; ‚´Wƒ#Àß» ¤.å~¸ ä±#ÃÿbÀÿS’¦ü­ÌDq[ä¼­ÏÎ/ñÜáIT»¥ÿ‚¶ô«BPÈ Ã0]b Fªš!mYÖNjKë¿°-ïþ¬w¼ÔÞnñI´;Sÿwsßvð.x¶aÛk é¿©MÞÖ[a*û+%»·(“û±.èØÇü>‡CH%A(!Àw" ·)è°7àá!A‡ÛÜ–2’€$IqCAKb Ê6ï×3!w„.¼m€‚{ûÏ{T¿„¿ŸÒ+2", X@@@°€€€`!ÀB€„ , X@@@°€€€`»X<" °ø®ùd»€À0 ðâ⢠‚€€€€€À{ Y¼‡M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`Ÿ ýªµÀ]»ÄwñÜBð¨Æ°}ôD–e„!dð_Jé°=¸ߣcL|çN„¢(Cû•ÀÁ‰»®›ÉdZð†°ÀwºÒU…R*IÒ§?ýé/ùËßÿþ÷ÿò—¿(Š2 º¦922òÔSO}êSŸš¥”...þò—¿üÙÏ~F‘eyì0Ls||ü£ýè®F˜s®(Ê«¯¾záÂ…!¡Éþð™¡qüøñgŸ}>ÿãÿX’¤aø¨4ØÞGydii‰ïÀÙ³g§¦¦¶™è»›~ñ‹_ð=qõêU]×E¦àò™Çùö·¿Ýëõ8çQB~ðƒ ƒ+Š"Ëòç<ŽcJ)Äx„8Ž9篽öšišÐstÙïÿ{BH†ÉMP­V!Ä|GÞÏ}îs/^åJI’„sþÃþpHX’¤_ýêW ½;­MEœóo|・»©ñÜsÏ'ì¤cŒs^.—Çüþãþûïÿío k“$ ,Ïð0ðëüü|†`uw²,¥”Rº°° ªê]ϲ@ßýîw{ ðÆÆÆ~àýɲlYÖ÷¾÷½W^yåŸøð.ÆxØ*Ì÷Þ{ïÕus¾ëô!½777‘°°9wö±]‚Úæã?þÍo~S’¤8Ž5Mæµ4 ÌË}TU5 CðýÝãkìß¡3ÆdYþÛßþöôÓO3Æ4Mƒ´ÍЮe¹\3{³œóv»]«Õ -¸_ðû °6Nçk_ûÚc=ö / „ ùä“ÒT€9á™gžÙ{'Ö… 4MÛ×;±î½Ðéƒ8?þø¿øÅ§Ÿ~úõ×_’½ÐÒmÀ¹\î±Ç;tèP’$ gÏžM’d‰ð裦¥í´ÒçλvíšØ }'zPCû4ÒÍÌìØÞaƒ|×óñͲ²ÃàNƒg˜n<N"ìÑa8yC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@àmøf<ëð1â3MIEND®B`‚httrack-3.49.14/html/img/android_options.png0000644000175000017500000010202615230602340014432 ‰PNG  IHDR@µ6E ÊƒÝIDATxÚíw\G×Çgëí—&ÝŽ , `oذ$ö[¢Q£FML$OKŒ±&}-ÑØkˆ‰%ö®1Tì‚XQ:\nÝúþ1›û€"E‰çûŸÃ²wwﲿ=gÎÌœA€R ·x»žx‚ ˆÿ>ö²,˲ü²ŽLQ>²,Ë¢(­€—©[š¦I’|êvEÒÏ=ÈS·“$IQT>1<x`xAߨ¸DWWW___FÃqÜãÇ322 îó,õʲL’¤$IOÝ¡sçÎÞÞÞ¡”””;vr1ØK<I’ø,Î"Ÿô% PÊpuu}ÿý÷ÿøãÔÔTQ±H233><~üxŸ¢ø^ww÷àà`gWŒàààŽ;>~üÇä<èØ±cPPPA§íük>íü«bçsìðv…Í$IjµÚáÇ߽{W~6©©©'Ntqqqn!çSÁ`èÔ©Sƒ œuHÓ4BhÍš5ø€&‚,ËK–,QvpþH“&MzõêU¾|yå ±ãEÕªU«W¯^+Vtn«»¹¹5kÖÌh4ÃÀ¿,Œ *`Eq'‚$IXiØã8,¼ÐÐЂŽû@£ÑضmÛîÝ»‡……ðÿýßÿ ‚põêÕQ£F}ðÁ·nÝaîܹÎÆíäÍ›7gff&$$X­Ö¶mÛ:ŸhìØ±6›íÒ¥K‹¥K—.xãˆ#,Kjjj­Zµ ^üû[¿¡˜˜Y–yžWœ¤3<Ï˲<|øð‚!+ŒN§k×®]LLL×®]ëÖ­[PÀK–,‘eù§Ÿ~BEDDØívY–çÏŸ¯ì€Û¶m[Y–±Ož>>‡§”‚øí·ß.^¼¨V«)ŠÊÈȸ}û6ðˆž ÀüôÓOqOÎT‹¢È0̦M›,XðÜš… œå©¿‚€·”§*¡dΛ¯9-Þ"Š"þ+~eà$zÒŒ#ç§ŽÁ&`°%ð ¸éʬ@çö³óžOqƒÿ;4ZÙ¦Pè˨S§Np ´ X™ @©ƒÎÊÊ‚»¥UÀÄ€Ò ä0¯%„~î²,#D<«O‹ гFƒ(\  ¼6«T4B5ãXd+S–$Y’ä|•eDˆ¦YIDQè΀×$à‹ÓD‘AHž ž—H’¤(YdY&4ÃüWáŠzIÙlèþý;¾¾¾ÚòåYðÂPò&’fÏžZ¯Þ³9õôé#AܺuÆÃÃËËËxëÖIBÝ» ï`·[ ‚TÌ0(3-_¾ mÛW/[V¦(0äo`>i‡¯DÀdåå=¢i !»É”n·çåå%#”Be²³"„l¶•ŠâI!DQ²JEȲeeš†<žÓ2¸hæ« ¡)ŠÁ!4*"¢ãŽwêÔiP]7kµúŠÃ%‰£(D’4A Y–A¦i†$Å'bÀÿ@’dzzºÉd“ ½½½u:ݳ|ø§–eY£ÑY,•Jjß¾ïÙ³¿GDtoyçΕrå*U®~ûöcFP–ÝN°¬ÞÕ•JN~èp¸Qa±È©©6„ôØ™ç;¬rÅJa뢇¸À< @i ž)ŠJII¹}û¶J¥ây^«Õ <£ðe w!$;ö›ÝžM’„Íf‘$ã¬6[Ïs’$'%]Ü´i^ݺÃRRöܽûWݺCCþðÈ5bt:÷›7Ï¥¤liÓf:îˆRŽŒ šèõz\Á$//—+äb” “’$©ÕjµZ›› OPzCh•J¥R©ðÊ ¯¤ Œ%'ËèàÁ塈ˆ6A(ËA¢(Êf³%%óö¼s篔”[åÊݽ|™ÌÊJ3›ïÓ´6%eŸ¿%†Ñ ‚YÉrI’¤×ë=z´víÚ”””   ¶mÛªÕê|•;«àʲl4%I2›ÍZ­öòåËçÎëÙ³'®OPêÁápÁqÜ‹Ïÿ^‹¶ñìw„¤V»K’™$õ*´>1ñVTT‡¦Mûäå¥fgß k✂Æê=räH³fÍ.\xþüùO>ù¤cÇŽ=R©Txæ4.G€§\ã-jµú‡~X¿~½F£aYöÔ©S³fÍâyï£ÄJô¤˜(~ 8OÈvÞøOn¼0¢(úùù…„„ †çV1㸗ìÒåÓèè÷A(X)Óá°FT­äë[!:º+BÈaaƒƒ›åå™rr?¿’äÀ -Y–Y–MKK>¾zõê®®®¹¹¹,ËæååU©R…¢¨+W®>|øÒ¥KS¦L1Ÿ|òÉ!C¶nÝ:~üø)S¦xzzŽ5J«ÕÞ»wïÈ‘#¸Ü·o_QçΛ‘‘1nܸÌÌÌeË–Y­Ö£Gâ5#­Vë˜1c¼½½çÌ™³~ýú‰'~ýõס¡¡_}õU»ví.\¸ Ñh^,/ì„ÍfsZZšZ­æ8®bÅŠ/üøÑE9™J¥aY5I’jµ† H†QáÊ· ð¬J’ÄÀÀšÛ·§Þ½{±yóþ•*Uþé§í4ý»JåÂ0éé—yÞF”ÒÎËËÓétÎ]G¸Ü®ÅbÁ½Ûüñûï¿ïp8 C·nÝ®_¿Þ»wïÙ³g—+W®K—.999 Ãèt:ƒÁðÛo¿]½zõÌ™3¸ ïÈ‘#?ùä­VK’ä¼yó7nÌ0ÌöíÛÿüóO†a®^½JQTŸ>}BBB-ZdµZu:Ý þ€ }I’aܲ{U#±ž¤Ë¸;wnX­fsÞõë×kJJÒ•+^&“)55e5yyYYYy®®<Ÿg±dHR}µZ-Š¼Ã‘ææV6+ë1ÇÙæ¿…ê ‚`&//Ï9`E¯@…Ý»,ËÙÙÙ&“) €eÙ›7oÚívžç9ŽËÎÎÆ­\\¤;>>¾lÙ²¾¾¾øeFÄ­[·<<<$Ib&##C§ÓÑ4MDnnn÷îÝ:Ú©S§‰'ÚíöÂ×­€WK?k©‡— à'©Z9//wݺ/T*–ã3gö'û–-3"ÇÅ‹gpö71qÏ[(J>sæK—N ‚˜xR’DQä*U PæâôR@@À… 8ŽCñ<¯R©²³³yžÇ 1ç["äY}eùº‘œ+t£'«ià}H’ä8®B… »víÚ¹sç‰'fΜ¹aÆ 6àµ3 „J,~¡råÊeË–ÅÞèŸ4âžïyH’’$Nìj5k0$IÊ2ïâB2 i0¨õzµJ¥r8²ÝÝ]H’rwwE3Ã0¢Èëõ:•Jë¬1’$m6[çÎ322~ùå—òåË{xxxyy-_¾\¯×‡‡‡[­V¬jÿ+W®ð<ˆûÊÔjµ‡‡V8MÓ<Ï7hÐàáÇ·oßö÷÷÷óó;~ü¸,Ë5jÔÀeõÍãk0S§N5kÖ Aƒ–-[öû￟?þÂ… Z­:“ö½ÆÍÍÍÕÕÕÍÍa˜—?Zé ‘$‰N:•)ãiµZnÝJ ML¼Õºuk‹ÅºråOÉÉw¾ûnÖÖ­[Þ}·ûæÍ›ëÖ­{áÂ…úõëÛ톡±›Å³X,uëÖ5jÔ˜1cÎ;xôèÑ]»výßÿýŸÑh|ôè‘^¯_°`ÇqF£ñ«¯¾jÒ¤Ipp°Ýn÷óó;xðà÷ßß³gOŽãL&“ÉdjݺuÆ {öìùÉ'ŸdffNŸ>ýƒ>¨X±âõë×ñzSJ //¢(Ÿ)S¦X­ÖàààmÛ¶yxxT¯^÷§ÃS”˜z†ILL|ôèÃ0‚ T¯^½L™2»i‹õÑGÒÎv8þùgåÊ•ÝÝÝÕjõ… ¼¼¼ÔjÕhšÎÊʺ{÷îÁƒÃÂB:DÓôÕ«WË–-g±X«V­zýúõÄÄÄJ•*‡……*A‡£eË–+VÜ¿ÿÉ“'õzýwß}׺uk‹Å"Šâ²eË:wœ¼k×®f͚͜9/è”pîܹnݺÙív–e[´hAD‡²³³·mÛvëÖ­Q£F=Ún·s—™™Ù²eK½^ODZZZ… êÔ©S·nÝJ•*íܹóèÑ£sçέX±"´†¦éû÷理¤ð’$srr” ®Æ²X,YYYYYY6› ûFü)»ÝŽþ[a‹p86› ¯a#Šbff&nå*k1 ‚?«HŸB9¯Õju>/”p*Ká9óÂ_$IfggߺuSeƒÁàéé)Ir³fÍ4MRRI’UªT‰—$¡gÏž&“ièСÙÙ9/^ ¬”••Åqœ^¯/(“±¡ÌüøãÃÂÂ8ŽË—yv¶WySlçãç[Îù³ùÎ %/]œ…._¾<Î4©TªW’…Æ­í´´´C‡>|èÑ£G®®®÷îÝ=sælVVöéÓ§¯]»æp8üýýOú³J•*?vss;qâ¸É”{õê5„ÐÇÏœ9S”!Çø›P5yòä:uê@d ü»£h•J¥×ëu:^¯ÇmÃ|Ò&IRÅ6mÚ$''¿ðµúûû}š7oÞ§O»Ýþ²Úíðº(F7I’yyy~ø!MÓ!!! ,¸ÿ¾››Û°aƒƒÏ;7bĈ>úèÒ¥KÛ·o_¾|ùìÙ³u:Ý€êÕ«wóæÍ„„„û÷ïùå—Eɲœ˜˜X¥J•óçÏoÛ¶mïÞ½Û·o7J Œ_0:N­Vûùùedd¬X±"$$D£Ñ˜Í朜e·œœ¥Ñ+I’F£¹uëVÏž= tóæÍ­[·.Y²ä·ß~£izÀ€]»vMJJÚ±cÇöíÛ,Xàææ¦œº(À.ÝH´s«ð¦3I’v»½R¥J‡š3gδiÓ&L˜Ðºu믿þ:""bݺuþþþ“'O6™LÍš5ûþûïív»Ùl>r䈷·÷7T*UhhhRRBˆçy—¯¾úJ„V­ZùûûߺuËÙ‹¢h4׬YsêÔ)žç=z¤Õj/^Œ¯Óy='šþ{q I’†Y³fÁ`5jTjjjÆ #""6oÞÜ£GQóòò²³³£¢¢®\¹b2™L&þìs¿;Ø`¿Q¶¢Ùb$±°†u:]åÊ•—,Yrýúõ_~ùåîÝ»]ºtÉÊÊJII)W®œ$I<Ï?~üxøðácÆŒ¡(êæÍ›}úô~üØf³5hÐ 222(((!!g×6mÚôçŸÕ©SçôéÓaaaÇ=5# ¥&‰UÄýpÏ$IS§NmÔ¨QTT”$I]ºt©S§NåÊ•?îíí}åÊ’$qGqVV–(Š<ÏwíÚuüøñãÆóöö8p`||¼³Jóërþ“ÝnŒŒ3f BèöíÛŸþytt´««+Î0“$ép84MÁv¬(Šåʕ۳gOzz:Annnjµ:--­yóæçÎ;wîÜþýûüàÁƒO?ý4;;V‡þým`%?´aƱcÇRåååEÄíÛ·B*•ªU«VW¯^½~ýºŸŸŸ››[÷îÝçÌ™cµZyžŽŽööö6›Í—/_ƇÁÊññ(«|ï †al6›ÃáÈÌÌüòË/ïÞ½ûÓO?á~ ììl»Ýîíížžn±XT*Ö<­[µjuëÖ­ÌÌÌ Ô¯_?)))==ýþýû•+W¾zõj³fͦM›±oß>Ü•åÜ] í+°KY¸è!4îéÙ¼yó»ï¾i·Û÷îÝÛ©S§ 0 Ó¶mÛ¨¨¨wß}÷âÅ‹÷îÝ[°`A¥J•"""pþ911ñÆåÊ•Cq—™™©('++Ëb±äb™™i³ÙT*UFFFPPÐ|0iÒ¤wÞy'&&fúôéMš4©[·n|||^^Ž„Ífsnn®ÅbéÞ½ûï¿ÿÙ½{w³ÙüÇ,[¶¬gÏžµjÕjÓ¦M—.]RRR.\¸°fÍ»Ýþ¬JÔ¤I“ŠBó<ïããÓ§O´´4£ÑøÑGMž<ŽîÖ­[™2e’““ëÖ­»hÑ¢Š+r×¥KƒÁ`2™8f̘òåËéõúÐÐÐàà`ü^([¶l£F¼¼¼ð¨¬¨²eËFEEy{{K’$Býúõýýýqstt´Åb‘eyìØ±­[· õññqqq ¯^½º$Iݺu«\¹rrr²»»ûìÙ³[·nm±Xz÷îííí}ïÞ=??¿™3g6oÞÜl6Cü ”jÜP,JZ ¤†qqqÁA/Çq&“Iq›®®®8É„TxL•Ñh¤(ŠçyŽãÔjuvv¶Z­V«Õ¹¹¹øƒF£g³œ¯ÁÅÅÅápX­VÜÊ¥(ÊÅÅÅb±ØívµZ­×ë ‚À}¹<ÏÛl6NGÓ´rL†aBx5~/àËS6â#CVìÒ›…&222Š+z<¶Y9¢âÄœ·ã<ráˆ%$IMÓ’$aPeç\î|V.Š"EQø Ê êÿ&ÓI2ß1EQ,x%/J·~ð¦d¡á0 ` @À€€€Ò(ಸØ`ƒýZì¿q6ÔO€’ö®E¨[N;ÏæêÔaY–Y–¥i¦Sƒ vɬ{„Áyåg­D?×ñÒ4ššªTºà•‚•i4q‘©çxàÂ×FÂË#,^¼ø—_~¡(깇à‚…Ö­[· &äää(õd j³¨m`(Ý% n½\v·Øm`HbÀ›W?³ 윕Fÿ»ÔH>PÂá‚ztÖ,]tõðZo!ù’XÎ13Ø`ƒýfÚ‡Ó™™™ðž€R x`°Á x`°Á<0¼5n€€0 `@À¼?uv¡sGó €W+`‚ (Š*¨Fš¦ n/ä Ã(Ÿ•$ þPEÑn·ç«ÐCQT^^žÃá(âÌaI’²³³ñ|eµZ­ÕjÁ!À«°(Šƒáðáà 4ÈÌÌdF)ÛC’dýúõ§NêææÆqœ$I’$ẘxl‹¢(Š¢ÑhܵkW@@@JJŠJ¥ºvíZBB‚RûÇygø÷@áÐÅ“;IZ,–û÷ï‹¢è\ˆG–åüÑÏÏÏl6»ººâ=Y–•eÙd2ɲìááâ8Îd2Y­Öððð5kÖ¸¹¹éõúo¿ýöÑ£GÇÏÊÊ’$I¥R ü¾€Z¶ð2Œ¢(Š$É|¡2v¹ØïÚµK¥R!„vîÜY¶lÙRõÕW_¥¥¥µjÕªM›6¢(bÏ,²eË®_¿n6›çÏŸß©S§²eËÞ»woÞ¼y)))ï¾û.ÞjúÀÓ}jq×FRrNÎ¥izÀ€«V­Òét+V¬ˆ‰‰™1cÆ£G¦OŸÞ¹sçnݺ?~üòåËݺu[±b…Ñh<~üxß¾}³³³OŸ>‘‘a2™Ž9‚ºÿ~«V­6oÞœ••5|øðÞ½{+‰1Xl°[ùYìùÀι+gÃÃÃC§Ó!„† Ø·o_\\ÜŽ;Î;×´iÓ}ûö9r¤}ûöË–-C©Õj†aÔjõòåË7n\³f͸¸¸€€€5kÖ¤¦¦^¾|yóæÍÛ·oOHHxøð¡J¥’ŸPøµ öÛ6¸ØX!ßû@E|D›ÍV±bE­V›••åååE’dÓ¦MÍf³$I•*U²ÛíJJL–eQÏóv»Ýjµ6hÐ@Å=zlܸ144ôöíÛeÊ”á8Žx¼}Áû%x`HãíJ/®Ru'¢išA’$»ÝNQA<ÏlQãë`Y6//¯C‡4›Í'N¬U«ÖìÙ³•&xû‚ vA\ì$–¨J¥R«Õ8Û¬4‰•ƒ’åröœ½èß™4š&IR£ÑìÞ½Ûßß×®]6›mÅŠ£GŽŠŠ 3›Íx…þiK–åû÷ïß¹sçîÝ»·oßNMM%;[;wá:¿9$IÂÂÁ³Ò5•žžžššªÓé6mÚÔ°aÄ„ܨÎwa> v¾ºxX–e•J¥Õj{ôè!Ë2I’‚ 4hÐ ..N§ÓáŽ_F£,LL„V«Å™då³xÜ¥^¯'BÅ>}ú 0 88xÿþýsæÌyøðaTT”‡‡Gffflllhh¨Åbn$xz8œ™™é¼VzöÒÃØ[ÚíöœœçÑË,Ë–)S&==]­V †ììlY–ÝÝݱ›ÍÈÈpsscY– “ÉÄq\™2el6›Éd*S¦ AjµúæÍ›ééé!!!Xí éééU«V­\¹r^^rZõ–lçÕ‹!`¼I’4M;»DY–9ŽcGÈx–Ïóx†a”èçy|œÓ’$ ÷*Y­VWkµZš¦‡ÝnWšÓðÏì‚.^M„$I‡#ßFœyÆ–¥¢p<ÃÿŠ`á¼—²{u›Í†ÇxɲlµZ•!Ö<@a’ÌÊÊ‚»¥5 ·J±€ai°Á.uöß­b¡<0Ø`ƒ Hb0 `@À Þ^Š4×m‡›%çZI²(uà袨×h4*‹ Pð<Ÿ——÷ÜùðôsÕ«Õjq}v<›ê!€ ö+µI’E±^½zÑÑÑV«µp?ü|L„ÝnÏÍÍÅÇ… 6Ø% `»Ý^”r4ÏŸÌ!4¼®Z)ðúLì\Ñî©o’$M&$± dPªGR¥¨·`yIü“Î7X9г]Ä„/‘géñ7ƒÛ¥0”fwm$°ÁûµÛÊOðÀPŠšXPÊÛÀ΂°Á~óí¿×â†w”n 0E†ÈÎΆ»¥ÕÃÚH`ƒ]êlå'x`€6ðÿ¾!J;ÿš/üë¡_àá.87˜¢¨¢Txáy$I¾ôã–(Ás@É X–e†a´Z­óèI’L&“ó„ãŽ$I à ük^^Ïó/6'Y„b½_ðWƒÀ¿MÀX½=Šç8¸ÃUïºuëöÑG™L¦•+WâêYÿP½:.''gëÖ­ÉÉÉ+Vl×®››Ûs |=UeÊ”1›Í<Ï?WøxÐîÝ»ccc·oßîááQ”O@é0ÖÕŸþ9`À€Š+R…7úûûwïÞýæÍ›YYY¸})ŠR ¼§â·±ÃjtÞ®œ%>>¾{÷î¢($&&~õÕW¿ýö[õêÕ­V+~•('—Ÿ€ƒmQI’¤i:;;ûË/¿ìÛ·oPPÃáÀûà˜ŸËù:q[ ;;ûâÅ‹ ]àßÙÆ¥z8P®\9‡ÃA„ !F£Õj±* ƒJ¥2›Í:Ž$ÉÜÜ\‚ t: Ça[’$»ÝŽ?ˆÂ5ø°œ¬Vë;ï¼S³fÍíÛ·³,ëp8¢¢¢úôé/˲Z­Öétf³™a–esrrB4M³,˲,Ïó‚ ¨ÕêÜÜ\µZš?~‹-êÕ«gµZu:˲øt‡C«Õ:_'ž˜EÓ4MÓ ^ TPìXW–eQ9'°€¥'èõú+W®´k×®víÚõë×_³f‹‹ Çq]ºt9pà€N§Óh4ãÆûþûïõz½Á`Xºtéû￯Ñhð‘ ÃÎ;SRR~øáš¦ÓÓÓµZí×_žžž””äââòàÁƒnݺ…„„Ô­[wÁ‚jµZ«Õžø 66vóæÍãÇŸ?þ÷ßÏ0LïÞ½+UªÔºuë­[·Î˜1cêÔ©ÿùÏ4Åbáy^q¼¹¹¹‹!¤×ë)ŠZ¶lÙ¡C‡X–ÍÎζÙl8jxêuâ•Üð¡Ào>ÔäÉ“QÑêBã¶hNNNVVVçÎ5²X!MÓ÷îÝ+W®\Ó¦M CÇŽ?¾qãÆGÍš5«gÏžx¬¥››Û;wÞ{ï=oooŠ¢T*•««k¯^½pç°³nÛ¶­ŸŸß¦M›öìÙ“™™9mÚ´÷Þ{///O¯×wîÜùÒ¥KkÖ¬¹yófllì‡~(Š¢ÉdÊÎÎŽ‰‰Q©T$I&''…‡‡k4??¿íÛ·ó<ß¾}ûëׯ‡‡‡×ªUËb±”)S¦C‡ù®ÓùPjµZ’$çaØPN ì7­.tñ¦âl°V«5™L΋¡É²¬Óé‚0›Í²,kµZµZ;”XœƒÁjµr‡Òh4 Ã(«;/Ü$˲«««$I6› QÖ7U©T:ÎjµÒ4Í0LNN´Z­Ùlƹ+½^/Ë2¶… „‡^¯;|Q ^'BˆaN———½ÁÀ›‘““Søê„ùl„(ŠJÂIÁyt¤2ªot^d rT& à±JrÛ9×÷Ä¢UÆc¢'³”œ‡R<îÐÂK3:_­rLçÊu*¯ŒÐD°n-Øo¤ý·f_Å„~gAæçS÷yE§{î©‹²3ü«²ÐEŒ´Ÿj?kŸWtºçžº(;À-`XÜ l°ß–$o\ k# v)]‰Àói€$%+`(ì6Ø¥ÎV~‚€R ´ÚÀ@l°Á.ÞâfB„Ѐ€(E*j3u ä)JQ'º(êeY×y dPÖ!úGEÑh4Ο??..V-€ ­k×®cÇŽ5™L«ßü—.< ÙÝ¿?-- jV@ÉDβ,{yy•+WN„Âðó»‘dYV©T ÃÀ€ƒçy¼úç?máp8ðR ”˜~9I¬¢ €ú 0¼5†ºÐ`ƒ]êì¿ÂtB€¡Áìâ„ÐàBh^Ä€R ƒœBh^‡€K¬.´$I’$)'†¿`ƒýÂ6zᵑdY~jaI’žZ¯CIëõz•J5=à%BäææK½ ÃhµZ³ÙììN ‚0 <Ï[­Ö|êÿ¾'HòÒ¥KîîîåË—n•^~X’$­V{æÌ™Þ½{gggÓ4­¸uŠ¢Ú·oÿý÷ßëõzA°7vŽ™†éÞ½ûòåËu:(ŠøOJ$ Š¢(ŠÎ/_À Ã$''oܸÑjµ’$é”ûùù¹ºº*´H’tqqÑëõÿ]Á… †Áõõ$IR©TZ­– I’(Šrqq1EI’¥ó èв,cÍ(ÊÁñí³l•JEÓ4I’Îí[I’¾þúk†aìv{JJŠF£1 {öìqss«]»6ÏóΩ,½^ÿèÑ£ôôôjÕªét:“ÉtòäI’$àƒÅbÁ/äÀû-·ÍÒùÆB;7kŸjK’$B>QÞ³gÏÙ³gÇÆÆ^»vÍh4Þ»wïÁƒ\¼x1ÞŸçy’$ÿüóÏöíÛOš4©nݺgÏžíÓ§Ýn—$I§Ómܸ±V­Zv»]yA<÷zÀûí´_p,t¾)ÇÂM_œ¯º~ýú„ ’’’/^¼jÕª„„µZÍó¼»»{RRR‹- ðå—_1f̘òåË?|øðÆZ­vܸqjµBhxùmà‚(±,ËEa1›Íæ† véÒEÅÖ­[“$ùðáC{'&&FGG8pÉ’%YYY$I †”””¿þúK¥R:ujáÂ…yyy…—¢àåØÙ;»MœdEÇÆx£Á`X½zubbb5B¢(Úl¶Ÿ~ú)000::ºJ•*Ÿ}öY… œsc<'‰õbsîzú‹$óU“ÎÍÍm×®]ïÞ½ ‘‘Á²ì¯¿þšœœü×_?þêÕ«»wïæy:Šà•§¬ŒF£V«U©T¸+ˆçyŠ¢pæ‰$I%ŒRBkY–ÃÂÂú÷ï¿oß¾=zܾ}[¥RLš4iâĉ•*Uºpá¢E‹8ŽÃN4 /_À‚ àÆ-^-I„ÐÐЕ+Wfgg[­VÜÎËËSµ(Š<Ïcœ““#IÒ?þxæÌ™V­Z:uê£>šqâÏóÍš5ÁjµîÝ»·Q£F~~~;vì(_¾|HHBèáLJjÓ¦Mùòå>üÇȲݤI‹Å¾^¾€ k4š|Ûsss]\\8޳Ùl:Ž$ɼ¼<‚ H’ÔëõV«•çye%%Åh4º»»¯X±Âf³5Êf³)Öh4óæÍóôôìׯŸÕj-ü]ÀÿH2//¯ˆ» ‚àââ7dÈ–e±ó,W®ÜŒ3Zµje±X°+Æ ”$IE•Je6›}}}§M›6yòä¦M›æææ^¸p!77— Q%Irss üõ×_srr(Š‚Š]¬x• »Ýž““³k×.«Õ:uêÔwÞyçÆeÊ”Q«Õ<ÏÛív6«T*‹Å¢Ñh<èïïrssÃâ”$I­VF|XWWWƒÁàÜ̆ ©I‹þ7©…ž—CÆ[jÕªU§NÈÈÈE‹Y­Ö‹/ªÕêyóæ8q‚eY–e¯^½:sæL»Ý.ËòÕ«W³³³B¢(â´jµ:33óóÏ?ïÝ»÷¯¿þ*Ër¾‚µoìBlåç‹48q¨Œ±eˆaªU«&IÒgŸ}¶wï^ì{Ï;7yòd»Ý.ŠâÈ‘#:„Œ½k^^^ëÖ­W¬X¡×ë¿ýöÛóçÏ+Þ€b„ÐùíìóÙø'nâFGG³,››››””´råʪU«Z­VOOO­V‹ŽeŒ_z½^£ÑàCaO»téÒ[·nÝ¿ß××—çùªU«Úl¶gl°Á~–‹Ñ켨a¿~ýÜÜÜ$IÚ¹sçüùó[µjåããÃqœ² š,Ë‚ (Ù¯|ÍÚÇ7kÖÌ××7--ÍËËËÛÛ›çyåƒÄ€b$± YZÅÙv–ñàÁƒ===B}ûöuss[µjÕ”)S”ÕXdYvVr¾Æ-BÈf³ùúúŠ¢H’¤(Š‚ 8‹VÑ0Tèì§ÚŠf‹BcÃf³áÌ“^¯wuuÍÍÍÅÒ¥( ÇØz½^isçky#„Ê•+—@Q”V«¥(J¡Ø`+„&ãÂWwÞçÊ•+/^Œ:thfff—.]BUªTÙ´iÓýû÷/_¾[ùY<,˲V«õôô2dŽ“===7oÞÎqܼyóúöíb4«W¯^¥Jìå}}}µZ­,Ëîîî ÃȲܲeËo¾ùæ³Ï>›6mZÕªUëׯ¯Ó霃xË‚ vQˆF£1›Í‰‰‰^^^eË–MKKÓétAX,Ü9ŒoF#˲Á`¸{÷nzzzPP(Šv»‹ÒP IKÀX´J'0N5ã¦/nÓ4­R©Aà8ަi9S…cie”%îOR«Õ4MãqÑÊ\%^¡€ó%–óuùàH]™Täœ4Ë—ISv&I²`ð @‘º‘^DôÏVZÁiÇO5òí Ò€æî0 ` þe†µ‘À»ÔÙèÅ&3l°Á~9ÚÀPŠJ1Eš„‹ãÀÍ€’kÜ’$EQÏ-qA;—¤|ê¬]I’ ê:”|¸mÛ¶cÆŒ)_¾üÎ;u:’¯R®_­Åb‘$Él6÷èÑcÔ¨Q_|ñ…Íf£iÞß@©÷ÀÅ­ÈIHHˆ?yòä¸qã"""ÂÃÃ9Ž»téÒ’%KÞ}÷ÝI“&ݼy³uëÖ•+WŽ‹‹3f̘1c–,Yâææf2™6lØ@’äÇ׬YóóÏ?;’$þùgš¦;wîLQÔ¶mÛ&Mš4eÊ” èõú¸¸¸Þ½{÷ïßÿ—_~Q«Õ111¢(ÚíöÇÇÇÇÏœ9388˜ã¸gåÒœ3ÒíÚµËÌÌLJJR«Õ’$A…°KuEŽb{!Ü(}ï½÷H’4›Í&“iÅŠ...lj¢8f̘¯¿þ!4bĈ2eʬ[·N–åúõëß¼yó‹/¾1bÄ€æÌ™ƒÚ³gO@@€ .\ LNN^¸p!ÏóIIIC‡mРAƒ |||ðU~ñÅ}úôùôÓOB[·nõðð8sæŒÁ` IróæÍ¾¾¾‡ƒã¸‚mZçN#Ü8Ç¡¾Ùl~{¿à•·q˜ºgÏž‹/&&&.Y²dÈ!ÇŽcY–çyÜE1>>¾Q£F’$effŠ¢Ø¢E‹ÌÌÌÌÌÌöíÛ§¦¦¦¤¤üþûïÇÿã?T*U:uH’œ3gδiÓªW¯>dÈ5jtëÖ-''';;ûÈ‘#µk×®Y³f³fÍ$IJNNÆ93Qm6[!î×I’xžÇaù–€‚öØ¥± üœµ‘ž5ìA¯×»¸¸ð<ÿþûïÇÆÆÆÅÅ5nÜ78qÛ’¢(A”¥™pêØf³U¯^½råÊË–-»uëÖ·ß~ëáá±víZ‹Åîææf6›ÇߥK—;wîܹ388xݺu]»v5›Í]»vmß¾½Åb¡(ÊÝݽ^½z§NÂǧiÚy´ÆSóç‚ ð}ú$&&îØ±ãÁƒ“'O~ÿý÷m6[5Zµjuüøñ}ûö±,»hÑ¢jÕª™L&I’Úµk‡´ÊW I2+++444,,Œã¸¼¼}ºyóæfêÔ©cǎݸqc—.]B ÃhµZ’$õz½^¯Ç5´DQ¬P¡BË–-I’ÄGÐjµ®®®A°,‹=9BHE–eñ•:ަiN§Óé Ò€BK’DQÔâÅ‹ýýý·mÛ†76lذN:Gމˆˆ¸téR5¶oߎŠŠŠrssã8®N:•+W¦iZE½^ŸߨQ#FƒƒgI’ôzýÇ;æêêÚ¬Y3\VóܹsåÊ•»}û¶ÙlnÒ¤ .ðÿ0øGm`//¯´´´»wïV¨P!TµjÕƒÖ®]{ÿþýýúõ 2›Í<ðòòÚ±cG``àüùó¿þúëG¹¸¸Ì™3gâĉ•*UÒh4¹¹¹ÞÞÞ‚ èõúmÛ¶ :ÔÛÛ;==½zõê;wî4 ýû÷ç8.%%%<<¼yóæ‚ À ^<„¦(Šã¸±cÇV¯^½zõê#GŽ>>¢(Ö­[wÖ¬Y£G^µjEQ ?þø#BÈl6;ø@a´ÙlEYZEñÚ,Ë’$yøðá3gΨTª&Mš„††±eË–þýûŸ;wîØ±cv»½K—.*Tà8îþýûÉÉÉ‘‘‘Ah4šœ>}º^½zU«V½wï^DD„(ŠZ­öÂ… {÷î¥i:&&¦J•*v»ýÔ©S>>>8ê†å6Àû)K«QÀΑ7–¢ò0™LF£qëÖ­=zôxüø±——Ž·ív;I’,ËRe³ÙðgµZ­+Û•ñÕØ¶Ùl$Ij4I’' ÿ<°Á.ößmœU¶X,ʱ”ö*Ã0<Ï;‡ÃAÓ4Þîp8ð"Ãx‹Å"INM)ÛI’TH’$EQøøàE¿6°Á~Û’X/§&I’f³ùñãÇ+VÄòƒÆ ”PøŸE–eŠ¢X–µÛíJ(@é0z2q‡Ä a(^Z]hô¿Ý¶P¿l°¬@an@€ÒÜl°K¾   0€€ðê(RE¼Ä Ü,(9×ú¤ÜK°óô}J»ÝþOŒç ^ºtéÞ½{Ja^XhåË—¯Q£F!ë~IÀ’$©TªãÇoß¾/Y÷^)Xh;w®U«ÏóE¦öçŽÄ‹qÃm€Æf³=·\¤¡”x©^¸¡P’4.ñÚÀ˜¢€’” ¥YÀÅZÜ l°Á~£7ƒé„!4Bƒ 6ØÅ ¡Á„м ‰àxаˆ”b u¡Á»ÔÙÖF€DQfýð††Ðÿ¦/ó¬90ÿ-ɉ׮ åòU yÖvø7A˲Œkð(%¯p^úY6I’ Ã(¹kžçyžÇôðA ùì«°ñy)ŠR©T‚ ‚Pøö’¼6°Á~E¶"·â…&Âjµ&&&ÞºuëæÍ›7oÞ´X,Z­–$IE½¨dDžʲÌ0LVVÖ€._¾Ì²,®€û¬í0žì·t,´(Š,Ë:t(88¸ÑªT©òñÇcõŠOAùö~J‹wÀ¶$I‚ ȲŒ:o,' Op®P-Š"Ïó²,çåå­Y³æÁƒøUòÔíø2”‹yê1 9‘²Â6à ¡‹ÛÚä8Îáp9rÄÏÏã¸3gÎôîÝ[­VOŸ>ÝygŽã$IÒjµÊ›ÍF’$Þ‚S߸Vž$IX]Xx£Ãáp>/Ã0jµ:ß¡œïââBQÃ0ø€z½¾àvƒÁ Án·¡Óéò“$ÉÂO”ïÚ ÔØ9Ì.[¶¬¿¿¿Ãá8qâIJe˦OŸ¾zõjŽãrssOœ8±bÅ WW×ÿû¿ÿÛ±c‡F£4hPûöíívûÔ©SË•+7hÐ Q=úÛo¿õèÑcÛ¶m#FŒ([¶,A‡Ú¿ÿçŸNÓ4N˜i4šôôôÙ³g'$$”/_~̘1AAA6›M£ÑüñÇK—.Õh4:tÀJCétº|Ûñ«aÁ‚^^^W¯^½wïÞ²eË‚˜;wîþýûýüüƈ_:³fÍ:r䈻»ûˆ#5j„O´cÇŽŸþÙápÄÄÄ 2„ã8xt€R™…FOª½#„ðOE9;vì6lØÏ?ÿ¬V«ÕjõСCÇ_³fM£ÑØ¡C‡E‹©Õj­VûÞ{ïݺu‹¢¨nݺݺu«J•*³fÍZ»v-MÓE}ùå—Xó¢(J’DÓôýû÷kÔ¨±wïÞ† ^¸p¡qãÆ·oßV©T¿þúk»vídYöññùÏþ£”À.¸¦i„Ðúõëûôé³sçNµZMD·nÝf̘š˜˜Ø¨Q£{÷î©TªþýûÏž=;,,,///22ò÷ßW«Õ«W¯îÖ­›‡‡GÕªU‡ 6|øp•JÉm ”y`g?|õêÕ¬¬,žç/^¼øý÷ß7+¹Zµj/^$âèÑ£?ýôÓñãÇ###B*T?~|=>þøã;wŽ=ºAƒ¢(®]»Ö`0ôéÓgýúõS¦LÉÈÈ8}úôòåË ‚À¡5EQ=êß¿ÿüùóB±±±*•jÏž=#FŒ˜0aBçÎãââB ¨S§®ž9qâÄ|ÛqðÏ0LãÆ=ŠÚ°aÃÎ;­V+˜—,YòÍ7ßlݺuÍš5ýúõC >üÚµk:uZ¶lYƒ –,Y‚ŠˆˆØ°aÃsËmÀ*`,’^½záÄÃ0'NüÏþƒ‡8 EqïÞ½~~~‘‘‘f³Y­V÷éÓç‹/¾¸téR‹-V­ZÕ¨Q£={öìÙ³·Kß{ï½õë×?zôèÌ™3²,GGG‹¢HQA‡£Aƒ5kÖüÏþsõêUÀ“$)ŠâíÛ·§N*IÇqîîîøÚxžONNη6›­N:8#uôèQ£Ñ›““£×ë³³³;†êÚµëÈ‘#;Ö¾}û¥K—âÏ:tøðá:tèСC=ºwÐðô¥/„Æ¡ãîÝ»/]ºtöìÙÄÄÄY³f)]Ä8÷KQ”ÕjÅé(,9–eI’´Z­²,ûûû—)Sû=Aìv{“&M<<<âââvíÚÕ´iÓ2eÊ`…H’IJì7*UªôçŸ6iÒ¤eË–ø ‚5©Ñhðép£” œÐη]‰pþ‰¢(üZÉÈȰZ­ééé111ØëþòË/ .|ðàÁðáÃ$I8pà©S§¼¼¼~øá‡Ê•+/Y²Bh ‡Ð$Iúùùùúúâ>!,KåOXÌÁÁÁ ,ÈÍÍuqqAݸqC’¤Ê•+“$9iÒ¤¬¬¬¶mÛöìÙóäÉ“v»]¯×÷ë×oÞ¼y‡ãÛo¿UuI’(ŠZµjBhÏž=ø&OžÌqÃ0:îâÅ‹]ºt¡(ÊÅÅ7Å5^¯Ï·]I¿)êýüü‚X¹r¥óWKJJÚ±cÇG}4`À„P5¦L™²}ûöyóæuéÒïüå—_Ž9²wïÞ:N¥ÉK’d·Û%Ir8XcøO¸‡ !d·Û»uëæííݧOŸÄÄÄsçÎ 4(::ºfÍš'Nœøî»ï.\¸iÓ¦S§N}ûí·z½^’¤Aƒ%&&ò<ß¾}{A°Ò°<*Uª”žž¾qãÆsçν÷Þ{ÙÙÙØý>|Ú´i{÷î½zõê¸qã”ä‚ÛñqvÈ<Ï><33³oß¾·nÝŠoҤɪU«ôzýرcGŽ™””ŸíïïZ½zuóæÍÏ;—œœ|ëÖ-???•J &¥Ï˲l0*W®Ì²¬³¿Å»Ê–-«ÕjñXƒÁ°gÏžaÆEFFJ’Ô¬Y³%K–p÷Í7ßtïÞ=&&!´`Á‚ü±ÿþ!!!uêÔqqq±X,8oLQ”Ãá0`ÀÙ³g‡ªR©:t虑‘!ËòW_}•‘‘Ñ­[7£ÑؼyóÚµk«T*¼===Ýy;Ã0²,WªTÉÏÏO–e»Ý°gϞѣG7nܘ ˆ¨¨¨-Zx{{ÿñÇ£GŽ‹‹E±E‹Ó¦Mã8n÷î݃n×®EQÞÞÞ[¶laYÖápÀŠ3Àk§ØÓ ñÄâ§>»ÊŸpó'xïܹò¬ŸŸŸ <Ïsg49Ž“eY­V[­VQ ƒ(ŠþþþK—.‰‰±Z­Î9^Ü„~üø1Þ‡çy‡ÃÁ0 •ýðáC’$}}}ñÁ¯•§nÇ®#Š"n''''«ÕjEظûêîÝ»Z­ÖÇÇ/Á ø””Žã*T¨@„ÝnÇC¾àJ™€‡Vþ',µZƒm,-<¬BÙ“¢(AN:µhÑ¢øøøk×®=ë½ R©‚°ÙlEáæ.Þ®V«±ö°Ó–ŸPp{¾ËÉn cAbaܨ\I’¸Õ¾(­..γ( þ Ë£U«Vyyy«W¯~Vhú¬ã(ÛgS²½(‡-úFxÍv8γ“P NŒr6T*Î~aõÂÄ1°Á.\;ÿýùKê(Æ!1„¦P\^çÚHέeôdŒÌùìçÚèMXé©À”Äà†Ðp ÚÀ`ƒ ökhP  „àu7ìRg+?!„¡m`°Á~[ÚÀt¾~`EÙÎ6žisAÀ»Älϰ(Š*•jíÚµû÷ïWV`à6kIR’¤V­ZõéÓÇáp¾„ÀsŒKI•/_¾~ýú `(1—/_^i·¦Ð¢ô³, ·J˜¢¬¡W¤²²¸ 4ÜP(I?\”5ôK<%­s¸ @À€€ðCUJ°Á.u6‚ª”l°Á~ÚÀPŠJs ·  \¢6rZ^8߯Ø®ø'Ÿ}é×6Ø/9 tH’DQ”ó Ý/!”'QeY¦iºðÃ*jÁ{Š¢è¬Ÿ;5>޲¥XßïIEQJõ¿—xgà9m`å|n¥>¾zõêþù'v¤Êy†q8Ë–-›0a‚¿¿¿Éd²Ùl7îÒ¥ËÕ«WB]»v­S§Nppp‡RRRH’T©T¨Y³fXXX•*UfÍšEÓ4~üñÇQQQÁÁÁµk×>{ö,vÝÉÉÉ­Zµª]»vÕªU§L™‚_:°DØ/ei•bw#=5'Ì0Ì€öîÝ»mÛ¶ýû÷sm·ÛišîÓ§ObbâîÝ»úé§ãÇŸ>}Ú9s[°a‰•ðàÁU«Vmß¾ýàÁƒ3gÎdæÔ©Sï½÷Þ€Ž9Ò¢E‹äädìÜ®^½Ú¦M›èèè'NŒ1â½÷ÞKHHèÖ­BhäÈ‘$Iöïßßßß¿U«V‡ƒ$Iç<öãÇM&S½zõpœOÓ4Çqqqq“&MBuïÞýêÕ«{÷î=xðàåË—GŒAÓôÝ»wÛ·oߤI“cÇŽÍž=û“O>Y¾|¹Á`eyïÞ½“&M:|ø°$I#FŒ IÒf³µnÝš¢¨C‡-[¶lúôék×®eYVIzCXö? ¡3Z…gÀžšŒ‘$I¥Rݼyó×_Ý¿£FBqqqžžžûöíkذá±cÇöìÙš9sf‡ †ß_ $I._¾<00!Ô¾}û3gÎ „–.]0sæL„P``àêÕ«qxΜ9+Vüî»ïBŸ|òɲeËÖ®]ûí·ßnݺ522²oß¾<Ø»wo¾^ü«ÝnÇ)hç¯oµZišæy~îܹ¡¡¡8ëÞ«W¯5kÖ „~þùg£Ñ¸xñb„P@@Àõë×>>³gÏ^½z5Ö<ÇqÊÊqøu£ˆ?ßJ6‚ Æ¥K—Z­VY– C™2exž‡$ðr’XÅùA4MûøøÐ4­Óéôz=EQ8ÎŒ‹‹£iZ«Õž>}:---22{›Ý»wÓ4MÓtjj*ÖÏóÙÙÙù‚gŠ¢”žš¦•G\ÙyäÈžç]\\‚ÈÉÉÁc?6lxåÊ•&MštèÐ!::ÚÓÓS­V³,»dÉ’_~ùeûöíÿ÷ÿ·uëVµZmµZ•óÁó¼V«íÞ½û‚ A0 æÆ ,0V«511qüøñ5kÖôððHKKÃMîæÍ›Ÿ?>//O§Ó©ÕêAƒ}þùçÎ~õà·Udddff¦¯¯oÛ¶m£££kÖ¬‰ûº [x)ÃãgŽçyA ¤×ë±w­R¥Ê_|ñí·ß~ôÑGÉÉÉ®®®sæÌéÝ»wDDA“&M5jTRR’(Šk×®ÕjµæÔ©S={ö<þ¼¯¯¯²LNNN^^žr % ÍÉÉÉÍÍE5ê§Ÿ~ ëÖ­Û™3gnܸѠA„Є ~ýõ×Ê•+>üÁƒ+V¬Ø±cGvvöÈ‘#gÍšÕ±cÇI“&uïÞýálj‰‰Îç%IR„Ù³gÿõ×_5kÖìÙ³§Õj]±bEÇŽûöí+ŠbTTTÏž=‡zóæÍß~ûÍÃÃÃf³õîÝûûï¿ 6lØùóç·mÛvøðaAÌf³ÍfÃ׌ß6›­M›6;w ùøãI’üþûï'L˜ðùçŸó<_øªsP¨ØØØbøk’”eY§Ó9aòôôlÔ¨î>Ù¿ÿíÛ·GŒ1cÆ ,ïèèh??¿]»v¹¸¸tïÞ}Ïž=±±±—/_^¾|ù”)ST*¤ñ0ÐÐPœ¦iºU«V:gÏk×®]·n]N×¥K—ÄÄÄ‹/ÆÄÄtîܹfÍš5kÖÔjµ}úôÉÉÉ9zô¨ óæÍkÕªÕ¡C‡ªV­:yòdI’š4ibµZ½¼¼ÌfóÒ¥K•óâL€Á`èׯŸÉd:~üxVVÖðáÃgÍš…¨;w6›ÍçΫ_¿~ll¬››[xx¸^¯ïÑ£GVVÖ‘#GÜÜÜV¯^]¯^=‡Ã!ËróæÍýüüpP]®\¹&Mšñî»ïº¸¸8pàÑ£G'N5jÏó°T ðR вš3ÎíXžçq::߆a~ùå—ÈÈH___„ÐG}´~ýúôôôÖ­[ëõú¸¸8ܦu>2Ïó8~VÏÊve¼t¾Sã]çV%ÇqxOܱŒcr„PË–-]\\~ùåçóâ÷…³¢”‘ÞΑ¼ÒÅ%Šb¾ýñ"®øøŒÎ×L’$þ“rÁðد!„V´áq`b³Ù”Uà”³ã7‘Ífs¾6xì€×æ‹ Ã0¸+X«ÕvëÖ­FØ=ÑUàqÚ%^(­Î÷â±PØ–|WÊë:/”V£'sz¬3 ¯½ ü€nàU‰ n€€P,ÃÒ*`ƒ]êì¿–@ðÀ`ƒ 6x`€$Bƒ 6ذ>0¼­x-¢¢W¥ „ÄùìµÇþ®JY¤8›$¥=Á»lç¥| yQ Dpsh $¡iÚy¥ËgîVxawQU*ÕâÅ‹7lØ dàÕ…Ö»wïñãÇ;\UæY!t‘ÚÀf³¯`a(4 .êXx¸H† ½PÂàÚOÏZìþo¥ ŽJž|ëx=•"-/ªºÑÁ»Äì|‹ >uyQÊ@éZ¶ @À€€0 `@À T ¸¸eeŸÅË-™Yøñ‹Â?Ù¿äK„¾ÒýÁFÿ╊;éYsƒI’|)Ó†q9¯|Õ0óIÑyr3z2¿¹Xû<é›ð6-¤æ‰ó¼P(üýÌ‚à<ÁZ/¯Ò¸zÀ?¯Ç‡¢iZ–eQ•j@¢(*—e™a„.Û‡÷Á5÷оÿS/½¦úƒE!„DQ|V]|ÛñÊ¿àõ^3د×V•"Mè—eY’$Š¢CBBjÕªÒ¨Q£ºuëÖ©S'(((66– ¥r¥$I¸üÖŒ(Š‚ àçOÑŒ$IΕz4MϘ1ã‹/¾ (êÃ?ŒŠŠº{÷.EQ’$áO1 3yòäððð«W¯RµråÊÖ­[ópà~!]¼xñĉ…dÉžçñ—òööÎW¸Äùòð öÎ_‡ã8,{‚ ð÷U¾ ¾?wÆÒrÞn·Û%IjÚ´)¾|÷T*•¢CžçÕjõ©S§bbb?~LQ~¯Õ®]¿H’Tb üBÊ)ð…)r-xÛß¶ðÂÐÎî¸p÷-I’‡‡ÇСCñ'?ýôÓ¶mÛöïß!”——·ÿþ† ªÕj„Ѓ®_¿Þ´iÓ'NT­Z511ñüùóaaa5‰eÙGíܹS¥RuìØÑÍÍMÙ§×ë»víŠÒét®®®ëׯŸ0a˲Ç1 ³zõjŠ¢´Z­ò¸»¸¸àKR«ÕÏÝŸ¦i??¿>+„&‚eÙ¿þú믿þòõõm×®V«å8ŽeÙôôôÝ»wÛíö-ZT©R…çyíïÚµëöíÛÁÁÁM›6Å‚gY633s×®]6›MÙKëÁƒ{÷îEEGGûùùI’X¶lYY–)Š"IòÈ‘#—.]ªT©RÛ¶m†¹páž={rss7mÚÔ´iÓòåË·mÛÖßß_–e•JÅqÜÎ;>|^¿~}žçI’<}ú´ŸŸÇq{÷î­T©RëÖ­ñWcYöâÅ‹Ç÷ôôìСƒN§Ãš‡Ð´ô†ÐHžç•ŸØ(hóO°ÙlÇ™ÍfƒÁ0gÎA8ŽKLLD­^½»‘~ýúU¨PA’¤ªU«–+W.44488!ôÙgŸávïÞm4k×®P¶lÙ¤¤$Qm6›,Ë­Zµúä“Oðn 4èÛ·¯··÷ÆeYv8<ÏW¬Xñ½÷Þóöö>xð ,Ë_ýµÁ`°X,²,ׯ_ÿ¹û9²bÅŠ²Îw€ã8žçßÿ}­VåååU»víG ‚pþüy??¿ÀÀÀÐÐP•JõóÏ?‹¢h6›Û·oïîîÞ¨Q#µZÝ·o_‡Ã!Šâ©S§¼¼¼ëÖ­«ÑhV®\‰›!{öì1 µk×®]»¶««+ކ æëë+˲ÕjíÚµ«‹‹KTT”ÑhlÚ´©Íf›:uj•*UT*UíÚµ·lÙ‚Û)?üðƒ,Ë> õõõmÔ¨‘J¥7nþFQQQ*T C 0·eæÎ«R©ÂÃÃË–-€o;®Úÿ¬ÿ;Øo¦­üDù~/Ê!$I²ÛíƒaÞ¼y¸…&Ër“&Mš7o.˲Ýnwwwÿæ›odY®X±bË–-9Ž“eyþüù¡ÄÄD‹Å¢Óéð²,GDDtïÞ7ÏîÞ½ëîî~ëÖ-Ü„«U«Vllìˆ#"""°vìØ¡V«Oœ8Á²ì‘#Gò ¸(û7N«ÕŽ3fäÈ‘#FŒ9räýû÷%Iâ8_çÍ›7+UªtöìY|yfúôé²,·mÛ¶nݺxã‡~X­Z5Y–·nÝŠÊÊÊ’eùСC*•êâÅ‹¢(úùùõèÑïüÝwß!„îÝ»'Š¢§§ç|€·÷ïßß`0Ȳ>>ƒA’¤³gÏjµZü`áã9r$//¯k×®¸ËJ‘–,Ë#FŒX¶l™$I+VŒˆˆ8wîܳ.æ¹û+ë¾aÇ«tÃâ§œeÙmÛ¶­^½úîÝ»åË—GÕ¬YKåâÅ‹“&Mš4iÒ7ÆצM›{÷î%''שSçÔ©SéééëÖ­Ä7¦éääd///E“Îÿf–eÍfsNNΆ l6ÛéÓ§cbbH’üþûï•Õw€R9”²ˆýÀ…^Âö|°ÿþ;wîôìÙoQ©TÄždñâŇ£Q£F,Ë~òÉ'ØEoÙ²eÞ¼y¸yÖ¾}{½^¯t‡AÓ4A´X,ß~ûíØ±c•q¯¤ðýh%ƒ¥tY+#(, vÔ¡={öܺuË`0 „ºtéòî»ï"„ªW¯Þ¦M›””’$׬YS¾|ùÔÔTOOÏ=zà¶nPPPÙ²e?ýôS¬«o¿ýÖjµ¶iÓ¦råÊ>>>3gÎÄÛÇ×½{wç,f³»VY–×­[—™™©×ëÅâfþÕápѹsç/¿ü2''G§Ó8pàÔ©SC† )8ŒçÕÓÒÒjÔ¨±uëVFÓ¬Y³€€€{÷îAŸêÛÒ\‡Ã¡Ä~¸õظqã²eËÖ¨Q£lÙ²¸ G«Õ^»v-**Šã¸K—.MŸ>½\¹r¡-[¶ôë×oÏž=z½>))iþüù&“iïÞ½¸EÑ’²¬©··w§NV®\Ù§Oì¾”ïƒó¨JGh!ûã«eæÞ½{U«VÅ=.¢(ÖªUk÷îݸßXÅ®]».[¶,88¸lÙ²jµÚÍÍíæÍ›¡åË—÷êÕ«jÕª:.11qáÂ…¡?üpÿþýAAA7oÞìÖ­[›6mDQüå—_ºtéR¥J­V›œœ¼fÍšråÊɲ¼aÆnݺ8q!”½eËü5ñµ 6lÓ¦M+VôööÖétƒ‡Ä8Õ6wîܾ}ûâˆ!´dÉ’˜˜˜5jøûû_¾|yâĉ;wÆ1¹ÒåŽoT^^^hhèäÉ“ûõë7cÆ œ[³fs”Ö¡”ÅMYa]ºtÉ×××ËËKi¯"„jÔ¨1~üøáÇ;•JU®\¹>ø &&æäÉ“õêÕ«[·.<Ä0LZZÚþýûyžoÖ¬Y… –.]ºråÊS§N)‘-A×®]S©T8C›•••ššZ³fMœ÷¾~ýzõêÕõzý£GRSSCBBH’,Êþ~üxDDD•*UÎ;W¾|yüÆÙ·o߃êׯ_»vmœ ¼~ýºJ¥Âi³Ù|ãÆÀÀ@FCQÔåË—ÿúë/£ÑغukËQê¬ H*âHfEøI†Ÿì×­[7nܸ¸ººŠ¢È0ŒŸŸß{ï½7}útç¡B¸ªŒ^Â.(''g¹œs*Êè%ÅÆ§#I_­ÒZvÞ§(ûl9;¿› ùƃó]3ÎÞ9·N•·O¾±·W†v:oǪVN›Î¹¥|§Æo e;I’ÊÙ•L»ó}pþîÎãÀ”p04¢4ÚŠf_$ U† â_[´h¿bÅ www%/b45$I6›aü0á§ ÷'cu‘$‰³/ù·øø!ãyg_Ÿ]¼º¢²½èûç»)ø#ÊMÀ!¨{+Ó ”kVþ„ï#Îô:çÃp›B‘óq”íxÜ•óeã^#™ïÔø°8eˆ ¼rvå¥ã|ðñ…)ÇAÿ»d,dtKoºØ!ô³¸xñ¢««kåÊ•£²ôôtFƒ31EéL†p^m¸Þ`çX±` À›+`%ð¿ %ÆKëÁjoH^)Ð `@À€€ 0 `𦸸‹› 6دÝFÅš¤”³ dÀ³SŸ»Š]‘ÆBCÑ3(yœ×è{¦ÎÅ{êr*$IÆÇÇã2˰ª%”€ï•e¹ZµjaaaÊR»ÏZZå9®sHHHعs'®À÷^)Xh:t¨[·î³Š@Õ£'eÄá¶Àk ¡ŸåŸŸÄÂ5ë x€¤‹šÄznUJçšoPl°ßœª”4k ô#± 4 ¸¸k# 6دÝV~‚€Òœë‚60@hƒ 6ØÅiC B `@À€€x Å.våÜõ÷k€|S^Jý=’$Ÿ»:1þ.oÎÅ@q)v?ðS÷§ªúŸ#EQE_%\E†a”_yž/¼–þ.Ppx+Œ'çååݽ{×¹MÓ¯¢ìN±&IMÓ999'OžE1""ÂÓÓ%y–Ôûí·7®^½š¢(¥zü;ChI’†9tèP×®]½¼¼U{xxœ8qÂÅÅEE\€¿°*œ=3AŠW^ø€¯ìL’$Ïóëׯ¯^½:®jíü®É÷¾ÀY·nÝÈ‘#U*EQ&“é›o¾3fŒ A`}æŒvýúõM›6ýüóÏ’$)ÕÃp^”J_ûãGúúúbm$©×ë)ŠRÊVâ8»Ä‚®ËÉ9ÖÅx¾)Š2dȪU«jÖ¬ÉqMÓÎqvËØ?~¼_¿~Ó§O?~|x… :wî\PðÇ!„Ôjµ››þ+~Ý(6„Ö@©àó7nnnF£ÑÝÝÝÍÍ ûÞQ£F­_¿?ý7nüàƒBË–-[¸páìÙ³###{öìyéÒ%¬š¦÷íÛסC‡&MšÌ›7»ÇÍ›7O›6í»ï¾kÑ¢Åo¿ýÖ½{w­V»hÑ¢iÓ¦Ñ4M’äâÅ‹[´hÑ¢E‹åË—“$™¯ÕýÅ_4lØð³Ï>S©T$I6¬k×®Ÿ}öBèìÙ³'N|Ø¿š¦?øàƒÎ;oذ¡FkÖ¬9vìØéÓ§yž7›Íʆ¡izïÞ½!!!5jÔØ°aï¿þºdÉ–eOŸ>Œž,žˆÝûÔ©SwìØ«R©~øá‡›7onذ_3Ž¢ñÁ-‹ÍfÃIf³ûðÐÐÐ5jœü›ÿÅÿâïFQé-IÒÛ¦[Š¢”i*øWQß¶qïø‹²ƒ$IoÛ³Q: I’$É·ö»+¶‹‹‹Á`p~ áÙü¦¿tI’E!3tèÐÙ³g=z”$É·á]‹¿¦‡‡Çˆ#:uêT¾|yQoÞ¼¹iÓ¦+V‚@oÅü3ü5}||Ú´ióT',Ë2I’ýõ×åË—ß’{R:bflnÙ²/jþÃ? „hš~K|oDDÄíÛ·å;vÌßß?Ÿ‹þw? 6l %))I¥RA¦à Š™õzý×_——'˲ÃáaΜ9oƒ€I’$¢R¥J²,s'Š"nã ‚Àqœ,ËgΜÑh4xÏ·á]¶gÏAìv;ÿ ?~Œ› à7ÂñöìÙóúõëøå*Ïó²,Ï;÷-0BhëÖ­X½½Ãáeù“O>q¾cÿî»±sçNü$¼’$ɲüðáC½^~ýÔ®]{ÇŽøÃó<þ÷¼=ÆÏkÅŠív;öºYQEQ¼víÃ0ÿúGß]»v.à”””Ò.àÒÝ"B«ÕNŸ>ýôéÓ:tÀÏ.MÓoÛ ß   •J%ËòS¿>NïU¨P·„Áçü;(Å~ ÷m6iÒä³Ï>CqDzìÛü¿T«Õؽ²Ã0jµžûO¬Qz/]’$‚ N:µxñbI’X–Åi›·öùðáCìfŸµƒ,Ë999iii؆§ü:ÁÞ&77wäÈ‘7>pàEQ¸øm{:ñ»ìÒ¥K¸é©o1Q ‚8~üxVVI’ `ð›Òü£(êäÉ“­ZµêÛ·ï7(Š"åxKÀÃl6ÛÔ©Sñ+,Ÿ†EQÄc<¦M›öVÝ–¸PRï¡'}›ƒaÊ”)ÙÙÙ¸7…çù·¤=éZ´h‘sGÏó8$‘eyĈèíÈ¿ãÞ½{AÀÃòÁó¼ ©©©ÐüÆ=Á¡€€€Ÿ~ú ?¸ ,xK¬4€G}ÿþ}ç^“„„„Î;£· ØùIøé§Ÿ ‰uùòe–eKõH¬áXhe"N“&M¸xñâ³gϾ%c¡Ñ“aÀ®®®7àyþÚµkÇŽãyþ-¼ ‘‘‘ʤ´‚^úÂ… wïÞ…±ÐobõÖÎFz–›…àÿÎWÕ¿þ9~VVöm§qd¨ ýæ›oq}`cõöíÛiš~ùå—‡NwÁ(UUU5~üøÚÚZ0b9ßÿýûï¿ßd2©Tªõë×Ó4ýÝwߥ¤¤P•‘‘¡Õj}ôÑ?ÿùÏqqqà Œø•C’$Žãyä‘·ß~›ã8A”ôæ8nÕªU7ß|3˲J³0Ü9~üø/¾ø"999 @w…ŸDQLLL<ûì³?øàêÇFcXmîïïß±c‡,ËW^yåôéÓï½÷^Š¢N9å”Ûo¿=>>^–e–eá/LŒ½^oll쥗^ºqãF³ÙLí) ø•[³t:]EE12-º¥¥%>>nP²—¢¨²²²þþ~Y–yä‘9sæœqÆ‹/V…~ùå—A?ñÄ'Mš4T…VÞ|úé§Ë²|ñÅ+5ö¢¢"I’N8áŽã®¼òÊ`0h4ɃIII²,Ÿ~úéÃ(ùøu¿z€ ƒK–,éïï'ªr X²dÉÀÀ€rudoYYÙ×_MãA…sq”¨dF„I“&½ñÆçœsΛo¾©”Ò}}}4MÛl6A@à?þñ\pEQ~¿(u(-~]ÄoD‘fY¶­­íüóÏ_¹r¥$Ijµúª«®ª¬¬TêÕ@³qãÆ}ñÅ6›- ªTª(Ó×°3mQ×­[÷׿þ5111 ªÕj¥BÎ0Œ,˹¹¹[·nõx<'N<餓À=÷ܳlÙ²ööö;î¸cÅŠÏ?ÿüøñãï¾ûîçž{N’$³ÙüöÛo=zΜ9½½½k×®¥i:jûñ2hq·zõê›nºé…^xøá‡ß}÷Ý(öʲè]ÊÚŸ.Ë2~B Ž2Y–>Qa½zxáΰ²,ïgµ@ü"v8B²ÌP¸º¤%I¦išadØ×µ?ÿ·¢Hùý.µZg0¨ å0qt\SS_‰ûúºišr»´ZN§v»½²LåäŒNHÈA©+Ó4S ;SS‹’“­ƒŒ›®ˆ£C`ž÷Ó´LQB$E>ñRT€¢´á°Ÿ¢(A0 Í0?R°išbJ–E†¡©‹@Dã§ŠðÂàM äϲtBBf{»/66Ùl¶tu5sœÊdJ (‰¦‰µJ–epç G´ÐŠ…@ ÃÞP(Äó<œ@ÖétLJGt ŸãT‚À±¬œ‘‘78Ø–˜˜“âõºŒF“Ùœàñ8Ž£¨(Ò £Òh¯×/Šjš¦#9†¾ÎL {eØjàü×Ï7@(‰ô¿?á‹ïñ#lŸ°:ˆ‘8x<ð¤¯R©~>˽½­‚¦i ¼I’ Y)Šr»íÍÍ;ãâF^ï@||f\\â®]ë­ÖL•JãvÍ©©“”Ù‡ëH$¢¼¨V«áÜ3ñx $¹(ŠÄ{}T·‹ÊçP{íº,xERɲ !°ˆ÷ˆ”u$o'—¿<Ï‘ `Ðh’$vyÔj5x{CvýbfYŽ.ɸ9" ÜÕUOQTBBÚ¾7Ñ j ONgõùü~·Éäs8èp8‰øFt f†QÉrìX Ãøý~»ÝžœœLÔpKQToo/dN|ȲçõzÃá09ô G45 xÐ=ŒæEñ›o¾)**ÊÉÉáy~h ›ŽŽF ¾…ív{$ILL„ÿ:N¯×›šš:”Q*•êûï¿7™L'N„2 $,Ëöööú|¾œœQaÔˆ2 ˜xv»½««K„¸¸8hCËahnnV©T©©©Aë— A*ÙB+7â¿ß’°¬†¢"¥2™R$IòxÜIIqq¹»ÃawffMÿ°úÊÀÀÀÆÏ:ë,pnÄÖ¯_?eʓɴ{÷nÏ~¿|I’TRRÒÑÑáv»94M[­VQ-Kjj*x*P*·DVã%×].Pw¨z¬Ñhêêê"‘È‚ ÀmBEE…Çã˜*•jÇŽ^¯7++ $§Rÿ§iÚëõ*W×¢&Ê4˲999 ÃTUUÙl¶ŒŒŒH$ú ÉS­VïܹsÇŽ111jµº¾¾>))iÖ¬YÊ—7hûk U D!!Š’òAÔ±ZöêõzPâ`ÄÿX²Lee•JR ô'Ç„˜˜D³9F’„¸¸T»½ƒa踸¤˜˜äææ™¢¨p8 µ€û¡c ‚¥eFÅý×Du:^¯‡ÿ‰‰š¶ÙÂa àöw•J¦i‰ãŽ£)ŠÞ6ŠbYV­f"‘ M[eYˆ’ ð1¤ W”iâ%:LM¡kö÷÷×ÕÕY­ÖæææÉ“'gddlÚ´ =&&&–••±,ËqœÃᨬ¬ôù|Çååå÷mI’T*•×ëݸqczzzaa!PL ‚ ¸Ýî´´´––µZ­×뻺º’’’@BBä°yóæîînŠ¢rrr ò Ã0>ŸïÛo¿íííÕét¥¥¥àˆÐï÷WTT¸\.–eóóóGŲlmm­Ëå*..Þ¸q£$I­­­@`êÔ©jµº½½½¦¦&›ÍæI“&™ÍfÂa–eëëëm6Û¨Q£‚Á ,Ë6›­  Àn·CË´¶¶îÚµ+ëõúñãÇ'&&Ò4]]]‡%IêééQ©TcÇŽ…0y[¶lÑëõcÇŽ…P}UUUÁ`P¯×—••%%% TVVÆÅÅ555tj€8†ñx<@$°ÅbÑh4‡ÇáfEAÅäJ¹l%˲Ì0Z¯×ÝÛÛzVOOËÀ@›J¥Q«õ¢†Ù‰å÷û½^¯Ïçóz½à·úð"‰tww÷õõ•””ÄÆÆ®^½º½½}òäÉ“'Oîè訨¨Ðh4¡Pè»ï¾ã8næÌ™999›6mjmm™A¥¾ùæI’òòò`°c•ÅbQ«ÕýýýÇutt$&&fggwvv2 c·Û†‰‰‰¡(jÆ “'O;vlMMMcc£J¥bY¶¯¯Ïd2Íœ9S§Ó­Y³&°,»fÍšH$2sæÌüüüíÛ·744hµZ—ËÕÓÓ£ÓéJJJ8Ž‹5jÇq]]]ßÿ}ZZÚ¬Y³DQ\³f ‰Ž’ÓårçqhŠP(TVVV^^NÓtWW׺uëRSSgÍšeµZ¿ûî;‡Ã¡R©<Ïž={ôz}yy¹ÅbY·nÓé„qÐáph4‡Ãñí·ßÚl¶Y³fétºU«Vá{{{ÛÛÛ‹ŠŠâââF>EGì‘H$ …ÃáP(tШKG:fYŽaXо(Šf”Oš¦aóÕÓÚ°§¤ä›L憆6šngµZ :$é*4™Ô­Y³F)äa2|xæ(†aN8á«Õ …rss§OŸn4†éëëkjjb¦¹¹Y–åÙ³g3 “’’âóù222@°ûí·:î”SN¡ö9$Ó`›Í600Àó|ÿĉ­VkMMM(4™L‹¥«««««ëŒ3ÎHLLdYÖív766Ž3&‰¤¥¥Mž<™çùØØØ÷ß¿­­­¨¨Èív—••edd@Ü*¨¸J¥â8N­Vgggoß¾Ýb±¤§§‡Ã᪪ª¬¬¬òòòH$b±XÞÿý¾¾¾ÔÔT2ogåQºhõ;vìHKK›2eJ8NNNܹsgzz:hP°ÄÄÄ?ü°©©)%%…ã8PïkjjâââfÏž-B||üÛo¿ÝÙÙi³Ùhš.//OII ƒ¨Eÿ$Vh‚#Ég$s`Éëu B†|Iü~Ó©ãy> ²,Çóáp8¢V›%‰„,dz,+Ë’ „ÔjC8ELÇ”bExXá믿>¼nAfÑ@€¦éÔÔÔªªª¾¾>0wC ‡Ãa±X† ‡Ã<ÏOœ8‘¢(žçµZmee¥(Чœr ÇqQ¬hšNLLljj‚˜îñññ:N¥Rõöö‚èã8ÎårÑ4½aÃà’ßïf› Ûa.j6›N§Z­7nÜŽ;š›› Íf3hìP‹p8 sNAÂáp8îïïÿàƒ`t“eÙçóýxË*å-V¤B¡ÏçËËËãy*•””ÔÑÑfOš¦áºN§‹‰‰q»Ýðvê~¿? }ôÑG`lÁëõÚl6¸!À'C#àJH$²wï6–e%I¬®^EQbssµ$14-:pWMÍYhZè´ÛûdYöxúdY–eÑd2»°a6›õz=ô†Ÿd5³¯¿þZ–å &ÆÝ»wwvvÂue@FÓ¬V«N§Û¸qã‚ È(³oâ &$$444444X­VƒÁÀ²l||üÞ½{ý~~~>ô{†a óR2¢¬Çð_I’@üvvvvuu-_¾¼¼¼¼  €¼4j0E1%%…ˆÜââb«Õ ê+pU§Óy<˜±ƒ-­µµÕçó’—’¿Ê†¢öã÷šÅf³åææÂ,·°°066Œ[JÓ4âH I’Éd2 ?ã»U™‘C–%IY–U©@âKj5Í0´JŪT,˲’ÖhÔ4Íh4Y†‘eI¥âX–ÞüŒ9hš&‘…3335­ D<Oll¬ÇãIKK‹D"^¯wÊ”)ÍÍÍ999MMMñññv»=>>l” Qa”s°6G)ÆÃÚå` F9˜AŸ–$I§ÓY,–Í›7{½^‡Ã±wï^­V …rrrêêê`ÛF}}ýìÙ³¡+‡ÃaµZ={öì•+WVWW—””Å$I’´Z­Á`ðx<)))𢤤$A ƒÉd ‡Ã ééé_}õÕøñã5Í®]»`)Ë2˜ êëë5MFF†,˃ƒƒß|óÍèÑ£ƒÁ Ãá7nt†a´Zmkk«ÙlÎÈÈ(++ûî»ï¾øâ‹ŒŒŒÞÞÞŽŽŽyóæñ@ 5jTGGÇW_}UTTIJlss3EQ'Näy¾¬¬ì›o¾Y½zuZZZSSS03f Ïójµº»»{ݺu‰‰‰¢(æççÃJŒ¤ãÆûú믗/_ž——çp8öìÙsÊ)§ÀçÃÝ?¡Úívƒ]S’$«ÕªÕjO³°ì±?öJ’Ô××g6›5 ìFÒét,Ëuuuñz}==Ýqq±]]Ý4M»\.£Ñ‰‹Åår¹Ýn“ÉK¾=(Ì‚ ¤¥¥‘@²,¤¤$“Éó=QC¡PJJ ,f’!Ša˜`0h±Xâããá:t;4M§¤¤x<žÎÎNN7zôhš¦´ZmZZšÃáhkkaêÔ©ééé0AMJJÒét&“I§ÓÙív°E)¬w,EQjµ:''z°Z­æy>%%Æ5Š¢ÒÓÓišnkkHII?~Dgd&33S)3a6*‹jµZ¥~¨R©¢î!ºEQÊ C`.¢ö€ã8 0ð,d¢¼{†á°°LÌ?Ï-ð,˲Êëd{ƒ²ðPržÀ° Êè d”–lí†laaØ\AÂOC©H±‡îU†©/Ü ›O•“dò¬(Š‘H–…"‘ÈÂ… ý~?Éš‚D¾‹41VÁ¡™ý}ÄáI`‡ÃáõzáÄÅÅ)'G?±Z’$Š’U*Îårööö&''ÃvNcwwwjj*12³,38h—$Ñãñ€“çyeù$Iº Ì$Ê©àþ¶ @G'?)s€†Iú:!’ò:ÜOvAÂP5ìÄ›P‚\QîŒ*<™³\Ô‡-ÆþÒÊR)¯GYÁ³wÔ=û{6‰ÀÚ#™³ m Reòà>âHä0uÄ»SN`ر$Ë2Ç©bbtE¥¤¤°,ëñxhš¶XÌv»‚G"‘Ñ£G‡Ãa‡ÃaµZbbbÂá0„Zjí¶2#4bàŠR½öžao>ì×í/óƒ¾e„ÅØ_uFrOÔuêpd"jwô¡qäVh³Ùl4‰–÷³X¡Aó …BÝÝÝ===@v÷÷À¥ÓéEÉ`0ô÷÷›Íæ@  Ñhúúúx>ìt:)ŠòûýQË3ˆ£5ÞG"‘œœ˜x#!.X–UíÃÏ{œ”.š¦{zzzzzàbWW'$€¨EmÙ²–+ȃð“Á`8ì]VˆŸƒÃ(NüT"íàËHååå°£,“Êm ûs[‰8Šó.į—À±±±GòÕÉÁeq|änVpÔG Ž‘~Ä1 œ"H`qTTh´0!Ç1Ñ0q÷H!Ç1Á‡(8. ŒÛ¤ˆã˜ÀÄeTT€LcÓÇlšpö <ôh"¦1éc9ýC1Üh…@ß*4¶qœ-XJ`F ¨B#H`F ǃ$~ªÐAx¶ñ³ø Œã~ö-ÖÇZGç8b¾ ÄÉAÍŠ¤mGØä¶Cj´#=8†L: „®&é¡D¥i"¯ý¬ŸŸã¸‘tô¨˜L$:8»…€Iý(êâ!ž¦i§Óép8† Ú@Ê@ÊCÓ4Ä@Šº3‰ô÷÷4ˆ ‰ärP¶CøbµZ o‡ÄkD"•´‘‘çGì¸qãÜ8Žóx<»víJJJâ8ÎétBZ¥R Ö××CèMèš’$©Õꪪ*A¡×Ô¾}ØQWÈué‚Ô]OÓ4íñx ~×°Ã=ƒƒƒÉÉÉ nÆ :®¿¿ëÖ­b»¥¥¥±±Ñårµ··×ÕÕuvvvvv677766ªÕj›ÍF¢" [0¥ïë-[¶tuuåääèP¼úúúÆÆÆ””†a¶nÝêñxRSSNçÆu:Ùl†¦ƒxh.—kõêÕ‹%66–."-÷ttt¬Zµ*))I£Ñô÷÷É¿¿‚…B¡êêê]»vµ¶¶ ‚Gb»FµI˶nÝZ__Ÿ eö±,[]]ÍqœÙlÆhÇ¢†~£Óé ˜šJ¥€0ð*•ª¯¯OŽã Ìg%EA”ADi2¢(Q‰4€.(˲p‘ÜFQ„Þ#9“_wíÚÕ××"H¥R ‚¢U©%:—ËWAðûý&“)))É`0ôööªTªääd‹Å“œœ,ŠâÀÀ€ÕjMLLÔét3)ôNrä"]¡HŠPolWWÄëîîîîî–$Éår ¨T*ö$’ ä9€.@~‚‘Q–e«Õ:fÌ‹Åâóù¾ÿþ{—Ë ÅPêG²,Ãh•YÙÐÐ@”RZò^§*•J’¤ÌÌÌQ£FÁ§„+PZr3¼Åårñ<Ô=js·ƒÞ6™L.—+!!ÁívCÑÄÄD·ÛššÊ0LMMÍàà MÓ£FJOO‡1^¥RuwwïÙ³G–e‹ÅR\\¬R©ÚÚÚZ[[)ŠŠ/**òù|µµµjµÚår †ÄÄÄÎÎÎP(”-IÒ®]»hš=ztBBð|÷îÝ'  †ØØØmÛ¶ƒAš¦ ccc‰Ø„ð3]­Vƒ¸NIIIOOïëëkkkËÈÈÈÏχè~Z­¶¢¢Âçó›Í掎Ž5kÖèõz¯×;}úôÆÆÆöövŠ¢233 dYÞµkWGGÇq£FÊÊÊ‚a‹a˜ÊÊJ¯×;aÂN‘#†ñûýDû >ŸÏ`0ÄÄÄx½Þêêj§Ói±X&L˜„oiiÙ½{·F£?~¼Õjíè訯¯D"6›­´´4‰ØíöØØØÝ»wëtº;v°,_YYÙÓÓ£ÕjKJJ"‘ˆZ­îíííëë›>~̘1 ÃlÙ²E­V{<I’JJJÒÒÒ<ÏçËÊÊ ‡Ã555ƒ¡´´T­VWTTÆ)S¦hµZdï±>¦iÚjµºÝnŸÏÇó|AAÝn…BÁ`0!!aÏž=‡cöìÙ£G®­­%js0ܱcGNNNyy¹Ëåjmmõx<µµµ%%%“'Oîîînii1W^^ ÷îÝ;a„ÂÂÂúúzI’Z[[£rY”““c2™ÒÒÒ’““«ªª$I*//OKK«¬¬„`¶Dt¹\ëׯ_·n]uu5ÔE„P(Ñ4#‘¤yž…B7‡Ãá`0ØÛÛk·Ûãããív{KKKaaavvvuuµËåêì쬭­ÍÎÎ6›Í6lp¹\`·«­­Ý³gOff¦Ñh”$I’$ƒÁ ÑhÜn·Ýn·Z­*•Ên·{½^“ɤR©¶lÙlƒUUU ï@¨G‡ÃQ[[‡·mÛf±X&MšÔßßßÖÖ‰DÚÚÚ`$!!!Ájµîܹ³µµuìØ±ƒaÛ¶mápd©ßïgÆd2A¥&L˜0uêTdzyóf•J5zô莎Ž;wÒ4m·ÛaÐܾ};|îííe¦ººº¿¿¿¬¬ŒaøÉn·www[,¢† ‘Ž] BØf³µ´´ôõõétºäääÖÖÖÞÞ^Žã Cww7˲{öìÁçóy<PäµZmFF† “'OffïÞ½ÉÉɉ‰‰²,çååuww'%%éõúÄÄD£ÑCÓ4’W«Õ<Ï 0 Cröz½6› U³, "ÎétN:•eÙœœœ¶¶¶ôôô(¥N©W+ÏRÒû 4ºBTâ²²²ÔÔÔ`0XZZêt:ƒÁ Z­===111ÅÅÅ0„{].×àà`QQQ^^h’$i4³Ùl·ÛyžOMMu»ÝÝÝÝ>Ÿ/%%Åï÷»\®øøø@ s“¬¬,òEEE.—«§§G“É488h2™&Ož ŠZ­Öh4)))ÕÕÕ©©©Z­¶»»Û`0„B!–e½^¯ÃáHNN&+[¤ú0I€ì%%%)))n·»³³“çy–e“’’@oݺÕçó©ÕjµZ ív»Á`Çõ÷÷û|>–esssLJI$dÄ1J`ˆŽm±XDQìèèHKKÓjµƒ¡¹¹Æ`Qõz=ôøÒÒRˆåM,I«ÕªÕjP€á üÝ ¢ÚÃS‚ @¼y2U†Ù 2gS²,CTUË0¯#ŠmµZg̘V⯾úêPu T}}}[¶lÉÍÍ5¤ÌÓU¥R¥¦¦Â{išÖëõ½½½~¿ŸÌƆ‰mii¡(jìØ±ÇÕÖÖRª> Žn·Ûjµ¦¤¤„äϲì´iÓÚÚÚº»»ëêê&Nœh42¼ÂÛ½^/ÇqÅÅÅZ­ž…ÏóÐŒµµµ0¡…o‘÷Ai2TŽÝð«ÇãÑëõEEEÇÁWàyFvFsØám¿„ -IPÔétÆÇÇ‹¢ÛÝÝm³Ù†±X,‚ €EJ’$Abbbü~¿ÓéÔjµÕÕÕ ©©©ÝÝÝ0!lmm…°iJ³­Ò z;䜟Ÿ9~Â+´Z­^¯ommU«Õ l61‡Ê²,hÐÛ”¢8ê¿p?éˆ0Ê ìv{$ÉÈÈP«Õ ÆÇÅÅÙíö®®®†††åË—{½^ЖËËËÝnwMMr(‰‰‰Ùh4¡F4MFƒÁ ÓéAÈÏÏ·Z­jµZ§Ó‰¢ØÓÓÓÑÑ:j(Z»v­Édš:uª$I`P¨ûûûEQ´Ùl@ ##b¯›Íf(||¼Éd‚éúž={vìØ …%Ijjjêêêjkk‹‰‰ÓéìììlmmÕh4ƒAEQÁü‡srrâããU*•Á`€¹ 77×d2‘ˆ8Uhè.6› „ ÓjµZ­Öp8\XX¸}ûö•+WRe6›SSSÁnd4 *++aø5j”Á`HOOß´i‡üüü`0V0z‘U­V+¨Q£¶mÛ9[,–øøx®ää䆆£Ñ8a„­[·®Y³†çùââbƒÁ@V/5 ”TbNG,´Qÿ%†e0>ƒh‚AÈÊÊ\»v­ÕjµX,Á`0//Ïn·oÛ¶ ¬kV«´S›Í6vìØººº¾¾>0¹òb4cccÕjµÁ`°X,jµZ«Õ2 3iÒ¤ÊÊÊï¾û,p²,›L&žç7lØÀq\aa¡ÅbIMM­ªªbY6&&¦  Àï÷ëõz¸3%%¥±±1&&¦¬¬lóæÍëׯ§(*%%Ú ×S¦L©ªªÚ¼y3MÓùùùEEE¦´´´¾¾¾½½Ýl6Ã:"¬BoÙ²%‰Œ3F£Ñp­WZZZYY¹fÍŠ¢rrr(Š‚) 4ãŽ;222ÒÒÒÐ}T@_zé¥#¼UéV $Ù–À0ŒÇã¡iÖAÂÚO ‡Ã‹á8Îçó‰¢K è Då™Ù’³Ò=Ã0°”Z¢ÇãÑét@{rƒØ´ ÀD8+ÿ«”ÉPå È¢ …ôz=¨÷°<€ç@T˜d’ ÚÊÑAY’†|DQ  ~AMP©TÁ`ã8XBã8. F"½^ϲ¬ P0–e¡T@6Š¢Ã0¤d_’$(*ü¯…B'Ã0ápø›o¾ÉÈÈ(..‡Ãä6exg˜èõúH$¢¬,à¡oÓã€ÀCe²rè·„ºÊ9€Ü ½œ,öìϦ² ’œ¤ý3 Ð V_È,:Ê^¥œGY³¢TèýÝO–ˆ”Ú~TöçFpè»”¿’œ•ùÛÒ”@fþÊæ*ƒr€P»CRæ $\¹rejjêäÉ“Ãá0y‹r^3´ûkFÄñAàc ÊEÇÝ+F’óþîa©†½M¹­ vé3áQiaÄÏ8>ÖÇ¡Ÿ¿oý|¯IÎû»g„¥ö6å¶Ó˜˜"`V #~»F!ÈŒq|m°H`F H` Œ@ À Œ@ À@ Ä‘b¤[)‡=¸ó ãØÜO噕ÚÏ9§¨Ã˜ä@|Tn¸# ñ³|‘Rû\ÕÀ¡ù_†Qäì8ÄÚéòbŒ îiÁY,ñ¹Þ^4 œJ‡à¥ÊÜ”wó*•*ê½pÏóàY¼±‚#>åHõ˲>ŸoóæÍ]]]à)n`` ¥¥E£Ñtttô÷÷ƒS•J3¶oß …´Zmmmmoo/8¦ÑëõƒƒƒÐ¶„?àïV«Õ’Â+Ý©CžÇUTTð Á“ÝÝݽ{÷nHÌ;W¥Rèt:—Ëe6›KJJÀÍ ‡eYp¬íõzssscbb‡ÇãIKK£(ª­­Íl6 îÙ³ÇëõB¸Œ½{÷fff:Α×ÚápÔÕÕåååE"‘Ý»w‡ÃáÔÔÔäää‘FB˜ Øpà[’$è”ÄÛK(Úºu+¸\ܾ}»$IL +++‰lß¾]£Ñ´´´´´´dggVUUÞëv»333÷ìÙÓÕÕ”V©T½½½;vìHHHEqãÆ„*¢(ÖÔÔ‚àv»+**bbb4ÍÆÁ³F£éîî®®®6™LDÈÐ@*Q'ÕÊ{dY†yxTi•¶h›W__¯Œx >YÉ’RuuuFFFyy9˜¸ Ú µ‡U‘Hì‚Ç`0À@¦)¥÷Ob;dY|²Ûíö¡µ*ä•ö9³Ùìr¹@K²Ûíjµ:*Ô#âø6bA„Ø~ÁÕk8ÎÊÊjoo_³f ‰XÇA÷ƒ1^Å 6À8>>Þjµ¦¥¥­[·.--­¯¯/##Âj‰¢˜ŸŸ¿mÛ6𓱅 ð h•‘H$77wÆ à‚ÜçóBÜ=¶´uëÖ©S§ÂÍyyy›6mÚ¼y3–'L˜àv»‰ðËD¿Ðjµ<ÏïØ±#//"@­Á©ujjjTi‰Õ Är$)**êìì$«> #‘H~~~oo¯,ËbbôèÑÛ·oŸ3gq­<Ô›MÓ===Û·o÷x<Ç*‡7oÞ !2¨}ákjj&Nœh6›ëëëwíÚUPP°qãF¨u 8h­ÁNQTTÔÞÞ¾qãF‹ÅÒÕÕUVV†ÑRŽ ŒÈ­,ô°‘(¿«Ãá0™LÐ ºººxžONN6Eõööz<ž¤¤¤H$b2™`ö588h4SRR Ͼ¾>§Ó“Ù‚éØçóuwwkµÚ´´4†a‡Z­Öëõƒƒƒ‚$ vuu±,›žžñþ Æt$ŒéÁ²l8îìì¤(*--M£Ñ„B!ŸÏ3´F à z<žŒŒ —Ëñ¼^o$¨k½½½.—KYZ0ä†B!ˆç‘Ð#‘H\\œËåòz½d_§Ó‘µå¾¾>«Õ Ke.—‹eYPBÜãñPåñxÂápFFlù€–1›ÍÛÁ`0x½Þžžž´´4XŽ’e9333 EÕâÂA6Žã†Ö:++ P(”œœl2™ÐÍݯ‡À0Ø+Cý ¾9\ø“EZ"-!`hz$ؽ”û– ¼€rµ/J5‰ßE^M^G"MÃëˆçwxÈOJ€îµ^7´FPf°‘‘XDÖ”"Éýð"B_ œXBPr²b4´mIìhU¢–C¬mX'ƒq7@MÉšùk AáÈB:Ã0‚ {m‰¥šÚÏÞ&å|ϰ×÷ç”\9M=¤‚‘ë#¼8ò|HLƒ(6Ò‹ðRå¦KR÷¨íYCÓ#¯îß<þæÀ¤7´8MBEõ% ÷×K|}Ø{†î1lÙö÷äÊ3Â|”°·ÛË|Ð6ÚDQy=>1’z F ¦©4á, ÁéÄq¹Œ4t;rDÇ4¦1} ¦É_<Ð@Ç@8žUhlçÀ˜Æ4¦Â˜‹ú?u°…LcÓG=M8ËÀÊù«<ì‚iLcúØL“¿8F ŽcpCw¡¢‚iLûéÖQ…Æ4¦_ú§”ÀÃW8ÓJàHéß„Ž|ÔƒÇÚç G2 ’‹(0}üI`’Ý#ö¹ƒ"ÇÜö÷9 KÞ;ìý>*xÐyûó¿¿Ã‰äW»Ý®Õju:ݰR”íç•XQ2`ú•À#4v +l!Ü ø1Ôh4}}}à™‘¦iµZ ¾¯à¿pô„[}}½ Q^—Àù88^#Á‹*˲ð©qÑHÓ4q‚EÎÐ+/Âu(*ñ Ù‚p¢V«Áß˲mmmN§þ ?)ù õ‚l#‘H}}=qÈŽ@üÂ`Ç?öB„¥ƒHŽãB¡Pwww$1›ÍÁ`|£ÇÆÆªÕjI’º»»}>ŸÁ`‡<Ï{½ÞP( kjjt:ÑhTò œ6‚fð; DQôûýàw’P´§§‡8Rôù|À±@ ÃD8…B$®B $©¿¿? ÁKC¡ ,F¯×»\®¾¾>ð,‚Åb1•Ãá€W“á¼ç ŽŽŽ={öÄÄÄ€7<ìOˆc‘À-¡µµÕjµˆ§¢¢BÅæææ@ Àq\GGG$Ñëõ:nýúõ<σCãÌÌÌþþþ7º\.µZír¹\.xŠÒh4ÀÕ­[· „ÃaV«Õ[·n¡¯¯¯££#==]–å­[·z<ž§Ó™˜˜¸qãÆÄÄD­V»jÕ*•J•ššZQQ¾"‘ˆJ¥ª¨¨hii‘$iïÞ½¡P(##£¾¾¾ªªÊãñÄÇÇ÷÷÷ïܹ“¢¨ÆÆFF¿iÓ&𦓓“wíÚÕÜÜÌó|SSSRR’J¥Ú¼y3”¿³³Ójµ¶µµƒAŠ¢âã㉂€@übQŸ“e¹¶¶vÛ¶m ¦HQËËËgÏžÍ0Ljjjjjj||ü¨Q£@^^Þ”)S&L˜îÝÀûì¬Y³òòò u:]II‰Éd"Ž£¦M›6yòdpøFÔcð5=iÒ¤Y³fônmm•$iÖ¬YÓ§Oïëë …B‹Åétz½^AœNg8öù|Û¤¢(ŠàÏuêÔ©mmm@@–嘘˜“O>Y§ÓíÞ½{„ åååÅÅŵµµ0‡ç8”L™2å„N0 ííí===ápxæÌ™3gÎOTcÇŽÕh4ãÆ‹Òüˆ_ÜHØKÓtVV–N§÷‹àf-;;Ûãñ¬X±Âf³=xBü° ¬]»ti˜?kµZ˜4Âp7KQ„P«Õ›6mÒjµ Д†"p‰ Qü@akÖ¬!~mãããNg(ÊËËóù|===Ç[y2q…œF£V«õù|4M ðÒ¨Õj­V«Ç㉋‹£i"› HQ«««%Iòûý&“ÉétÆÅÅQ Áyíàà EQ<Ï+§ÜÄ1D`ƒ¹¹¹yyyàÄZ8.--…0ëÖ­›?>Øuôz}uuuWW׉'ž(ËòªU«¢rƒÇ‰eæ™;wîœ5kVLLÌ÷߯4/Gùv55..nܸqLSííígâĉ­­­ ±±±*•Jkâ'‚¿Eå´tžç%IÒét‡ø¸¤öE$&’u:]mm-DHeÙápðˆjµZ8¶ThjŸSu¥÷æÎÎεk×BLj_XP»Ýîp8@½t8 N§D.ñ& V»»»yž'´”eÙår555A(0ò^pŒiˆá’‘‘Ñ××700 šžÕjß»»;...Ê”ÝÚÚÚßß_SS£R©¬V+ØÆ$IЉ‰1 ÕÕÕ‡£ªª*66\7‹¢ϲìÞ½{AhllìïïÏÊÊhjjêîîÞ¼ys8'Õà´;â5bQCŽ#B¤•H$ÒÒÒ …ÆŽ §‡ƒçùüü|žç[ZZ Cll¬Åb‡Ã6› DœJ¥êêêŠÕjµ¢(êõz­VÛÜÜLQTRR’Á`/ç ÃD"­V#IP4..N§Óµ¶¶:ŽÄÄDðÒβl\\œÉd‚UŸäädbRbY·G$?~¼F£áy^¯×›ÍfI’’’’GGG‡Åb)..æ8®½½Ýh4ÆÇÇÇÆÆöõõuuuéõúääd(Xkk«Ëå*,,Œ‹‹ÒýýýÊ7"¿èË.»ì°[1HTAÀE8qãN4aâRœ¸D'Е›Ÿˆž Op5N)üȘ8=‡ÇÁþ¤ô™zÁš5kòòò²³³A‰€( Þ©}ÎßI3Y–×®]››››M&ÞdöN^ ˜»Hˆcn|I&ËÄðõéîD!§~¼¹„èÉÊG€c$OÈH¥(3$š9™›Íf°u“”÷CPBj_ü„êêjŽã #ØäÈÐ0ôդ丌8þ$ðqSI…Sì‘ÌöAÌî5Âp Ä1gÄ:®1tèçC#Á(±È)ÿCzõOR~%0 øàk虉¡'|vgØSJÊ+C±¿üG~}™D½ˆ¬œ…B¡êêjåQ €J¥jkkÛµk‰ ™€¹®¡¡aïÞ½ðÓк›ˆz{Tþ#iHó<¿yófe€eÎÄØ3U˜@å“uà MÓ0+Öh4ð,1>)s€>J²ŠD"pøÃÀúE¥` DrŽM)Ö™Ih¿¨ò(W¶”¥"÷€Ù¬¥¥e```êÔ©¡P6<˲L2‡ùv$ ƒÊHb`ÏƒàÆ¤`Ê·cLPT˜o“ÝæÐ&äh—2å«÷WSr&6c/Gÿ°x  {NgKK EQÙÙÙ±±±°?9 qWPP‰D† ÒN§³°°P£ÑìÞ½Ûív'%%¥§§ÃÁ½ÖÖV†arrrl6[kk«N§‹ÍÍÍ999ÝÝÝ‚ ¸Ýn“íp8z{{ããã³²²€Òuuu~¿?===99™Åd¦©©i``Àh4æååÁÞ °{·´´Ð4Ýßßo6›óòò€õõõN§Ójµæää°,ÛÞÞ‰D¼^oRRRKK‹ÏçÛ³gOBB0Ž+õööjµÚÜÜ\`µòü0 Þ³gÁ`ƒ&“ Ju‹‹ËÍÍõz½ýýý™™™EÁöo£ÑØÞÞ®Óé(Šòûý@Àëõæää$''Sûv°Ð4½wï^ˆ“œ›› ÙFÕ”¦éæææØ¸Ž“öߺ òd÷îÝ«V­r»ÝäüÛíÞºu«Åb±X,[¶l­È•••@ÖWáÁæææÆÆF³Ù¬R©ªªª SîÝ»·§§' UTT$&& † 6D"‘ÎÎεZ‡!ät]]l`\½zµÇãIMMmhhèììT©TÛ¶mE133³¶¶v``6ªTª†††ööö‚‚ŸÏWSSC6Wɲ¼k×®þþþ´´´ŽŽŽÚÚZN·sçÎÁÁÁ‚‚‚¾¾¾ºº:X‘Þ³gÄ.‡ÓQF£1 ÕÔÔ0 ÓÞÞÞØØ˜››+ŠbeeeÔ¡e†aÂáð–-[ÔjµÁ`p:pÖª²²Òn·gff¶··ïÚµK«Õ666†Ãažç·mÛÖßßú¶(ŠUUU°6^QQA”v•Jµk×®ŽŽŽÌÌÌÁÁÁÊÊJȄԴººZ§Ó577744¤¤¤@ðq$ðo]Cïéïïïééñù|6›03))©¸¸˜¢(ÇÓÜÜœ••eµZ'MšD)†),,,**êîîîëë›0a‚Á`ˆ‰‰ikk³Z­p*8///11tW ˆnLÓtNNN~~>ì¯=ztLLŒÝn÷z½‡ÃívjµZ£ÑØÖÖBXÈ’$Y,–îînå>G­V[XX˜J ÈÏχuc‹Åâv»aßeQQlu¹\‘H$%%D®(Š ‹2ïïïWªî@³ööv؃Éql–v»Ý‡ã¤“N2 ƒaýúõ………111p*+..Îãñx<š¦A2z<žžžž`0‹á~¿¿§§gæÌ™6›Íf³}÷ÝwƒƒƒYYY¤¦]]]‚ tttåççÃA+Ü"†*4EQÔøñã³³³au”ì…Ž…BE™L&—ËEl'Ô(ÞápTÛÚÚ`Šk³ÙÌfóÔ©SjkkSSSãââˆ~®4íÀb,Ïó°‘# Á±{xQSSP(66xȲ¬ÛínllŒ‹‹ƒÂÔW’à€1™‘¶´´$$$ø|>r¨Ê ³PQá]Àm¯×»sçΘ˜²@…p8 çŠÉD= i4–e}>ŸF£á8ŽçyB°¢¢¢ÎÎÎÎÎNù0Ü@•Iþ°Ž ›Ø|>L°A…B»wrsi½^ˆèÆ^þ[·BÞa˜’a45F£9­€R€C××jµ ÃŒ7îä“Ož2eJnnnooo 8å”SN8á„={öØívp‚¡ÕjIàùýÅ|Û†™4iÒI'4eÊ”””rТ®®.''göìÙÃ0™LŽìïÞ½»¤¤dæÌ™IIIÄ‘¥“ lX–­¯¯OLLœ;wnnn®Ò+­ŒF£Ûí†#P0¦ †P(@È‹¢¨V«ãããûúúü~JJŠN§kllLLLTf¨¬5ÐRE¯×k±X@=6µµµ¤¦`T©T‡ü ìoˆAüæ$°rëØEóòò6mÚ´qãFŠ¢‚Áà¤I“ kû $I&“)==}ݺu©©©}}}999qqqÛ¶m¤iÚd2éõú„„„]»v¯ xöN1ˆe[’$žçãâââââV¯^˜˜Ø××7jÔ¨ÔÔT(@rrrCCƒËå§,Lƒ»ººÚÚÚF­R©kjjº»»»»»u:ì'"A±ëêêêêêbbb@¾¥¤¤466®Zµ 6WEÉ®ÌH$’œœÜÚÚºvíZ«ÕÚÛÛ›m2™233·lÙ’œœÜÙÙYPPÀ²¬ÉdbÆd2©ÕêØØØÆÆÆØØXi¢ZOF“——WYYÙßßßÝÝ••e4HMá¶Q£Fmß¾= å~8ᇹ ä˜(ŠJMMÕh4¡PÈçóÅÄÄ(Å/¸¡Ê²l__ŸÓé´Ùlqqq ÃÁ®®.š¦!Š¢úûûÁT+˲Õjõz½,ËÆH$âv»cbbÀEQf³™¢¨žž¯×'%ˆÂÙÝÝ á|2¬EE"‘7‚˓ɔ˜˜Äëìì„ãGápØf³)ËLÓtww7EQIIIN§3&&œx<ž¤¤$žç-K8ŽD"V« æîŽŽ•Je6›axÓ7œ(mT}µZ­ÓéAÑÊ0 ©(ŠðÆP(‰DàW»Ý>88C<À<™ÔT­V;Žþþ~8Þl4£|!À™‚ë Øè§‚¢¶õƒÖM¤(˜©`Õ( ‡È&,ü¯àÈ7eæä"¬¦Âi‡(ák¹0TŠÇU«VÍœ93666“G¢nV–~…Â$SYHx Fe ` É ½Á̺ŒòEÐ,0úÜàä ØÿÁ@ŒgQ…'÷éìEˆÆQ3À¡Î\£ Zʹñ°9DÀ‡f®|dÎbÉ=Ê$IêèèHNNV«ÕQ9+o¶ÌÊëQ…Ü_ŇÞ3´î­ÝÐÄþðÅCüÖçÀXd:Àü†ÄVÆÓä/õÂlLcÓÇrçÀÄñ¯BC  ò—Ä Â4¦1}̦É_”ÀÄq œcÓÇóUhLcúøU¡QcÓh…F GÅ M€@ @ $0@#$0@#H`F H` Œ@ À Œ@ À@ @ $0@#$0F H`F H` Œ@ À Œ@ À@ @#$0@#$0F H`F À Œ@ À Œ@ @ @#$0@#H`F H`F À Œ@ À Œ@ @ $0@#$0@#H`F H`AQ MÓE‘¿À4¦1},§É_vüøñ8Œ!¨B#T¡1iLX…F Œ@ÇÀ90s`q4ÀÅ@ F ¿ eY¦(Šü…¦1éc9Mþ¢F Žÿ9°ò/Ó˜Æô±œÆu`XX˜Æ4¦È…s`LcçÀçÀ Œ@ @ @#$0@#H`F H`F ÀâØw$“Æ¿ð³ı†#ñ¯~$Ïr‡M?Â@QGBKd,iu˲@ e첟Àò>‚ ‚F£Qò9Š«#ç-2ñk%°2° éç4MƒAŽã8Ž;lQÌ {U*Õ 7Ü““‰DŽJˆäü1 ü4fµ,ËÇ577¿úê«‘Hä°9Ìö·ñûý“&Mš1cF8f4†!‡I’ÒÒÒ6mÚ´iÓ&‹ÅŠô/7–$‰¦iAxžG#‡A`•JŲ¬$I‡Ç^êÈ­Ðô>à÷@ UµVN‰ÌaV ü ÄJÁ#!ª¾ÄÑçð/'•Ã6=q\9Œ@ü„ì=l*1¿å†EQ„ãe’$I¹é@EI’ ¿Mþ:0uˆ»¬†Ý/kQ¿¼[–e†a EQ<Ï­(‡T`£ÑHQ”ßïWU–e“É$Ër Àµ€ãT‰>ü90,^ð~F£×ë9Ž‹Úe©×ëµZ-Ã04M«T*•JõË4,¾½úê«wÝuWgg§Z­>–å°,Ë*•ê»ï¾ûòË/U*•rU©TŸþùºuë”× àóá rx>vUhI’´Zí-·Ü2kÖ¬öövØ8 ×u:Ý=÷Ü3}úôºº:­V{å•W.\¸P¯×ƒN*.Œ¢@J’$üªÔ‡É_reXõÄïe—]và 7TTTx<¢ ø¤Tä:ܶ? –héÊH¥Fþ $IjµúoûÛŸþô'µZ EQŒD"*•êŽ;îXºt©Z­†Â“’G½1ª)  ÊÏDþUGòëþ> z½þ˜lÝ£n8¼–„ï%Œš} {üúUèC÷ ÃìØ±cÆ o¿ýö<X–Õh4mmmO?ýt$ñx<4MÏŸ??D"F£V«¡w†ÃaèšÐ3€(ŠF£FúP($HoµZÍó¼Z­! ©ÕjµZ Ÿ9 ’½b’$F»Ýþßÿþ÷Ë/¿„—‚䇿~¿Ÿè«EƒAøÆ†ã8xEQáp˜çy“É·Ei¶ð"Žã@K§(Êçó¢a2™B¡V«…fôûýQûØ$IbYVù $ C8&O^m4ÉÍP;R$Š¢X–Õëõ¤ØPNY–u:Ã0ä¿z½ža˜@ Ûƒ4 EQ‘H$Ó4­×ëaÔƒý÷‚ (? %3f̈‹‹#ƒËþ¾Q0„ÒBæCë®Õjá[“¯%á#F"†aàÐO  oQvèGÝŽõKÏÉ´v$hµZ‹ÅòÎ;ïÜzë­*•ŠçyƒÁðæ›oÒ4m6›áž &À€ÚÖÖ600’’òÝwßzê©]]]‹¥¿¿¿­­mÑ¢E&“©²²rÆ qqq§žzªÉd¡¯¯¯©©)??åÊ•S¦L)**êêêZ¹re(š={vaa!é©Çõôô|òÉ',ËîܹÓ`0Lœ8qÍš5YYYõõõ>ŸoáÂ…fÆ iii§žz*h§ÍÍ̓ƒƒYYY_|ñ…F£9å”S¿ùæ›úúú±cÇžpe ÇóñÇN™2eòäÉÁ`0 mذaÒ¤IkÖ¬Ù»wï´iÓÊÊÊ”ÓWY–5 Ïó~øaww÷¤I“¦M›æõz•B’eYŽã>ÿüó–––… ªT*A™7mÚ´uëÖüüü“O>¯ 6¯^½:55uêÔ©<Ï«Tªšš¯×;eÊàöÎ;½^ïĉu:ÝÀÀÀŠ+A˜7o^ZZZ$©¬¬„‘±ªªjÉ’%V«µ¢¢bÓ¦MqqqóçÏ7›Í‘H¤¨¨(##zŰߨ···¹¹y„ o¿ý¶ßïŸ;wnfff("u‡Ñ§¥¥åÛo¿¥iúä“OÎÌÌôù|‡Ñ’ð¡7lØœœÌóü·ß~›••uÒI'Q%‚Á`èëëûꫯ‚Áà‰'ž8zôhŽGš¾âŠ+U%ÅápL™2$ê*_eòäɹ¹¹«W¯~ê©§.ºè"ŸÏDzlQQѬY³¾þúë7Þxãä“O>餓ìv{UUÕSO=u÷Ýw§¦¦z<žo¾ùæOúÓÖ­[EQÌÌ̬ªªzôÑGzè¡ÒÒÒÞÞ^•JõÙgŸ¾÷Þ{\pAvvöààà믿^PP0wî\‹Å¢Õjëëë_|ñÅK.¹8¬×ë×­[wã7644dggÏš5ëßÿþ÷¨Q£|>Ÿ×ë6mÚ7ß|óûßÿþ¥—^*++kjjJOOÿôÓOSSSŸ|òÉ{ï½w̘14M×ÖÖL™2eõêÕz½~ÇŽ÷ßÿƒ>õ’$I£ÑìÞ½ûÌ3Ïä8...nÛ¶m>øà}÷ÝWWWWZZZ\\ jÂÞ½{ßyç³Ï>Ûï÷³, ÝÎn·/\¸°««+;;»ªªê†nxòÉ'Y–=óÌ3ǺuëB¡Ð…^øé§ŸŽ?>···Ÿþùÿþ÷¿EQ¼ýöÛ_xá…qãÆíÚµkÞ¼y~øaccã˜1cRSSnºé¦Ç{ÌétÆÄļôÒK×]w]ww·Ífã8nÔ¨QåååÿùÏ6nÜ¥(ª¯¯ïóÏ?Ÿ>}ú9眳råJF£ÑhvîÜùúë¯ßyçãÇïììÔétŸþùèÑ£¯¹æš+Vttt°,û—¿üåÏþsÔ7z÷Ýw/¹ä’ÒÒRAº»»AX½zuaaa(b„öW_}uÞyçeffRÕÕÕõþûïÏž={ç΋-:¤–„^7cÆŒÎÎΘ˜š¦«ªª.¹ä’W^y…¢¨­[·.^¼Øjµ †úúúgŸ}öÊ+¯ôz½¿°–$É`0<úè£ßÿ}ll,˲,Ëê8ò :@ ''çŒ3Îøç?ÿIQ”^¯_¹reooïW\át:¡át:^¯eU’¤'žx¢»»»¬¬, ™L¦ŠŠŠªªªõë×ÿéOzýõ×·lÙÒØØhµZ/»ì2xD–å[o½µ§§ç¬³ÎºãŽ;RRRêëë«««/»ì²Ç{L’$†a@K<á„>ÿüsA^ýõ—_~c¤¦¦666®\¹ò½÷Þ{öÙg¿úê«7Ö××÷õõýþ÷¿§(Šã8I’þñlÛ¶­¦¦fÇŽ[·n­ªªª®®¾ë®»üqŸÏ²x¸lٲѣGïÝ»wóæÍK—.½ÿþûÝn·Á`ˆD"%%%ÕÕÕ 3gÎ|â‰'@!„/ªÑhn¼ñF‡ÃÑØØ¸iÓ¦Ï>ûì™gžùè£@Ùƒ‰Ü[o½õñǯ_¿~ûöíŸ~ú©J¥ŠD"E}ðÁÏ<óÌÖ­[7oÞ\[[ûÑG­X±"..NÅO<±§§çÞ{ï jµ:Ÿ{î¹z½þóÏ?W«Õ;vìØ»wïM7ÝÄóüyç·`Á‚ººººººO<ñøEQjµša˜•+W677K’tË-·<ñÄð AxõÕWa¢ÓéX–]·nÝ}÷Ý7ôiµZA.ºè¢ÊÊÊ={öH’ôÚk¯A«B‹Ë/¿ü¼óÎÛ¹sçÎ;O=õÔÅ‹Ó4ýÆojK`òõÑGUVV>ÿüóo¼ñFgg'EQçž{îÌ™3*++ï»ï¾«®ºª©©I§Ó]+à/d…Vêχ èiÚårÝ|óÍ[¶lÙ¹s'Ã0K—.=õÔSsssÉa&’g(²X,çœs¨è>ŸoΜ9yyy üóÎ;¹¹¹\pËåÒh4>øà¶mÛ ]_|1LŸ ëêê^z饽{÷¾øâ‹6l€ažŒ|Á`^S»@ °pá””š¦—-[6sæÌÙ³gÛíö˜˜˜{î¹gùòå Û[,–éÓ§ûýþœœœ´´´E‹ Y–'Ož,Š"™ƒ±,žxâ‰O>ùäÓO?}ùå—[[[9Žs»Ý ®¼òJèg¥¥¥N§ª)˲Z­¶ÛíŸþùÿøG³Ùl·ÛO>ùä©S§.[¶Lù?þøãiÓ¦M›6ÍétææææççÃìîí·ß.((ðz½Ÿ~úiGGGrròŠ+Àèu饗’93MÓápØb±œvÚio¼ñEQÿýïsrr&NœXQQÑÙÙ9yòäo¾ùfÕªU£G®¨¨E‘çùñãǃÀ×jµyyyo½õÖ—_~Éó|SSÓm·Ýµ†ñåí·ß>À7ºì²Ë`DÎËËëéé!_D§ÓUVVö÷÷ßvÛm¢(†B¡Ç{ìé§Ÿöù|ÿûß?þøã‘·$éu^¯÷ä“OÎÎÎŽD"¥¥¥Pñšššîîî|P’$¿ßë­·ÆO?ý”ã¸a—ÙIú08Ìý2¥ä8®¿¿¿¤¤$33óÍ7ß¼÷Þ{W¯^ýý÷ßÃìnèDZ–e¯× סÝaŸ··7--Øf†€*¯×«×ëÀã?óØcÝu×]cÆŒùÇ?þQ\\¬ä0É™$€ÌEõ÷÷=Z0ŸÀëü~?È ˜/ð00À²¬N§“$)‰$&&^uÕU¢(nÚ´éZRYMøFðɈ„eY³Ù 5ÒjµñññÝÝÝ¿ +t”eÿ 0ú_{íµ¯½öš$I™™™3gÎܲeËl×Ê/ÿMNNWúúú$IŠÝ³g\Öíܹóž{î¹ûî»o¹å–ÓN;­±±ÆìèП`˜‡=·à¤§*ù?tÀºñÆÇŒ³|ùrŠ¢ª««Aª }H3R ¬W·µµÅÇÇ+ßf³uuu±,KÓ4˲*• ÈLÓôøñãW¯^í÷ûÁäKQÔÞ½{•o°, æ½”””‡~Øn·cbb$Iúì³ÏFå÷û‰á†3†aÔjõÀÀ€Çãyÿý÷Ýn÷¶mÛ-Z‰D^|ñE²ðsÐo4´ÅHËƒÕ ¬t@`ãÆ3gμ馛©%‡ý¬ðGQ=Ozzº ‘Hd`` 99ùQžõ`ð¡©Ð‡½kЦiŽãhš¾ä’K|>ß“O>yÓM7A—Uº R¦‡¾fPMMMo¾ù¦Åb ƒ<ðÀ¤I“âââ`¡]­V»dÉ’sÎ9‡eÙÂÂÂSN9¥··w¨×a_!IÒå—_¾~ýúo¿ýÖf³ þõ¯=ãŒ3`ö‘as“eÙçóÁE¯× Ó3“ûË„¦ižçm6ÛÂ… ÿò—¿8›Íöõ×_oÞ¼ùòË/WÞ|î¹çnÚ´iݺuV«µ®®®¾¾˜vÉ%—¬Y³fåÊ•ðßûî»oóæÍd9' ‘HD¯×_xá…O>ù䨱cÇŒã÷û'Ožœ˜˜x×]w‰¢h0¾úê«ûï¿_ù”Z­îéé)**z÷Ýw-ËI'”››ÛÞÞŃ ^tÑEÍÍÍûûFû«{0,++KJJzê©§†ÑétwÜqÇ\ ÔÅFØ’øF~¿ìر©©©úÓŸÀ¢ùÔSOù|¾3Ï<©£>õýy]ê(¥î!‰_žça©#==ý´ÓN[¶lÙ\#(É3‰ð<ärI¶:‚X^^þÈ#\sÍ5ÿûßûûûFã'Ÿ|BlãD³zþùçÏ?ÿüüü|£ÑØØØø÷¿ÿÝjµ‚‰X9‡'U Åóz½K–,¹å–[,XPRRÒÞÞž †7Y–•zyÞ%Wîxä‘G.¼ðB0¨Z­VI’ºººÒÒÒ”;(ÀŸ‰Ré‡ÃÏ>ûì™gžYXX˜žž¾sçÎÛn»mñâÅdïEQçwÞW_}Ëc &@EÀ>túé§?ÞétRuá…ÂfèçgŸ}ö_þò—E‹1 ‰DÌfó|pöÙgçææ&$$ÔÕÕÝzë­ÊOà÷ûÇw×]w]~ùåO<ñ„Ãáeùå—_†¯û%f̘q€o4ô³íÃ`0,[¶ìÜsÏݸq#EQ‡ãí·ßfæá‡¾ä’K©%‡¾>7xŸzÿý÷¡Žƒ¼RåååýòVèýQì8|ÈËHä;Ùíö©S§>ôÐC^F‚¾²{÷n­V›““CQ”Ýnïëë+..†Å÷úúú‚‚“É´wï^AFÝ×××ÓÓ3vìXxöieggC÷5 ;wîܰaƒÍf›?>X#].WSSÓØ±cÁa4»ººV­ZÊËËKJJ”-† …B°‰wîÜ K˜·nÝ ëÀ§œr ¨åÊRÑ4M®ÖÚÚ:f̲WÖwïÞ½aÆôôôN8aûöí999f³yÇŽyyy‹…¢¨öövÇSRR¢Ü¶Ó¯¿þº««kÒ¤I“&M‚¥‘½{÷Š¢8jÔ(²³²µµuΜ9Ð/sssAlnÛ¶mÛ¶mqqq§Ÿ~º^¯w¹\»wï†7vRµk×®¼¼<½^ëÌF£q```åÊ•^¯wÆŒ%%%¡P¨©©I„Q£F‘öÙ¾}û¶mÛÌfóÉ'ŸËó|GG‡Ûí.))bøÑ4­ü¬Dý1°<þü¤¤$ŸÏg4£%•=zZCCCaa¡N§Ójµƒƒƒ_ý5¬çåå•u`¨ï_þò—5kÖÄÅÅÁÄáP‘Ã$°$Iƒƒƒ#$0,«lš…5w†a´Zm(Õ,Ã䆨gI ¼vù€N¥Ñh‚Á Ùá¨Ñh`g±õv’ é¬!ܯ|ØH£˜øEz')Ü@ôg¸-ªäðkTí¢0´îd,#ÓZòjrl8U~e]Fò¢>ëÐG<ì–T¾zÉph®Ú¬œ™’ozP>ʲÌ) ìœý°çEÍΣ:“²[ø†\ÚA•hh_9’WìÏsC:t£‘<8´W)YJ²¨†…•¶‘Ôå 5zûPßk‡Ô>#¼ao¶%Gò †ŽŒ¤ýÞî¯úÚ™†å#EQ?²ÂG£lÂî֎°Xz½þ—9*8,ÔjµN§;êßN Þ ¨R©ˆR}ÐFÞßÑÿ#YÆ×ëõ‡Tòœµ:ZI#–ƒÃòñ&îQt9{išÞ½{woo/Ñ ~Iå„a˜îîîúúú£ë¼ôÀ;vÀùžC­Âààà®]»ÚÈ}}}°jm2™~ª£¹ øÝîššåšßAa6›a›Ú±@‰¶áQ_>Œõ&J…VŠï(Q~ؘã¸ÓN;í…^Ðjµ †ú ¯SL%?‘‹QoŒº™,‘‹¢(jµÚ§Ÿ~zñâÅfǃ÷çœ`h†ÃÞ¬,á°9ƒ‰®¾¾~„ ­­­f¨+Ÿýå ç+ß{ï½O<‘Ì|†6Çq§Ÿ~úóÏ?¯Õj?üðÃÅ‹ßÈŽ¨¡›ðvèñ0WÔjµkÖ¬™4i’Óé„íhÃNÞ¢VAî¾ûîO>ùÚ|è—¶{Ú2Êï ØÖ2ôAe-Þÿ}hC² wз´Ø?ëRðùøƒ ýS µ]+£j4£ÑH¶zs£ÑÆCå¼Î`0ÀEµZM&“`‰…£ª¹J¥bf¨¦Gºiš&™+ýkµZ£Ñ8ì>-xZ­† áX²Ñh$§çá"˲F£QY’ýU”[ØçöUróМá`0ìÄP:ˆb¯N§ƒ{ˆÖÊó¼ßï‡ù8íš %QõEQ¥R‘·ƒ ù¸é¦›à°'éñä3‘/r‚? O=õÔš5k`Å^M>DÕ‚–2@#+ë2´e´Z-ùp°ÿ :^²dÉ+¯¼b0”ß…Ô–šˆW½^Úòc©Õj£ÑHvDCG‚¦#ò~òÙÁá{äùøÕ0’6™L]]]›6m²Ûí° KÓôàà`0T©TMMMä+‚êªªÆÆF£ÑØÛÛ +7:N¥RUUUÕÖÖêt:è(ýýý‚ ¸\®ÚÚÚ(ÇQ°fPQQ±gÏ  Ï&“©¹¹yË–-pD9jÃpOOlÀ®¯¯‡’{½ÞM›6õôô@Éáìk8Þ²eK]]”Џ'Õ„È7gLLLWWWEE… °+X’¤¡9ÃC0ܺu«Óé$§¦£†j£ÑØÔÔ´}ûvŽã4 ´óÂ… ?øàF …úúú´Zm]]]? ¤¾F£‘Tapp¼½·oß¾uëÖžž²‡”¢¨îînr²ša˜ÞÞ^—Ë5l÷ˆ‹‹ƒ~ïóùìv»N§«®®Þ½{·Z­6›Íƒƒƒ[¶l±Ûí°èÅó|oo/캩¬¬¤iZ«Õ’²AË´´´À‡û³Ýng¦¦¦ÆårA;ïØ±c``@éEDY  Çq&“©¶¶vçÎ0úÕÝݽyófŸÏ§>‚Á`¿Á`¨­­­©©ƒë^¯wË–-PÔ_`v0Ò9p”jɘAF;Fsûí·7îÜsÏ-..~üñÇu:N§»÷Þ{.\xúé§/\¸°¤¤ä¶ÛnS©Tǵ··———Ïš5kÞ¼y§Ÿ~ú´iÓêëëõz}CCÔ)SN;í´N8áÔSO…-ò×]wÝ)§œ2vìØ³Î:K¹1K¥R9ŽÙ³gŸqÆcÇŽ…#,€k®¹fÊ”)guVIIɺu눒Ãü¹çž;þüâââ+®¸B¯×ÿç?ÿ)..>çœsÆŒóðÃët:Fóé§ŸŽ3æÜsÏ1cÆ‚ <Ƚ;î¸cܸqçw^IIÉ3Ï<R¥RÝyç³fÍš3gΔ)SöìÙƒú믿•³V«]½zõ˜1c,X0}úô—^zÉl6G a•Juã7–””,X°`æÌ™„K/½ôÒèÑ£U*UCCäI“æÏŸ?f̘·ß~[£Ñ\qŤ¾k×®óÞã?^RRrÞyç7îÁT«Õ‹-ÚºukSSÓìÙ³A‰0›Í7Þxãù矯ÕjÕjuww÷˜1cÖ¯_¯Óé†jdæÝwß1c|ÙñãÇ_rÉ%Ï?ÿ|yyù‚ ŠŠŠÞ|óM½^_SS3mÚ´ ÌŸ?ÆŒS§Nmii_"¯¼òJaaá¹çž;qâÄ«®º ¤ôûï¿?}úôÙ³gO˜0áý÷ߟ7ožÏçûïÿ{饗‚‚Ë/^Ljáp8@Ÿ_´hÑüùó'Ož|æ™gƒAš¦5ÍÝwß]VV¶dÉ’ÂÂÂ>ø@¯×ûí·P¤ÓO?}âĉgœqÆk¯½6mÚ´3Î8côèÑÏ<ó l}ùùdïùHþÂøßøÿøÇSO=õþûï×ÕÕ=óÌ3wÝuv ‡Ã6l¸ä’Kêëë}ôѧŸ~º¶¶V«Õ^sÍ5UUUÛ¶m³Z­]]]püuáÂ…ééé{öì©®®®®®~衇(Šòx<;vìxöÙgW¬X¡\ÙÖh4ýýý\pÁîÝ»?úè£×^{íµ×^Óëõüã?üðõk×¶´´œp ]tÏód»%EQN§³¡¡á½÷Þ{ÿý÷7lØpÅW<üðÃÍÍͯ¼òÊý÷ß¿eË–p8|á…^pÁ­­­UUUkÖ¬yâ‰'t:Ýo¼ñä“O¾õÖ[uuuO<ñÄ­·ÞºqãFر$Šâ÷ß¿cÇŽÞÞÞÇ{L£Ñ¬]»öòË/Wæ¼yófI’Î9眲²²ÆÆÆ?þvkE¶1,[¶ì_ÿú׻ᄏ{÷î+®¸Âårw?.— >p__ŸÑhܺuëµ×^{Ï=÷|üñǤ¾\pJ¥Z½zõ]wÝõ÷¿ÿ½®®î7Þx衇Þzë­+VÀ6¬ 6ÄÇÇ“ý*‹/þî»ïš››Á™^0œ={ö£Û3“³Î:k×®]üñ{ï½÷Øc}ôÑG'tÒÍ7ß 3£®®®”””mÛ¶mß¾}``àºë®Ójµk×®½úê«ÿøÇ?ÖÕÕ}ùå—o¼ñÆ<Õomm;wnuuõ’%KV­ZÑE½óÎ;Ä188á„ 6›eY—ËUTT´cÇŽÏ?ÿüË/¿üðÃõzý?þñ'Ÿ|ò“O>iii¹òÊ+/½ôR¿ß¯V«;;;§L™R]]½zõêµk×þáx饗¯ºêªÛn»­¿¿ÿ§ò…x÷`?×ø0ŠCãÒ¥Ko¸á†SN9E–åK/½ô¤“Nzæ™g`Í}æÌ™—\r‰Ùl>çœs@=óx<«V­zôÑGóóóï¹çP7nÜØÜÜüÐC…ÃáØØØË/¿üÃ?¤(* -^¼øì³ÏÎÉÉQv)8Á{Ýu×i4š Ì›7ïÝwß•$éÅ_¼ùæ›sssý~ÿïÿûÎÎÎêêj2²ÂΞk®¹æÔSOÍÌÌ|þùçG}饗 œzê©999ï½÷žZ­nhhøë_ÿZ[[‡KJJ@Ù~þùç-Ztúé§Ó4}å•WÞyçà;Š¢¨G}4---77÷„Nhhh€›•9ƒ×žªª*»ÝþôÓOÇÅÅ=úª«®RzŸ¼òÊ+óæÍ[¼x1¸LMM%[`ŠCØ£>:qâDFóÜsÏýá õíîîÞ»wï[o½UVVvùå—Ó4½`Á‚G}ô|N§V«ãââÈ,¯×{æ™gjµZ8ôî»ï.X° 66vhÁ”‡Ãqqq×]wÑh„C×à—#&&æÂ /t»ÝpȦé»îº+!!¡°°ð/ùËêÕ«ÃáðË/¿\RRû±§M›vß}÷ýë_ÿ~Z,–¿þõ¯%%%6›-!!p$B„•ÍfSÖ"˜Íæ¿þõ¯V«õä“ONMMݳgEQÏ<óÌ%—\Vºk¯½6oÚ´ æn·Ýv›Åb±ìŒ3Θ={¶Åb¹ôÒKeYŒò²zT¦Á\”D*Á‡®ãždÛíö±cÇÂqQKKKß}÷]jß#8 ~äX–u8 Ãäää@×w»Ý0õjmmeYöŒ3ÎeY¿ß“Lžà¦ d‘² ðRF“››»fÍšþþ~š¦ŸþyØ‹)®(ÅÞ>00ÐÑÑ‘ŸŸ&Ÿð†÷ý÷ß?øàƒ:æK£G¦(ª§§çÄO„úçoûEQ6l ( ÷ F™ÁÁAeÎýýýàL«ÕÆÆÆz½^ƒÁå4ìïïŸ:u*Ô+ê *U*0huvvʲUßÎÎNØG E½û·3¥Û3Ø­™’’žz®¹æšŠŠŠ>ø`$}ÜVSEüoƒm˜OLÊ.— 6]fggÃâ_{{;l®†Þ2vìØ`0g³)Šòz½0¸€I¨§K¥™ú‡#Ãx½^°˜Àñ`b–/_þÍ7߀1€%Âív3 .bÀèøKºà>É_îó:ÔHÞX–µÛíÄ« ñ{Ht€Å¾½(Šd3Çq ìX±ÜVšÍfØfßi¨c!à6y©ÇãÑjµz½Þï÷?òÈ#gœq†ÓéÔét6› Ü&FíÑqçù‰'¾õÖ[p6ÝjµZ­Öššš‹/¾øÙgŸ½ì²ËŒFãܹsaÐjµpø 8¡è.0!u„•s||ü|Çw 0Cíê05 cX:Áët:] PÖ×b±€IpËj¹Óé ƒ)))JK¸2·Ë.»ìÊ+¯|æ™gæÌ™câA÷«¡rKY”`Ÿ;ð $I‚Ï —ȇƒ¥P‘Èñobшš”*O‰’ZDõ1Ro¸á†ßýîw0O¶Z­±±±Ë—/‡Ž¤¼^÷ÓngvWòÈ)6Ò9ðþvr|+|ã9sæ¼üò˲,'$$À¹ð Pû +ïçy>!!!11qÙ²e,˪ÕjÐNÃápyyy$Ù¶mÛèѣljDªªª¨ýl{†Þg‰@ßûâ‹/¦M›f6› —/_ž••UZZšŸŸ¿nÝ:åwê’®6oÞ¼ 6p7~üø’’’;wºÝî®®.°úF8mfÕ“O>ù“O>ƒì¡P¨´´ô믿6›Í0ö“Ì¡WÍ›7oýúõ$ç]»vuuuMŸ>çùO>ùÄd21 S[[«lè©sæÌùä“O‚Á Ífëïïw»Ý0¶xÒªpr099¹¤¤$ª¾4MŸzê©ß}÷Ëå‚ñkæÌ™àã 6~““·°Ï^Źsç&%%=üðË-2›Í¡PÄÔÐ/N6+K®^ÉG‡+ííí0 ½ù曉‰‰±±±óçÏÿúë¯;::À¥Á¿þõ¯I“&Ψ}peèîHrŽbØ>Í8mÚ´Ï>û,33³´´´¨¨hãÆdÄ?@±r!µn2Ò9ð—‘¢Š{¨#ÃဠñO>ù$ø"»æškŠ‹‹óóóï¹çXl ê+H°>õÔSË–-›;wîâÅ‹ÿïÿþã8ŸÏ—••õÐC]uÕUguÖW\1a„o¿ýôsØâ…`0èr¹æÍ›wá…©Tªÿû¿ÿ‹D"¯¾úêÖ­[KKK¯¿þúâââ¿þõ¯QC¸Ãá€Y¥×ë½é¦›¦OŸžŸŸõÕWŸvÚiçœsNSSÓ‰'ž8jÔ¨ &,Z´¨¼¼¼½½œ³Ü{ヲ¤¤äºë®ƒä§œrŠÃᜉu»ÝPÚßÿþ÷åååÊœ[ZZrrrn¿ýök®¹æì³Ïž?þþó¥wr–eÃáð]wÝe0ŠŠŠ.¼ð“O>ÙívÃ1€@ àt:ÁîMž’$饗^RÖ÷±Ç ƒ7ÜpCIIɘ1c®»îº1cÆð<ñÅS5uêÔuëÖ-^¼ÖfÀ% œ^´hÏópJù?ÿùOFFF___Ôêèàà 4] Ú¤Ô>ßÚ —²,û»ßýîÒK/7oÞ;ï¼óÔSO‰¢xÕUWÍ™3güøñW_}õäÉ“Ÿþyø $O®eeeO?ý4¸àS öI“&A-‡(ŠQ%ånéÒ¥n·;??ÿú믟8qâÿýßÿ8»¢4g’ã%‘HZõ'äp”ŒùÖfvüøñÊà ÔÏ@(7Áøýþôôô9sæŒ$°Pzzú¬Y³’’’bbbÀØÛ××·hÑ¢¥K— I’âãã§OŸž——ß###cÆŒƒ¡´´ô´ÓNÛ»wonnîµ×^ûî»ïþîw¿‹Ÿ={vyyyGG‡,Ë÷ÜsÏÍ7ßÌó|JJJyyyFF¨Uäí:ÎZ´hQ}}}YYÙ¿þõ¯¬¬¬`0˜““sÞyçù|¾ÁÁÁ <ûì³°ŒDžMMM1cFRR,ô_xá…àp'33ó…^GÖK–,aY–çù[o½õª«®ÊÌÌ,,,4›Í\pA$éëë;ûì³—.] ‹´¹¹¹“'O†9U|||yyy^^˲ʜŸþùÉ“'û|¾SO=µ   ££cÊ”)>ø`ii)8µ%Sz«ÕzÎ9ç„B!žço»í¶… –––¦¤¤˜Íæ‰'Ž3F¥RåääL™2E«Õ†Ãáììì¨ú‚»É .¸@«ÕvvvžtÒIÏ?ÿ|BBB8ž4i’Õj 'tRLLLAAÁĉaÇEWW×–-[üqX`ÏÈÈ(//‡‰iºÌÌÌN8!99Ùd2Mœ8qìØ±Ð‹ÒÓÓgΜ MªÓéF5mÚ´ÎÎNX€C>úèYg&† .¸ 66¶µµµ´´ô…^=zt$1™L&L7n¡ë‰'ž+L³gÏ&Ý]’¤‰'B-æÎ?~üxxJÙ'ccc/ºè"Y–{zzf̘ñâ‹/ÆÄÄpW\\\VVõJNNž9sfFFôøŽ°æØ4†0kÖ¬imm…­50) É=ô•W^yH¯„óÀ‚ ô÷÷O›6í/ùËHÎÃ8bFœâSûüúSûN·‚©†ÝT©T¯¼òJRRÒgœAQÔ-·ÜòÊ+¯tuuAÜâf‘ÚwpL™‰²ÌÄ·Q«B¡™:µ £|–›L~È<¼7‘€Êü!¾²š0©ƒ;á+)±Gå -RrøZä42>äô¬Ò\D¢.ÀîŽp8 šä°õyº7¥8ß G¦á6ØùÖµZ=a„©S§>÷ÜsÇ`0€‡­(å…4FyŽšØ´ ØEQàûŠ˜©}§ aÚIZ>l󀋤Öä+D5‘² c-ITŸ?P68Æõ±à]C{Ë¡öê<øàƒkÖ¬ILLûì =„ÉéO5í>0À­9Lކ“â‚~³I’ˆ¹B„‹/¾8++ 6ß,[¶Ìh4Â)sðHH)ކ‘·D}B8"KŒä ,¸æ =ohÛ‘ Éãä¥ä´*©™?ÃPJ®GUÞ«2Ê*Íî!QÉRœÒ2Äó<9¬ w’)Ç ‚‡É>áýÕœ¼EMöÈWû…Ïç³X,àQ–| gèÇC7T†ea¢š ŸÏ^rÀy€ `ü#³Öa[D’'iÛ¡‡•µˆzêÀ}2bJP[ùVSÖÏEàÃpm§lÖ([ÂР¹á;ýîw¿[¸páš5kdYž={vFF|à¨GˆýùÀ9‡=+{õaè±Ø¡¯¶:Ã^ºÕ&Ãþ gV‡}»rˆúuØú›‰ò"(¢(ÜvÛmK–,IMM%Nꆭ>¹õƨZÃ:B~~þ矞™™ ¶¨¨%a¦ú\’CúXûÛþ“ìšüÙ |£…r?í!ÕÊëõ&%%]rÉ%0òíÏóذG@áÿÉÛú¨€œ‰9ðˆóó¤ýäÉ“§N kõ?I1ÀÒfµZO?ýtÐ~›Ji |¨¶h˜¯ áµæ>”œ`":ªò( ¹_–e˜á =ÀÀqÜ‘ÏUŽö§P”ÂKÖ/ ˜„C³ÿ„Ã&Vê7ŒÃ뢿D?`YöÙgŸýöÛo•+ Q ËFi”RÞJ”rÊAÝÐÐPVVçlɱaµZÝØØøØc‘¸a#q°+õ®tdùØa2÷ìÙóÐCÝu×]ëÖ­;ŠåaQ÷çXý³÷ð¿ÈÏ­ÀߥK—~óÍ7pþ4[ø`p>S£Ñ|÷Ýw7ÝtÑ @c$÷ 5½*ïƒ--- Ô¹ö$ÖÕÕýíos»Ý`†Ù_†Juè Û°×áþa½.Šn›èüC‡³(‡Õpý»ï¾+++ûïÿ»~ýúY³f-[¶ "E`÷E0GHΑh²,×ÖÖþùσjµZ«ÕšL&Øl2™`šZ[[ûÜsÏ¡;FPŒaWª’ä~åæÄØØXn‡¿À‚ NO86™LûËÚç'n€#£Dà “É1uɃp°Öh4†Ãa8ðÅaØ@ :¥Æ \U*U(‚ÀÜdSäëò,KWà¤˲ÿüç?§NZSS³aÆóÎ;ï/ùËP}ˆãz|ŒJ`¢B/^¼\êüéOúÝï~wÓM7¾üòË‹åºë®{úé§Fã¤I“¾ùæ“É´~ýúéÓ§3¦¨¨è¹çžƒ%;`šÉdºá†àþ)S¦¬]»–"_{íµ²²²‚‚‚óÏ?ßét‚#˜O× 3fÌ?~|QQÑSO=ÅqœN§{஺ꪋ.ºhôèÑEEEo¿ý6lº¾øâ‹o¿ýö¹sçL:uëÖ­äL,ìOxî¹ç.½ôһᄏ¸¸¸  à‰'ž€éƒ^¯ÿç?ÿYXX8f̘òòòM›6 †µk×Κ5Ëívk4š¾¾¾Ù³gWVV¦ÂÅ‹¿ôÒK¯¾ú*Ä"¢(*;;–C°ß#~!Ó4½aÆææfš¦ÛÚÚþýï«ÕêwÞygÆŒ×\sMssóõ×_¿`Áš¦ÿüç?—••íÙ³çä“OÎÊÊúïÿ{ÓM7ÝtÓM/¿ü2xK•Ìk¯½váÂ…4M?üðÃEEE°¯mùòåþóŸÿõ¯½÷Þ{O>ù$Hܼy3EQ^¯wáÂ…¹¹¹}ôÑe—]výõ×ôÑG …ʲ¬Õj;::&Ožœ‘‘ñÉ'Ÿüá¸ýöÛ?ýôSš¦›šš^{íµ¢¢¢÷Þ{oÊ”)]tQUU•F£Ùºuë¿ÿýïK.¹ä½÷ÞᬳÎòz½$80œÂ}çwúúú–-[vÞyçÝyçÛ¶m3Ï>ûìÍ7ß|ë­·þ÷¿ÿMMM=ùä“áÀͦM›6mÚIJìš5k6lذ|ùr†aššš¾øâ‹œœ›ÍÞyš››Ÿyæ™+¯¼2Ê7â7‹Ã\F:ÔGL&q„?iÒ¤¿ÿýïEedd¼ñÆ»ví:ãŒ3ÆŒòìÂ… Y–½á†âââÞ~ûm½ÛØØøÀ\vÙe0…X¯ãÆ{ûí·Ï<óLš¦÷ìÙ#Ëò+¯¼2aŠ¢N?ýt®ÞúÕjµÓé´ÛíàZaâĉééé111Ä4 ÕùꫯæÍ›GQÔøñãŸ~úéï¿ÿþœsΉD"3f̸÷Þ{)Šš9sæ·ß~ûÚk¯ýóŸÿŒD"7ß|3ÄûàƒrssW®\yî¹ç’Ø¢(fdd¼öÚkEMœ8ñÙgŸÝ¹sç´iÓxà[o½õÆo¤(êý÷ßONN~â‰'þùÏÂi‡E‹}òÉ'ÅÅÅ«V­¢(jÆ ÉÉÉååå°§ÊétÎ;wÖ¬Y÷ß?œÂô/4"îÈ@_…Û°ul9 ‰ߪªªéÓ§K’d·ÛáøK___?ÙzJ"tCLg2/…]ŠÊE²,ƒÁ´´´;ï¼óꫯ3fÌÍ7ß|ÒI'Í™3ÂÞ›ŒŒ ›Í6wîÜqãÆM˜0¡«« Žï™ AA°Üºº:¥Êår%'''$$ìÞ½[ù `Ó"ì‡ÀßpÎétΞ=vÕ˲<}úôŠŠ Y–çÏŸ¿iÓ&dzmÛ¶¥K—vvv677oܸqêÔ©Z­–çyNwã7úýþåË—õh‰@ú—hÂJ? Ê=ÜÔ¾ÈäÔ%ñ¨4 5áÙ”q”÷ÿíoÛ²eËe—]VYY™ŸŸ¿zõj8l QÕÕÕS§N0aÂ믿þÑG¥¦¦’ud#œP+U¾zèv°Ã’)bHuHXjh‡ùóçÛíöçŸÆ‘‚‚‚×_}÷îݧŸ~:¼ "ƒüþ÷¿×h4QNHà_ÂŽE¢æDÉ$ÛqY–Kò¬Y³¾ûî;AâããY–ýð󳳕î·Ùlĵ‚2xÙI ~'¿ÿþûSO=µ¤¤äöÛo_¿~}||üþó²ÃqÜêÕ«U*Õã?>~üøÌÌÌH$[Û!¢,Ã0qqq<ÏoݺuÒ¤I@?X^¶Z­ƒƒƒ'N¤~õC©âr‰D CZZÚG}IJl||<Ïó«W¯†Ó3ãÆKJJúÛßþ§£Ï;ï¼çŸÞápÌ;¼™†B¡+VÜwß}Äq˜sàÃ9êv»£Îý‚ô´´4‡Ãq÷Ýw_rÉ%·ÝvÛ›o¾9mڴ믿~Û¶mï¿ÿþ'Ÿ|š3ÙÎAî¿úê«á„·òœ-¼Ná„B¡œœœ5kÖÌš5ë’K.ihhèêêZ¸p!ñä Šâ¬Y³xž_¸payyùçŸÞÙÙ 9˜L¦+V\{íµS¦Lyíµ×dY¾úê«A°Ùl/¿ü²^¯ÏÈÈx衇JKKO<ñD˜—B1ü~?Dè¥öRƒê?ýôÓçœsŽÑhœ8qâ¿þõ/›ÍvóÍ7‹ÅRVV¶}ûö³Î:K–å Üpà yyyYYY°^«Õ^zé¥ÙÙÙ<ðŒØwE±¥¥¥‡:Õ&gGÒÓÓçÎ{ÐóÀ4MÛíöiÓ¦º\®üüüéÓ§ƒ¯©ÁÁÁùóç'$$dggó<¿råÊI“&?þÌ3Ϭ««[¾|y8~î¹ç,X@z-P.77îŸ>}zVVÖààà©§ž ë´.—+//¯¼¼æÕà¾lÉ’%UUU_~ù¥Óé|ôÑGÏ>ûlâK-‰dffNœ8qÍš5UUU_|qyy¹Ùl>á„Þ|óM8κlÙ²ØØØW^yŒÞÏ<óÌüùóAøðÃÁç«Ñh$‘GÀñRRRÒœ9sÀÐm·ÛçΛ‘‘Q\\åýE‘|”çlÉ‘N`öBnÄ’,BLLŒÇãK8Œ ä@¬KA†Žš@]r|W–å¡Å#ÞØÈ9^8‹3ìÔ¨6Ä®ø¥ L3ì¹_jÈvv¥Ejjy”•h転΂8ᔎD"W_}5ðJyþFÅ?ÿùÏ%%%À·auqØâ =¿¿Óª.9 Œ†<ÏŸþù o+©%Šâ-·ÜB\í`[!ÀÇ"¢¼Þ(AüÅ`+!ÀÇ.ö§µâJ,âXQ± $08UhšþáßojzŒqä½è§`Í‘X–¨H˜ŽðÔoÌœÃËžúÉ{óo­IÁ×ÿžë>LË¥fè®0õz[ˆ~;¦)Š–åÙ1T¢I'HîhüI Ër8&Ñ!~;µ†c¶G"ŠŸÀ4%‡(®UPs²ÀR %ÿ •LyÈt!"QaA¤8ʠׇ üvåß¡ÊG¬ôˆThš’Õ”œ­§jF’Ä^îWѳ%Å@$SGSý!©Å'Óòÿ\ ~¶góãºÖG{LQ2EIòÿ”þuøk’¢jJQÒ±Œ@Eà2qã'À,Mq4%*æ½4Mi˜ã^‡–)J”ô_M14%S¸Ž„øµ:3ù÷¿+¿Š.NËÃÔ@@ ˆãzšvĆh$0@ @#$0øÕX’$Iÿå_{Ø[Y–!Œ(ЇtôH–~Úsàßÿoäc¼„?¸£ÛÊzƒ‘f¿×ð¬,I£YÅp(8ì É#<9yŒt,•JE¢@ˆ¢8òH¿*• BOF;¨ÕêC/PµZ­R©ŽÙ¤„Qñ7~ªÌ©NȽV–4:Íöu«6}ó…Þh#V³éÛ/ë«+4Z,I’(Š‚òù‡p 'þH\K’$ÂmDnË’$ ‚(þAWÅbKd"˲t”Æf`oooï¿þõ¯Ç{léÒ¥ &“‰ $3ù/Pâ¿iµÚ{î¹§¦¦¢–G‰¸M7˜\¸3×_ý—_~ l¢h¼¿g!xÕͨÈM­VïÙ³çñLJëpÛ±²¹©©éÃ?„!OYBR5ÒÂð“²=£®:ÂRÈ LI¢¤7è¾ùðÝ;Ï?£§­E­Ñhõºwž}jíçŸL:QÍ6[lb¬)&&áã“c*¾ÿîÅ?ß›œa“öµ¾No0˜Ì–X›-1V­ÕÂçÑèõ±‰±¶øXN¥’$ÉhµªÔI’5:½Þh”$™å8“5æhÍÔjõÎ;o¾ùæÁÁÁ;vœvÚi$0šJ¥2›Íf³Y¯×CÌ“Éd4Íf³ÅbafûöíÆår]|ñÅ&“‰DB–$I¯×óD´Á`€+;¢ººº¯¯¢(‹Åb4•\…W˜ÍfﮘL&“É>_”ùÓ4Íó|?Äy‚ÛÌf3„_?êyóæÍwÞy§Z­6 Ê’ªAHZò\~¥¼¢¬£Ñh¬­­½öÚkÉÍ¿uZ’(“5F£Ó=}×þöö§²,ë&V+˲J£ùô?/5Õî,™<õä³Ïݹµê“×^l©¯_>sÊœy‚ huÚš-øP¨}ocWÇi^ž’•Í©T{wÕ¬üàmƒÉ´àâ«âS¿ûï{مŹ£ój++ý^ÏÄföwõÿÙGåó ü—EEEO>ù$EQ7n<í´ÓfΜYPPÐÓÓóÒK/ùýþ‹/¾xܸqÝÝÝ›6m2 +W®,--½øâ‹O<ñÄP(ôÈ#|ñÅK—.½âŠ+@ †Ý»w¿öÚk*•ꪫ®ÊÈÈà8nëÖ­ï¼óNllìµ×^«Óét:ÄUúä“O(Š:ýôÓyž§(Êh4~ûí·ŸþyJJÊ5×\£Õj êU«>ûì³I“&étº1cÆäææ’ü¯¼òʬ¬,ˆB®R©¾ùæ–e+**\.×õ×_Ÿ””Äóü±àï^­V[,Š¢¾ùæQ+++C¡ÐM7Ý´uëÖU«VMŸ>}É’%ýýý7n¤izݺup% êtº÷ßÓ¦McÇŽ½øâ‹%IúöÛo}>ßöíÛO8á„eË–}öÙg¯¿þúÙgŸF,Ša)×àÀ©ç_ê¶ÛßúÇ1&:Âó¢(ôôÓwüþ“×^ÌÊÏ|ù‘^ò1½Ž¡dY­ÑFxž¢iIuÝ÷Ÿ}|ï¥g}žîλ/:‹å¸ÝÛ·ÞqÞ£ÅÜ×Õñ‡E'S²°zù?~å…x›þ•Gzìæk-6ýæo¿zï_Ïͦ£¨AÔ5—Ë5}úôÑ£Gûí·Á`pΜ9===ƒá”SN©¬¬Eñì³Ï~ñÅãââ~ÿûß¿ñÆ<ð@JJJ 0<σ|Ðjµ;vì8餓’““%I:ýôÓA¨ªª:ï¼órrrvîÜ9kÖ,à˜˜˜¸bÅŠK/½4!!¢(Aôzý²eË®¸âŠ¢¢¢7^|ñÅ:î믿^¼x±ÅbY»víâÅ‹çÌ™Còçy~çÎ_|±Z­~á…Î9çY–·oß~ÁjhÌŸu”„¸ÓÏ=÷ÜUW]¥V«+++'NœøÑGÅÇÇ_sÍ5+V¬ (êì³Ï~ï½÷ââ⮽öÚ_|Ñ`0Üÿý÷ßZZÚ?ÿùÏn¸A£Ñ<÷Üs]t‘Ë储ºz½^‰ò7-iŠ’DÑ`2ßóÏ_~ÂÄÅW]£ÕëÕmSC÷º/—/Û°ctQzAiùÿ}Ú•wÝ{âYç¬Yþß%W]ØÙb§išf(Y’fž~湯©Íqáäbç@ÿ»Ïþý”s.¼ý‘Ã"uá”)½úÚ¢+¯åÑ[;œ~ŸG£ÕíÝÕÞXS9ó´3ÕZNvIGËD]ƒ™Ìßzë­¸¸¸_|‘¢(·Ûý裾ð )))Ï=÷\JJJ[[Ûºuë.¹ä’ŒŒŒ›o¾yÍš5wÜqG8fZ,–>ú(--­§§çÕW_mkkëééq¹\ .¼ùæ›?ûì3Q­VëG}TYY¹jÕª‰'z½^Žãxž?~üòåËm6›Á`¸ýöÛ¡Ç_sÍ5>ø ŸH$Ïfddôôô¼öÚk­­­f³966*rõÕWßu×]K–,™={¶Ãá°Z­ý 7õµ×^{çw.Y²dÊ”)?þxBBÂÞ½{W­Z5cÆ hḸ8«ÕúÊ+¯\tÑEÿþ÷¿¿þúëÒÒÒóÏ?¿¤¤ä‘GÑét7ß|ó£> ãBCCÃ5×\ós˜ÇŽ?SŰŒÛaŸV>þä%üõ¦ë9ŽãÔêžö¶¸¤d‹-¶¹i09#Ë`6w4µò¡P8tÚyâT’D­Nï Š^—K­Õòá°spàijÎéé h´ê “›ví8ý¢Ë!²üõW K'Ì–¯Þ[6ÐÓ}Ò’ Bá(jz`¯‚ØÂN§3!!¡¢¢bÒ¤I@È)S¦TTTFÅHÓ´ v»]„“ÉDæl·ß~{(ŠEÑét.X°à‘G9çœsX–½ãŽ;´Z­$Io¾ùf^^^^^D6‡`«²,ßzë­d\«ÕÂããÆ …B™5‰èõú'Ÿ|’çùøøx 'ØuÈô[¯×«V«A§V`4ÁívÛl6m ¡´EQ„€Ì¡P¨  @’¤¶¶6«Õš™™éñxâãã“““ÛÛÛU*•F£§\.W$ …BhÄÚ÷z†Q©Õ® tó£Ow·îݺj¥ÁdJHIìíq;ì9¹q½ímAŸ/!%1‡µ:½-ö½„a™¢~ÏKQjÆ×P]‘œ¤7˜¸Æ•ñ)© )Æ”¬œ·ÿùÄ„YsNX°ø³e¯‘HÁØÒPÀO=kµZ½^oµZׯ__[[;wîÜÄÄÄÊÊJ•J¥Õj·nÝš””¤Óé~b9Ž„A•ã¸øøx’¬Õj—.]ÚÕÕµbÅŠÿüç?111ƒaýúõeeeK—.½à‚ z{{yžþùçÏ>ûìùóçCÎà”ø–[n™8qâ{ï½÷È#@U›ÍVSS£Õj-K ˆþùç•ùóÁâv°“S¡ÞHôYøHXHÓû‰DŒF£V«Ý»w/˲™™™.—«½½Ýl6öööfddÀP9Ȳ¬ÑhŽ)ï™GU…¦©€ÏGQ´$1F“ù–GŸùýsÝ{^qFùü÷\´hÁż÷ü‹g\vmL¬>61iç–ï<ÿŸÏ<›…hš úýápˆf(Y–½.gÐç»ôÿî¾ã¼3ô&S_g§ÇéXpÉU¡ \X6éÛÿ¾[X6É–èu9ãSRcâ¬ö>;{””Ñ4½k×®;ï¼Óáp¬\¹òé§ŸŽ‹‹»è¢‹^}õÕ믿>99ùí·ßþâ‹/¼^¯Óé„ÑÊçóÁ³‘H$!!¡»»û¾ûî»ýöÛAŸ4iÒ‹/¾xß}÷ÕÕÕ577‡ÃaÇsÞyçýñ,,,4™L.—‹¦éGy¤¨¨èæ›o~æ™g<,˳fÍzë­·ôzý—_~ÙÓÓãv»o»í¶3Ïà×&¥'L˜Ë–‘ì‹;˜O,š¢$™²Úâ Æ•Æ&%ý´œÜ¬‚ÂQãÊôæØi'ΩUMµ §žÉ’«çvú2óGktúp(X2qª$‰²D™cbóÇŒ·%¤È•‘[ž—ŸY0ºlÆìºÊm[ìù{L\|(À'¤¤›>3gt1EQ£ÆO˜8kŽÁd‘¤-ÇGuH–¦¼‚ìà¥ñ&ʪӈò¡y‚7 †üü|–eSSSï¿ÿþÓN;ÍçóY­Ö%K–444x½ÞǼ¬¬,³,_VV–’’Âó|BBBnnnggçÌ™3Õj5ÏóÅÅÅ£G®««[°`Áyç—0cÆŒ™3gnÛ¶Í`0<þøã6›-))i̘1111 .ôù|£FR©T‚ Ìž=[§ÓuuuÝpà §žzjrrò˜1cN:é¤æææ™3gnÞ¼yþüùsæÌ)((¨¯¯_°`Á¹çž›‘‘‘œœ\TT4jÔ¨¤¤¤²²²„„Žã ‹ŠŠ; y$Q«Õ?ÉøÖõqãÆåçç'''C U*”a˜øøøÉ“'SõùçŸ_vÙeÍÍÍ×_ýÅ_æÍ›—°k×® Ü{b ¤¤¤”••ÅÇLJÃጌŒÄÄÄÁÁÁ™3gùhNÖ¬YÓÚÚj4A¯9TC }å•WÒ+EQŒD"¼ xû­ã¦—\{o>2©YQþ±S;v$ôuƒ,Ë¡@€¦iY’Œk„çÃÁ ÍÐF‹…ã¨HDö¹ÝP%“Õ"Ë”×å‚i°V¯§):è÷3,£7š‚¿Àó:ƒAgÐÈ2åóø…OÓ4˪4:]Àë‘)Jo0 B„‡GÄ^Š¥ýWESÝ!i¯7rY •câEùP °€ôTI’ü~?˲°z ×%I 0õ ƒ’$ÁÎ-0œÀ/EQÁ`,]’­]`^…BF£‘ƒçyƒÁ Šb(º‰J¯×+Køå—_¾óÎ;7ÞxãòåË?ýôÓM›6±,«¼¶‚h4¿ßo0$I ƒ ÐH‘£+e-ކã¸aKóvš¦kjjfÏžÝÞÞmÕ¼Eø/ä}šâ'Ù…_öÁ\³fMbb"Çq*• tþãE…¦>Lí(Š¢ÆërÒ4 ³SÃfß î²;hŠ‚ÿÒ4ôû˜ ˲×åd†aÙP ðù(šb–¦Š¢!q‡–¥)ÊïóÐ`Â>zU&V˜†Èb†\‡ù¤ <ÏÃçô)[‰¦½^/ÌE»0CÚ(ªÕ”Ï’›i†aœ'°dß#ì±Ð½†up{h+±kBã¡7(³ú î×ëõwÞy'æápxXë1í/ÛcLj5´„`‚Ž‹‹{ì±Ç@kP~í³¿¦þM/#!Ž5H’BÄ2ó+ [6|¯×{ìòðäâaÝ#ÿŠq¬ ™Ÿ[J×8’ñYŒ@5Ù{¤ÆÈšÄñ+iÂÄQÂè øÎQ‹F ŽS#uˆc‡¿L´v™¢å¨@œò"ë§)JTl ”)Š!»£eì9ˆŸlö{$Vhî°yK Q”DQ²¢WÃA…_¥ø–¹ˆ_¦(ЦhŠ¢XŠâhJü±~ÍÑ¿++‰¢8úSðhƒèH†~t!Ò2‡ÑD‡¹šþáÅДO”$þ*´ü+"°$ýH…æh*(Ê4%S4Ã0 #Ë¿‘>‰CÕÏrxð°éÃÝJISÇy¼>‡ÛѪ%~Dòú8Ñ¥¤‡V‚áhAG"‘ˆ$ÓǼœ9.ä2—$é·#¥áECCÞ={ˆ÷•ŸÀÄ MQœVîm«ùÇ5*N& Ê¥â?Ô¶ŸÿýÙ7¨ÓÇ ƒ.—)y‡V3´ükçÞ/YI’ˆ8R*–ûK³„¨­ êüï$éÀÀ€Ïç3›ÍQ7üì*4Ã0,ÇiÅP¨§ÉæeY’eY–dYAßH,ÿÄ2Ø€~ø#GY„àÿ í4e§èãK§ %~é_˜´Q‘V”ìâ­’Ÿ0TÑ4­×ë œú:Lš‚eØ"­ó{YV–eYÖPfV%ˆ’,³Ž¬Hÿ °é¡ -ïsL—‹4MÉ¿2ûéc\GñYÉjjß™m•JÅqܰÎtÌGøËýO:þ˜ZæɓÄ/!MÓ"Ã(­²²BIV¦•£ÀÐq81Tþ •ÌJÅXI`Т•ìDÑdiøËRA£üª“!èSuÀ[â×g‘V‘ÞßôX)“£|Ù*G¸‘1ª@dÌ N†èÆû³ÈdįO\»&„úžùêÐæÀQŠ4$†u¹‚äD ÌáƒJìƒÎÿÿ7><¥_©D½€Œ%û …ü+ˆÓ@¶šÅjÿãIàC2bjzEA)ømrø'LÃ_<Ð@ÇàP›E Ž_ F ŽgGÍ÷· Ó˜Æô±“Æ90ñ+šGmÝÄ4¦1}Œ§ØO…cs`LcÓGaŒ*4¦1*48**46F H`F À Œ@ À Œ@ @ $0@#$0@#H`F H`F À Œ@ À@ @ $0@#$0@#H`F H` Œ@ À Œ@ À@ @#ˆã–À4MSEþBÓ˜Æô±œ&ÙÒÒRÆ”À˜Æ4¦i Œs`â8ªÐÄñ¬Bc 8Æ4¦1}æÀ\Ôÿ• LcÓÇfšp–‘e™¢(ò˜Æ4¦å4ù‹s`â85FåÓ˜>.Ò¸Œ@ÿVhlâ8&0±0éã׈…s`LcçÀçÀ Œ@ @ @#$0@#H`F H`F À Œ@ À Œ@ @ $0@#$0@#H`F H`F À Œ@ À@ @ $0@#$0F H`F H` Œ@ À Œ@ À@ @#$0@#$0F H`F H` Œ@ À Œ@ @ @#$0@#$0F G‹À4MSEþBÓ˜Æô±œ&Ù²²2Æ”À˜Æ4¦Q#4b!¨BcÓ˜>¦Uh”ÀÄq N–eš¦É_ÂlLcÓÇlšp%0q*s`T¡1éãW…F ŒiL£@+46F H`F À Œ@ À Œ@ @ $0@#$0@#H`F H`F À Œ@ À@ @ $08~ ¼/0Ú®j‡ø¸|à”¿ôæ‘ä,ËÃЇQþ‘Üyäíùs4õÛðÿ¨×a&ÊÇ|ÿî9àOòOØh¿r³,£ü„ CsÜ¡Io•Šq†Hj5§R1¸eåÍÃO–eš¦ -p³,SÇ„BIú¡Œ°¾4}ð–Úz#yj„8¼¬€ *Ã0´,S,˨Tì¾ ÃÐápd$&o§iš‡²ØQT”e™ãXI’ýEiµ*—+àrüþ°ÏöûyŽczzÜÁ oµêEQÞ‘iš‡¿?¬Ó©B!Þéôû|á@€‡!R’¢KBÓ4Ë2N§?ŒètꨊÓ4 K£QÁýþ° H* _¹·×ðƒæðÃoE˲ÌqLW—³£ÃÁqŒ,Ë C×Õu;~Žc8ŽU«9hA}Õêb«ÕùI–)‡Ã÷ÿí}YŒ×yîÙjéêêu–ž!gç:Ñ %+Rl]ɉbǺHtã{‚lçAž²¼%‚ P€ ~¹ˆ_ùJ²"ÉW’i-´hQ¤¸ ÉÙ÷™žžéîé½k=Ë}83­æpHÑ–Ds8õ Nלª:ç¯ÿ?ÿZu(årÅUU"fcYUUÜX† )c…BýêÕ%Ï£‹‹…ÙÙìæÐ^èºþÅ‹ó™LIÓ”õõÚõëi×¥ãã™\®Úè,ÅæÆ•‹çWWË#Œa:]_¥”ON®.-0ÞØîœ\.[KK…ƒSBP>_»paÞqüM%ÇLúB¨(H×I¹lW*6!c¨(ˆ$g¡ª!(©gÛ~¹lC!Š‚g5FÛ €$©¹fKcH’ú§aDÈnžG‹Åº$»¢àÆãga¼1’-Ò[(Ô/]Z\Y)ú>…Öjn¡P/ëå²=:š.ëÝÝɵµŠç1„¶7b%Ÿ¬®–Ö5M™Ÿ_Ÿ›Ë•ËV&S¾re©^wU•4B„RvõêÒôt¶^w¥<7=ú«]º´À“ƒŸšZ+ꚦd2å‘‘eËòVVJ7n¤w³&wÙ/ årUÎ…¢à|¾êy¬¯¯•R¶ºZá\¤RQBmû¾Ïj5'‘kYZ*R©(ÆÈ÷YWWRׄ`±h•ËV"ŽFu!D­æJý¦i¤¥ÅdŒ µHD—Ü !X_¯uw·8ОÍV®]K÷÷·5-Ò€s19¹JŠDt!ÄÜ\¾§'¹ûÄÄj&SN¥b›–3²,/ y …TÉ=étéÐ¡ŽŽŽ˜a¨ét±··(„€ÌÍ建†¡º.åœg2¥X,T­:±Xˆ1Z­º€RÉŽÅB‘ˆ!ð<¶¼\ŽDôzÝÅBŒñrÙv]ŠL¥¢Ùlµ^w[ZÌpXeŒ†‡”²tº(ÏŠFC Ã¥X¬›¦Nr]jÛ^2¶,oi©«--&ç¢Zuc–åíÙ·,/Ÿ¯™¦–L†åêîNJú¬¬”(eííU%”rIêrÙJ&ÍpX•Þƨ^w§§×÷´¶šŽãû>ëêJ@˜T”ÍV-ËM¥bCBp¥b·´˜”ò†¼ ã >±,O>VËrÚ;;ãˆk×–——‹ÝÝrÑ!”²ZÍN&Ãã㫱XèСÏ£Œq×¥ŽCc±\8®K)å««•ÞÞÏ£”2ùfg³ÃÃ]Éd˜1~þül>_O¥"¾Ïw¡*¾g r.ÂaÍó¥ B°°°ÞÝ ]»–.•¬rÙË‚Óéâ•+‹¥’åûìÆ•rÙ^_¯]¹²„1ÊçkÓÓkšFòSSkœ‹±±•|¾¦(drru|<ãºt||u}½˜›[÷}&¥|ß¾öŽŽXµê¬­U¢ÑPCM Ácc™X,†4MqŸ1žLšŽC5Má\4ÌxÆx*íéIJù‘Çë ‡UÏ£…B= A£jÕq]ÚÞq]ªªdi© ëJWW¢\¶ä¥FF–ÖmÛ»q#íº¾ï³+WåWW˱X¨Vs/_^\Y) !¦§³óóyJÙõëËå²-Ç\­º”²+W–äYkk¹!„SSkReMOgK%˲¼‘‘eJùüüz:]"ަ'&V]—‹Öèè ¥lrrmv6§idjjm}½†1º~=ÏWëuwdd™1îûôÊ•ÅtºT«¹×¯§å£B „Ò颪’\®:>¾Ê¹€PÊ|ŸÚ¶?9¹ÚÝ”cè8!(Írßg££+kk„6”?çÂq¼pXs]ʘˆDti6SÊ5M™™É•J–®+óóë¹\¥R±ëu02²\«¹ŠBÊe;.Ê{I:Û¶70Жɔ}ŸycL˜¦¶¼\L&ÍD"lY„Ð4uËrå³ LèmÀùÓ3Æ××ë¾ÏzzZæçó”ò¡¡=‡uX–[«9¶í ´~á }BˆrÙ:x°ãäÉÞŽŽ(¥Ü²ÜX̨׽ååâððÞ¡¡=]]É••"¥Ì÷Ù©£G÷¶¶šå²¥ªäĉ.)~›Ê¬®–ΟŸÍçk‡¥$‡ !4ÌÏç1F½½­¶í›¦&ÍòB¡æ8þÒRAÓ¤­(VY­æRÊC!…1!]bMSæær–åõõµù¾4ÕP¡P7 UŸŽãçóÕýûSѨî8¾¶}EÁƒƒGîUUìºty¹k=ÔsèP‡®+¡Z­:ñxèôé}º®¬­•OœèÚÛÖÉdJ”rÎy,š›[7ͳ4MÑu"]VB°ÔüµšS¯»}}­ãã«©Ttp°³»;™ÍVÇ;Ö=4´'—«* >ztïÉ“=†¡zõ}žH„—– œó'z†‡»Á¹\Íu©a¨CCCC{¶-ƒRRV*YÀh4”ËU—– „`!€ª’ÅÅõpXkk‹Èõ”s!‰)ˆB¡>5•M§‹›ð}êû,ÖÇó<šÉ”òW®,Öënww2R‡:Ž_(ÔÚóùc<R…«”²¶¶È‘#RŸC=¹.íê’†@Å÷ƈ\­Úñx¨áQSÊîX À· QJ‡Ö²üååbWWcT*Ù¾Ï._^Y&3&|ŸÅãaËòâq£»;yñâüÈÈr*ST¯{Ѩ^,Ö"‘P(¤Ö랦iq!„LS·,Or˜B¸%úÝÚjž8Ñ£ª8Ÿ¯!9„àL¦´¸¸¾gOlm­" 0„àÀ@Ûâbaz:ëy47) !BH†RU•!dLnv6—É”‡‡»šÝÂzÝ“1-BðâbÁóX.W]]­8eŒ[– )ªJêu—s ª¤\¶S©¨ç1©¤Çb„`m­’LšŠBlÛÓ4…s`ÛBæh{ûÆY]ßX³ ¡êyty¹”JE9–å‹Öù󳋋릩×뮦ÃPj5·¿¿côÎ;Ùl¥«+aÛ¾Bוõõz*£”û>Ó4¯Õ\ÓÔ1Fµš Ô4"rÏ£œ‹C‡R{÷Æ»»“¥’%ÍZÍ][«ìÛ×N)—úÐó˜$ô\âñÐþýí==- 3Çq(À0ÔZÍ•«€ãøÑhèäÉ^M#º®PÊVVŠñ¸kå²Ý××ÚÓ“Ü·¯Ý÷™ãP`ÓÂŽãa 5ìÙ“X]-W*v(¤ ㊂å0(åŽCMSkŽ>ðöÙ—hTŸŸÏC:;c”2ÆxOO²«+éy>@Z8R, …zOOr` ml,36¶râDï3ÃÐ$s( –žm8¬».ULbŒû>3 cÄ9àœKé]_¯¹.íéI‚…Hí×P§±X(.Y–Ç9/ꦩ¥RÑÎθ4[[M„ªb<ƒZ–¯i˜äûLUÉâb¡T²NŸ y•‡€1¦ªº )çrÕÎΘe¹RÂ¥Ñu!äº Ń$ÅcD²m/5<Š‚…@…B=‘0lÛWUBäüã³BªJ8Ò FCËËÑÑ£{ßßßfÛ^,²,Ï÷™ªâD"¼°°>?ŸgŒ‹ÖÃ÷ÏÏçU•‚k5×óh8¬ÍÎæt]moPÊdˆuv6'Wµšsð`*—« õþþÖþþVë]á\?x0庾ük±híÛ×fj:]r]¿§§Å÷B \¶4M‚çæòÓÓÙƒS™LÉ÷yk« )’ïBŒáääZKKøðáNß§ªJ*»X¬×ën5•DtÆ„eyá°J)kk‹Ž¥—–Ök5×qüîîäÄΦB°dèÆY#ƨ” ÓÔ××ë‡w( Á˜†:3“O¥"étñÀŽZÍÑuEzËcc+1ÓÔ€†¡ uEA£¶¶ÈÒRAÓ”tºhšz,fŒeÚ ÕªCÆ1Æ8†¡†BÊÌL.3²ÙÊÐÐáÒRÁ¶½£G÷zÞ†¤e³–¦‘pX•«¡\C}Ÿ6…ÁrÙÖ4,ÉdØó˜ç1î☦V.[]] ÓÔ­­æÒRAUñÜ\®³3†Ëôö¶H%(—m]Wdª©£#véRÉ04ÎÁÞ½‰™™,BÀóèÊJéðá=n„ƒ<ðmÝ`B(ÑÛÛ£ÒþŒÅB‚\® )qÆD8¬6žï³õõZ"îímñ<¦ë$ÑU•D£z.WcL82 Íóh<’Æ•ª’xܨTM#Ò‚B†fšz6[8 ‡µzÝó}‹ŒÉJY,fÈ$m©d3Æ÷ïoFCœ Ûö8ÑhHêÎy,f¨ª"䑈Î÷K$Š‚£Ñemœ•L†¥ñÒ0 C!­½=*æ‰D¸VsËe«­-’H„(åñ¸!Ó¡--¦\Sz{[ Ãui,fh‰DtQ.W‰FCû÷·sÎ!‰D!D)‹Fué|Ê;&“f¥âX–»o_{,âœ×jngg,R¥¾ÅMN®íÙ7M½9,›Ù~È—wgL$“a¹¦7,[„¦)©T cĹˆÅBˆ\®šJźº’2!ƒ”òÚŒ±xÜÐ4EºÊ¡šH„!¦©éº’ÏׄrÀrÙÝ€ôGt÷%>#©7¶XŽR4†„4É„ØøÆP®Ü#i‹2Æ2{¹É%RN–Ѳf7¸éŽ1’\ØÜA^Dš‚Aßç’;1FÒSÚ¶g³×Ę4e1†;3“îR¼iÔmœ.2¾-5¥¼QY%à\HÛ¸ù¦rü2|%C)Q„à-wo¦-c¬QƸy}A)—EÑÊQq¾ñ'yµæ Êà!H.y²3…×gL4œ—fBÍÎæ,Ë;ztocR·+דÓT”G¸¥èJŽ¡™ä¤ä¶P»1†M‚|üX›¹h7rüÜp†o)ÁÛ&~°Ynõq%VSNóñ›Ê‰¶Cl[¹u—ƒl¾þ­N3ÀÍW'/,äC!µ­-"sž[Ƴ]™Ôæ{Óøo>]@· òֻܙ·§ç–ûŠ[ûÜîú>£JÅN§K¦¤¥ú‹ñÉùg› ¼í~n}¬·Îb7úÀ›þlzÀ71â¦Ür¼Qæzçã•þ–¶ØöøÍšÙÑ;í¯/ݤíÚ[ïK)ëînáœKÛ¬Á¸Ûùnæ{Óøoܹ#ÿlÓÞîÙmOûσ×nÈ,~衇@°½Zkk—šg3ÊÖµ)ÀNÊïBƽU’wç*Ö Ån^Èîk–O¨ñóÛµífÞå4Ùv] øä~x.òÿ»-䨢‹‚vÐÚŸwûn¬Ò,œ·»!¡ÀØàÞ1ÆkÈð­²¹ñêë'Ù …z½Ð4@€{†p8ÇeZþNøÎ¡EÎ9!$NÏÍÍÉ·Ævmà>hí{Ó–‚Ö×××ÚÚêºî_ò‰ê×ó¼áááãÇ‹b€÷ œsÏó>Ñu%ÍUÛ® BJéÝ”yí ´?ÃöÊ«ºÛOêÜ.Ë´ƒvÐþ\Ûwå7ÿÿsÝf7W)í ýy‹î¶9ùŸ;|;lV¨ v qƒZ¤÷>•C)€Æ‡§š áwtá¬Øn.%Áî'þÄ Ö¶í“œ·ØºË1â¶"üà´!ƒ1EÇ€ßõ{9A;híƒX¿°,šþa(nÒ¸B¥“_¨Û…Ó·÷¹ð¸œ€þpÐþå¶?XAÆPܬ­ÚÙ&4ßê,Ë‚àœˆÜ»Ùèäòs ’üuið€ 0†[¿ŠàÎ`xëtš>£#vxˆ.@ ÀwbwydGk·ä‹`cŽl¸÷·ž¼ò~—´ õÙ!xIð3€,@ÿÉO~R, !wÞŽJš¦ÍÌÌ\¸pAÓ´O|Ï&@ À÷T«”J%Ji%¾3•lÛ®V«ÁëåßÞ!ô~2Ã!„1èðýh"Dp€îµ ÐØÉ3Xþ?£q6¾r÷ý}¾Û4ügF‚"L6vvB0¶±Ëíýˆ‚3¶ÛÜà¾ƸQø*7ã¼ÃP…Š¢@}ß¿3£?`^:„c,éÓLº_`9Û¡ô!Ÿž„Ôw-fËïäaBt#,„ŒÞo2 !ôlÛ÷ýp$"„PT•sÎo~ö÷êõúæ>cØ4M¡çy·ÛpHUÕ«W¯RJzè!ß÷·í¦( €Rú I/¥ÔuÝp8Ü,®µZMUUEQ~.VU•sÎîW~ø\XA5=qñêÔ LiÆEÉáÓÅ Î6¶ÌnlrÓØls©ƒ!8„h³- ,•rÝxÛøãN>ÖíPÞxíïvœ½aÞP5}äü¹•ù¹gþçïsÎ3‹ ºaDã Á…£hPÑ|‰{ºÐxÞË/¿ìº®T&¦i>òÈ#½½½ ÞòuABÈÜÜœëº?ü°TÂÍ$2™ c¬£££ù+-Í}vœå¬ªêâââ[o½õØc;v̶mŒ±ïû/¼ðÂéÓ§?nÛ6B¨‘p–¹+9ëF‹s.ç>77‡“ÉdãÈ®ÐÀBêyª¢<ú̳‚1ß÷¯üôíKïùò³Ï!„ˆ¢p.0!œRß÷0&DQ¤¨úžÏ9C+ŠF=Or’ªiŒ2Î@QU €ï{cUQe 2õ=Æ„HNœùž×¼XȶªiPnBI)õ}ßó;ÙøÐ0#—úŸ½‡wööU `óØ<×@îĉE l˹¥Dús”a˲NžóÌ3žç4M“É©‚$77>ŒÒ4M~ÜÐó<ÆX"‘xë­·êõú·¾õ­R©´mŸh]sÎ)¥çÎëêêŠD"’¾ï³M/ Bh†¬ýr]—s®ª*BH !d¥T×õwÞygpp°¿¿¿P(ì"Þð:1£qF½9xâÔ¥÷~â9ÂhêÚÕd{jqz*ÙÞ~àè±r¡0;v£V)Ç’-ƒC¡°Y)®/ÍLï;rTÑ4ÁùøåR]=Ñd07>Š é=pتUÆ/]¬ f,6pdØ0MêùЦ²«s㣾çíéíïÚ·Ÿ3¶©l7öãš¼v%ŸYQu½ÿà`¢=%8¯”ŠŽe)ŠríÃs‚ólzyägï÷:BˆbÕk37®Õ*åÖŽŽþÃG!€ˆ`»Z½1v½^­Ä[ZS†R¸wuІaÄãq]×¥î}çwzzz „„éééÉÉIŒñàààÞ½{E0Æœó?üpuu5?~\×õ3gά¯¯3ÆÞ|óÍáááH$âû~sŸp8¼«Pä| !ï¾ûî³Ï>+­iP!!žç]¼x1ŸÏ·µµ ‡Ãá±±±z½~âÄ é§|øá‡+++Œ±ÅÅųgÏ=ztQ}Vt@@ˆìz==7cƺaxŽ3vùâgÞ¬WËáj¹üî«/sk‰Ö¶•…¹³¯¿â¹Ž¢¨“#—ó«MÓkåÒè¥ ‹Ó“„(œ²kçf×j@ˆ÷ßx}ui!ÞÚ–M§ßþáꕊÒ3 sï½öCFi(l~töí©kWUBHÃarùýw'¯^Š&’®m½ûÚË«K º^ž½t",„à’ß9G׫•wÿëÅb>oi™¸zù£wÏ(šêÔëïÿ¿ÿ*æsñ–¶ÅéÉ~ô§„èžÅ8¥zñ<Ï¶í¡¡!Û¶³Ùl8¾páÂo¼!¿W^yeii©¡~!„œóW^yåÆmmm‹‹‹?üá¥á-„àœK¥´¥ÏË/¿ìûþN¬Ž’æñ—¾ô¥åååëׯ‡B¡†‚1v]÷Å_œ››kkk{íµ× „¦i~ðÁÓÓÓÑhôÝwßÅbŒ±[7@ØX0¶êõw^þ?»^çŒ>þµß†É…ðÈC_8|òaÄ{¯½¬‡Œ/?ûÂèÐñ“¯ï]ºpúɯ$ÚÚ×–÷=–YZPTµ]ãœUJE!xÏCùµLµTüÊÿøfgO_)Ÿ;÷ækõJ%O\~ÿ½ƒÃ'Nÿ·_‡&ZÛF>xàðˆsò{yvúÔã_>ýE»^;÷Öë•Â:„@QTEQ 3òð¯=µ¶¼ÔÙÓwìÑ_umûÚ‡ç±ø3ßø}ŒIïÁÃo¾ð½j±X*äm«þÔsÿ+ÖÒÖøÈù·ßrjUØfAJ+WÓ4i‹Å .|ýë_—_ê~á….\¸pøðaÉÍš¦]¸p¡P(üéŸþi4­×ëÏ?ÿüôôô3ÏzãÂÏûõ¯ÊU?šHRßõ\·];xì!@­\6"ѽýÙô2ç¼£«gqjÂsÕÅ…ƒÃ'ç'Ç*Åb1Ÿ ™f(lÍXüý7^íêߟêê~â«ÿ]QZϹŽ]«Vνù:±mß÷êÕJ,ÙÂ9‚+ªÖÙÓ7rþýb>×¾·ë O<)„ð\@ µ®cÕ…Ô÷<×ñ]·´ž7ÌÈ…wÎøž‡1ä×2ݽZÈx÷Õ—öôìéé=ýÕß^¯9œQˆá/e™–ÆóÚÚ`~~~nnNQ”r¹œÏ盿߿²²¢iÚ¹sçÇÑu1¶ººjÛ6¥”snY„peeEUÕ-}vn}²mÛ<òÈäääÛo¿ýÌ3Ï4Ô™L†òöÛo»®+ƒÌÙlÖqœ‡~8›ÍþøÇ?>}útgg§Œ~ !|ß·,k—¥‘6“Ýû1æEÄï½úâzv5‹8¥"!„à‚(DŽ ”!(Æõýö½ÝÓ7®­ÌϹ¶Ý?8”ˤW—*ÅB[ç^„P(d<ùìs“×®dÓK3£×ZR§Ÿ|šQ!¤¾g[@p!ì;4H6ÓÒKýâW~sfôzz~vyvZ…NýÚ“­{‚’!/ãLp!¸°jUΰ÷àaÃŒ˜±ø—Ÿ}núúÕÕ¥ùék—[ºû{N=À½«ãÝ´ñ9BȲ,Ž.—ËŸÓ4e`¹a?KW¶Z­2ÆÇÙ¿ÿž={cR>åªzkŸ½{÷6Â×ò:Ò€j4îsO˜òä“O¾òÊ+cccš¦IºIÒU«UJ©mÛƒƒƒžçiš–H$Òét[[›$]cñÚ}yà9—ÿ0!N”ä@HªD-*åsŠªùžOˆRÊ瑨"šH„#‘ÏG“-a3ÒÙÛ7;vƒs>ü+B³ËiDzN<ú«Œ±Jaý¾;?1Þsàb`ðèþ¡c¶U'„PJ=ÇáœAÂõJ%·²¼ÿèñƒÇNxŽóã¿?úÑ…'Ÿ}nムŒˆ¢ª£–TÇý7­ZM^1¶858õÄ“ŒÒÜJúÝW_Œvöà¶Ã‚z÷&ÅM‘zCUÕË—/›¦ÙÒÒ²¾¾Î9ÿÒ—¾ÔÒÒ"·Þh¸¸Œ±¦i¾ïÿÎïüŽã8ÒüvG 'BH¾í¨iš®ëÍ}\×õ}? 1Æ(¥†a îý ¹¾¸®ÛÛÛ;44töìYéwBE1Mów÷wkµ!D®Vã™™™ñññœ9sæ›ßüf#cL!„ì,FŸÉè{ÞúZ¦][]œÿè½3ºa$S”úr@„Ðáã S3£×¥c—.æW3Žç”)ªÚÚ±§R,töö1F;ºzkå’ï¹-íœqÏq>zï'ãW.ÕÊ¥j¹ ªb˜æžÞþ o¿57>Z+—®ÿÙ»ÿõ’ÌKõ !¼úÁû—߯\X¯–K¾ïé†!WΘ"¬ ÕR!¼ÿèñé#×?ü V.ÏŽßxëÿþ§]¯ÛõÚùŸ¼1;v£V.×*%Ñ´{ö­ Îy¡PH§Óóóó/¾øb:~ê©§(¥]]]±Xìå—_^XXÈçó¯¿þú™3gTUeŒIõ{üøñ\.÷£ý¨P(,,,|÷»ß™™‘i§J¥’Ëå\×=qâÄ–>³³³ªªž?~qq‘rþüùååe!ĹsçÖ××¥…yêÞ†õáºî£>jš¦´/8ç'Ožœ››;sæL±Xœœœüÿøl6ëûþüãC‡}ík_“oqË×È „ëëëÅbqg 0>uêÔ§‘þ"…ëùœ[)dæ2 s«K áhôį~9lF|×]Y˜ßÛ?`F¢¾ï%Û; BW?šŸ-dW>üH÷¾ý¾çcL…ìÚá§BZ(T.¬GÉžý=ÇI´¶E™¹4?9¾2?7pxhßÐ0õ½ŽîÞz­:qõÒâôd¥¸¾ÿèñX2ɇp.Ba#ÞÒ63vm~|tar¬5Õ9ü+"B ÙUßózöDaŒçÇGs™tWÿ¾ÖŽNàäȥũ‰µå¥î}Z;ö$ÛSœ³‰+-LçÒË=Ã'=û“„©‰í¢)ãããÝÝÝ‘HäSæT%ó---år¹©©©……Ã0ž~ú鎎éËõöö...^¹re||œRzêÔ)Ó41Æ‘H$ŒŒŒŽŽNMMµ··9rB¨ëúôôôèèhggg$iî344Ä9ë­·4Mëíí}ýõ×Ãáp[[Ûo¼‘J¥ÚÛÛ?“D±¢(™LƲ¬ýû÷ß®bìçà]Œ+•J&“Ô41¦ëz<_YYéëë‹Çã‰D" ]¾|ylllvv¶»»ûÈ‘#/^¬ÕjO=õƸµµudd¤¥¥¥µµ0::º¼¼|øðá€üÇü .~¦«´è²v Ê"+ˆQUΘàAĹt½6>Ъ¨ªcÙŽm…¦ªi~Sm "ôñ—ãhTeEõǶêšÒ ƒú>"„ ±j5ê¹F$ª¨ªï¹à°BQêS«V%„‘£L.ÓLÒÆÛõš@ÓCEÕÛr,K7 =dx®'Pű-×¶pØ'ZÁr‡âJC.¶ñÁ^zé¥/~ñ‹·«yü$riÜ)9^Þ BX©T8ç±X¬±û\cgJUU}߯T*š¦E£Qi+ŠbÛ¶çy2ÿtkYt-íOJ)BH6>«×w…¡PèÒ¥K¹\î7~ã7êõú§—“-eU2{$5°¤•¦iŽãÔj5]×#‘ˆçyžçɺqιì,÷Ð%„Ôj5!„a;(™ôY½Ì€¥ |Ï`ÁFY9ج¯€žëE‰j ιï¹M\. l–ÞÆq€ð=˳<!€Pî{ž ÃàŒy®»±Å˦[ä{„ÈŒÅeÕ×Ç_ÒEò£’RªáMQžë¢È»x®#ì{ž¢¨Š¦CÁ-Ͻ§¦Ñ¦ØH'4} XÖ3G"€L`J~•ÒÛ¨šN$ò\ùWß÷UU•1çmû€¦×¤«ÜhÜϰœuã'c¬aðK»cÜVÒ7¼é^›wHÙöŸ46¸Íî“èë;|âÁ]ò  »œæN|©ã3 šÃ[[™î ö¦No|C6øL€[‹[5œ¸E+î˜öæ‹„Þ´oÒÝÚrîv èpÿk`ø i`qXÆ6–úÄàÜŽ+–Ø5ü zPÂ|Û –Œ<õÔS„OŸÞ|€Q×u8°oß>YÐ$à{bõÝû«ëz°ÛÀ'ÚÏRýVôý%À\ÜÖÞ¡à7Ï@4}pç¶§Ò{w2á¾`t‹ÄBð@íNa°a€W€=¾u]Ýé¿E#¨d8À'ÀBŸƒ‚'8#ú6j90< àì1p›¾ÝnÞž¶  8q ,0Èîq!€‰@x€Lh¾Ë:pƒÇq¤Ö½•ecŒ±±±1EQx–•yýõ×ï,À+++;]€w¶;!4 ãïþîïΟ?ÿÕ¯~Uò.!d·-¨r¾GŽÑ4M±íôex¯··WzÂÎy0°ƒõ’Ìm>ñÄù— ðËt:-Õìí:!J¥R6›•í€ûþeBj›r¹ügög?þø™3g0Æ2 ¼Û¸S®e###2´í*ƃþô§?- ¡@€¾_Ü?Œñ¹sçžzê©ßû½ß›˜˜ÀCe-Ç.,K°mûoþæoä¶E†c²ÆãoÿöowY>e‡÷jÚÌmF"‘¿ú«¿*‹2›âûþ.ɃÍäпüË¿4'Ò|ß—&‰âÛßþ6Ø…rŽo¾ù&¥T–lïû”Òµµµ |ßq0`ß¾}ßùÎw$ãþÓ?ýÓ.à†üçþçKKKÍY“k×®=ûì³`d€›9á;ßùÎ+±®_¿®ªêŽ®Äzk¡/â<ñÄßúÖ·žþù‹/î’Zh°YÇüñ}ûöù¾?66vöìYß÷w!{ì±ÆKi·jé+W®,,,µÐ÷£µkßFºšÝ%ºw·>ð||»¨ìn0§¥eØ(<ÚD¸C‡ÝÉ @€ @€ @€ @€à&üCQPObÂŒÝIEND®B`‚httrack-3.49.14/html/img/android_finished.png0000644000175000017500000010034315230602340014530 ‰PNG  IHDR@µ6E Ê€ªIDATxÚíw\”ÇÓÀŸçz?:H‘Ž¢€½*–(–±k,1–DMboÑ(M4vc‰[ŒÝD±wÅ^E¤H¤·ëwÏÝóþ1ožÜïPcĨè|ÿ¸Ïp|N¬¢¢"‚ öîÝ;gΩTÊårãââH’<{ö,¸Ùà0‹5{öìÕ«Wët:6›máÇBFÞsL&‡ÃùþûïwíÚÅáp(Š2Wo‡sîܹ &°Ùls·0|ìØ±:uêhµÚ8–à_F£ÑÑÑ1::zß¾}ð'sh]QQQBBMÓ#FŒhÕªÕ¬Y³‚èÔ©ÓäÉ“íííišýd³Ùl6›Ëå¹½{÷vppX·nÅ5Q‘XVÁb±FŽyçΦ6™Ll6;++«ÿþŒ9m®½¡¡¡§N’ËåJ¥òÅ#OPàuëÖH¥Ò>}úÏò$ƒ9µyóæ!C†ŸOTs³X,Š¢š6mºcÇŽ>}úìܹӼG-,,$I񮮠¢¨:uê¨ÕjµZMDëÖ­øá˜~FÛ¿.òÒl6;;;»ÿþEAŸüÙgŸÝ½{×|l jÖ¨Q£cÇŽÙØØh4£ÑháúzæHÛh4^¾|yáÂ…ŽŽŽÌYæÚKÓ´——×Í›7Ùlv“&MÖ¯_¿lÙ2>Ÿ¿gÏž%K–”––=ztݺuóæÍ›3gΖ-[à7nÜxþüù´´´ç- áàO‹|8-‡sþüùqãÆ­_¿>&&f÷îÝæ£bP³ÈÈÈ'N€M ž$±XÌåry<‡Ãa¦…Ì‘H$l6»K—.öööÌYðin°Ùì+VÐ4íääÄ4 <oVÿþý§M›Ö¼yó3f¬\¹’ ‘HtêÔ©­[·>¯û%p)%ò¡]ÙÀ÷ìÙcÞ©‚Å+‹/^ìääĸ|I’<|øpBB‚@ `³Ù%%%ŒF5>}út˜©OµÑhär¹{öìY¹rå?®Ð¬!¨ÀÈÇ :´ÿú¾ÃiŠ¢à£Ñÿ…&{Me=oõ5A$.ì@>@†~ø™jÌì 4?›Yý,‹¥Ñ̸÷A6FÝ»wÇR@ÚªÀÌ~HAjœ²²2,©­ ŒN,©½àJ,AFä­˜ÐÿxMÓA>oN‹$‰ç­a¸` yk Ìçsâïµf°Š…¦A3i“‰6™h ¥i‚$ ‡g2QF#MQ8 oIŠŒF.AÐe IÒ`0±X,6›¦(š¦I¡Ïåþ¿†3ÚËb ‘››ek[§N‘›{ayó L„iéÒ˜&M>U* oܸH’dZÚ-[[YZZ–ÉDôé3²yó(­VM’,F¹\¢´”Ø´ieçÎcÃÂü\]i6A,˜CÉÿDI’ iB¡xÊá˜B[UU¬Õ*ŠL‚È'I»òò<‚ 4š|>ŸCQä_áH‚ ØlšÏ'iZËãÑúɤšâ™¥‰€ ™ÿ• Ífsa;„PÈnÑ¢[llVpp„——ŸÑ¸W$’xx47™ôl6ÁbqH’ iEÑ—Å2þ¥Ì¨Àò?°X¬ââ⪪*Ølèèè(‹_°å¨F LÓ´P(V©„|¾©k×A·oiÑ¢Oóæ‘YYëÖõ¬W¯yFFP( ˆ2­–äñ$VVìÌÌ<ΚÍ&U*º°PCèÌ™ B´ó»@„â¯è$Õ_ø™Á`[É+—ã‹·•Á“0ׯþç ‚­ü« k/¾ÔKžþWkûŠíl˜àÍÏl6;???##ƒÏç ‘H$•Já'x Ó@A]¾|X«-g±HFe2Qz½Z£Q z“‰NOOسgyãÆŸççŸÌξٸqÏ–«Wõ÷ï!Û¤¦ÞÉÏßשÓB˜ˆ‚§çr¹"‘H¡P0ÕŽ$I+++­VK„X,&þJÇDÁÕh4<j§¹"F…BñÊE EöÌR£iZ&“Q¥Ñh`ë™H$b±X*• ”S(òx¼çÝòe~š¦!àCUUÕ+(’Ñh‹Å"‘ˆ ƒÁ¥úoëMÓVVV&“I©T¢»ñ™Ð|>ŸÏçCf†ÿȉ*Gœ;·‰ ˆ-:‘$ɤƒ I‚Ífk4šôôËŽŽYY7óóÓêÖÍNLd••)•¹Ž(?ÿ´‹‹'—+¡(%I²hšæñxyyyñññmÛ¶ …ÐñRuàÀ† ™ÝV«…ÝÌ¡¡¡YYYeeeð=MÓ:Îd2Y[[GFFþÛñ4:®wïÞ_|ñEŸ>}*++- ‘Ãá?~ÜÖÖ688X«Õ ‚øøx•JÕªU+ø3)));;»}ûöÕUW*•Ž1ÂÍÍmÁ‚LÀÁç[7«W¯feeõéÓÇ`0XYYéõz­Vû’Ê/—ËΜ9£ÑhBCCÛ·o©=Ì3h¾øR4Móùü}ûöI$’:h4fS+*óEQ:Ž$I½^ÿjÆóËšÐÐG²XÏS“@`c2)Y,‰»{{Š2<~œÖ¦MTHHß'6”—§tï>”Í&!êôc·oß?~üµkפR)EQ,K«ÕŽ;öǬW¯Þ† ø|¾B¡xò䉳³³\.×ëõ&L8yòdJJ ǃ`œ~~~:ÎÛÛ˜±É™$I¸8ÔB&Ý›Éd‚`ß4M?zô¨¼¼‚À¡-0ÖÖÖ6lP*•çÏŸW©T|>Μ9÷î݃>óÇÌÌÌìÙ³gEE(<„/…æ-##ný×´9m>@€A¤¡PxòäÉS§NõíÛ—Íf/X° (((**J¥R±X,hà@ þ7R©Éd’Éd+V¬øá‡4h “É~ùå—6mÚlÚ´ L“ÉTý\f$E!`¸\î¦M›\]]»uë&a–­9±úÀyeÓÏÙÙ"iA‹ÿQã_MI‚0ëã§ëõEEÙÕ#eêtꀀ>>F£:442>þ$—Ë kРí¾}K**(gg“IǬÖšQ6¦> ½^ß¡C‡sçÎÉd²øøøN:mÙ²¥yóæJ¥Òh4öîÝ›¦ièrmmm8P\\ Z*x<žZ­Í´²²KÒÚÚZ¥RA|@‘HÄáp …@ àp8³¾„F"‘¨ªªŠQx𦣢¢-ZT\\,‘Hrrr222***=zÔ¨Q£ªªªÄÄÄ>}ú@jYkkk…BÁf³e2è3Ç“J¥VVVÅÅÅb±˜$I¸£@ àóùUUUp€B¡(//Ÿ5kÖŒ3à‡Ü¶m[ÿþý‡ ƹL&3™LjµZ&“AÏÌŒd2ÙÙ³g-Z´bÅŠaÆÑ4˜˜¶jÕªY³fÙØØF•J%•JišV*•,‹Ãáðx<°Ø¡( …Z­>xð A•••$IJ$’$ …D"»C07>Ÿñ1ÐDM€ˆ9ÎÎÎP’óåýa/¼|²‚‚š{x„>óg3™H‰„f³)‘ˆ#²hš4i½Þ ×B¡@&TV±Xìÿ]éAFþÿÕÂh4j4F£ÕjF£V«…?Y­VSEQ”Z­V©Tl6ûæÍ›ƒþî»ïš6mzþüy¡PøÍ7ß´k×.""büøñПˆD¢ôêÕ+""¢}ûö¿ÿþ;´yÛJ$•””ôèÑc×®]"‘ÚBN׸qc•J•œœlccsåÊ©TêïïöìY¹\ž]PPЬY3¸È¤I“ÂÃÃÃÃÃ/^Ìãñ <÷“'OúôéÞ¹sçË—/ …B.—›““Ó¿ÿ¶mÛ¶mÛvíÚµ<O"‘lÙ²eÆŒYYYíÛ·7 üñGß¾}A{;Ö©S§ðððèè茌 ¡PÈüÒ<ï—_~ 6lXQQQAAAPPЧŸ~z÷î]N'—ËÿüóÏ:´mÛ¶k×®—/_‰D"‘hÙ²eÓ§O7n\›6mÚ·oøða‘HÄãñfΜ¹fÍ8æêÕ«QQQÝ»w¿}û¶MJJÊÀ.\جY³ß~ûM&“aúš8±¸\nzzúÅ‹¯]»vùòå²²²gm¯©3ètj½^ÃX€æ™ÿ²¬l³²Òâ⎃­xéÒ›7cE";++ÇÇH’g®ÀÀ“'O²²²²³³³³³sss™ù/ÿt .\¸víÚøñヂ‚»xñâÅ‹?~|öìÙÖÖÖEEEýúõ‹Å7nŒŽŽþæ›o<(—Ë ƒP(¬ªªêÕ«—Ñh8p >Áª÷ññ‘Ëå7oÞ‰D'NœhÕªUïÞ½O:Åårïß¿ÏårëׯOÄ_|qúôé~øaâĉ?ýôÓÖ­[¥R©@ ¸r劧§ç† œœœ†šŸŸÏår‡®R©Ö¯_ÿ駟Λ7oË–-ööö)))/^trrúæ›oD"Q“&MFŒ!‘HΞ=;bĈŽ;nܸQ§Ó}úé§0(€1¼J¥JIIiÒ¤ ü<¯¤¤dΜ9k×®e±XgΜ5jT‡6nÜèçç׿ÿû÷ïËd²ôôôí۷שSgíÚµ>>>£FJJJ’J¥7nÜHLL„uß¾}ƒ‚‚6mÚäàà0xðàÊÊJz;vìØçA^¦V*•EEE¥¥¥ÅÅÅz½þ•Ý œ—¹Ÿ/äñ,K ’$‹Ëå …BHßÂãñM&c@@ý?ÿ,ÌÎNh×nˆ§g½-[þäpŽðùr.·Eqq¢Á !I6ÓüÀoVcŠCŽ©Wh„H’äp8›6m (..îׯßÊ•+ÝÜܸ\îµk×öìÙÃãñöíÛg4ýõW×¾}ûœœœÛ·owëÖÃáhµÚ¾}û:::úÈ`04mÚôǬ¨¨hÕªUýúõÿý÷¶mÛÂ3‚Ÿ~ú)$$ä×_ÕjµM›6õðð8qâDÆ Y,Öš5kÚ·o_XXÞÔÚÀb±¸\.Ôùÿj%Ö_î2}VVŠZ]¢T*’““u:u~~úÇUUU……E<žP¡(++SXYy •ªÄdj*ŒFƒNWdmíZVV ×k¸\3³4ðz½žÃá¨TªîÝ»›ûN_a4??ŸÍfwèÐaÁ‚×®]ãñxOž<±¶¶6‰‰‰¾¾¾<¯¬¬¬²²2&&†$ɲ²2kk똘­Vû矊Åâ’’0€}hÙ²åîÝ»¯^½ªV«›4iâää$‹ãââ>|ؤI±XœœœÌb±ÆGQ8ØU*Œ¥¡o‡±h½zõÿüó”””éÓ§CR˜˜˜&MšlÞ¼yôèÑÌ+@+ ‹e2™V«uqqQ©TcÇŽ…¡oRR’H$;Z„^½zÅÄÄdffúøø@šùÙ³g‡„„,\¸ÐÛÛûäÉ““'Ovvv†”³5âóù0….“É`0xð`H5©^½z%%%£G—~bb¢MII‰E±#5ì{…B!¬Y‚9…׿Ú‹BQF‹ìÞ½»½Z­JK{òøqZÇŽU*õ¯¿nÉÌÌZ²äÇýû÷EG÷Ù»woãÆïÝ»×´iS­VÇår $‡Ëêõzf‚‘Yu¤Õj™‘4QF£±ºQM’$ÌÁ0GÂP|ñŽŽŽ~~~S¦LÉÊʺÿþ®]»ìììÀƒµqãÆÞ½{;öÖ­[7nܺu+x¶KKKårù¯¿þÚ«W¯E‹}óÍ7•••Ðv WW×ôôôvíÚ ƒÁЪU+•JåâââááQVVÖ¼yó®]»vëÖmÖ¬YÖÖÖ+W® ݶm›Éd:{öìgŸ}Ö¬Y³_~ùÅÚÚºk×®AÄÇÇ÷îÝ{Ô¨Q÷ïߟ:u*ÌÓTVVšL&ggg÷Çx{{GEEÍ™3§_¿~={öìÖ­[\\ܱcÇ>ìêêª×ëY,VeeåðáÃ;õÅ_‚}ûö‘$¹páÂŠŠŠ9sæDGG:´S§N»wï...ž4i’B¡€É§Ñ£G·jÕjÛ¶mz½~ðàÁJ¥&“t:Ý´iÓzôè1pàÀÄÄÄíÛ·ÿñÇ\.òwáÐ÷uy¡?~üôéSèüüüììì^mÉþꫯ^0ÎÖétׯ_¯W¯ž@ ¸wƒƒ@À?{ö,t2ÙÙÙçÎ 9þ<‡ÃIJJru­«R©}||’““?~ìéY/44„ùíÙl¶R©T«Õ;vŒ™÷ôéÓ6mÚ¸»» èŸKJJ"##år¹y½a±X¾¾¾7Öëõp5FÓ±cG˜«l×®]jjê©S§GÅb±š7onkkÛ¡C‡ÄÄÄÇ+•Ê%K–tîÜÆaaaööö÷îÝkÙ²%ŸÏgfÕ¡¥H$}úô r¹¼²²²mÛ¶Mš4Ñét4MwíÚ•$É?þøãÖ­[íÛ·Ÿ6mI’¹¹¹]»vU*•{÷îuvv^±b…³³3—ËíÕ«×£GŽ=š‘‘1vìØáÇëõú²²2[[Û°°0‚ nÞ¼™‘‘ѹsg??¿fÍš]ºtéÔ©S&“)&&&00P§ÓAÓU={öT(G޹s玗—×òåËëÕ«WYYéããÓ¢E‹³gÏžŸ¢(Xò»aÔj5MÓà ÓjµÐ–UUUq¹\±X %‰Ú[ó˜ÇãÝ¿?++ 63„††Ö©SÇ`0¼æÍ à·0 °x0)éáÕ«W#""rrrD"Q:uªªªŽ;vñâ…ÈȎ̯Õj233ííí+++œœàùÀ„†JfþJåååæÞpÉ2ߘ›Ð°D o0tÁÝÂxž`–¼»Ì˜™ùVD’0·Ëœ¨¶›VPÁŠæËŠŠ Æò‡áhii)ü «à!¡y2¿#AÌj*Æ“ ·0—¸Ù˜Ç¨¾ÉÖô˜ßŽf¥ú¹ð`åå奥¥jµÚ8·ªªŠ9^™Åbi4f’ï™?RW–ÅÒ†×?õ ¼¼<--Õh¤¥R©½½½ÉDÃ>„ôôt‹åíío2Qýúõ«ªª9rdyyEBÂý€ßÀÀÀ²²2½^oawUÏÑöLÍyÞ\EõJl~$ó_‹Ó™ïÍËËü˜—¼Ý‹•,ÜlÕ6ÿÒü`‹Û=ïu^|÷gž T}úôÑjµ0Š6¿×3ËðÅ?RC/´››qæÓÿz>ùGÛEEEçÏ_¸páüÓ§O­¬¬rr²oݺ]VV~ãÆGét:—k×®{{{X[[_¹WUU™”ôˆ ˆ¼¼¼[·n™/DÞ` ôíÛwèС°GËä-ZÑ|>_"‘ˆÅbé¼²úEc`ØÈÒ©S§ÌÌÌW~V—sçÎÁ:4ÀÞ:5 €¼^5f&ê_½?ž3$''3ÛS-<(„Yè æQÌ]SÐÒ€ÿ0yýù?*°@ ¨‰¹EÓ4øByíüóJ,ð‹Öpô… oGQýäÝU`Œ®€ µXѽ„ µXÑÄ µXkî£BämŽ-æo©5 Ìì*F¤ö)0—ËÅR@ÚªÀ/Hü È»®À¸®APy Œ+%¤+0®ÄBìAFMhù@ÀîAPA~c@ò¾WvûoóAb<]äP`¨ñàñ²¨”5Ïqúæµ—ÃáXYYÉd²åÃ@ÙãïeŽ'IR$ÁN¯çíó†µ÷Ÿ}( Ù\ “¤‚ˆPû9ÎË×é굇Éèñ õïÎ…wQ(û÷ï?~ü8$C©þð‰ µ/,,|üøñKFâ¦(êÁƒ:ŽÃyö¦ÈYy‰ ßä¿*Æêÿãéæ0I‘÷Y¡ÆLž?..î矖H$E‰ÅbÈ$&•JͯÀáp¤R)ä7³²²âóùr&ÙØØŒ=Z !•J!s —Ë•J¥“V"‘°Ùl­V /“–B£Ñ˜Ÿ ÿ…g€ª,‘H ųçz¼{÷îQµqãFHç ¹e2Ôr©TªR©:uêÔ¹sg•Jw-•H$\.W§ÓI$¸¦L&£( 2'B{±X¬ÑhD"‘@ `³Ù …"99™$IO É333'NœHQÔ°aÃhš>|ø;wd2´†$IB^eÆêä†IX,F¡PYZ…B!¤°TP˜ ä2™ n)Åb±P(¤iúÑ£GjµÔjþy/!tJyyyýúõswwwwwŸ>}ºL&KII¹yó¦ÑhŸ¿fÍšäääåË—'%%ÅÄÄL™2¥Q£F111—/_¶±±;vl»ví?~¼bÅŠGy{{ýõ×þþþ +V¬ÈÊÊ ™uê›ÍîÞ½ûˆ#=z´bÅŠ'Ož¸¸¸|ýõ×~~~"‘¨&YyÚÑ›L&.—;bĈE‹M›6íøñã:uŠˆˆÈÎξqãFÓ¦M;vìèáá1dÈ”””Õ«WO™2eãÆ—.]ºzõªD"1çÁƒF£ñû￟?~‡V­Zùòe‹uýúu‹•›››’’2mÚ´FݺuË`0ÄÄÄTTT,Z´hèС˗/OMMݼy³L&»r劗—×”)S”Jå7X,V^^^BBÂ_|1a„­[·êtºƒ>xð`ÕªU‘‘‘W®\Ñ»N§swwïÚµ«ƒƒÃ˜1côzýǹ\nzzúãǧOŸ>`À€7Ò4‘‘‘™™IQÔâÅ‹?ûì³-[¶¤¤¤Ü¾}["‘”””ôíÛwîܹ(**Š‹‹;~üøÏ?ÿ]§ÓÍž=ûîÝ»›7oŽ‹‹[±bŸqãúôé³uëÖÔÔÔ%K–”””,_¾\£ÑlÚ´‰ÅbABSâ3æ IŸÃátëÖÍ××÷êÕ«¾¾¾:u²±±1bÄ7T*•½½}¯^½\]]!35œÛ¶m[//¯ X[[WTTÄÇÇ÷íÛ·nݺ͚5«W¯¤o„'±¶¶æñxG(B îܹ³‹‹KHHŸÏW«Õ"‘ˆËår8œ† îÙ³çøñã‹-jÙ²eIII“&M5jäçç’oܸÁår÷ïßWZZzûöí´´´Áƒ;::¶nÝÚÊÊ ÆüƒÁ`0øøø„‡‡CvOŠ¢lmm·lÙ2wî\•J5eÊ”¡C‡–––J$0†I’”Ëå:îâÅ‹aaaŸ}öÙüùó-ZTXXx÷îÝþýû•Jõ²§êt:so“B¡ÐétçšL&­V Þi(êõzš»ŽÀÝzÅœ®Ñhàñ˜ ®³hÑ¢.]ºÜ¼yó›o¾ÉÈÈ …:òtÃS§ÓÉår‘HDĤI“|}}µZ-ÜÚh4‚wM.—Ñ4MQ”^¯‡Ç …/^\»vmŸ>}>¼lÙ²K—.]¼xQ Ð4-•Ja0ÌãñL&“­­m‡EQ< //¯°°0½^O„V«ÍÈÈhÙ²eïÞ½ƒƒƒþùg{{ûÍ›7óÍ7™™™³gÏ7n\rròôéÓ7nÜÈçó6l?"ªÁû¬ÀÐq}÷ÝwGU©TGªEÁ5Éd T«ÕíÚµ?~¼›››@ `,4Ð"ø\Y]t ¾?Á§W&¢I“& )))"‘èÀ¾¾¾b±’ܛɜK’¤^¯g³Ù~~~G%I277úyó,ŠÌ“í->ÙlvAAÁW_}ÕªU«¥K—r8œëׯƒòÀó š¦ëׯ¯P(6¡PøôéÓÓ§OŸzô(55uÒ¤IEEEË–-óòòºtéEQC‡µ··‡@M¨­ l> ‚zÉè-Èz½ÞÁÁaÁ‚»víúꫯ>ÿüsGGÇèèhNgkkk0BBBòóóçϟߪU«?þxôèÑC‡ýå—_Ì'o¬¬¬ÀYÊårmllàK¹\. I’´µµ…º ¾V8^(jµÚ† 8ðÛo¿>|¸R©üòË/ÕjµL‡°Ùlæ\èíììT*Õˆ#x<^Ÿ>}6nÜÍ Óóù|+++æaL&“L&ƒù‡#•Jy<ž“““Ϙ1c>ýôS++«>úÈ`0X[[ƒ¶ÛÙÙi4šÞ½{»¹¹EGG:ôĉ:n̘1999 Ø·oŸ³³³P(LMM‰‰‘J¥çÏŸ_»v-¼µB¡èÒ¥ËòåËoܸ1f̘}ûö3¦U«V;wvvvž:ujJJŠ··7EQ£F 0aÂÉ“'¿üòKww÷É“'ñùçŸ;ÖÅÅ%&&&'''::zÓ¦Mååå‘‘‘ÖÖÖýúõ[½zõСC;tèuäÈ‘?þX­VOž<™ÃáÌŸ??==:üê¿;Êï²ü÷gqqñËLüHff¦H$rww×ëõ`²òx<.—[RR¢Ó霜œ`n¶¬¬ÌÇÇÌKè'u:›Íæp8F£¬bè*¡#Õëõ0Ã3%æÇÓ4-‰òóó+++}||L& &¹\.ôcçÒ4­Óé„Bayy¹V«…9¡ &üôÓOžžžÐuFŠ¢`þž„ÃáT¿ H$ÊÉÉQ(^^^, ,m¸‘^¯çp8&„`ˆ On0²²²ÜÜܘ©ixN]Lë&‹«ªªŠ‹‹¥R©½½½F£ár¹UUUJ¥²N:0z^^žD"±··W*•@«ÕÙÙÙI$•J%‹Õjuaa¡­­­\.7 àd³Ù...ðR•••EEE2™L£Ñ¨T*@€ŽèZÍK)0ب, V\ÁàìU¤:éõzPi‡ÃŒEOAžYðÀ| ‹:˜‘§Åñ04¿&ó_f‡ù¨• >ŸŸ°lÙ²úõë'&&6nÜøë¯¿V«Õ憆ùê ‹§bÖH<#&·=s 3&‡& 2¡Ã,4 ƒ™§b³ÙŒíͬʀKA+MÜ/hV˜U<Žâb³Ù<Ï`0PÏ ×¡(ÊÜc Ü„Á)l6›Yõaýk±—””0?¡¹ ™ËÌÐÑü_ß3ú™Ç˜×xóƒ-®Ãœh~¼Å#=o”n.Àº…’’’„„GGÇ   P?‹~æu@ý,*ô3ŸÙâs;ç™·xæõŸYhæú¼‚µøÓü°zžù[˜?ç Êåw\ftö¥‚BW7īמca¾?³Ò<ïŽL%~Á‹Y\:Ckkë.]º Fcq_s¡ú»¼àÙžWÑ«ëö ÊÊü:Ï|óòüÇcª_çÏ`qß·ŒÈ{bB×Ê3[PýâÎAj/ïmZsc’À­sÈ;„2Ê(¿³ÓHsºPF¹VÈŒÎâV2©Í&4‚ÔbgmII –‚`Œ *0‚ /¯ÀækÍ÷Í¢Œ2Êï¬Ì|~càg®|F÷€—]‰Å%5× Ø‘ËoE3_æÖÚËlý™·®¾,ù ðZîk±Rº†Àþ'󸻿á,ÍCØ2?‡EØ]ó³xªÜû™ cá.Ì˜× fÉË\Ç¢‚1›OþíÏñf*ç%õâÅ*•J¦Z@@,ˆ®(‰ªªªÞ¼öòù|>Ÿ_UUõ‚b²øñH’´¶¶V©TLÐüb±˜ ‚óßéÆËß÷ß^癵öe*nõr“Ëå°9ÙÊÊ öŠ0[DL&„C€`ÝPI`#7\A(2ÁÀa{#ìs„m›,K­V[l8y1°Òâi!°1—ËU«Õ°wR @`&ˆ²¦R©,Úó¼Àº4M …B6› oô¯–ÓÃó@ܨÿT‡ÙS§N}=9}útbbb@@¼3ŸÏOKK;tèP```~~þÎ;CBB K³L„©@ŒÌT}ø9-úFóÓÍcªü—‰K.‰âããccc›4i1qÌ«,ÄÍPì»víêÔ©„ÚÑjµëÖ­óôô%a: ‹R-:þ¼F£qrr‚݈Ìn^¸8Ó#=ïÕ,^Óü`‹R"ÌöQV¿/a¶7ƒiÚÍ;CƬ`ŠQ(Î;W.—{yy©Õj¸#pŠ þ4/s&eŸÏŸ;w®µµu½zõ`Wó‘#GÜÝÝ)ŠÚ´iÓü!‹ÝÜÜ ìX,¾~ýzYY™Ñh<þ¼¿¿?EQB¡ðÊ•+………YYY¿ýöÛýû÷ïÞ½{áÂ…›7o–––>|øæÍ›÷ïß¿téÒ¹sçhšvssƒ‹)¦0 Q\þøãÓ§O·oßž‰ø ï{úôi•JuãÆºuëBX¢óçÏ{{{óùü¤¤¤›7oúùù1qüØl¶Z­þöÛo5j$“ɘíè̽‚‹Å—/_¾zõjÆ !¸s;ó’¯^oáyNœ8^˜‹¿/4üœ'Nœ˜5kVQQl+‡X‡K–,Q©T|>BáˆD"¹\nkk ‘Í­¬¬ Þ Ç³µµµµµ…vB[[[CÀq¦™J¥666666L¸‚µµ5Ӣɶ¶¶ä¹5s:ôÐØ[[[‹D"Š¢ ÓîÊårˆ™.•Jᡯ0o³x<^~~þ–-[är9ü 666-ÄÞÞþûï¿úô©H$‚˜>666ðj$IÊd2‰D]½ ĸ‡¼J¶¶¶ÖÖÖ°z [[[ˆ´nq_’$™ÿB¤+++(xx[[[‰DUއR’H$•••iiiP{à1är¹Ñh´³³KMM]¶l™EQ"‘ ÊœÅbY[[;88 †””[[[½^/“ÉNœ8qíÚ5›™3g–••/Z´èÉ“'ê@©TþüóÏvvvçÏŸ?~ü¸P(„8'{÷î}ðàÄ KOO?xð 666:nëÖ­Pg¬­­år¹ Ä …ÒfBšJ$¨ ÷Áƒà2@ÿÿèÑ£ýû÷Ëd²M›6UVVJ¥Ò}ûö­X±Ò_lÞ¼9==]*•ZYYÙÚÚ .—›——WZZêíí-“É Ä A2™ÌÖÖ–©Eb±rlÛ¶íÂ… ¶¶¶EALÐK[<°H$JNNÞ³g½½=txoÙ„6™Lvvv666§N9r$„GOKKkР˜CŽŽŽàÒ¥KIIIÑÑÑYYY•••ééé&LxúôéîÝ»5MTTTÓ¦MŸ>}züøñªª*­VûÙgŸA|@pâĉ¸¸8ggçBú‚Ý»w'$$øúúöîÝ[ \¼xQ£Ñ¤¤¤h4šÁƒ×­[n ^llì•+Wüýý£££Á^Ú°aƒÉd‚~˜ÉHB’¤£££T*}ðàAnnneeebbbÏž=7n AØá}%ÉÒ¥K;wîìççðàAš¦hoo¿bÅŠëׯK$’o¾ù¦¢¢bÍš5 …âã? )))9yòäÓ§OÁ€Ö¯_ŸžžѾ}{’$‹ŠŠ~úé'IDdddIIɺuëJKKûôéS¿~}¥RimmÍÜ7++ë÷ß/--íÝ»wHHÈýû÷SSSKKK  ”––váÂ…¶mÛvêÔ©¬¬ìÈ‘#‘‘‘666gΜqtt„ü ...ƒaÏž=< ŽŽ¾~ýú¦M›222N:yãÆ?ÿüÓÆÆfÈ!ñgõêÕeee‰ÄÉɉ¦éòòò#GŽüøãqqq …bÞ¼yçÒ¥K>tww‰Dk×® ñõõýùçŸ[´hi´hšV(~~~Í›7oÙ²åÏ?ÿ,—ËGŒÁŠ‹‹KJJúòË/ ‚¸}ûöÖ­[ÓÒÒúöík4÷îÝËãñ äèèÈår/]ºtúôi—Bsܺuk6›½~ýú   Fq8œmÛ¶õíÛ×ÃÃByÞ¹sÇÉÉI¥R)ŠìììÙ³gnÙ²¥¬¬ì“O>iÙ²eNNŽH$Ú´iSnnîСCëÔ©CÄ¡C‡nܸѰaÞ={RUQQѬY³ƒž8qÂÍÍ-44ÔÕÕuÏž=·oßnÞ¼yTT›ÍNLL“dàÀvvvZ­–ËånÛ¶ þ,++ûOÝC/5L’¤Z­îرãµk×JKKe2ÙÑ£GëׯokkËb±233W¬X! O:µjÕ*©TºiÓ¦x{{Cæ‰D4gΜøøx‹µxñâ{÷îyxxPÙL>¼~ýúˆˆˆœœœ‰'ŠÅâµk×=z´]»vׯ_ÿþûï%ɱcÇ~þù瀀µZ=eÊ6›}ÿþýuëÖYYYýöÛoˆŠŠº}ûö/¿ü"—ËçΛžžxïÞ=Ææ„ V`8¤¥¥Í;—ÅbyxxÌ;·¨¨ˆiAÅbqBBBzzz¿~ý?~üÝwßy{{ËåòI“& °r7n\ZZ:qâD‘HT¿~ý9sæäååUTT,X° ??ßßßîܹùùùüñºuëâãã ‚øæ›ohšöõõ]°`ÁÝ»wI’œ1c†P(lܸñ?üPRR"“ÉîÝ»—‘‘]\\…ZK–,¹{÷nïÞ½÷îÝ{âÄ ¹\^^^Þ A''§[·nýøãmÛ¶U(+W®”J¥óæÍ{ðàAÓ¦Mcccår¹D"‘H${öì tww¿téRpp0MÓ•••ŒËåfgg_¿~}È!¦°°P«ÕÞ½{7!!áâÅ‹UUUuëÖ­¨¨Ðh4ÝÅÅeþüù¶¶¶eeeeîСCcÇŽíÞ½{‹-öïߟ‘‘qéÒ¥+V„††4(;;[,÷îÝ»W¯^:uêÝ»wBB‚•••µµµF£9tèPŸ>}¼½½#""vîÜÙ¹sçìììí۷שSG¯×ÇÆÆ2ã°K!UxxøðáÃõzý… rrrœaŒÄãñ¶mÛÖ³gO¹\þðáÃòòrÿ´iÓF&“5hÐàþýûüñ÷ßïåå¯vãÆk×®9884nÜxéÒ¥z½:4@`ee¥ÓéN:eeeCÄéÓ§ƒƒƒOœ8QVVÖ©S'’$ûí·tïÞ}ëÖ­Ý»w·±±Ù¼y3óßíÛ·?|ø°  `äÈ‘Ÿ|ò‰••UVVÖøñã¹\î‘#G*++ ÜÝÝmll º`PPÐñãÇ]]]I’ŒŽŽ†wuêÔyòäÉ'Ÿ|bccóÑG<8888((È`0lݺõêÕ«;vì°³³ËÌÌ|úô©P(ÌÌ̼råÊâÅ‹)Š*((hÞ¼9x°*++íìì8ÎöíÛÃÃÃÝÜÜž}º½½ý¾}ûàyÞ@÷û/˜Ãá(•Ê>}úìÙ³gåÊ•ÔË<è$ñמcF-Á×çîîÙÁÝ»wÀaÀjZ,?~ü¸U«VùùùK—.ŽŽÖëõYYY-[¶LII)--uuu…”b±¸´´4//ÏÕÕ5##ƒ HاOŸN:étºÒÒR¨¦åååÞÞÞŒ#×Ü `\ˆ0aÞ?Ó4ýÛo¿ 0Aþúë¯ááá»wï^¶lÙÒ¥KwïÞ••c0‡S^^.“Éž?**ÊÑÑ‘ÍfCƃëׯ{yyÕ¯_?!!A­VóùüaÆ-^¼Ü †£´LÒˆ #|£ÑÝï¡C‡D"QDDDii©µµuQQÑøñã;tèpíÚµîÝ»ƒñàÁƒíÚµ8pà’%K Å•+W¢¢¢êÕ«÷èÑ£¨¨(“ÉÝéÂ… Á(àóùmÛ¶7oMÓ>„ìG=zô˜={6MÓ)))7vqqeee‰ä“O>ùöÛoM&SJJJppp“&MŒF£££#tÍš5#"55U,s¹ÜÀÀÀ¨Õꄇ‡WVV–””8::jµZÈØœœ\RRbccSQQQTTôÛo¿3¦S§N³gÏŽˆˆ¸zõê¸qãÚ¶m»uëÖY³f)•Êüü|ooï%K–tïÞÝÊʪ¤¤„Ãá„……­_¿þþýûgÏž]²dI\\\EEE=***ìííííí…B¡R©„Çn×®8Ï“““Áj«¬¬„f155U«Õ:::²X¬´´4¡P(—Ë5M½zõ`œ¿oß¾ &ØÚÚ†††Î™3Çßßÿüùó«W¯>tèP½zõš4iâáá±sçN˜èjÔ¨Qii)ŒæŒF£““S‹-t:••EQíÛ·×jµÑÑÑsæÌkÔ¨QëÖ­‹‹‹×­[gmm}áÂ…Å‹ ‚}ûö¥¤¤ðù|ggçÀÀÀ£Gº¸¸À|R\\Ü7ÂÂÂvïÞ=~üx[[ÛÌÌÌåË—§§§;¶U«VÉÉÉS§Nݾ}»<Ï›YÚôÏK)aþ#))I*•º¹¹•••ùûûk4šÄÄÄ @JžÆ''' …BwwwƒÁ˜˜èîî.—ËY,–V«=yò¤J¥êر£³³syyyjjjýúõ™âà‹ONNŽ‹‹óððˆŒŒ„Ñã;wîÞ½ ÉЄBáŒ3¼½½+++£¢¢„Ba~~~qqqýúõy<Þǯ]»V§NvíÚ±Ùl6›}úôéòòòÐÐPŠ¢|}}Á–¦( »´´´²²200yZH×0wîÜO?ýÒİX,@—œœBQTIIɹsç"##]]]ïܹsãÆ ´iÓF¡P<|øÐÏÏO(r8œ¸¸¸ììlpoøúú ‚¤¤¤¢¢¢øøø’’’%K–€|éÒ%ww÷ˆˆˆ¹sç2$00Z7ÈçpéÒ%77·ÈÈÈ 0&4Œ„µZ­¿¿¿Á`8uê”^¯÷òò²¶¶¶³³KJJjРP(¼}ûvbbb³fÍÀ–H$/^Ôét:t âÒ¥Kééé-Z´ð÷÷›üòåËAAAVVVf÷îÝ ,€\3`…?>''§]»vþþþ3gÎìØ±cxx8¤zMNNæóùžžž0Dzðà««« I’YYYz½º}è'KKKŸú¨N:·nÝrppprr*++KJJ:zôè7ß|ãèè“Õ</==$IHgW^^ž——ƒ|‘Hd^žjµ:>>¾]»vÞÞÞF£Q¡P?~†Švvv÷îݳ²²ruuÕh4ÇŽ«_¿~ƒ ÊËËOžsæÌÉ“'Ãó¼™1ðK­…3z½\VØÀÈèÉSàÑ…B!d÷‚)Y‰D†à½äóù¥Ý|Œ )ª)ŠR*•Ì’@ Ó骪ªìììÆŒS¿~ý¯¿þÌ(Ïår!3 ½àtp;K¥Rh>À:`ú|xl‡9>ÍŸ€ë0«/˜ŒÞ`hÀë(•J¨p.,ÖÔg0­/‹ÁC9(æÏŸhooÿË/¿LŸ>½qãÆJ¥R(Âz’ŠŠŠê÷ÌAÐvæiu:tìL4yHDAÛad“‰DPÚ`A©’$ … ¯¦Õjáç€dèppee%ÜÔ<ûÌN ÓÈLXyHÑÂLÅA±€Ílþœÿ¿~ˆÍ†Â1›#Hì0D!Ã;T±X ©9x<I’\Â¼Ðø|>¼)üR<~µêå ¡íaµ<‡Ã¤íÌË<ƒT*…R‚ia°ã =‚2Ñjµ°"ÐüyÞf²T¿nž]ÁbyŠùBPfͳ0«úYÎbJ’¹LSY[[‡††‚úÿ›Æ¡úéæ ³Ìc©3m~®ù0Þ›c^†L™TO ð*piié?ff°Èf`^݉תëë–Í7O‰Åbp1Uó¯o¾oá_=Ïë ñÇ4ÿAÀ*bæ7þOï[óßå]uhÑþƒzž¿uö%·‚a4¹\.ì ž•Wåå÷Ž˜Ïáp éëZ©T>óxóæó™{ ªßÜ=ê[É´¦Æ©F^ú´ù9½¬Lœ?>Œ”BCC‡ Æ,é†94s¥‚o3Ì\˜ƒóC*•îÚµëèÑ£666¦I“&C‡eö‚Á¸ŽÃá0&H$š3gN‹-ºví s°pAhàfÝ9,‚aÕÛm­-Ì< â‹òké_jªŠÇãåææ>~üø›o¾™8qâ7~ùåp-ÀFB@Ns@-X¤Î¸¸`ÛÁIËÔf‹uñâÅ–-[Μ9s„ gΜٿ?¤†¬œr¹fªÀy Óé d4Åb±B¡€ Bš_°±áÙÔjõüùóa>ý]èñž™ AjÔ[„Ô17ù̧‘233ëÖ­ «&Nœ8wîÜÑ£GWVVþøãEEEuêÔ™3gŽR©üá‡äryrrr£FÜÜÜ`ÌŒ3|}}ÓÓÓW­Zþä©S§Êd2Ø‘§P(*++#""ÜÜÜ<==#""župp€»ÃnÞ¥K—Ân‚ \]]E"QzzzPPã`{fŠ`”Q®2£³ÿlBs¹Ü¢¢"»–••-Y²$--mèС0ˆíÚµëðáí­­ÓÓÓ===I’ÌÌÌ„ø°(·N:uëÖMIIQ*•ÅÅÅ»wïîÚµ+ãOKIIñôô„˜ EÁ¶RFãììÌb±œ¯_¿Jrrr`_¨››[:u CTTÔðáÃår9\!>>žÏç:tVçåå999Á²ô!ï­ëÙ a\QQ{kt:ÝêÕ«y<žŸŸ_ÇŽ‡ &‹=<<7nÌápÀÌ.-- àp8eee ™>>>Íš5;v,MÓ:uêÒ¥KUU,@Ójµ°6<Þ°Ûôÿ³Ï>‹‰‰ùôÓO5ͬY³AQQ‘£££OÇŽ‡*‘HêÖ­Û¦M›#FÌŸ?ÿÓO?5™L_~ù%I’AAA7n„•½°Ã'!P&Þ¯ì„diié?j¹Ñh„E¶Õ vÁ:ÒÜÜ\“É¡t:¬z…ÿŠ¢`Ù*ŸÏÏÈÈàóùnnn°žÖW›÷`ôÂÎ>Ÿo0²²²œœœrrr>ÿüóuëÖÁnòÜÜ\£ÑqÛ 9ÈÍÍõôôdÖZÙÛÛ¿ZXPy÷!KJJþ1?0ñWä^Ø…g¾šÔ|ºùò@‹eº°ä•ÙíÀt†p³Ø˜ù’¹,Û„õî÷ïß_´h‘··wLL lWdV®3*ÊçóaÉ>\„Ëå–cæE°Gùƒë-VÆZ(ñÒ+fÍW„[\Ǽ{´Pf8“sõ©ùRêêïŒ 6ò!öÀïˆÌår™ýâØ£¢Œ=ðËöÀïæ'°éEâåcb½Öª.‚ü/˜APAFAPAFAT`AFAT`AF¤V*ð?F¥De”ßÙ¨”µi;!‚ Ø£Œ2öÀ‚  A4¡QFù5¡±FZÌ?df@e”ß娔Ø#:±yeeeX ‚=0‚ o\™4¢Ä_©à(£Œò;+3ŸhB#öÀ(£Œ2öÀ‚  APAFAT`AFAT`AFAT`APAwX1.4Ê(×:ùïOÜNˆ hB#‚ Œ ŽQF™ÀÜH‚¼ã  AjùؼGFãe”ß}™ùDAjyŒ *0‚ ¨À‚¼4dyy9–‚ÔÖs#¡Œr­“™OìÇÀ‚ #‚ Œ ¨À‚ #‚ Œ *0‚ #‚ Œ *0‚ #‚ Œ *0‚ /©Àe”kü÷'n'DìQFeìA'‚  2Ê(£ ÈjBcn$”Q®¥¹‘ÈŠŠ lÆX‚¼qÆÀî(£\ëdæ{`©ÅàAp Œ ŽQFå—Ü MhAAT`APAT`APAFT`APAFT`APAFäåãB£Œr­“ÿþÄí„‚&4‚ hB£Œ2ÊÿÆ„ÆAЄFäm€N,©ÅpÃA4¡yƒ Œq¡QF¹ÖÉæFB÷²²²KAp Œ *0‚ /¯ÀèÄBåZ'3Ÿ8F4¡AFAPAFAT`AFAT`AFA7«ÀØe”kü÷'îFB4¡Ae”QFAЄFAÿ Ì„ Ø#òVÃÊ¢Œr­“ Ì„ ïdUU–‚àAT`A^^щ…2ʵNf>q Œ hB#‚ Œ *0‚ #‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚¼¤cf”Q®uòߟ¸A°Fe”ßBŒc`©Å  µÙ„Æ"@Ú æFBÚ¬ÀL¨;Aj¥ mîÔ"Ðׇ2Êï¼Ì|âAj1¤B¡ÀR@ZlB#R[S« Œr­“™O4¡{`”QF{`AЉ… ¨À‚ #‚ Œ *0‚ #‚ Œ *0‚ #‚ Œ *0‚ ¨Àòþ+0ff@åZ'ÿý‰»‘{`”QFs#!òo@Aj³ E€ 8Fe”߆Z©Tb3† µµƨ”(£\ëdæÇÀR‹AAЄFe”Ñ„FMhAe”Q~çMhì¤6÷ÀX‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚ #*0‚ ¨À‚ #*0‚ µQ1*%Ê(×:™À¨”‚=0Ê(£ü6{`#H-Mh©Í&4‚àe”Q~^h•J…Í‚ÔR8L¨;AjåؼGFãe”ß}ùï1/šÐR»{`APyã Œ©UPF¹ÖÉÌ'Ž{`”QF{`AЉ… ¨À‚ #‚ Œ *0‚ #‚ Œ *0‚ #‚ Œ *0‚ ¨Àòþ+0†•EåZ'VAЄFAT`ùàX(£\ëdX‚&4‚ oÓ/#‚=0‚ oP1.4Ê(×:™ùÄAЄFäm@ªÕj,Á10Ê(£ü¦ÇÀØ#ŽAFAPAFAT`AFAT`AFA7«ÀVe”kü÷'îFB4¡AFÇÀ(£üŒ±FZ :±ÇÀ‚¼ 07‚`Œ È[Q`Œ 2ʵN&07‚  ÈÛ„Ôh4X ‚c`”QFùM±F#‚ Œ *0‚ #‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚¼¤c`w”Q®uòߟ¸AЄFMh”QFs#!šÐ‚¼ë  A°Fäm€Éͤ6÷Àe”kL`n$y µZ-–‚ÔV‹APy ŒN,”Q®u2ó‰c`AAT`APAT`APAFT`APAFT`APAFä%33 Œr­“ÿþÄí„‚=0Ê(£Œ¹‘ù7  µÙ„Æ"@£Œ2Êoà ­Óé°C4¡yã Œq¡QF¹ÖÉÌ'šÐ‚&4‚ ¨À‚àe”q Œ šÐ‚ #‚ Œ ¨À‚ #‚ Œ ¨À‚ #‚ Œ *0‚ #‚ Œ *0‚ ÿ£À•e”kL`TJÁe”Q~›=0ޤƒ&4‚Ôf‹Ap Œ2Ê(£AkB›+4¶m(£üîËÌ'ޤCêõz,©Å&4‚ µU1µ Ê(×:™ùDA°Fe”±FX‚ Œ *0‚ ¨À‚ #*0‚ ¨À‚ #*0‚ ¨À‚ #‚ Œ ¨À‚¼Ã ŒaeQF¹ÖÉâvBÁe”QÆAtb!šÐ(£Œò»nBcŒ µMÓ$I2ŸŒf£Œ2Êï¬Ìè,öÀR‹! –‚ÔV'vGåZ'3ŸhB#Hmî±ÇÀ‚àe”QþWÉͰF#‚ Œ *0‚ #‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚ Œ *0‚ oT1¬,Ê(×:ùïOÜ„ Ø£Œ2ÊØ#‚N,Ae”Q~×Mh줃¹‘PFs#!ò6 )ŠÂR@ÚêÄÂ"@Z¬ÀØe”kL`r3Á10‚ hB£Œ2ʯdBcŒ µ¹Æ"@T`APAFT`APAFAPAFAPAFä*0Æ…FåZ'ÿý‰Û MhAЄFe”1µ ‚  È»:±¤–÷Àæ&5Ž.PFùÝ—ÿvZFlÆÇÀ‚¼qÆÀî(£\ëds#!È{ŽÇÀ‚àe”QþwÉÍЄF4¡AFäßÀy™ƒÌíoAÞæ+(kªÀl6 AÞ0&“©¦ LÓ4I’iiiyyy$Ib?Œ o ï¥iÚÅÅÅËË ðÕØd2q8œ3gÎùäooo£Ñøbû÷¥¦‘X,ôu!H-4¡£Ñh2™Ð„F7fB³X¬—qbáB©Å mŒ ¨À‚ #òﻣŒr­“ÿþD'‚Ô^8Xï&0—`>ø’‹c‘«ž˜L&X®Å,ÚúÿÂ(¿´Ì蛹PókV_?c0Øl¶ù½jcY™7IX^Mft{à×Ó[VïI’¤Édb®ö’ëþU)/·Hy©òÄ"¨9Pчšœœ êô/þǤ¥¥=|øpâĉ“'OŽg³ÙÜ¿„o8| í|2üËB&I’k|c2™Ì¯ÆhuÍÕØd2±X¬={öÌ™3‡ÅbaÏñÚs#ÕС$%%©Tª×{M‚ ¬¬¬$‰££ã¬Y³‚ˆ'âûï¿ß°aøqãzõêE’¤J¥š9sfëÖ­£¢¢Ž?Îf³išžþøã† öíÛwåÊ• ½Mš4ÉÊÊ8pàõë×###õzýklâ¹\.ŸÏÇ:óºæ9æ.hôz̘ˆÕMë^“ ˆž={òù|FSTT´råJ???‚ 8NÇŽO:EÄöíÛ¯\¹RRRbkk 2nܸÁƒñÅ_ý5A &“‰Çãݼy3,,ìúõëS§N%bçγfÍš8q"AuëÖ­¬¬$bΜ9ŽŽŽgΜ!bܸq"‘èøñã={ö¤(Š×Äÿ\=<*ÖŸW}¯¼Ðïå†ÇÅ‹ûùù †K—.}÷ÝwÍš5kÑ¢…Z­öññoÓ©S§š5kfkk«V«ù|~ÿþý—-[–››ÛµkסC‡æææþùçŸ]ºta±XlÔ¨QAAA‡hšž6mÚ¢E‹nݺեK—Ñ£G ‚ îß¿¯Ñh† ¢ÓéD"‘F£¹}ûvÏž=a‹cÎwn üÆLh‹î¾gÚcsÅ«‰Ùi2™ïÈ›<¯A©¹ 6kÖ,›µk×Bqéõz‹Åápôz=ŸÏg¦|¸\.I’eee¶¶¶û÷ï¿téR=z÷î}õêÕ?ÿüÓÓÓÓÏÏ$ɘ˜˜³gϺ¸¸¬Y³ÆÙÙùøñãA(•J[[[{{û:uêX[[Ï›7ï£>¢i<Û¯ñ½È¿xæ1æuÃüû×ROjn¾‚µeñÀoÇ„~3NZ˜í€77×gø¼¸5ŸxdfJÞäæ×çC¡Á™;r¡Ü˜H+Mš4‰‰‰!IR(qýúu‹åææFÓtttôŠ+ÄbqXX—ËU«Õ‹/îÞ½;A«W¯ž7o ª{ôè1qâÄ.]º8::J$<[¸ÙßX¹13X0€g*+ó oq‚ú™•ù%wy½!"ß„Q/™ŸŸ¯T*Í»b‹U\\\ZZj2™RSS CMô*÷Þ½{çÌ™cÞ~¿™·û/€ùÞ?ÿüó?þØ·o_ß¾}333ÇŒC„F£Ñh4p̈#ø|þ'Ÿ|ÿÇL˜0aòäÉÖÖÖ$IöêÕ+''ÇÛÛÛÖÖV&“5hÐ ))©W¯^àr[µjUçÎoܸ—˜˜LÄܹs?>uêÔ„„„½{÷úúúÞ¾}¦—ÞX¹’TVVšWw½^ŸŸŸ_ÃzRóǦ(*--Í`0üÛ!‡Ã1oŽ_g-a>Ax½2EQ4M·mÛ¶cÇŽ4MSß”••Y[[oܸ199™ ˆ[·nÑ4m0 ƒ^¯×ëõƒ.¥×ë™ êõzŠ¢@†ƒá.z½ž¦éQ£F988Àø’¹”é/(Š2ÿž¹Â«½#4M‡……ݹs^°†ååóàÁƒÐÐÐÀÀ@?????¿N:?¦O?ýôÛo¿¥iZ«ÕÒ4}ÿþý°°0ggçºuëΜ9“¹‚Á`hÛ¶íîÝ»áú‡nÓ¦F£‹¤¦¦¶k×ÎÅÅÅÕÕuРAåååð"‡ tuuõòòZ²d‰N§3þEMÞ ~ Ÿþyøðá4M3—­~<9wî\¹\~ïÞ=8˜¦éÛ·o‹Åâ„„¦1¿#œû̺Áüâ&3(Š2¯igÁ÷pMóÚËinݺEĵk× „Íã™uŒ¢(xý‹/Þºu j5£t¯VžÌ'aúïßcãÆÐCµ3™L[·n%âÉ“'EÝ»w¾„2b€ŠÀ?O†»Lœ8ÑßßßâæRðÚt5jø‚ðmÚ´±PàšðÌç„‹3ÿb~Hø³¢¢ Á¼r˜¿ ùû2gUUU©Õjæ{¦ÀËÊÊ,N-Õ€Q` 2Ôæ½›4i*DÓô7‚¸{÷.£ÒæuÃ\¶("sùyek~VõR EÐh4 ¦zu5o«Wã&Mš 4®Ã}z÷îݹsçêtº×µbõƆ r¹¼K—.¿þú+I’<¯   ..n̘14MgffNœ81''‡$É_ý5<<œÍf‹D¢¨¨¨ýû÷[[[÷ÝwçÏŸ'"99yòäÉ›7o&Â`0|ùå—?¶˜ƒeÊ¥W¯^3fÌðòò*--mÖ¬üœZ­¶sçΫV­rwwíÖ­Û¶mÛˆwuu.i›Íf„>[¨| Õæîbø—¹÷ÒÜõ¼³à.Ì÷oëÝ5››Û† æÍ›÷àÁ¦›…úîÝ»!!!nnncÆŒùꫯ„BáªU«6lØç~öÙg³fÍ‚‚úî»ïŽ=jޜݺuë‹/¾˜9s¦ƒƒÃ£Gš7oÝûÞ½{¸jÕ*µZ-Æ÷ùçŸ;;;›L¦ˆˆˆ-[¶$™““3qâÄ´´4’$?Þ¤I…Baoo߯_¿%K–€ö6mÚôâÅ‹¿ýö[XX˜B¡€ö—Q¾¶b2½ÀÒ8qâAiii&“iÅŠ"‘¨ªª L#‡“œœ¬Ñhx<ÞÖ­[Áðˆ‰‰ñôôëtĈ&“éûï¿—Ëå-Z´ i:!!A ää䀉VÖ×_ §ìß¿Ÿ ˆŒŒ ¸ÔðáÜœhšÞ³gAÙÙÙð}XXLŠš’ߺ ý<ûÊüû×eƒ½ä ¾Àâ}í&49a„ºuëÒ4ݲeË   š¦¯_¿NÄíÛ·išŸÏb±ªªª˜öºªªŠÅb•••AuÕjµcÆŒa³ÙjµZ,CVƒÁàîî^§N‡ÿz[^Λü1‚1bÄîÝ»¿úê+ŸV­Z1©_Àwâîîn2™–,YR¯^=ósýüü¼½½¿þúë¡PøÉ'Ÿ¬ZµÊ`0¬Y³æy b4h°f͋Ŭ4™Lvvv...ééé, –=¼öÝ5T]‡sñâÅÁƒ6ìûï¿§( z6› ßGGG/_¾üÚµk­[·¾}ûvhh¨N§ãp8 i°Mq¥0î.(f@k4á_†‰¿ö3‡ wñâÅ©S§Nš4ÉÚ'0M&“B¡¨W¯^«V­Úµkw÷îݼ¼¼Y³f 0šÃ¶mÛ&$$|òÉ'4M÷ìÙ3))©¬¬¬M›6‹„`²Ž ˆÏ>ûL¡PŒ7.??ÿæÍ›ãÆ1b›ÍŽŽŽ.++›2eJvvöáÇcccårù;Õ+ЧOŸ®[·®¬¬ †P›×­[÷äÉ“²²2hÑŽ9âããCÓ4ŸÏgvð²X,ØÄËår5fv3MôÌvbøcZ4XÖ& Ùl¶D"oƒÁªlÞ¼¹¬¬L«ÕÂ Š¯¾újÔ¨QG}úôéŽ;ÂÃád>þøã‡6mÚ”ÃáJ¥Ò{÷îÁ¦Kóz"***–/_žŸŸìر;wŽ=š ­V 6ŽÑhìÕ«—­­í Aƒrss>|8tèÐŽ;º¸¸À¦QF#‘HúöíÛ³gÏK—.åçç/_¾¼cÇŽ ÒüñÇþýû 7lØðùçŸCäñxÉÉÉYYY¯q/4ç ÷0,kĈOž<éß¿?ãðäóùuëÖåñxA:tè³Ï>ëÔ©“@ ËåË—/‡&ÿ£>:xð`ÇŽI’tppøä“O¤R©@ €>й…§§'AuëÖ=yòä˜1c8@QT¯^½~þùg£ÑèååµÿþÏ?ÿ|Ó¦M>>>P¸ïEYYYéõúßÿýË/¿„¥ÎYYYgΜ±··‡Æ›¢(fè¾cÇŽÐÐУGÖ­[·]»vgΜiԨѮ]»úõ뜕•µ}ûöÒÒÒŽ;vëÖ zݽ{÷úøø\¿~]¯×õÕWAìÙ³'... `ذa"‘:«#GŽœ3CÉÔ+‹Çxæ³™WìZ6ôLߦÅ7æ“(Ì‚*s³ÇbµÆ3-:óXÊ0œƒ†ÍfÃemmmW­ZuåÊ•1cÆ\½zõðáÃíÛ·]+^‹‘Éáp*++5jÔ¶mÛ¥K—qìØ±ÒÒÒAƒÀs2«ó`ÅxãáK0#ÁôÈÈȘ8q¢ÉdÒjµ-Z´ð÷÷‡éq•JEzøðaWW×íÛ·ÿôÓO7näñx×®]ƒÈ[ €Æ(88˜)ÕW~ÇêûFÿñx gùž p¿1óáæ?ŸÅYÕ/B„››[dd$SÓÌc˜ß3ºÍápvíÚµnݺ xzzš×+‹Çxæ³1Ëfj¥ºz!¾à›çí ý·¯¾Ë”$ÉnݺuëÖí­Ék|¯W®ëZ­vòäÉݺuÓëõëׯïÖ­ø]œ«ßÜ*ÌÝU*•D"©¨¨`±X02„ZhggWZZJü³†…jµZ£ÑìØ±œ…Íš5 )((àóù<®©V«Ÿ²ë?--õÄâOð FGGGGG?3Jõ B/^À™3gΘ1ä—ÙðüÕ·¬Ào}¶*«¹7âu)Þëš>©ªªú補'Ož|ëÖ­½{÷š/ä0_lá_ef†`‰KFFF`` „¡JMM gNÓE"Q½zõ.^¼hþ §NR«ÕåååNNNAÀ#óx.o þO î^Ê\§ïB˜1¨3Ag¾-þµD™°he_í:P· àÆØ±cW¯^íããÓ¶m[¨.0²`ÆWP™Ì£LA8h˜ìÙ³çøñãaALLLQQÑðáÃÏ%œ2~üø+W®lذA«Õæçç÷ïßÿüùóÖÖÖß|óMUUUvvö† `ª™xa$ËÕ{àw"9Ø¿­ ­ ë×õü,óvÑ"àØ{/›w5¼ŽyÉÖð:G"‘À í§Ÿ~jcc3räHèc%‰H$‚~@"‘@5’ÉdÌ‚‡#“ɘ°/¿þú«Ohh¨¯¯ïš5köïßïííM„\.‡Å z½>22rÕªUS§Nõ÷÷oܸqii©··7ŸÏ?pàÀ¹sç¼¼¼"##…B¡£££ù0¸æeõvëÀ+?ûóüÿoÿcŒü×b±X¬ððð•+W†„„ÔdP û¥*++íííAiKJJ¬­­A.//g±X0K\^^nkkËápŠŠŠ`K ¬C`Îe=|ø°¢¢"88X,ó•–– 0ŒááËËËmmm‰¿Â›(•Êû÷ﻹ¹¹ººÙÛÛ×|ÙúõëoÞ¼¹e˃ÁðúÃS|xpÌcÊbÀΚ'ì2%¾ZÒ*@Ý#h—s€ È<–þÑ4 KüáósŸmýúõŽù5Á¿emmÍø¥ÁZ3‰¤U«VÕïRÃ@¹Ï4XP~Åäf&ô3ý1(¿X~Þø®ÉlÁaÆ<ŒF1 ,Ža¾4÷͘·ÈLJf™¤ùu˜é ó0ƒæ_šßåõ–ÖŸšÈð‰6Ì;gÿ>Æwõ·ù¼hu?Ù3ÿ|ñD¦)|wMh,…×>uôʥʘ¾ „æBßhþßgžÎ¬ôxñ3˜û±‰jùߨ~#¬?5U`â35à£æc`¢Æ‰ÂÍ£d¿àO¢Z2 ’$ããã C³fÍ,LëgÞ·z*àÿ.ÉÎk4:Pþ»2XäF2A¡ü2òóú–W¸&ñ×Nݘ˜˜)S¦$ ;¥vìØñé§Ÿ‚c‰$É#GŽôêÕ vÕY,/'âÛo¿ýꫯ˜Ð‡£e&x,ºÜ¾}{£F ¨B¡P«Õ̸†™d®yY=Ï Àºô 2ó‰ÙnÞ-@»ŒFãÊ•+!^I’[¶lÙ±cGnn.˜ÇÛ·oOLLäñx¤Ö¥0ÛÄ…B¡@ €Õ³:ÀN`¦Ý©W¯ÞG}W4hÐÌ™3a3†=ÆæM òNéEß­ÜH`÷ìÙÓ`0@ôÜÂÂÂôôt‘H!¾yŸ>}‚€ý4ÇŽ;|ø°B¡€ ÕF£Q ”––îÙ³çêÕ«L›Íb± 8pâÄ âADppð×_MQÔõë×SSSñ¿»‚j>AÒ®]»¥K—ž8qB«ÕFDD$Ù¸qãýû÷ß¾};,, »°X¬)S¦0sž¾¾°}œ‰/AQ”««kaa!AÇŸ0aBß¾}ÙlvŸ>}-ZT}ŒqujµÚÔÔÔ®]»Áf³­¬¬`­u 'É@6ßP…õç•WïÀ'Ç¢~æ$;Ê/™†O*•Z,®xµk‚+88ØÞÞ~Þ¼yÁÁÁ®®®AôêÕkË–-UUU0¥deee2™Îœ9ãææf0`—ñWÈrˆøÉáp œœ@™wïÞ]YYyýúõ!C†<}útïÞ½æ[Y`£%T N÷ñÇoÞ¼Y¥R™{³A¨I¹ñxŸåææFÄ“'O233Û´i7=pà@yyù°aÃ`JùÌ™3wïÞuwwŽŽf.òwk ¯a=9*p­^¶eµóñ½þÕÁÕuõíp@Pߟ.ý™S-R12ñwá{ótÞæÁë³PXÌÁ·€±7㲂?-.‚ #òzÀÍ ‚ Œ *0‚ ¨À‚ Œ *0‚ ¨À‚ #*0‚ ¨À‚Ô„ D¤6‚k¡¤6÷À‡ÂR@A7nB?3É‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ï Ä÷ð'~ß ²f±Î?½…$£æB”ö°^péy·`2|˜ïÎÈr¹\*•šWh¬Ø¿ë.‹Å‚l#=zô9räÒ¥K/]ºÄb±>„¶^ÓÖÖvìØ±Ý»wwss3©©©{öìÙ¼y3EQL6ã÷¾ï¥iÚÉÉ©S§NÏì„išf±X7oÞLLLü@ʤvØÌ ìÛ·ò/®^½šø+3õ‡Ð÷¶hÑ"##£zÊË—/»¸¸XtÑïwMøý÷ß_œ›3==Ï磧ಙ%Éüùó MÓ:Ž¢¨Ÿ~úéCP`È?æééYRRBÓ´^¯70Æ£( RߺuK(~™Ê 2œÿy™¸Á½çîî#aìsÞjq¿s›ááá3gÎ$B¯×óx¼ù·н¼à.—+°Þ¿?¶Fí}tÈ@íÚµuëÖ™L&n›ö·ÌË˃nöyÐ4]QQQTT2Ö~Tà· ô6•••_|ñEXXØÙ³gÙl6LhµÚ²û÷ïÃÒ3[1£ÑH’d\\\YY‹ÅBF~W†l6ûêÕ«:t4hPJJ ›Í&IÖr| À²FM˜…FXã±`Á‚ªXjxò¦Ú¡¿æ6¥RéìÙ³ËËËa6Å`0| óÀÄ_“Ck×®5ŸH3 `’Ð4=vìXâÃXÈïxêÔ)Š¢`9€ƒ¢¨ÂÂBœ~çj0A^^^[¶lŠ»råÊD™ðøñãsssÍgMÀBhݺ5³)­z/}ïÞ½ììl\ ý.ZPìn¤çu³üýlªÞûzü<¯ì‡`NƒeÈ,<ú0 á|˜uAAAAAAAAAùþŽfnµ€P|ôIEND®B`‚httrack-3.49.14/html/img/android_experts.png0000644000175000017500000027305115230602340014440 ‰PNG  IHDR@µ6E ÊIDATxÚì]g\G×ßz÷öBAD¤("bD± Ø»±Ä5ö®Q£IŒ½E{‰5övì]ADTD^nïmßçqßû€šD“]RRb³Ù€I***.]º4yòd?"{œœêÖ­ë(Š¡Q·nÝŽ;ƒNžŸŸß±cÇàààªBÛñ¿•D´ãÿéÍKºÚŒaŸÏ1bDnn.ýf*))™6mšD"q´+qH$êÔ©S£Fù AvíÚ;ŒfµZišÞ°aÓÁñ–æÍ›÷íÛ·zõêÌ Að"Ú·oßš5k"Âçóccc[¶lÙ¢E‹ØØØ&Mš8;;¿Eg‰¥O€1jÔ¨e6›­V«ÝnNƒ†Õj5›ÍÀxáááU¥è±b±8>>¾W¯^ 4¨ÊÀ7n´Z­?;vì¨Q£233­VëÊ•+ìäTTT¤¥¥éõúøøxÇMœ8Ñ`0<|øP§Ó%$$¸¹¹edddff>{ö,33“¦iè_I¯f‰¥OÜúE¤sçÎ4M[,FH:’Åb¡izĈUÙ˜Y ´oß¾sçÎݺu‹ˆˆ¨ÊÀ6l izÛ¶m‚4iÒÄh4Ò4ýÃ?0`Øøøxš¦CCC¹qãÆµk× ¯Y³&Af³ù«¯¾Bd÷îÝYYYŽøòË/‹ŠŠ(Šªª °ª6KŸ2Ùl6Ç;6{öl‚ ªº©¬V+Ak׮ݴiS%?Av»½Y³fãÇqývõõþýû(ŠnÙ²¥ª¹ N©”””úõë§§§ƒ«´´AÌ;W$‘$yíÚ5E/\¸n6è†aØœ9s~üñG“É„ãx%?ËÀ,}âd·Û ‚X¸pá/¿üB„Õjudo‚ ’’’Æ㸣[zÖ¯_?11ÑÓÓÓh4¾Å±?Ùl6ww÷ž={üþýûŒ¶Ûí8ŽçääôíÛ—Q§¹·AƒgÏž•H$Z­öí–'0ðúõ냂‚D"Q¯^½×y’AîСÃÖ­[øäÉÇ_¼xQQQ?Ñ4 b®|óÍ7;vìP(UÅ/ËÀ,ý[xAƒÁУGÒÒRFUÖëõ=zô(++s<Ýe¸÷Ì™3Œ`ü]! È‹/ ÅñãÇ)ŠBª¸‹1 ³Z­‘‘‘»víêÕ«×îÝ»%jII Š¢NNNV«ÕÓÓS¯×ëõzA¢¢¢‚ƒƒ—,YçïÙ;Ø¿.KÿEÇñÜÜܾ}ûZ­VÉÆ KNNv´Íœœ ƒÍf«äúz­¥m³Ù®^½º`Áwwwæ.Gî¥iÚßßÿÎ;8Ž7lØpÆ +W®¤(jÿþýË–-«¨¨8yòäúõë¿ýöÛ¹sçnÛ¶ &¼iÓ¦‹/fff¾)€„`ÿ´,ý{ZA\¼xqìØ±6l˜?þ¾}û­b`³V­Z>}tZð$ ’$9A̱# …BÇÛ·oïêêÊÜÿ:j8ŽÿðÃ4M{xx0›BZZx³úöí;cÆŒÆõÕW«W¯F„ÏçŸ={vûöío¿JÉÒ¿@”õë×oÿþýŽB4^@°xñbÆå‹¢è±cÇRSS¹\.ŽãåååÙÙÙ G6>sæL8©OµÍf#Irÿþý«W¯þÝÍ÷$–Yú×Ñ[ÚßýÜJæ´Õj…+6› ~…-‚=‘WGYoоFe;Xú20Èáײ1“èh?;ö¬zW¥Ðh¦›{ÀK,½u3êÔ©ûXbéce`&’%–XúèˆËåìW`‰¥•Y'K,}¼ÄFb±ÄËÀ,±ÄÒÿD…þÝ4M#ú¦3-EÞ Â¸° ,±ô?c`Š"äÿcÍ Š…¦3i»¶ÛéJ,JÓŠ"Á±Û­6mµ²ÇÙ,±ô?bàÔÔR›DÚjµ (j±Ø1 ÃqÚj¥iåñ(’ü‡3Ü‹aˆÁ€¼|™ãììééɯ^ÃJa–XúçEûòåó6ü\«-¹}û2Š¢™™wÝÜÜÄ™™9v;Ò«×ðÆ;zÅ&I¤¢Ù²eu|ü—11ÞÞ4޳ ÌK• ÌWv(ú·00Š"4h4EaG£Z]f4j4šRˆ¢. E‚ C!EV+ú ~EÇiŠBiÚÈáÐÁúÉXb© ã9”‰ÐÌ¿K…ÆqÒ!x<¼I“Ž'NäÔ¯ëïh³àó…¾¾ív3Ž#F (BÓv«•&Ãl¯˜™e`–Xú/Â0¬¬¬L­VC²¡»»»@ xKÊÑ{10MÓ<ž@§ãQ”=!¡ÿ½{Ç›4éÕ¸q«œœtŸš~~³³‹y<.‚ÈF”ÃJ¥ø‹&“ ÇQŽ.)1 ˆ„93`Õ¹~8ñ$Lê ä¬ünÿÿUnK¯òŒãxaaavv6EQ‹…Ïç‹D"È(ü+–1‚X¯^=f4*0 5tv»ÕlÖ ‹Ål·ÓYY©û÷¯Šˆø¢°ðLn.ááMüñË:u: NÏžÝ/,<ضí8ˆ‚Ù“$Éçóyƒ¦iµZýw° §üñïb·Û`)F­V‹¾õ 6#¶Kï BSEQTfø[làW,‡$%mA¤I“¶(Š2å PÁqÜ`0de]uwÊɹSX˜éã“ûè&——jµ/ ‚_Xx®Zµš$)´Zµ(Š÷Þ¿ßl63¸{EµiÓ†¢¨ß…Þý³$“ÉŒF£Édú#ÃÒ4-‹ïß¿Ÿ””d³Ùbbbš6mª×ë!Ǻ*«K$’;wîÚµëàÁƒxÍ:ÛYúƒdµZaY2ŒðwÙÀ 'b؛ģËu²Ûµ&¬Q#Îjµ<žÝ!<¼÷éÓŠŒNá8 ¨Cv»Ïç''';Ð趉åñx @ˆ5E…`{é‹‘®{mµZ™²nÐþk±XfÍšÕ¶mÛfÍšéõz g´ô¶P(\°`Áš5kBBB‚øá‡ú÷ï¿xñbÚG^£ÁT.—?}ú”áÇ|n–™Yz‹bèååHZv»]$½óîÿûÇH‚uí:Ól..-Í­Š”i2郂šÛlú Z¥¤œ!I¬Aƒ˜ÐÐ.S*­^^uìv“c´àVÿúë¯ÕªUƒMEQƒÁ€ ˆP(4M@`±XÌf3‡Ã!I’$IµZÍår ‚Ðh4>&“É ƒÕj•Éd: ö¡³V«/ßæÍ›kÖ¬™ Õj9`ü¢(*‹µZ-cuØl6©TzèС5kÖlܸp}“’’zöìY»ví/¿üR¥RQÅårF£Åb‘H$jµ¶GÓ4‡Ã±Ûíf³€QH’4™LìJeéµN›Íææææåå{=Ô|yGØ[Ÿÿbuë6öõmðZÕnG…BÇ­|>Áãa4Úl´Ùl1›+sUªR Ãÿ;ÒƒÐM†`ÝñÅK—. …B¡pùòåƒ  …+W®œ1cÆØ±c£££ãââŽ;& m6ÇûñÇ[´h3zôhF#“ÉvìØ1zôè/¿ü2::úàÁƒ:uâr¹ëÖ­5j”P(4'NlÞ¼yóæÍ§M›ÜQZ®]»6..®ÿþeee¥¥¥ }ûö]·nA÷îÝ4hкuëZµjÕ¬Y³Y³f1¥b‡¾~ýz‘HDD~~~×®]?~ÌãñÞG;béSub‘$™••uùòå›7o^½zU.—¿´ý}˜!“Io6WÖŽ•¡ãÎ99™×®‚e}åÊá;wNðù.R©ûóç©(Êqd` ‚‚‚ÜÜܼ¼¼ÜÜ\µZ-‹~øá(ǶråÊ6mÚ8;;gffîÚµËÓÓsíÚµ#FŒxøð¡§§çªU«¾ÿþûñãǯX±ââÅ‹3gΔH$………G5 “'O 3f ‚ qqq}úô¡(jÞ¼yçÏŸ_ºtéܹs·oß>iÒ$P]@V(ÙÙÙQQQF£” ­VÛ¨Q#¨m2™’’’Ž?>wîܱcÇnݺõàÁƒb±Øf³Y­V±X,‰6lØ ×ëE"Ñ©S§îß¿ïçç»dYª*„µZmiiiEEEYYÙû¬â<Œ¢xÃ0.—‡¢IR<E‡²ÛmAA!G–俦¶l9°fM¿mÛŽÄqŠ’d“²²G‹EqfûŸÛàÁƒÁŸn±XæÏŸß»wïAƒ9sfâĉÀu£FR«Õ‚DFF.]ºT©T6kÖ,88øðáÃõë×_¹råÒ¥K'L˜Ã~öÙg$IzyyíÞ½›¦i£Ñ4uêÔððð¸¸8•J•œœ\¯^½ž={áéé™’’¢×ëa2† ‹Å"ÍW>Ÿ¢(ÔÅÁq|Æ 8ŽïÙ³ºÁ¡g2™†zðàÁääävíÚ;v¬[·nÕªU+))y-Œ0K,aF’$xdþ®H¬Wî2sNN†^_®Õjž>}j2é ³ÒÓÝÔjuII)‡ÃÓhär¹F*õ·X4:]¹ÝÉårm6‹ÉT*“yËåÅf³$9 ½Á“„ È–-[ÜÜÜ, ‚ ÎÎÎz½Þ`0¬ZµªY³fV«õæÍ›J¥R*•‚‚ªR©JKK=<???Ú¥¥¥þþþUß üÀp½sçÎ0I’b±ØÓÓÓl6ÃAÈF&ƒJ¯×÷êÕ+22òäÉ“W¯^íѣǸqãfΜ Ñ0V«U*•:;;?{öŒ$I`c‡“““Ããñ b l=8Žƒ ­Ò¬ø|~÷îÝO:U»vm—¦M›êt:–Yz­JkµZýüü¼½½A~ðx¼w‹âøC60†áv»Ùj5r¹‘Ã0Œ¦- F’˜HÄ ¹E™L '' †áNNN6›–$I›Í" (Š_u¹ƒŸV$‰_‘““I’\.wÔ¨Q±±±:t1b‡Ã0b±ØËË ê—Ö¬YÃ0±Xýøñãcǎݸq£Ñh8°[·nûöíËËËóöööòòR«Õ;vìh×®00l Œ#Þ ÞÃ0½^ßµkײ²²åË—wîÜY&“Uæ,±ä¸2y<žL&“J¥2™Œ$É¿>ö ÃÂÃíV†¡:urqqÕëu™™ÏÃÃß?ÏlÓ¦N§ÿùçm/^ä,[¶ôСƒ={ö:pà@DDă"##FI‹Š‹ÃÈ‹Åf³-[¶ œ@` O˜0aþüùééé¿üò EQAAA_}õÕÆù|~jjêÈ‘#›5k¶cÇ‹ÅÒ»wo.—;cÆŒ¹sç–””Ô«Wï—_~)--½sçŽÁ`P*•ð »ÝÎãñD"Ñ/¿ü"“ÉÚ´i£Õj 0sæL‚ öïßߦM§V«!F¥RMœ8ñÚµk-[¶üâ‹/(ŠÚµk‡Ã™={¶N§³Ùlf³™qY«T*8Ž2 …ŽÁêÔ©S¿~ýK—.uíÚõ†Ž°ô¯õB?þ¼¨¨Ô½ÀÀ@Ðòþìh8ãz­m2™nݺåçççääÄår_£ÑÏCè¹N§ãr¹\.W¥Rñù|™L¶bÅ ÖÿÌÒ[$0‡ÃyøðaNN$34hÐÀÓÓÓb±üÅÉ  ˆÂj§ß¸q#666//Ïç{zzªÕêÄÄÄË—/µjÕ¼²†q8TJJŠÑhxñâ…««kpp°J¥òðð€ùA„£B¡¨¬ à8h¿`÷Bd•‡‡‡F£Q(À¢È«Âç(ŠBpP qËL¬%Š¢:ŽñcÙl¶ŠŠ ¸¹*}¯×ö6ÌFš9@ÒétB¡ðäÉ“»vízúôé?þŽ1v¥²ôvWC‹yuf«P(23ŸÙl´H$ruuµÛé-Zðx¼¬¬, ÃjÕª•’’b·[ûôé£V«‡®P(SSÕ–Ëåf³Y(:ªUk´1<쨽a0zõêe4A Vrê2ý™FU¯¯ãÇ羉ÁÞÔ§Òœ÷ÇÁšàóùûöí«Q£ëféx¡«W¯ž&Š¢ÞÙ ý6xzöìYPP`·ÛÃÂÂÂÃÃ‹ŠŠ**ä¡¡¡§OŸÂq¼E‹÷ïßúôéìÙ³Ûµk·k×.µZ# ;tè––FQÔÊ•+ßÍÉFÓ´P(DQ”ÑŠ?X¥H Pe0˜à–Xú] ̬ŸwöBÿÛl¶¶mÛ¾xñâ'Z­Zµ¤¤$ˆ|x&„PÇ_#…yþA –XB^…Z¼g$Ö˜¡§OŸFÆ’t|<â€GÁL…ÙKõ 00uɲÄÒß"É—¹\îûHð³š%–þúý£HÐ}bµJ–XúŸ10Ë~,±ôá20‹¨ÈK1³î%–Xúˆ˜õ0±ÄÒGÌÀïï£b‰%–þ—6p¥ó[–Xbé£a`@b‰%–>J&I’ý ,±ô±20›¶ÊK1³™«,±Ä20K,±ô¿``6R’%–>bf#±Xb‰•À,±ÄËÀ,±Ä«B³ÄÒ¿„XñËK,³ÄK,³ÄK,³ÄÒ¿…þ–@h; B¿B¾EEEXwK,} ü,y;Ø„FQ ŽØí8Jã‚!¬Ã›%–>†Â…Ph³*÷ZiÄB#ƒÉFÓV†Ã`J¡Š 4 a–XúŸ20poEEEff&Žã4M#(‚Ò¢4MÛiĆ z³Õ·NˆÆhÚžšÛÞ×)*°¦ÙnÃ0CA ÆŠcaù€¤3MÓv»ýÏæxü“¥U¬V«cqV–Xþsë›Ãádgg«5šÀÀ@ƒá?UWh±ÓˆÙŽlvJH””mÌѵz^L+[IgE…جAáñxV«ê‘Ãh‚˜ÍæaEÂ|ø|¾J¥úSÜËçó¡Ö«Á`ø[Á‰PuqqÑh4o*èβ÷¿Š°wX@‚`8îçç\«N_`_ ¿:A5ëT ô ãI6¾Ð³HÎÓ¦õp’ZívXQ(Š>{öL¡PŸËåÊårÇ% ˆ ™LFÓ´B¡‹ÅÀÈ«º‡$IÊd2µZ­Óéd2™cýDЄÅb±B¡°X,0Š¢NNN&“ Fãp8Àº‰D¥R èF’¤«««D"Q*•P Øn·Ûív©T 3‰DLµT蟗—WQQñÕW_%$$ “—Ëå€ÏçË!´Zm%ƒ¿jEQ™L¦ÕjÍf3óD"MÓJ¥R*•:99a·Û% I’A…BA4ÍŒ3ž?3¬:g.—+ år9MÓðëå€`éO3°ãºwô-½©MÓ4 4B#(¦RkÖ'¿øº»5%G¡Ò—nxT”dw¶ë ‘’™ }Db‡¶p Œ@‘WÇÀ4Ãc•*’¦¤¤´lÙ2!!¡Y³fGŽáñxàçŸŽŠŠjÓ¦M—.]”J%#Ö‚Ðh4ýû÷oÛ¶móæÍ'MšÞ#X¬¬sçÎñññ111?üðƒH$BQtöìÙ-[¶lÛ¶m=***8Ž^¯ïß¿ëÖ­cccçÎ ÒÌh4>¼uëÖ5:uê,úíÛ·GEEµnݺk×®0›ÍFQTnnî°aìVkß¾}—/_îææ¶iÓ¦¨¨¨„„„V­Z¥§§Ëd²«W¯vìØ±C‡mÛ¶kÃ0½^Ÿšš* -K§Nîß¿¯Ñh:wî|X*•‚xçóù#GŽ4›ÍçÎ[¹råŒ3’’’._¾¼cÇŽÜ¿?''çÛo¿•H$Ó¦M{üøqbbâöíÛW®\¹qãFOOÏ’’ÿ³gÏ6kÖlâĉ"‘èÒ¥K0“»wï23¡iÚl6{yy}÷ÝwgÞ¼yŸþùéÓ§Ç?gΜ3gÎøûûwïÞÝb±˜Íæëׯ7oÞ|ûöí –Ã¿iii:<Þiiið7nˆÅâcÇŽÍœ9súôé>,//8pà矞˜˜ªÑhø|~yyù„ † öàÁƒN:}þùçÕªU[¹r%ŽãS§NíÒ¥Kbbâ”)S˜9Ïš5K$1ÂÉÉéÞ½{“&M;vlFFŸÏw4OþÈ`Ûÿó6óﻜ£‚¡˜ÕjñòðXÕD>ùV^žÐçQjGq»ÞÐØ^üMË—<«…G`†XÑÊšº£æÆÌF(æäädddL™2¥W¯^B¡pÛ¶m!!!...?Žýé§Ÿär9xh ÅŒ3L&Ó•+Wp÷ööÎÊÊÂqÜn· ‚çÏŸß¼yóâŋժU«V­ÚÖ­[m6[‹-nß¾ýôéÓ¼¼<__ßÂÂB½^âĉíÛ·×®]ÛßßÏž=B¡P¥R¹»»OŸ>Ëå0àøñã&“i×®]¯‰Ífãóù(Šúûû»¹¹mذ¡S§NÔh4«W¯öññ¹zõ*EQ_ýµÅbÑétÌ_‚ÏçcÆXÌüÇ_£FqãÆmܸñÂ… >>>nnnsæÌAd̘1k×®5™L<ïîÝ»EEEÇŽ“H$:N§Ó…„„ (Z³fM''§­[·†††2s^³f 8 >|øÙgŸµnÝšÃá˜Íf6'ü#>FrÔc9êMíW2!1ÌjµÔ©å·A§Ý|™/®ŽXŒìEßµ uvræÚÍ<#QG[Ö÷ŒÍfeØ`0 (zæÌ™™3göíÛA™3g†††ÊåòÂÂÂqãÆ™L& ⣣aáÚl6¡Pxûöí‰'º»»———3^Y‚ ÊËË9Ž@ Ðh4:nèС â†Êårk×®‘‘Q·n]•Jf¶F£Q*•½zõÂq|Û¶m8ŽÃ1’Á`À0Ìd2©ÕjÇ™DEE™L&>Ÿßh4Ò4m2™hš.--mܸ±ÕjU©Tb±ØÃÃãåË—®®®v»ŒjGƒ“ñ~1þ*…B¡Ñh———R©äp8^^^6›M§Ó) ¸‘ËåÎ;÷öíÛ‘‘‘EEE°¯F0ìv»F£)((püz …âàÁƒ3fÌ:t¨Ùl;vì¨Q£ôz=h@oÿ»³íªÍðì;ÇB£8ŠðpT£3…Ôò[…¡ã¯æxó°¥­B%Î.„Å(äpÁþ[öÒ4MQ‡Ã)))!IR$á8^\\\³fMFsñâÅÝ»w#²wïÞ~ýúµiÓÆÅÅ¥^½z§N2›Í`¯êõzXè$IN™2¥{÷îK–,A$==–)Š¢‹ÅÃÃÃl6+•ÊÐÐP©TúË/¿mذ ˆ«W¯"2iÒ¤‡:;;QRR"‰„Bá‰'ø|>xƒ°W¾_>Ÿ–˜˜3ÑétF£|¼ðA ‚6ðññyòä A®®®J¥²  Àßß_¡Pà8¶’Çãq¹\©T Ï‚¯$•JÁ-—››çãã“——‡a˜³³3l"‘èæÍ›Û·o/((ðòòJMMe|æ"‘Ã0W¿~ý“'OœF£B¡8vìØªU«¸\îùóçÛ´i§V«YpÒÕ‰õgm`F£4M v>Ž`fc¨_M±¾K[Ôqsq¦¬&>Ž’´£i´ŠæŒãø°aÃV­ZµuëÖŒŒŒ9sæÜ¾}{èС6›mäÈ‘ƒ zôèQYYˆÓQ£F>}záÂ…?ž0aÂĉÁ' £yyy]¼xñêÕ«óæÍ»}û6ã35kÖŒ;vìýû÷wìØÑ¿•JU½zõŒŒŒ3gÎlݺuÆ &“‰ÃáôíÛwæÌ™×¯_?vìX÷îÝ‹ŠŠ0 S*•ÀV«U£ÑèõúÑ£GŸ:uЙɤI“ã÷an³ÙF}áÂ…åË—?yòdðàÁ~~~ÑÑÑr¹üÏ Y,77·üñÞ½{óæÍ+++ƒ-Ãb±,X° 99ù›o¾yöìY»víâââŒFãĉ¡§V«4lvgÏžýâ‹/T*•Ùlæóù&“)))©¨¨hܸq‰‰‰ÌœÇçìì}úÈ‘#³³³µZm§NpW(åååñññuêÔ©[·nÕ™€¬6YYY  FõêÕÛ¸qãþýû]\\¶lÙ"“ÉJJJÔjuçÎ+}Æððð_ýõÀNNN5jÔhÙ²%—Ëݹsgppð¶mÛ’““W®\Íápš5k¶cǎÇתUËÇǧiÓ¦aaa...ëÖ­KJJj×®D"iܸ±¯¯/A;wîtuuíÕ«W``àÏ?ÿ s;v¬‡‡G‡’’’¶nÝzëÖ­¹sç&$$hµZÖþx -//ÿS60øxïܹ“™™éããc2›¥ÄNÓÿ*…Ї“••Õ¼ys___“ÉÄ00sºk6›µZ-øA:ñù|’$áÐÃ0Fƒ œªÕj™LfµZu:¬6»ÝÚ¸V«…ÃRƒÁ`±XàA`Z‹D"…BÁãñ8ü€U 2 F£Çq±X¬R©‚àóùТ(½^ú—ËÕëõ6› ÜÎUgBÓ4諃ܹ"‘Èn·kµZ™Lf0L&Œ©Óéýð–6Ç’™™Ù¼yó{÷îU«VÍl6s¹\ø ðF#ôd¦µX,6™L0g@f­Íf«úõ¸\.—ËU(|>ŸÃá¨T*†{YÛòc´Ñ²²²J籿;øuÊËËív;òŸT†ÿvRÓ(‚ÐA¸¹¹áWéìb•p‡X"0À`õƒk˜‡‰‚žLªŒº†aŒ$¬´ Ùl6ˆ^€ä&KÁ1ñ€ çrlÀ1·íª3q|Óíµs®” Á|OÇWÿsVVVDDĵk×ÂÂÂÀ_Í|Ÿ¦ôÚ‹ð²¯3ó‘™Ï²ÄÇØf–úŸf`†‡·¬!MÓ U^›xôÇ'úÚ ¼enoêöþã¿çœß>>|U½^ãÆ¦M› …BÆIViÌ×NõïøžlûÃgàwÉF‚›M&Ó‰»t”Šï@ÿÙf^éÞo§jÿ›rÞmü÷œóÛÇÌçó»víªÓéî­:ækßñïøž,}6ð_2ýJ}fé=™ßQ³eŒ¥ß äøËvö[þ%ŸES™å^–~ÿ˜ý,±ô3ðŸ ä`Ûl›mÿÏÛÿïùƒ6p¥¨7yGþ>Ëð/Ô*ÿÈT+w±ÄÒÇ­Bƒm‡·UÁ1Wg¹“S‡ÁüK°`˜8gÇ‚J ~K,}ô l·Û ñ …BfqÓ¯È1Ö÷-qÔo¤ª*oÙD"‘J¥*((àr¹§ª¶ÿ–A^û,³Ù¬Óé ƒ@ àr¹UÇ!âúõë………ðšo‡Ýzû»°ÄÒßJÄa]¡P¸téÒ»wﺻ»ëõz©T:yòdwww³ÙŒ Ä-Z´háÂ…èGDkA*Åb”AŸ‚3dæ@’‰—b˜–á= Ö/_žœœÌãñH’œ1c†···^¯çp8ŽãØív‡±ÖLD‚ E™Íf&,I,_¼xñ‡~¨V­šÉd¢(jüøñþþþL°'ŒÆápÖ­[×§OŸZµjUTTp¹\x·Ç C0ÀMÙív2c•p–þÇ$ÒË—/ãââ–.]ºxñb@°páBÐ¥1 +,,tuu>}º@ €•JURR¸S¹¹¹=0ƒ!77—Ãá0L‹aXYY™c¼´Åb±Z­v»]$}ú´mÛ¶ ,0999(ŠB†ÃÂ… çÏŸ¿gÏžààà={öøúú:tEÑ'OžÌ›7o÷îÝ‹åĉ‰$##£mÛ¶óçÏ ={ö,Žã7oÞ¤( (4M§NÜÜܺví:þü/^ôêÕK£Ñ¬X±âóÏ?ß¾}»‡‡Çž={ …V«]¿~ýæÍ›oݺ•ššÊápž={Ö­[·;wªÕꤤ$&}Ã0…Bq÷îÝ;wî¬X±"44ÔÙÙ9??4d½^ÁájÿôéÓ]»v­X±âÀÏž=KJJ‚L#GÙËår‹‹‹Oœ8!Ú´iß¶mÛöíÛGEE•””$&&‚|~»Ž~J\Cþ»‚Y ü‡3E;w.;;Û`0xzzŽ;Öh4Êd²˜˜‡aEQ`І†† …BÚµkׯ_Ÿ ˆÀÀÀÇs8œ!C†8pàСC¥¥¥PœA*•6oÞEÑØØØ;v{ölBBBUÑÍ Âápž>}ªÑh4h ükSO¶2Öl6èOU/Z¥3°ªQÓ•º9&H±çgŸÌEß¾}‡ PO&“ P£ 1µROÈC²Ùl X‡ÃQ«ÕS§NíÞ½{«V­ÔjµÕj¦ÒëõF£ÑÅÅ¥aÆ۶mÓëõMš4ÔY.—{âÄ ??¿Ö­[·nÝúâŋ˖-›>}:YÁ•J¥<˜?þ¤I“üüü?~ v5<ʸ0K¼\ÁÁÁ+V¬xôèÑ´iÓÊËË=<<0EQHÐel‹ÅÉÉ)&&F.—GEEy{{«ÕjG†ÁqüÆMš4qww`fé[­V¥RÙ¸qc¥R™––Ð_U©X,Þ°aý{÷îÝ»§R©Žã~~~ :¬ãGÃq\§Ó…‡‡çää¼½ø‡Ãár¹‚èt:Fl¦×ëÕj5‚ `W§§§çççK$0U6oÞ|îÜ9½^ï(T%IyyyZZdóƒÛ_(ffffff2‡ÛNNN>4›ÍðúZ­vŠôôt£Ñxô,{| }õêÕœœ˜ü{XaµjÕâp86›ÃáÐ4 gKSÎüêææf4=<< 0mÚ4______€t 7²Á` ŒŒŒ„‡b¦R©Æ·yóæ9sæ@¡“™3gJ$’éÓ§oܸñøñãÎÎÎݺu“H$ýúõ   ???ƒÞÞÞëP;R©Ô××–ìðáÿþúëÌÌÌqãÆ­\¹òÎ;$IÖ©SÇb±øûûÃK=úûï¿çr¹2™¬AƒŽêAEEEà{sÚl6‰DBQTEE…««+|À×*ÒV«• ˆ%K–”””ìÝ»ð+VÜ»w/111--møðá€Î•ðí·ß2D£Ñ:tˆÏçÏ›7P;„Bá?ü°víZ‘H¤×ë׬Y§R©úõë—‘‘¢h``à–-[¤Ré7ß|³{÷n±X¬V«W­ZÕ¥K—¥K—^¼xQ"‘¼xñÂl6ïØ±#22R¯×³rø§?JÉ(c•\ÓLT(~ Þ Üâè\…dW¨‡ ‹µZ­#&†P(ÌÎÎþæ›oV¯^Íãñ÷ ) NçîîÐ9 æ) ÐÕ¹\nii©L&#I„¡#R3%F7f€)@ …:Îd2¹¸¸&+¼œkµZµZíéé íŒ*.]ºÖ>¨orP]¼x±FŽèB Y­Vww÷/¿üòîÝ»÷îÝ0`@QQÑ™3g0 ›0aÂ7î߿߶m[«Õš””tïÞ½¸¸¸_~ù%66¶aÆ={öœ3g|I.—›““S·nÝS§Nµk×nÔ¨Q7oÞLMM9rä¥K—.]º„ãxãÆÛ·o?}úô-ZìÛ·¯I“&S¦L9tèPnnî„ ¶nÝzòäɈˆˆöíÛ …ÂS§N•––²h•ŸÈ1ÒkžŽâÚŽÝŽ¡¡ÕjVR£Ñ07À$IIIK–,6l˜““(`pªœ¡r'øŠcU§ÓCêt:©TjµZ- ³)¼væÌ6Ä Ñ$©×ë!Z“AxƒÛQ…©:;;ŸTb?‘ü] ¨$¯ý©R]˜ýÚÁÁÁû÷ï߸qcóæÍsss —Ë/§V«¡2›H$òòòÚ¶mMÓß}÷ a:ujöìÙžžž:îÀyyy...wïÞ=þü7***5Ål67kÖ,66A–-[&&&¾©|)Kå1Ò_ó0 Ó—)GLb6›ýýý—/_Þ£GªÆ$°º#&ü ¼úŸ 1ö‘OŽ(_ R×kUÇg1÷:_yy¹ãëT}ßW‰%˜úƒ€ÅåÈÉp‘ÑkV®\9wîÜ]»vµnÝzܸqL5F(’cšÍfOOÏ[·n ‚©S§6nÜøòåË _ˆD"£Ñ(—ËÃÃÃ{ôè!—Ë;uê´~ýú²²²ŠŠ æ•A¿°ÙlUÕ–>\ üg+3üè>V«ÕËËËÇÇG¯×;rïï¢sUçï›çkçc2™|}}Ÿ>} ›Žã ô5êI$Æ ÿ¶mÛvêÔ©½zõBD.—ƒ{ Ô{Š¢WI(Š.Y²¤_¿~_~ùeYYY55j4~üx‹ÅÈø S@©ŠÔÔÔŸþAåË—>>_~ù¥ÅbÉËËÛ¿ÿ† hšŽ‰‰ùâ‹/6lØ`·Û7nÜX·n] Ã’’’Ö¯_¿jÕªââbÇ}}}áüìøñãÍš5 ´Z­R2nܸ§OŸvèÐáÊ•+AAA$IŽ?~Ò¤IÕ«W'bÔ¨QË–-wý¼yó\]].\Gzz½^¥R1Þoh¿VÛgÛHû?¾§3f ¦¼èß×þæð§Ú vBÝ“gÏžÕ¨QC à8Žã8‡Ã¡(ª¤¤äìÙ³õë×÷ññ©tŒd±X:vìh±XöíÛ—=oÞ¼Ï>ûL£ÑÔ­[—ÇãíÛ·O¥RuëÖ-(((22²sçÎr¹|ß¾}PË¢C‡f³9$$$))I¯×·nÝŽÊ|||Z·n}âĉӧO{yy­Y³Çñððp;v$''Ïš5kðàÁÎÎÎ5kÖffq¡Ù6ÛþèÚÿ¯N³*4K,±˜m³m¶ÍJ`–Xb‰•ÀÿÛ6“#Í~¶ÍJàƒàûB6/ìÎä6°ß‡¥¿‰ö¼?Ùív’$I’”Ëå …Âb±ðxXF…(kx©OooúèˆU¡ÿî}þüù½{÷4hàëë Óv»]«Õ¦¥¥´mÛ–ÏçWåa€Œ”IAÔjµÙl®$ö^î ƒô†J×ß„ïóGF€hÀ÷puuµÛíeñÚ±ôO8±ØOð>Š¢¨‚‚‚{÷îuêÔ)00Ðn·ƒì5'66¶^½zçΫZZ¨FãêÕ«G½dÉ…BHÀÖrƒ“à¿LG·â‰dÿþý„½:C‰D‚8”•¬äuƒ6Œ°jÕª &ˆÅb¸Ýf³ñùüsçÎ5jÔ¨yóæ±±±s»gÏž2u«N˜?c× ËÀß½{·yóæö€ã ñôôLIIár¹Ž,sëÖ­þùg’$?Þ²eË/^¸ºº~÷ÝwÛ·owqq f>Ÿ/•J)Šb2þÑrz¢:8ŽãxIIÉ£G(Š’H$pÏçó•Je¿~ýôz=T–"I’ÃáH$‡cµZ¡3< ÇñÜÜÜgÏžÁµÀ0lĈ:uºråÊܹs% <(==IrR©” ˜8¤R©@ `y˜eàKüæååq¹ÜjÕª †ªz)»×­[·  À± È·-[¶(ŠÔÔÔU«V]»vM*•Ι3'++ë×_=yòdVV$÷?}úôèÑ£yyy 9õzý‹/Ôjõ…  ºM^^Þ±cÇòòò*ÕmÂq\&“)•Ê“'O>{öL$)•Ê«W¯>|øÚµk¦¤¤¤¼¼¼   111??ßÍÍ-''çĉ/_¾‚PÅX»àܹsjµºAƒb±8** ì/‡*LøÁƒÇ×h4PJB$•••?~<%%E$½%Ö‰õ20v‹‘, \.wwwgjDÐ4-‹U*Õ³gÏjÕªe·ÛwìØ¡P(æÏŸ_VV¦V«W¬Xñã?Μ9s×®]þþþÏž=›1cÆÔ©SÏŸ?ß§OWWW½^óæÍ7~ûí·¾¾¾ÏŸ?_±bÅ€sö—ÜÜÜnݺ©ÕꌌŒM›6ùúú._¾œÏç/\¸Ð××÷øñã;vì ,)))))8pà¥K—ìv{NNÎÆûôéã¨{QZZºxñb‹ÅòÝwß!òìÙ³ãÇ'''3åy<ÞèѣϜ9ãêêZVV¶oß¾† &&&Ž7®Zµj¹¹¹­ZµÚ°ak-³øC!“ÉUß^:˜¢(Çúà8Ž+•ÊAƒµjÕªAƒŸ}öÙÁƒk׮ݤI“íÛ·‡‡‡wìØqݺu'NœX¾|ùáǯ_¿¾víÚiÓ¦=yòD$ÉåòéÓ§?þsæÌõëן>}êhá³Ä2ðÿT!ˆ·£(ƒ1l±XÀ’d.‚d>tèÐîÝ»iš=ztLLLvv68`}ÿú믭ZµŠŠŠ*..îÕ«W@@@bb"‡Ã‰DíÛ·çp8IIIE%%%Íž=;99¹¨¨èñãÇ`l£(j0üüü7nl³Ù4h%‹?ì>AAAPï"44´qãÆP',,L«Õ"¯;éu„ïwŒQaÝÜÜÖ­[÷Í7ß”——ß¹sÇh4vêÔ騱csçÎÕh4µjÕbÂXbøFÀ„ÎÎÎPOø-ÀîF£Q«ÕÊd2Ç“$ÇŸ={VXXØ¡C‡½{÷¦§§«Õê¹sçÂPp<£Õj% SêQ"‘@Ý3(mAÓ´F£=9++«¤¤dòäÉ...•*¹Aõ3¨ØÆL 8™©Y•Ø:ÿÙÓ]¦œ†aYYYOŸ>³fÍR©T«W¯^¶lYjjêgŸ}öÙgŸAtk³6ðÿžÍf³¯¯ozzºR©|íI/”LMM•J¥b±Ê#¯p¡'L˜àìì|øða¨üÖ¤I“´´4øài#""~üñG»ÝîããSVVöðáÃyóæY,’$Áa`47mÚ+..ær¹PDTh¢ÚÈ«Ó#Ÿø ÐyLmTh;ÞåøÖp‹ã¯àxGÄÇÇG­VoÞ¼:—””`6jÔ¨Y³fõëׯ¢¢ÂÅÅ¥_¿~]»vU(,h+ÿdž_ppð…  ”Î?k>•••¥§§7lØÐѱüõ×__¾|¹[·nëׯ1bÄÞ½{'L˜€ ˆ¯¯ïÑ£G÷ìÙ3|øp±XܦM›õë×·iÓ¦aÆíÚµ«¨¨P*•†iµÚîÝ»†„„¬]»¶wïÞ:ur”oz½^.—ÃÉ„^X­VÑóæÍ{ñâ…ÕjU(Lq)¦­×ëÁ½¬Õj•J¥#ê¥Ýn—ËåR·Àƒ”J¥Íf›6mÚóçÏÖ®]Û¬Y³)S¦¸¸¸<}ú´yóækÖ¬ùꫯÜÜÜ‚‚‚Xú/¤ÿ»³ônBŠÂ(Šû÷ï{xxH$Èg (Š ˆ¬¬¬Ë—/GEE9j¶Œôèܹsvvö½{÷8Îâŋ۷oo0"##_¾|©V«;tèеkלœœ›7oÆÆÆ®\¹WÝÜÜ7n r¯wïÞæêÕ«žžž‹-‚°p¢¨¿¿ýúõ«}}}äRi@@@rrrxx¸¯¯¯¿¿pp0DSÕ®];44:תU+<<Çñàà`èÀ8Ï%IÓ¦Má@(00°^½z†Ô­[W&“uïÞýÙ³g÷ïߊŠúꫯhšîÛ·¯Íf»|ù2‡ÃY±bEPPã‰Kï»år9‹Jù>m(¡òôéÓ´´4‘HÄ»aÖ´iS'''£ÑÈh°Ì½PU(2m(€HœèBYF±X ”J¥Õj'–R©dФ¥R)t€0äÇãQ¥R© ê —Ë¿1€¿k4PÅ&žÏç“$ ø|>‡ÃQ*•B¡Ã0µZÍàZ½F£±X,Ì-ÐDQóF*• v™LWôz=p/»~XTʈ€CÌfs^^ž\.‡è(ww÷jÕªÙl6GÙ[U w¦&õìRðf16'ÃùÐþ„Œíí˜Áxª î!Œ m¦J;<L_è mؽRT6ó80ƒ™ñ™þp/3afÏb“áY+?¸6°‡ÃaV­Íf«T鵘ÌoWÑ«öySyä`>#ï/ýnã¿é½ØõÃJàÈ®„™À¦ò³Ä#}LZ4âùÀ².Kÿ aÿUª-ßȶÙöÇÐfþe½ù,±ô1«ÐŽ,Ö=À¶ÙöGÑfx–•À,±ô1ÛÀì'`‰¥—P¹\Î~…÷$Ç#tGUÇñt%–þ˜ýÁ.èÈÁbY­Ö·Ä`±ÄëÄúPÚv»¢(AŠŠŠ***¬V+Çswwwvv6™LÀÛ¯³¤’×ù«#É™Ç0#v]ýA'«B¿¯æ À‘999)))8Ž;;;C2ƒ\.‰DMš4áóùøì¨N3 ²‹ªöùŸ¿#ûì8™?57&¿Âñ^›ÍÆáp8ŽÙl†°jx8Í*/èÛVTT°øwAàÞ”””ÌĮ̀¨(OOO&ôßl6?}úôÑ£G­[·vrrrT§™{swôz½^¯‡XÿªðøŽ€°Ï•0tþÈ<÷²£‘KÓ´P(,...((ðññì«?ò ¶]I³‘XïÞ†„þçÏŸgffvëÖÍÓÓÓh4ê_‘Íf oÞ¼yRRdóWÂÄâóù“'OîÚµë˜1cùr}0 c$ä÷Tv‡‹ÌP DŽã<QÚQ¬àJ¥1µ '3àøìÙ³§OŸ>9e`¢+8bnAÛjµŠÅâ%K–Œ=Z,ÃK@üîÝ»6lاOŸV­ZåææJ$’;wöîÝ›Çã!¯²A*½s‘]{‰õþ„a˜Õj}ðàA\\€l`„¢¨J¥ªQ£F­Zµîß¿Ï.`læ¼¼¼–-[>zô(&&¦¬¬,..îÞ½{®®®Ó¦MÛ°aƒ‹‹  U‰ÅbWWW¡PÜÙÂ<ÏÅÅø\(º¸¸@G†¤(ŠÏçs¹\WWW‘H݆aNNN®®®€IÓ4‡ÃáóùE¹¸¸0u˜wÔétÅÅÅE¹ººŠÅb«Õ* Õju»ví”p¡…B!Ôs !fΆ©TªòòrÐMàq†M:õ«¯¾zöìÙž={¼¼¼àA¥¥¥LZˆL&sqqañaËsuu…ìb6'‘õB¿¯qHQÔóçÏÁ´ZmU'‚ t:]PPÐéÓ§µZ-L h;Û¶mãr¹gÏž…üÞ¶mÛ._¾EÑóçÏW¯^=&&&((ˆËåž;wîÙ³gõë×oÚ´©ÑhT(/^¼Éd·oßîØ±£»»û•+W>|X¿~ýÆëõz`’$³³³õz½@ ¸xñbíÚµcbb à‹ÕjÝ·o_yyy‹-M&SNNŽN§sìY O$eee8q"00°E‹………‡ºqãÆÁƒ»wï^^^n³ÙŒFモ¢¢._¾œ––Ö AøŽ`·&“iÿþý W¿|ùR&“¥¥¥µlÙÇq’$!-™ÃáüöÛo-[¶ Ðét"‘(%%åöíÛ^^^íÛ·•›µ“Y üî ŒãxYY™››Û[<.`û°;ÃÀ Fúùùåçç_ºt FÛºuëüùóùåµZ••õÛo¿ ‚/¾øbĈ—.]êÙ³ç¬Y³$Ifff›6mºvíúÓO?¡(:oÞ¼Þ½{Ÿ;w®S§NkÖ¬‘H$ dŠD¢Ó§O·jÕj̘1ÇïܹóêÕ«Åb±Z­Ž_´hÑéÓ§[´h±wï^±X|âĉ֭[3=׬Yê.LŒÏçgff2ääÉ“;wÞ¸qcYYÙ¯¿þÊçó8PZZºwïÞ-Z,X°ààÁƒíÛ·ïÛ·ïÌ™3?¿{÷nA@•`>šV«=|ø°ÕjHê­[·Ž34vPàQíÕ«×Ì™3Ož<sá±X¼cÇŽN:={vòäÉíÛ·V³ ü^¥€ßî2Å0 |­Ž˜²jµºo߾Æ KHHhÞ¼ùŠ+¸\níÚµúé'v_ºtéöïßéÒ¥ß~ûíÈ‘#+W®LNNµk×>|ø0##cÙ²ewîÜ9qâÄáÇ—.]ZVVÆÈ:cÛ¶m;{öì”)S6mÚDÄâÅ‹Á+11qΜ9cÆŒÑëõPl‰é¹eËÆ› ˆíÛ·Ÿ={vêÔ©?üðCddäæÍ›1 Û¾}{DD„Z­ ¾Ë—/wïÞ=11111ñܹsƒ Z¿~=òßY–f³ÙÝÝýçŸæñx?ýôS·nÝŒF#ŸÏg¬nŠ¢6nܘ–––™™yæÌ™qãÆÍ›7$ÉùóçöÙg'Nœ¸{÷®ÍfËÊÊr´JXfé]ˆ$IƒÁðv`w»Ýn6›)Šªä4âñxëׯ¿téRTTÔºuë5jôðáCÀñ0v»=11±M›6µjÕ*,,Œ‰‰ 9{ö,A</,,Œ¦é«W¯r¹ÜÅ‹0`Û¶mŒÑh0ªW¯îëëkµZ}}}Á°LJJ4h‡Ã)//ïÛ·/Š¢=BQÔÛÛ›é s`ÜéF£ÑÇǧFÌ8€Y ˆZ­Liðiùøø4hÐ@*•Úl¶êÕ«~e%X»Ý7º5ò߀‚\½z•ÃáŒ5jðàÁׯ_ôè‘^¯ÿòË/÷îÝ;pàÀ¤¤¤K—.±àx,¿ßùŠÚl6WW×’’’·èr†AÁÑJÀîA\¿~====<<|Ñ¢EsçÎe iÀsçp8È+è,‡V1·™P(¬Q£†‡‡GÍš5üñGoooFÔà ÙlÆq D‡Ã§1 T¯Víéø¦V«•ùõ?§¯Î¹ Z­V(ñÚ¡? òß ^Žd4}||œcbb6lØ Ñh¾úê«C‡I¥Òï¾û®yóæ*•Š…×bø½€ÝµZmii©cuO†¢ýÉ“'nnnB¡‰Ù°Ùlb±ø»ï¾=z4.’$«U«uÉ@-Çq<&&æÒ¥KÆÛÛûÅ‹)))111f³™$I0§ÃÂÂ***&L˜°|ùò… ÆÆÆ:;;;bÜ9‚°Ãœ#""~ûí7 ÃÜÜÜ®]»¦ÕjCCCM&I’•àÚ™­*˜;ÈagggG€xÐÛÛoˆ‡_ߢÓéfÏž½bÅŠ¹sç6nܘ$ÉŽ;ŠÅâü155õÖ­[×®]«T‘e`–þ´‹ ˆððð .Øl68•a ”³³³³³³#""ÑÌH}ÕªUùùùM›6>}zBB¹sçfÍšEÓt½zõöîÝ»bÅŠ!C†„††6kÖlæÌ™-[¶ìÖ­[‹-är9€­kµÚŽ;¶mÛ6 `úôéÍ›71b„£D2 ÐB)ÔjµÙlž7oÞË—/Ûµk7iÒ¤¡C‡~óÍ7R©T©T2ر&“ Þß4ŽR©´X,žžžgĈ?†JÈp‹^¯W©TІÑétŽ•Ð@t+ ÀÇ\xè¯V«­Vë”)SÌfsƒ ¦OŸ¼lÙ2™L&‰Ú´i3yòä.]ºÔªU+22’©tño&Øý½„°Õjuss³Ùlׯ_—H$NNNEq88yðàÁƒZµjâ×Ñ—c±X¼¼¼>ûì3A V¬XѨQ#N׬Y3EI’lÖ¬Y=0 ËËËûì³Ï¾þúkPªÃÂÂBCC1 ³Ûí½zõruuÍÊÊŠŒŒ\¼x1—Ë”v»Ý.‹6lèçç'· 6¬Y³¦““SÏž=KKKU*ÕŒ3 d4¥R©cψˆ¨rêz¥q"""üüüD"QÓ¦MËËËëÕ«Ò A°xe2Ydd$ÌR©422ÒÏÏÏÅÅ¥qãÆÕ«WgÂÂq §(ÊÉÉ©qãÆ¾¾¾R©´Q£F5kÖýúõ³Z­EEE½{÷ž:uªÁ`èÙ³§··÷óçÏk×®½lÙ2OOOÇbÿÞEÈÆB¿'A€ÁË—/ïß¿¢¨‹‹ ÄBWTTH¥Ò&Mšðx¼Jø²ÌޏízpÐPÓL.—3¸í åà€W €ˆAZ‡ÁU*•c .—Ëáp·¢(.—«V«ív;@î‚÷µ=-㵿Âñ—Ë…p‚ 4 ‚ <i37òù|Ç¡2³…‰Åb­V ‰$IªÕjè¯Ñh¿ ¼84¤R)p¬V«e¹—eà¿R—æp8(ŠCé ÈFrrrÎ[ª;‚ž3±Jp 8i3Ï'ÝѤdâ _ ì^õ.f|¸¥ê¯Žã¿eÏ©ñâ™iÃ+WˆgïÅL†9šfìg–XþËxAp/ÁÚ…Ð|v±ô·Jù—Ùà”2g',°;Kÿ±ÙHe”RF•e¿ Ûþ»³‘Xš%–>f Ì~–Xb˜%–Xbm`¶Í¶ÙöŸ±Y/ô_L,NKÿ$±N¬¿êC¢ˆC}`fƒ„ëìçaéo"ùï‚ß‹ú÷Ç‘?y…5EQ†aÀ´V›Íl2¡ÿŸ KÓô¿Ea¾»~þ:TJV…~/m}Ž\Ïh4f<{&—Ë­V+—Ëõðððöö¶Ûl‹ðA 3¨ËUùêÿ_êUˆ5“ñ {Ó»=®êí•æðúKÓ Lôý[TyÕüäciX/ôûò0m§¹<^zzúÑcÇŸf½°\Râ¬1ÛnßK>zìX¹\Ný"ã5+‰_ +öõo‚5‡˜mÈ”"IÒ$„°åñx2™ŒÁv%¢PóŸâ^Eœœ!u ò™_;&¤[Èd2˜çï>B£¹\n¥‹2™Œ Ãþ„ Ÿ1c†£S ©€Â¶ßÔFQ±Û)ÿÚµëÙy/#šÇU¯AÈÜ1‘Ì¥ºŸ_`Ià7¯]•H$ÎNNV«µª b±˜ ¡PH’¤Ñh„Øý×VE{Ï9ÃB/..6 B¡°¬¬L¥R‰ÅbGëI(>yò䯂@êR©,//‡n까]²dIPP@ €\B ÃòóóQ¨’(f¾IqqqRRŸÏhž·? PòŠ‹‹!ÅŠ.X¶lY`` àà~zkûÿ#ÿX)ú>ê(—Ç{ôèQaYyóŽÝ´Ñ¥Û÷Ï%%]¼rålRÒÝŒ,qÍÀ&­â¯]¿¡Rk@æÐ¯î<çäää^½zµhÑ¢sçΗ/_LIƒÁ`2™°(ÎŽ’²v tE«ÕúZQÃÜ$‹§L™2wî\±X¼xñâ1cÆ0蓹bÅŠæÍ›ýõ×½zõ°õ]»võéÓ€ûŸ…:ÿUØáºD"?~üƒÜÜÜ µÃb±Ñ£Gýû÷ãüÞà²ïܹӬY³9sæ<}ú”¢(¸‘Ÿ)FÏ2™L"‘èüùóíÚµu]¯×F@ ÕjÌÀƒ|²*4{ünm0zƒ!ýñãˆèÅ:ó…«7®(.QÕOr|oàî>½qïÇÅÓ/(äÞ½{$‡CÓ4J# ·ˆˆèÖ­›Ýn/..¾wïž““Ó¥K—ÆŒãêêúË/¿$''GDDtíÚÕl63HB¡°°°pÕªU*•*!!¡qãÆˆŽœcM@‚ ´ZíÆívûÝ»wýýýq¿qãFïÞ½áØ Ìfó?üŸŸß¾}ûèèh@?yòäÕ«W½½½ Àçóä ÇW®\9lØ0±X\VV&‰öïߟœœH}‚H$’”””Ç»ºº0@&“%&&Þ¿_,oÛ¶­cÇŽNNN¸{÷®ŸŸ(ÏŸ?ôèQ‡8N^^Þ­[· „ @lݺõéÓ§»ví±±±cÇŽ]¼xñ¨Q£ø;¶6ÛFA_Ià y…ÔÅÕh¶Ü}Qtw«Pi0 Á µ[rtÖ+qFvÉr…BAÄyOdddffæîÝ»Íf3‚ ëÖ­[¾|ùÇ­V«R©ÌÈÈÀq¼{÷î+W®4™LÓ¦M>|¸P(ÌÍÍýì³ÏFuïÞ=Ç¿üò˯¾úJ§Ó7nîܹ‰låîÝ»§T*;vìxøða¼¯QÃ0Ìd2eddØl¶‡*Š}ûöÍ™3‡Q×1 3ñññ{÷î•Ëå;w>xð X,^±bň#´Zí–-[š4i¢Óé@S•ŸŸŸžžÞºukƒÁ “ÉæÍ›7|øðŠŠŠ•+W>þ|Nl×®]EEÅ‘#Gâãã-Ë‹/ÔjuIIIjj*—Ëíß¿ÿ¤I“hš^½zuÏž=ù|þ7ÆŒƒ¢(ŸÏðàÁˆ#,x‹Å’––6vaa¡ÉdjÞ¼yEEEZZŸÏ¯Z;êÓÀ¬ ü^dµZ вY­eF‹Ù†â(bG;ÀYaÅÔz‚b8A8ºR_¦sçÎóçÏ7n\½zõÆW\\ìææöí·ß†††¶iÓfæÌ™;vì¸sçÎ7Ö®]›””´wïÞk×®Éd2Š¢öíÛwöìÙäää_~ùåÁƒ6l8uêÔ–-[^¾| ¾eÇ‹ŠŠ¾ýöÛß~ûmóæÍ=zôغu+òº’B°ô]]]׬YÃår-ZÔ¶m[@´bÌu’$W¯^­Ñhnß¾½mÛ¶o¿ýváÂ…8Žoذ¡OŸ>6lHIIiÒ¤I~~>`Ör8œÜÜ\«ÕZ­Z5ÀôZ±bÅÎ;þùç£G:;;ƒ-=iÒ¤•+WþüóÏ·nÝÒh4{öì3fLÆ cccW¯^­ÕjýýýïÞ½»råÊãÇ_¾|ùåË—b±Óh4žžž"‘(##ƒÃá|ª´ì9ð{EQF–CQÕE\DeDxÔb¡Q£iÃVƒ—“m·ZL&oÝñÞÙ³g÷ïßÿôéÓ;vìhÒ¤ÉáÇccc¡Ä¡Íf»téR\\œ““Saaa```XXØåË—;vìÈáp<<gæ$ yU«åíq#l Ç¿”Í&Sê5h³Yž—\;`r〰Št²¼€V– K²:Ѓc#½\dÙR«ûøðø|fàû¶mÛ†ÎàÅA5A ŽãñññçÎËÏÏ÷òòºwï^ZZ˜”Àcv»½Y³f€,=nܸ#F$Éø‡q¿xñbýúõûôé"—Ë¡fR%ðJ§‹ŽW6€_›6mš••õÙgŸM˜0¡C‡àùâÅ‹)S¦\¼x1++ëþýûö///ç‹¥^½zF£ñôéÓ2™L­VËårš¦}||$ †aÇ;v¬»»;THbæðòåË—/_NŸ>=22¬Àë„bˆ$Ifff2~of_0›Í‹a˜F£ÑétP2æSe`V¿'ÑMš49wáBL{IË&‘5«y¤gåª ÆjNÁþÕ\ó%«ÊK[télt(ä±6lèÛ·ohhhXXXvvvIIɾ}ûìv{‹-V¯^-•JçÏŸâĉ¨¨¨èèèsçÎ=:22òìÙ³PH§ÓµnÝzøðá 4ˆOKKóôô<|ø0¬i³Ù<|øðž={6oÞœ¦éÇûûûƒ 5Ð0 •ä°V«…]Æl6ëõzh˜L&«Õ:a„‹/Ö¬Y³iÓ¦W®\éÑ£GóæÍ›7oÞ§OŸ¶mÛ>þ¼Q£F111Çq“ÉäëëëææöàÁƒºuëzxxÌŸ?ÿË/¿nA¢P(X.|g‚XŽçϳnݹS+¤ž§m‚'@”¶ÛŒ*EVZŠZ^Ö®m[gûo!…6›íܹséééžžžíÛ·wvvýóàÁƒEõìÙEÑÄÄÄÇ7lذU«VF£Q¥R¥§§7lØ" ù|þŋᠥK—.àÁ#=|øðüùóuêÔ ÎÎÎŽŽŽNKKÃq<888##Ã`0Ô¯_ŽyçïÝ»*“Éž?®T*6l˜““SVV“?qâðj\\œV«‰DW¯^½~ýº§§gçÎù|> `[­V—ï¾ûîìÙ³×®]ƒX®K—.Ý»w/66Ã0±X\£F ‡óüùóÄÄD úwïîááaµZ™‚$ÿõ×_•Je·nÝ^¼xáíí]½zõ²²²ß~û ˆ-Z5jÔ¨¬¬  íI’T(¿þúk@@@BBÂçŸNÓô®]»ÊËËaS`˜¥×ópE…üÎÝ;jN ã$i2èMz]uŸ† #Pµ½N…#P,ƒdÖh4ö€ ˆT*eÍAÏ´Z­ÂÕ u:S+‚1Á‰åxXá"P«Áh4R¥Ñhà@Å`0p¹\(¼æx8! $cà8®Óé nœd(ŠJ$àOµZ ÒO$r®V«aåáEš6m:~üø/¾øB.—K¥R’$GlU\.4g­V ÌÏÌc‰D‚ ˆN§ƒƒh“ÉÄáp„B!‚ ƒJ¨AQ|ˆK…:éC‡½té’»»ûkõYfé•8µÛ ’$IR¡T* «ÅÂãñœ]ø¾Ñ`x{DþkaÙ;–éàû^ ØŽjÐ+ýĸ¾¯˜c£Òd˜ÎПi8Ζ™ŒãÓ+¥þ@Tó£GfΜ¹sçN@àXj”1­½½’s‹™ƒkvL‚‹Ì$+ÁÖs¹ÜAƒ 8°sçÎ …¢ê—a˜¥ÊŽ\ØþÝß9ï“ÑM@Y@þòÑ‹E"‘èõúOûOÀ2ð_ÏÉ•\»ÿrû‚Œÿð£Áîøä7PÖ ýWïˆ,ßþ79¦.ý“æÀ§ÿ…ÙEÆÒ'¹£ýKvR–Ybécf`6‰m³í®ýÿÿ²N,–Xb%0Û~}–ûMØ6+?W íì± Ê$û}Xú›ˆ=Fúkö`‰¥¿‘±XÔ«wk#Âçó ÅÇU*•Ífãp8îîîþþþAL”£(®toUIþþór_ûÜ?Ò® %ËìVŽáŸðßJ‡®|žŽÁ¤ï6Ï#*ó¬ ýþ`¨¹¹¹^^^îîî6PPP R©"##}}}!­’: kAÀ‘²Ûí1À<½³î ÷’$I’$¤+8þáõþ-ãïP)ò ˜DÓ´H$"Âf³iµZ'€„‡·lLoz ¤F V«…tˆßØy…‹íÆŽ°¨”ªÍ¬f.—{îÜ9š¦[´hÁãñÃýKJJ.\¸Ä𰣎-‰0 S«ÕB¡Ã0•J…¢(„ ;æ ¿i~­@C^M”——׫WÅ€çBZÏÛë!BDvv¶Ñh f ðP¥(êâÅ‹Ož< nÔ¨‡ÃyÓƒ*=¢êüiš)))ׯ_÷ññ‰ŽŽü÷·‹q °X,ÿf‘E¥|ß6¬?>Ÿÿþ}š¦;vìˆ ˆV«5™Lf³Ù`0hµZggç.]º¤¦¦–••AΣä‰D'NœhÞ¼yLLLTTÔž={Äb1Ç<ÕjeÍáv¨¦Át`ÆÔøƒ2„Ëå6:Ün4sss™œ>GrÊjµ …ÂÕ«WOžýåË—B¡pïÞ½ƒ† ,UçÃ\©ŠÏçó÷îÝÛ¢E‹Ã‡ûí·7oÞ ==ÍL ^A§ÓåååAnë…fXïN.ùâÅ‹Ž;‚2Éœ`ÎA‰€ Ü¿¿]»vL>0Øõë×{÷î=kÖ¬øøøäääAƒY­Ö!C†|þùçAAAË–-+++ãñx€‰¼J¸%IRdQU«Õ4M;;;C‡JùÀ%K’¤««+‚ …B*•æää4oÞ<55U$™Íæÿ”SDA4 ó,(: õ“>,Ø7;v¬uëÖz½˜n( ɺL>3‚ Ì õz½ÉdbJ%Qµjժɓ'/X°@¯×S¥Õjy<ǃ·P*•$I€‚TTT8;;§§§÷éÓçÅ‹PÅâߜÀîïÓæp8Pm@«ÕVM:ÅqÜ`0Ô¨Q#==]©T‚xaî=r䈿¿ÿ7ß|c±Xš6mš™™yåÊN—œœœ››ëçç7xð`¥R¹xñâÌÌÌððð‘#Gr¹Ü/^œ>}ÚÉÉéܹsK—.•H$‹/NIIiРÁ¨Q£qðÀ1~èСƒMš4)55uùòåjµzæÌ™Ó§OÏËË+**Òétׯ_oܸñ Aƒ–.]zÿþýÈÈÈ!C†0Zòª ‚R©üþûïÙ¶m¼Ý£GÆN,²+--;wnAAAÇŽ{õêe2™H’\»víÕ«W½¼¼Æçåå¥Óé@ ^¶l€³oß¾=22òèÑ£ãÇüøñõë×I’¼wïÞêÕ«årù7ß|SPPиqã±cÇ^»vmùòår¹|üøñãÆóõõ5™LŽé_§B³‚ô ÀS]\\ÞrV® ¡P¨R©(æ6mÚddd|ÿý÷ò¶bÅŠ+V (ÊårI’Õøøø‹/FDDlß¾½G\.·¤¤dÊ”)Ë–-ãóù8Ž÷éÓgïÞ½ 4X¿~ýøñã™*‚ˆD¢ôôô={ö­^½zæÌ™B¡Ãáà8Îáp¸\î™3g† –‘‘Q³f͹sç6iÒ$%%¥N:óæÍ[´hREQ¦H’P(Çq¼¢¢¢eË–/^¼¨[·îèÑ£7mÚ$‹gÏž½téÒ $''‡‡‡———3(Í€ Vž>}:{öl0¼'Nœ¸uëV‰D¢ÓéºvíúäÉ“°°°¹sç2D À+ðx¼¹ìýÿc¤JZµ£žÍ¶ßÔf¬Mí±jf×Äqœ›A^ÚÅÅÅmÛ¶í›o¾Y½zu³fͦM›9f̘'NÔªUkذaË—//**ºÿ>I’Ÿþ¹··÷¹sçÜÜÜø|þ¯¿þxøðáK—.Aa¾øøøèèè¹sçzzzÑhôôôoÞ<¹\eŸìvû¸qã6lØÐ£GÞ½{8pT}(uþüy™LöðáÔ””Õ«WÇÄÄtíÚuÏž=áááãÆKJJZ²d ”2{íñÕ¿¡ÍVfx_¥Q£Ñ¼é<`ªñ`ewîàÁƒ>><<|È!:®  €Á¾°X,2™ `îÀÖµÛí4M—•• fA‡êÕ«CÅ3G[¥Ý nütG ‹)33³¤¤¤I“& 6\³fZ­Öh4k×®=þ|½zõF5bÄpÈ×”$¦Žw‹ÅÂår ‚(//¯]»öÌ™3{÷îuêÔ©yóæY­Vx…âââO銵ÿö6p¦——׃*qµcÇU*•ÉdªìNQÔÚµkk׮ݦM›ØØØöíÛ÷éÓgéҥݻw‰aÇ+)) ;Eõz=à¿ìÙ¹ºº®\¹²¬¬Œ¢(www¦¼#AS‰ηˆFhŠ©B~¸7id•Àß+ñÅbiРÁ¼yóŠŠŠ¤R©»»»Á`ˆŽŽ¾{÷îåË—8Å%üüü+!¶ãƒÀ¨æp8jµú»ï¾2dÈ¥K—~úé§“'Ož;w&ìˆ2É#±ÇHïÒ6›Í>>> y„Ba¥Z$ âArr²ŸŸEQŽÀî<ïÊ•+Æ +++hÅ/^¸¹¹«wéÒåüùóP_711ñÉ“' /¦cëÖ­srrl6[§N"""îÜ¹ãø”Jª³@VÚ¯«*•B2^«b8Æ~#óæÍ€€€®]»:;;§¦¦òùüúõë=z´[·n[·n•ËåL•™ªQ_ŽÁ^àîÝ»5kÖäóù#FŒ˜>}úåË—Á3g0H’„-ì_~ŒÄªÐïEV«5**êæÍ›………b±ØiÎ{®_¿®ÓéêÕ«gøo`wF³aÆÈÈÈÈÈÈ6mÚ>ó¢E‹l6[·nÝöíÛ÷Å_tëÖm̘1íÚµ‹‹‹4hЂ ‚ƒƒ¡øŽãz½¾iÓ¦ß}÷]ÇŽãââ"##“’’˜5]U™‡„5kÖ¬S§N§NnݺÇÎo2ï×þw¼‘#GŽlÛ¶mHHH«V­âãã322ø|þ˜1c¦M›[¯^½:´lÙÀß_kÑ9:u:]tttÆ ›6m;uêÔ… Ò4äääýðáÃJ†É¿1‹9¬céÌÈâââË—/o…B¨Z$—ËSRR@N‚ZXÉ¿ÕI’““Ÿ>}êááÑ´iS€M&IòÊ•+†5kÖŒËåÞ»wïÙ³gaaa¡¡¡(RPPàëë ˜b±8===%%Å××7::ŒgØ#är¹F£©^½:Š¢*•J.—רQƒ$ɲ²²;wî@½½^JDyy¹^¯¯^½:·j4__ß’’‹ÅâííÍL«Õ £|>¿¬¬Ì`0T¯^½¢¢B«Õ½<ïöíÛÙÙÙõëׯW¯žB¡H$÷îÝswwŽŽf çaÀÜÜ\±Xìää¤ÕjKJJüüü´ZmYY™¯¯/ \.÷úõëyyyõêÕ Õh4\.7//ïÁƒQQQR©ô.›Â2ð?ÄÃEÆû÷ï—””ðù|H`°Ùl!!!àq­ºÈ˜XB‡qÅ`‘B°1Ä3L&Tß…’PyUä­@83ƒ“$ UN¼[h“$ÉçóÁS b‚10 ƒK¸Ñh4r8E™ƒVÆ÷f6›ÁýÝDÓ´P($Ij,‚ûb3l6›F£©$l¡<Ôjƒ÷‚úf0+æÈ ®€ÏÌc>Ÿ¯ÕjÿåÜË2ð_æŽÆ0ŒËå •J• $ A¿[•Ç1³ÇÑßË\©Ú¡ÜôkG`6!ݱí8Âk}$ `zUå–¹·RT³ãô*ÍžXu†Ègn¼Jþ-V‚’g˜¥÷Åàà…ŽXØÆÒß{ŒÄ~‚¿Š@>0Ï,ë²Ä2ðG¨Ò°|ËÒ?)6ØOÀK,³ÄKÿ&fÁPXb鲙ЬޖÞ{&sAÂ_bs‚×—ý[²Ä2ðë¹ÎÍd#«ÕªÕjßÙa%Ø´‡÷á^ÀFbRLYb‰eàÿâ4.—ûäɓÇS?:®N:ݺuƒ|.GÄ¡¢d¥Óy¸)x999 ,X¾|9“ÀTjw”¨ŽÁ Žã3­R©ôçŸ~ùòå·ß~ ðšðHsù'YšÉ¡©ôâ,r"K/ÿ..4ä…PµfÍš„„„ÐÐPggg@ Q©Tî‡ Ä»‰ÅbÀvÃqàfP$'ˆ›³Z­YÊHuÀg„‡šL&Î6›M§ÓA¼1ÇC¶¹"‘Çq«Õ Àš(ФMÓæŸL„-`\Q)M&“c?›°É¶‘¿špL檚>IsÞÞÞƒ BäÈ‘#ñññ‘‘‘f³yÏž=z½>;;û«¯¾ºuëÖ‘#G0 ëÝ»wxxøŽ;ÂÃÃ+**víÚÕ³gO‡³råʬ¬¬¨¨¨¾}û"ÂdÃÌöíÛ‡¢hJJŠ““S¯^½Nœ8ñìÙ³„„„V­Z¡(úüùó_~ùÅh4vìØ1::ÚjµnÚ´I*•–••ñù|à™7¦¦¦†‡‡÷ë×éÈ›Óâ޳혜Éçó 233t;ggç   ‘H¼Ž¢¸Ò8•bßm>ÌP•v–·Ï6hPXþÖoõ>ï:ÚùaÎóŸoÿ>ñ(‡f³Y.—«Õj‹Å¢V«M&“Á`سgÏùóç›5köäÉ“%K–téÒ¥I“&³gÏ6™L/_¾Ü»w/EQ7oÞ<þ¼‹‹Ë¼yó ÅàÁƒ9’˜˜(‰aP ‚عsçµk×Úµk—••5xð`WW×-Z,Z´(''G.—Ož<ÙÏÏ/..nÁ‚7nÜ IrÊ”)<¯aÆOŸ>…µ¸råÊôôô¡C‡Þ¼ys÷îÝŽèP«#òÑÏŸ?óæM‰DÞ¤I“àà`‹Å’˜˜øèÑ#Ø_ñ"™m ä3‡ÃüÞJªøŸ $Ç;Žÿ&‚/I2™ìCÖó!;B(2zÍ;帧ÿ‹Thäª,HFÅ0L(N™2¥qãÆÅÅÅ_9//¯_¿~S§NµX,ׯ_ïÕ«WaaáÝ»wçÍ›';V¿~ýJ;ŠX,}Úd2EDD@}ƒJó‘Éd:®¤¤ÄÉÉÉÉÉ pa!Çü vÁ™ÍfRÇñqŽó›B>ËËË;Ïáp޾߽öÝÿ”À}þ޶ÒÕ«Wív{³fÍ E‰Á ©:àÛ'  !K¬j2ÆŸÿ§B¿ð1 ‹E£Ñ,^¼ØÛÛÛÝÝ.BÊõÙ³gårylll~~>A.\€ÔœØØX­4 ^¯˜2.—k4™Ò>r¹ÜÛÛÛf³™L&ooï´´´òòrWWWY.föÍ›7¯^½Š¢hÛ¶m!þïÛq`÷+W®H¥Ò¸¸8`?x/«Õj2™8N×®]>ìîîîééÉ`81iw6lX½z5`ß 6lÊ”)Z­öÑ£G€PÝçèá°þθôD"ѵk×>ûì³7n¸¹¹f£ÛÏQ KNN–H$Ïž=0`@VV–‹‹‹Õj…ݘ¼Òs¿$$ñÁ¦LÕþU]›•æãˆVïèw„๋D¢+V˜ÍæsçÎMŸ>=33óÌ™3LF1(/UÇaª´0`©©©5kÖ‹Å07Ç[*¹Qiã|ÈiOŽ«æ ‘$yìØ1 Ã,X`4áåÛ´i³lÙ²æÍ›{yyiµZ‚ &NœmN'—Ë«‚ 2ˆMŒÖkíÚµwïÞã8ŸÏ¿uë–››[@@@NNŽV«uqqÑh46›M*•ñùçŸ×¯_ßl6A&êßûíB.——””tîÜY­VW@¼ÂÆ?xð ZµjŽºœH$:}úôرc·nÝÚ¼yó'OžtêÔ Ã°iÓ¦M:544ôÇ,//à½CD¯×[,'''½^{““˜3†ÆÚµkoß¾€Aœœœ˜É0}`J¥ÒáÇ4hÚ´i‚Èd2'''‘HÄôD„¢(æ¹ï¸8‚QBŠ/sÐó4›Í<Ïñ˜Ð`0Tz»Ý™ÃpÑ1+Žy $x999ét:A† ^R¡PÈ@É«T*Çq`uœ$$*£(špáÂooïòòr'''fÂ-Œ#8Öd2AÒµT*¤ÁÓÐÀ*9±U§ õ2™6t‹ŽŽÎÏÏŸÏŸ?0xð`Ÿ:|ÿý÷………sçÎMOO?uêÔüùó%Iaaá°aÃZµj5lذÒÒR‹Å2|øðôôtÇáp¾úê«£G^}Û¶mmÚ´Ú.Oi÷£F*((عsç–-[Š¢»wžEQUPP0xðà-ZÌœ9“€wäñxk×®mÙ²e»víŽ?뾤¤æ9|øðÂÂB>ŸŸ˜˜8wîÜùóç·hÑ.Λ7/66vèСeee8Ž …Â7ntîÜ966vݺuà)`>EQK–,‰É’%[·nåóù (ÿß±–þlûÿõ)Õ ¥R©T*U*Õ½{÷ 4 ´ ÕjµÑh|ôèÑÖ­[SRRRSS_¼x¡ÕjU*ÕÇËÊÊÔjµR©4™L7nÜØ²eËÍ›7FcIIÉ;wär9óY«Õæää$''k4µZ 5 t:R©sæÌýû÷F£B¡xíwS(F£ñĉOŸ>…YºÉdºzõ*‡Ã†)¡×ë>Ô¼yó'N”••yyyuïÞýÔ©S-Z´hРMÓ~~~Æ £iúÉ“'‚$&&™œÍf;}ú4‚ ¥¥¥×¯_G¤uëÖ?ÿüs«V­|}}µZ-<º¬¬l×®]ÕªUëܹóµk×nÞ¼‰aÓ³Fƒ¡¸¸¸F 8pà€¿¿ÿ_|P²r¹Üf³­]»ÖÙÙyÏž=ß~û-‚ 'Ož4 Ì<ÁÁ±`ÁAf̘±mÛ¶š5kÊd²áÇoß¾Ýßß¿]»v4M_¹rE$}ûí·Û·o …[¶l±Ùlr¹Pc¿ýö[î\¸p¡@ èׯMÓ}ûö £iz̘1‚ 0`ïÞ½7oÞ …Ì87n¤iúË/¿ôòòÚ½{÷Œ3H’~ü˜a`æú™3g5j$‹#""öï߯×ëišŽ?~ûlÓ¦Mƒ6 ƒÁf³yzz^»v-::Z"‘(•J>Ÿ¯T*;uê4qâÄ\¸p!!!BG˜é1am ôZ,³Ù µ|™éAx @pÁ<€BCO³Ùœ““£Ñh"""ûŠÃá( ˆ´Ñétß}÷ݨQ£üýýkÔ¨1uêÔ¦M›Úl¶ŠŠ fžs0™L€Jíääd0 ’ ¾ÊÊÊ BCC!ðÆÝÝþv$I–––Æzõêét:Š¢$yU©y…Ë q>eeeEEE0ŽZ­öóó{öìI’5jÔÐjµƒaÆ ‚deea¦ÑhÌfsiii³fÍ,‹^¯¯W¯Žãùùù8Ž@—R©Œ‹‹£(êòåËçÏŸ‰‰‘J¥r¹|].ôŸvb1GšUÛ•VÉYïè®äÓc"+ýêØpDg`+p3 ò÷g;Á^ãããsûöí·À$ â€Ý'ŸÏÿæ›oBCCûôéãçç·téÒŠŠŠµk×6Œ9´»}û6Øóñññ·nÝjß¾½Ñhô÷÷‹‹ûî»ï²³³g̘›Ý›>¬c„F¥‹€bWµ'êÇ/** …‰„$IÀƒ*ÌÍÍMJJêׯߖ-["""ú÷ïúôi˜g›6m˜¿ãÖ†]†qÀ]ºt™3gNqq±“““@ ç6|A´Z-ŸÏ=¦È8³ãCü dzX,;w†q¤R©‹‹K~~>”˜€âŒ™™™€n o ¤P(H’äñxàr“H$Ì©‡ÍfsvvîÚµëêÕ«ËÊÊf͚ń€^hØý½€Ý½¼¼(Šzôè‘X,v<Ì`Ž%¸\î;wêÔ©ˆÍÌI,‡Ã)--9rdjjªÍfËÉɹzõjpp0ü åΠæˆ¦íÛ·3‡zäÈggç† :ÈÈul·8–Ò¦²X, …ö_ÇžV«Õ`0ôìÙóÞ½{?/++Û´iEQ ÞÅbñèÑ£{öì0räHwww(Ž 3O˜Tla>…cU ³ÙŒaX÷îÝ<ÅnÞ¼ Þ8ÐÜÜÜ7n¼téR£ÑøòåËk×®1þa“©?LD=˜qnß¾½oß¾ÀÀ@ÿåË—ƒhmÚ´éõë×Åb±V«-//GQ´k×®‹/.--EdÞ¼yõêÕsvv† ]æû 2äìÙ³z½¾uëÖŽ™­ü‰p£ÉdЉ‰ùí·ßø|~:uŒF#Ô¡†"ƒAœ;wŽ$I(äXÜL­V¯ZµŠÃátêÔI&“)ŠE‹Y­ÖÁƒOœ8qàÀ[·n8p`\\œ«««···———B¡ðððhÙ²¥««k›6mÀÚd4‚  /4˜¼gggG&GdðàÁ .äp8=zô`"±pwssÓjµ-Z´X¸paÿþý½¼¼ÊËËGŒã8\ÆÅ‹4(((Èb±@ TWW×Ï?ÿÜqžeeeB¡ Mçr¹2™ ö ‡ãêêªÑh¦L™¡µnnnjµŠ•Á'2 ?þøc=BCCÝÝÝ% Ü.$‰cC©TNž<9;;›ÀñáÓÕ¯__£ÑôêÕ«G8Ž÷ìÙsÔ¨QjµÊš6iÒbìwîÜé8&Àî7lذvíÚŒþìXÉåƒ"T¥R±Üø>ÑyG£Ñ\¸pA*•Ëd2À….))yøð¡D"‰e¸Ú‘ÿ1 ‰D¹¹¹ÙÙÙ®®®AAA&“Éb±ðx¼'OžØíöÀÀ@’$ÓÒÒìv{ýúõ‹‹‹I’tww—ËåaaaÇŽ q,ÏgµZu:D"W,c‰Ÿ`Á2æ ‡Ã³(ooo•J¿ÚívF#‰P‹Å/_¾ÌÊʪY³¦¯¯/,F¿5›Í>$¢^½z ]y<3Ï¢¢"82™Lb±ÎF#PCž(ž>}ZVV hLò—Ë5™L=ªV­À¾‹D"’^EÒá3VJ1Æ8;;‡„„¨ÕjxýôôtWWWŠ¢>|h0ÂÃÃAä «Õ*‰ Ë AÀÀÀÕ«W·mÛnÿ0UhT©T²ÅÍÞ§ yH‚¤¥¥åææ‚ÕgµZ ‚ ©Y³&øÆ+«2±Jpî º+± WÀ ÔëõA`væÌ™¥K—º¸¸;vL©T2ÁÏÿqi(™Žq,UcZ ©6áà˜¹ãÄL&“ÉdbÜ ð¾Px fż 3OÀ©‡wa¼«¶á)<$Iés¬·Â˜¸f³ÙjµÂ+8Æ¢1võkÇan‡ Ñ—ð1Á]mpË9FYƒå|õêÕU«VUTT\½z•ÁÐÿ0‹›±ø/Ëj`ü¢° ¾Âd2½=þžq:nðŒ1Æ´s„BáìÙ³‹ŠŠ–.]*‹+Õ%¨ÜûZϹã#¿£_ݱ]ub•‚ *Á¯;šgГÏÜõ¦§¼6³êKU§ê$ßÈ1 ¬R5¡P¸råÊ»wï.Z´¨Zµj¿ûdUèOŠ™H`­ÞYp&ÇVùûþŽPàÊ`0|ø%ˆYþø¬îJ¼,ý›?2ë…þÈè=sbYúÄ>2»XbécÞkØOÀK,³ÄK,³ÄK,³ÄËÀ,ý9rDª„ºÄK±ÇH÷Rõ0w»$‡c¶X¬ {`ËËÀ4ëb8Näó癙ϟMfAP‘HÄ¡!!nîîF‡<¤7ÀÀYþOˆI…ý›‡ˆǬiS{Ë+;¸øƒs¼HŸö±9‰õ¾ÜK„Él9á¼…FkÔ ”ºyàŽY§--È{ù<ÓÏ·F“&M ¯•7Š¢<àD`­ÿÊ7dÒQ Zä/X[(j³Ù¸\®Ùl &Ò§!²êû2£šñGà ‚àóùPR‡ ó62™ €>>Y˜Mè·6ò qÂj³?qÂÉÓ;ªC7nõZ٠ݣܢb æU·Qlç…eåW®\åòxU‘C ëˆÏç?yòäáÃ‡ÔøZ(Ü7­¿·ÄZ¿özÕ¤pÈ:ºpá¶mÛ kÿ-ý«"¥Túo¥>0xiii—.]ÊÊÊ€!UpûöígÏžuDE²x<Þþýû{öìyìØ1È yË| Ç8??Ù²eF£’49Ž@ ˜9sæöíÛ!¿ò[‡Ì¿V–mWmÃ(.÷êÕknÞÕý#š<ÈzyêÜ…›éOï¼È¿rïþé‹—òuæfí:••?žEý7ô¬ÍfãóùÑÑÑ]ºtùì³Ï5jtëÖ-€ÎbÀ=˜¨ˆ òn¥¿—#V¥[È×L‚)Š:räÈòåË·ê£o\%/ó+d :>…yI’ýúõkÚ´i`` ÷CöåªU«Ž9Tð f>àäÉ“ôöövuuµX,ޝVÕAh³Ù(ŠÊÉÉ™>}ºN§#I211ñÉ“'4M?~Þ¼y÷î݃bŸÒ:Dþxm$–ÞD¿V¡TÖ|šWxöֽ˘û>Ì÷g‹çQ*ಊ¾tãv…ÑÑ(íQMÓŒÜÅÛ`0$$$øûûß»wïþýû­[·Ž¯¨¨ IR&“Þ²L&¥šÇãÉd2‰DBQ”L&c˜22™Œ¢(©T*“É€á"È"ÃQxÂ-(Šº¹¹A »Ýn—J¥€“fà×ÁHÍAB¡yq¡P À²§(j„ gΜ!¢~ýúŸþùŒ3ª*¬ ýoo2[^n®ÌÕÝÎáÝK{|Î&»hà唩*Ôºôbe^ít‘þYV¶Ô£šÕŽÈ+äA2‹[(þúë¯J¥rË–-"‘ˆ$Éùóçûûûß¿_ lذ!::ºqãÆcÇŽ5™L<oæÌ™óæÍëÕ«Wƒ &Nœˆ¼J‹eÊ/3&""¢wïÞS¦LY¶lÈœ©S§6nܸI“&ëׯŽ»8‡Ãùúë¯###»wï~óæM¨$‰öîÝÕ¤I“#F˜L&Eû÷ïãÆ @••Õ«W/…B!~ýõ×I“&i4š.\¸0&&&22rïÞ½ð\fEmÞ¼¹ÿþ0C½^?pàÀF 2Jg Âãñ-ZÔ¸qãFmÚ´ÉÙÙyݺu‡NKKk×®]qq±V«íß¿tttttô‘#GD"QZZZŸ>}ôz=ŸÏñâE=”J%!ÆþýûWTTlݺuáÂ…v»½ÿþÉÉÉ?vŽÿ”Tèß)/Ê¶ßØFA4Z­Pæj4RK”ÏÑê˜Ùˆ’8B#F댦d« » ¨QÝ ŠÇ×h5ÎÎNM#¯òÑ“““ƒ‚‚ø|¾B¡€,â«W¯ ‚C‡Mœ8ñÀ5jÔèСEQ+V¬¸|ùrvvö† ‚èÕ«Wݺu‡ P»2™l„ {÷îݳg\.>|x||<Ô²¹xñâÏ?ÿ\TT4dȇ3dÈðYÊd²åË—/]ºtÏž=8Ž;¶víÚ(Šž>}úóÏ?_»vmHHÈèÑ£ûõëwúôé¼¼¼}ûöµnÝúüùó¿þúkß¾}{õêµcÇ///·oß¾ÒÒÒ œ:ujðàÁÍ›7wqqk™™™sçεZ­b±¸gÏž<ؼyóÓ§O÷îÝ ãE‹mÛ¶mïÞ½P "00°M›6‰‰‰ùùùÓ¦Msqq騱#Š¢{öì9yòdŸ>}^¾|©ÓéŽ=ºzõjp¼8qrîA95jÔõë×cbb:uê¤ÕjkÕª%“ÉnÞ¼¬Óéª"™~ìåEÙc¤wu±¾òcÁ–h§„¦Qµ3Û<‚Xì´ƒÃëÿ[°wZ­VPMMŽ=êׯÿøñc8Rމ‰¹ÿ>Ü:f̘>}ú Ò²eË””ŸU«ÕîÝ»wÙ²eíÛ·GäÔ©Sf³Y§ÓíÙ³çÔ©S-[¶DäñãÇË—/|ÕªUPK!""âôéÓ=zôxúôé”)SŒF#ŸÏ_³fMHHH½zõ6oÞœ““ãååe4 ‚xgwwwÇóòòNžY/4ËŠïs# µJ9—Ë ó!Z9MRbGGÅ=ÍÊÚÞ^v³Ù¨×‰€Ý%tT¦´ŸN§3 R©têÔ©Ý»wŸ6mÚµk× ìð¹£Ë‡9>Üi(Ò¯°°¢¨5j¨T*‹ÅåXK«Õj4š:uêÀ c!RTTf±X***<<<\\\ÒÒÒÚ¶m«T*/]ºT\\¼téÒ\¿~ðFÒ-`q™c B¨žÊEqq1EQÕªUƒ*Óà:Öét6›mË–- !¿|ùR*•žÕjµÙl ··hÑbüøñß~û-î.ðfUòœÁLJƒtÍàZ}zD°qBï¹ `-–ê5jd^ºŒš Qa!^^>þÀM›6…3ä8Î%"88ÐjÁ—ÉdQQQgΜéÕ«—Á`°õèèèZµjEEE¹»»ÛíöŸ~úiüøñmÛ¶åp8~~~¡¡¡v»½Zµj—&“ÉÖ­[7{öì-[¶DFF6iÒ¤¨¨¨eË–óæÍ›9sæ’%KjÕªÕ¨Q#€• ~Ò¤IsæÌÁq|Íš5W¯^µÛíÑÑÑŽÚŸÀ:ü/XY–ߥÐ(òÏ“Ùb½pá‚Éj¯^»ŽÔÍàPF¦,?ïeVf-?¿Æ"Í&“£ÇDRÅårsrr©Q£À‹C9¯—/_:;;‹Åb~ò+ȱÜÜ\ggg@ ¢££CBB6nܨÑh„Bá‹/Àø„0CGÇËËˉD2™L£ÑÀaS‹°fÍšV«b›¡XÕÔ1® êô€©>|˜œœìêê €Ò/_¾ôòò"I"q‡òˆPçQ.˜) ¡œeÍš5õz=€T‹D¢¢¢"‹ÅÌ®à̼¸¸AŸŽ;Ö®]{åÊ••ê3: ¬V«Y•øÝì`EÐW5’ó<33óùs“Å‚ 4Š b‘°nh]777£Á€b¨ƒíü_ ð% WåãÀÅŽˆ¦x-ƒ$—H$Ë—/_³fMŸ>}ÒÒÒ>|xñâE___°')ŠwGpvÆß•AÕ­V+‡Ãa?U¥Ö› ©U%›Í&•JgÍšuóæÍ'Nâÿüs///ƒÁÀàÂW¼êÑ"òßeS+möï,1áóùË—/ïÖ­ì)ÈëB¸«~„×Îç—}…½iÍš5;v `2"XféõÌŒ¼:[wÔ6ÿ±š”P½že4?¨b –ÉÑ?É?ðM 4̧ʽ¤²6ð'Ðfr˜¼ÔÜÝø~®cµ÷OéïÎÚÀ,±Äž³ÄK,³ÄK,³ÄËÀ,±ÄËÀ,±ÄËÀ1‘†pd»³ô›Ðÿ×°. ÃT*¤¼A޲Ÿˆ%–?\î…(ùäääÜÜ\ˆ€ˆâàà`??¿·g“3YÿXØKŸ±ï˽$IªÕêóçÏ»¸¸I¥R‚ L&SIIIjjªX,nÙ²%“Ê[‰ Rðõz=“rÀK,ÿ#. 3™LÇŽkÒ¤I`` €Ë€%L’$A.\0›ÍmÛ¶5V)Έ­æÆV«522ÒÃÃC­VW ý«ª®¿E“¯zùóY8Ÿjä0ËÀ,ý×*çñx‰‰‰>>>ááá*•Ê1tc±XüÛo¿Õ¬Y388Ø‘‡{¯^½:tèP.—KQTIIɺuëºtéÀ‘$I®£ZC>-ßUÒ·áY€SÝWI9PÁ1aðíô–§°ô!Šö¼3q8œÂÂB³ÙªÑhÓî›Öh46jÔ(##Ã1˜­¢¢¢K—.={ö|ôèQJJÊĉ»uë–——Çår¥R©ÅbQ«Õ‰„$ÿƒ&-‹ ‚Ðjµ"‘ˆ Ç$;@±Òjµ$I‚ AH¥RFc6›·ý¿vî7`Ê”N§ƒÇ±ŽôœX'Ö»‹_‚ òóó=<< xBUa"ÔÙÙ™ ˆŠŠ Àd)Ççóþùg’$.\«cÇŽ½xñbfffµjÕfÏž}äÈ›ÍüÓO?yxx >ð¼¼¼ÌÌÌÈÈÈ 6@.>LC£Ñ@6@@€“““Ï’%KÊÊʆ ’’’‚ HÏž=¿ùæÀ ÷/¿üÒÝÝý›o¾AdêÔ©v»}åÊ•C† ±X,………ÙÙÙQQQëׯ©ÎÊá—s Ù¤¼?Þ†u:‡‡‡ã¯”ÎŽ Žã|>_§Ó¹ºº:¦m>yò¤V­Z TžâèÑ£gïÞ½[¶l¹páBõêÕ›6múÍ7ßlÞ¼9--­¨¨èÀEÅÄÄìÙ³güøñ …EQ>Ÿ?räÈ´´´ãÇWTTtëÖ­E‹† >}úÚµkµjÕªU«Ö¬Y³6nÜ8iÒ$ȆÇãQƒì|xôèÑíÛ·Ã-‰Dù+6-Xи\nŸ>}f̘ñôéÓ‹/^¿~N§s¹Ü^½z=:==ýúõë+V¬˜—¨=Ú5°¯MÔökK.—«V«Q ³áû~lÿt¾ûsði\Jßûõc@c&"¡Ê÷!¦àO×Nÿ##‡ÿÛa Æ†häï®ìÀ†º¡þ=Û ,´¡Šá6Ô uCÝpŠ¡Êu¦àÏ-ßCCù;‹A ý§ðš‚ÈN±G?DC1ðwpê’Éd‡®ˆ†Åb *•ªÃ`(†b àoîàe0r¹<99¹²²’Á`.´N§sssóññÑh4z¨zÄ®ÈăúÿowŠßw×_±ýÁ 1=?7`ì“C¸¡@1(±þèâc0ååå÷ïßwuuõôôär¹TX[[ûâÅ •JÕ©S§Ï…hµZÀ”Å0L£ÑH¥ÒßáJ.¦!ôô稠|¾þ®¿t3 Ã0ÞøÂNÇáp´Zí?;ào­PæÎk˜…ß½ø¨Tj}}ý­[·Ú·oïãã‘IÏÀår}||êëë_¼xáååÕÛQ§Ó ‚’’’Ó§O'''s¹\{{ûFý1‚û+ÖÀ™ÅbM™2¥¦¦&00ˆ ‚`ZHÚ$—ËÙlö´iÓª««½«áízÑØg@ç±Ïƒ¿4¼‚¢årùñãÇ322<<<ètzC´0‡3kÖ¬wïÞ…††B¨Æ×Ä{|Í0¾ëbàFþ˜B¥>zô¨E‹666"‘!Ô‘H$F# ÃÃÃ9Nff&‹Å"‚rhµZwæÌ™#GŽ\¾|922r×®]<XnƒÁb±{ ÍÄ‹‰àâ­[·^½zE¥R RƒÞ‚ÅHKK[´h“ÉÔ» kœ„°ï Fþêõ©w …BAªÃÈi4“ÉÔ3fB^‹èèèíÛ·oÛ¶­wïÞ ]¸A5ø}ûvFFàœèt:&“ ¡ÑÐŒè“8 *• W`ä_i `Ãñ‹Óéô’’2™ìêê*‘Hô¸_X42™,((¨°°èÁ½L&³¤¤dàÀ ,xôèQbbâ–-[ÆŽ›Íårù|~IIIvv6Ng2™4Æ`0Äbqnn.…B| èY\.×ÜÜ\,ççç3 8ǘL&`kóù|o|ðàÁÆ«ªª 5„………L&ËÏÏ×ëFH¥Rsss%  ‹H$ØVPŸ@è}¥R)€~H$™Luymm-Ú_8ÎÓ§OŸ?žœœœœœœ””ôæÍ6›MD&b³Ù8Žçää¨Õjsss&“‰aà×¼}û–ÇãÑh4…B! áÑõÅb±Z­–Ëå0òÚÚZ.—û¯1õ”Xèø---µ²²úK¦ÕjƒÁ¨©©177Û’V«e0gΜ±°°˜úŒŒŒÜ¾};àlét:>Ÿ?jÔ(›õë×c6eÊN·wïÞAƒ …B¥Rùþý{—Ó§O FLеµ5…BIII¹|ù²»»;l…°ÓÁôúõë¨T*;;»¼¼¼ÀÀ@–û÷“ƒa˜§§ç±cÇjkk£££ÏŸ?߬Y³Í›7>|8))‰Íf>Üßß?22rܸqYYYµµµk×®2dHÃ=×pÿoÀ†Éår>ŸÿeÕ (id2Û :88 ´àf×®]‘‘‘—.]zõêUZZZNN•J]¼x1‰DúðáÃû÷ï:”œœœ}äÈÈÌGì ÇöìÙÇçÎËb±Ìf³ÓÓÓïܹsçÎùóçÿðÃ'N466¾té’………B¡Ëåû÷ï×ë(gÒ¤I:.==}ÿþýïÞ½«ªªl-‹}&&&._¾K0ŒêêjÀš'‘H555555$©¸¸X&“;w.99¹¨¨háÂ…È~~~~ãÇŒŒ|öìì)ˆX˜áÇ»¸¸<þ|ýúõ ÛÇ0lâĉÅÅÅÉÉÉOž<)**7nœ«««N§»wï‰DºvíÚóçÏsss5Íýû÷ÃÃÕJåëׯcccÓÓÓ‡:wî\­Vûï½2ðÓ~JöY-ÿ'Äö†Ëè–¨SÑh4r¹¼G‰‰‰/^ܾ};“ɬ©©Ÿ äììlkkR\\LìJ.—÷îÝÛÞÞÞÒÒròäÉOž<)..~þüùš5k8Ž““Óܹs;Æ`0ŒŒŒÈd²™™$@êß¿Ã>i4Z}}ýãÇ,XxwmÛ¶¥P(uuuÏž=[»v-êóĉ€Ëƒn$Ö!«“N§ëÞ½»µµµÝ´iÓnݺ¥Ñhì’Ãᤤ¤$&&zxxðx<''§;wî>|˜Á`“RTT”““³dÉ>ŸØ´iSÐ^¿~}õêÕfff«V­ºté’V«‹‹{ôèQUU•X,މ‰¹víZAA…B‰ˆˆ¨­­µµµ9r$—ËU©TËê_ÀHøw Lcc㪪*½£U¯Àr122¾]çñx ¶iµZ8‘RRRêëëß¾}qñâÅ’’’ššDsŠn½-ä[µZ­V«ù|>†aìÎår¥R©Z­¶²²B¨´8ŽCÎq2™Ü°O`¤R)†aÆÆÆÐ-@Æ×ÖÖ2 ‡úT( Á&º×ÃëµbR©T£Ñ@š(­V‹òâ8>dÈ6mÚ<{ö,99yÚ´i'Ož<}ú4N×jµ á§ÓéG"‘ÀÛQ©T@ó311Q*•J¥ÒÌÌ $íØØØ¢¢¢ãÇ;;;O›6-))鯾¾¾4M¥Rá8ZÆ/ç[ÿþX/åG£ë õFë*•ÊÉÉ©ººì· atéæÝ»wl6󯯻ƒÜØ¡C‡¬¬¬·oß°{uuudddMMÍÖ­[›4iráÂ…U«VµiÓ”ºÐ9né°N§ƒC///Á`¸»»Ëåò‚‚Ðñ<{öÌÜÜv: Õ]¯O`ÈMMM FNN“ÉçP¥Rikk«R©òóó‰}‚ÚÍ QÿŒPµàd¦ÑhoÞ¼áóù :†m¢¬¬¬[·n<ïÕ«W/^<~ü8âoU*U“&MÔjõû÷ï¹\. C«Õ²X,&“ùêÕ+ƒÁ`02339@jBжŽ;FFFÖ××ïØ±£{÷îÀéÀ ‚· â†Éà»[{è¯!7Òï¬ÃQÃçóœœîÞ½Û­[7"kL&S*•¦§§wèДCˆÞ¤RiÛ¶m{öìÙ±cGÈ?´dÉ’víÚ5mÚÔÉÉ騱c‡*++Û¼ys‹-0 «¯¯`J ÄB!œD[˦M›œ)J||üÚµkÁ?þ8|øð;v”——oܸñàÁƒ†™™™:t¨oß¾b±õCìS£Ñp8œÑ£GO›6M TUU]¹r¥GL&s̘1Ä>> o ‹)22råÊ•:u*--=}útß¾}AC¾gÏwww¥R¹víÚ-[¶Àü@N‰ž={þðÃ7n”Éd ´/.. ƒ-ÃÊʪÿþ#FŒØ²eKnnîãǃ‚‚H$ÒŒ3¦OŸÎáppÿù矗.]J£ÑÌÌÌœœœ^¼xѦMƒáæævìØ±Ž;gmm-¼Ô.xìûÌD™7ožáþÝ» Z­¶··/,,ÌËËsrrâp8°ÁÓétƒQYYyýúõ€€ä¡îÕjµ½zõ’H$GŽINNîØ±ãæÍ›µZmóæÍµZíÑ£G1 1b„@ hÛ¶muuu@@€§§§N§«®®ööönÖ¬ð½d2¹ºººS§N=JHH?~üäÉ“årytt´F£9pàÀ›7oV¬XÑ¿©TêââR[[{ùòå=z¨TªfÍš5ìN¿èèh*•ºsçN‹Åáp¨Tjß¾}[µj¥Óéôú„c\­V‡„„H¥Ò£Gêtº¸¸8ŸæÍ›ïÙ³ÇÛÛ»¸¸øÚµk“&Mš0aÂÙÕjµ111B¡ðèÑ£iiicÇŽíÝ»wRRRëÖ­ApÐjµ;v¬¨¨8qâŸÏïÔ©S³fͼ½½ÃÃÃ÷íÛ÷ìÙ³3fŒ?TÊÇÑѱK—.:ÎÄÄÄÔÔ´{÷î`ߢÑh:t€^NשS'8‡¿÷˜„À» ¢ÿU# O2ŒÔÔÔ¢¢"kkk0Ø–””…ÂÐÐPGGdžÐбD"‘¸\.ÚYam‘H$‡C<$ ¸=‚yRZŽ_.—KÄ+„tJpú¡ND"l.àÎXö Zè›7oC>Dggç!C†,Y²¤¾¾ž˜+\$À9 úv´Ôj5F êÝ»÷œ9sà_46ÄŒoAï‹P>õú„A‚µ‹ÅhØðð9£ÓéP‡ý\5Á¥D*•þ;’›|¡ÿ“›Í®««+(( …Z­–N§[XX¸¹¹Q(Pó4ê ŽV ‚D HkpÛÁà ò3ôƒêDfžø†;±âE”µÑ>A?|âĉY³f9;;—””¸ººž>}šÅb—±Ï†voèFndd³|ùr@Š××^Zowç-bŸèð ÷jH”×4”xí/ uëÕÿ ÊTÿ)iXÈ'®(•Êß„wý³RûùBŸ¿ù8RËãñÊËË“““ŒŒ"""öø¿z …òæÍ@ê(¤|þúa®!eįó``¡ÿDvºaðï.øp]„]^/~à+ë(«“aý%,´žLb(ЇÖwïB\%D6û÷Å£ yÒþ;°•òÏ­ë-âïñˆO”ZÇ<è¿aüYßèW¥€a3Cù¾e`Ã,Š¡üËYhT!†qC˜x£ì“V«ýrŸØ§|\›z6°[_Ï’5Zÿ7½×ÿ. ôL&œ€ŒÁ]¾Qó&—ˆ/ÄÙg<± tûGT0T§òþͪ‹´ŸŠÞ‹ÿ#úž“aæÄÈôU,4Ä F~~¾X,vssãp8:.33³¶¶¶M›6 ‚– N¿ÿ¾±±±¯¯/À¨M~~þÛ·o;uêBð(R©T^# Í—­2((—F£Ý¸q¢ÃÁzñ ®-xð‹‚‹÷Cô¯ø«Õ¶Ð?¸I€k•JU«Õߺ]йô«—?• â¿[õýÛ,4s¨Õê3fÌ›7oçÎC‡MMM¥ÓéIIIçÏŸ§Óéà@ ³†N§_¸páÉ“'DøËáp˜L&´yõêÕ‘#GÆ ¨7!!¡°°ÅbA|  º€A’ÃáÀ¢§R©(ôê°â!`E«ÕÒh´C‡½yóe¾Av+:®T*wíÚ5uêÔM›6‰D"0™r¹\ÐB›Ù™”†u¢ø@lLAp½!ðŸÏ§Ñh,ëÍ›7íÚµ@ ¢dÔp zï¥÷S£a¨D¡ êzÒºÒ]Ô?êS£ÑÄÄÄ$%%Á¤Á£i4Zß¾}Ïœ9Ãf³aKBãÑ[£ƒit¿Qú7à !&nçÎ?~<|øðÞ½{{õê5gΈY@PÀ4OMM …ÀTs8>Ÿÿþýûüü|ðee04-==½  î¢Óéˆ ‡½{÷&&&ªÕj‰D¢R©Þ¾}[[[ËçóKKKSSS’ëëë¥R)¤Ã‹Å"‘ˆN§“H¤gÏžUTT@„ ŸÏ§Ó騷¤vuuu­[·Þ¶m›Z­>}útË–-ß¿Ïçó/^|àÀ¬5“É„<8L`wC2¼&F`±X|>bâá$g0$‰Çãå¨ðx¼)S¦\¿~B¡…””­VËf³ÃBG4ŒmˆÄµA&“ù|>ˆBzí!löY:@V°}£:q‡år¹<xâ¼At!ÇCOÁ>îˆojjj]] š0 êóçÏËËËáõávâƒà ê=¹¬‚Ë4jFdI¾¹pÂß>£Éd•Jõøñã)S¦°Ùl•J5tèP½aXZZÚÚµkÍÍÍ+**ÆŒC§ÓOŸ>••õæÍ›öíÛOŸ>½¨¨hÁ‚§¦¦&,,lÆŒÄý˜Á`:t¨ººúÎ;-[¶ÌÊÊ:~ü8‡Ã™={öõëׯ^½jeeUWW·iÓ¦´´´k×®mÛ¶M£ÑÌœ9søðáÞÞÞÓ§O§ÑhUUU£GîÚµ+lºß¬ Çìºuë*++ËÊÊàb@@À¬Y³Ö­[wúôi77·:˜ššòx¼¼¼¼‚‚WWWww÷úúúÂÂB;;;F¡P>|ø@&“---£ÈçósrrŠŠŠ<==œœ¤R©\.¯««³±±¹{÷.ŸÏ÷÷÷‡c ŒÜÜÜS§NÉd²°°0*•*ÈdòƒØl6ÀÍ }úùùYYYTöÉËJ&“ݺu‹Åb…††êt:@ ŽY.—WWWëôêÕ+²²²W¯^9::º¹¹A !‹ÅJII …-Z´`2™(x PWW÷ðáC>ŸØ0ª’’cccð¦æóùÅÅÅyyyAAAÆÆÆÒA&æææ0'§ A&L&3--­¶¶6 ÀÂÂB,óx¼²²²—/_ZYYùûû£ “o‘‡–|±ˆÅb™LVWW×¹sçgÏžiµÚŒŒŒGåååiµÚíÛ·Ož}:Žã………EEEOŸ>Ý¿?Žã¹¹¹QQQ‰äâÅ‹C† Ñét"‘H(â8þÃ??~Çñ•+W|¸±±±••Õ¸qã4Íœ9s¬­­[¶lijjúË/¿Èd2 ‹]»vét:¡Phoo¿k×.Ç…B¡H$Òét ,°²² ³°°Ø²e Žã÷ïß·²²jÛ¶m`` —Ë:uªV« …2™¬ªªªsçÎ<ÏÎÎ.>>>==Ëå¶jÕ µ„Ð…Å‹[[[ZXX ŽH$‰D …"//Ïßß¿Y³f...eeezc^»v-ŽãëÖ­³µµmß¾½¯¯¯@ ˜5kV‹-üüüx<ÞÞ½{5D"éÛ·¯“““··wQQ‘B¡€§¨TªÄÄD{{ûæÍ›;88tíÚµ¾¾^§ÓmÙ²…Çãùûû‡††r¹Ü3gÎà8~âÄ ###??¿ððp>Ÿ¿uëVÇýýý=<<ÌÌÌŽ=ZPPàîîîëëkcc3lØ0Æ1b„££c`` µµõõë×Õjõõë×íì삃ƒ­¬¬†Ж’o²üZh8ÍnÞ¼¹mÛ¶aÆÕÕÕÌdêСƒL&‹ŠŠâñxEEEt:ÝÃÃC§ÓÙÛÛ(YXX™Lž4iÒÖ­[áTo¨t‘d’¦M›öBttô/¿ü2sæÌwïÞ©Õj‹åáᑚšúìÙ³ÀÀ@ …RPP››;uêÔƒÖ××ÃÀþÎ…ï3ÙlÇÕj5‰Læp84 o ‚˜B¡Èåò‘#G¶jÕªiÓ¦C‡½|ù²——WË–-8Ô½{÷mÛ¶•””ݶmÛĉ ù|þÇœžž¾sçέ[·VWWf “ɼzõªƒƒÃ˜1cfΜ  °Ã† ƒ–›7oV*•÷ïßúôizzúÔ©S§NŠDDƒ±jÕ*N÷òåËœœœúúú{÷îÉd²»wï¢1/X°˜,©Tºk×®ÌÌÌ¡C‡ÆÇÇoܸ1##c̘1K–,¡P(ëׯþüyaaaVV–³³ó¢E‹€Ý…¹:qâĸqãRRRrss“ d<@ôÅq¼²²rêÔ©S¦L‰ŒŒ\¾|9ðÆ:uºqãŽãýû÷‡ïÔ¦M›…B!LLL@Ôù{Œ1 L&S¨o²³ó Ôê_ñeø\nÓfMmll ò›ûÊçó¯\¹rñâÅ£GŽ1ÂÓÓóèÑ£NNNh¡˜››ß¹sçÈ‘#ǯ¨¨`0uuu?üðCëÖ­¥Réµk×ÂÃÃmll„B!H:§OŸnß¾}‹-êëë{÷îíîî~õêÕvíÚñùü=z`æïïÏf³ëëë>VoTjµZ  –L&S.—_¿~ÝÔÔôÂ… 2™¬¬¬,++«¸¸¸I“&ÀUFEE]¼xqúôéø÷ïßGcEV«utttvvIÁÝݽyóæ†=zÇñ7nX[[¯[·N«Õj4š{÷îÜ øÒû÷ï¿sçÎÏ?ÿL£Ñ8ŽJ¥JNN6552dˆR©lÞ¼9ä‘ËÎÎÖjµ?ýô“J¥òññ±±±AðW=zô011yóæMVVVTTÔŠ+Øl6…B¹zõêìÙ³mllƌӷoßÅ‹ÆhLLÌÅ‹mllbbbÞ¿/•J¿¼âÖB¥=møðá;wî¼}ûö»wï.]º$ Y, i;88üòË/eee[·når¹ŽŽŽR©ôÊ•+………gÏž­¨¨(//‡ƒñÞ½{%%%اl@z¡09992™L­Vƒ¤T*¥R)È6Ož<a/222//¯¼¼<88Çñ–-[Þ»wÏÒÒÇñÄÄDé&BØü¥ÔK¥RJåÅK—² ›¸ûø·îÔ!®YËÖl3Ë»>LJ¢3˜ `***ºwï~öìÙׯ_WWW: ¨<**êÌ™3666&&&€Ãjkk{üøñÔÔTØ¿ŠÅbcccNV=###ÁÕétN¤R©Êr G1·Ä– aQ(”W¯^eff …ÂY³fz ­†~åÊ•?Ž7®U«VUUU&""½8êèäp01€U*UVVÖ‹/¬­­'Ož _²IÌž={ôèÑ|>߯ƶK‘H˜°<à´‹ÅL&“B¡ØñM!äàÊË˳³³aö"""LLL233ÝÜܶnÝ’×æÍ›ãããSRRºví:`À€oÙ®öÛJ,@*ŠŽŽÖét‡¥â’%Kx<žµµ5hJ—,Y²qãÆ™3gš˜˜¬^½Z§Ó5kÖÌØØxãÆ?~\¼x1ƒÁ2dÈš5k&Ož-‘H¬¬¬¢F£0`ÀÚµk[·níççWWW§Õj&Mš´fÍ''§¶mÛZXXÀGíÛ·/‹Å¢ÓéR©tüøñ[¶l™víÎÁ*ò;¦9.“ad¦ÃÙ~Óêœ)aî¡>îÉ×/¶‰lI„††åþCB,‰D>$76›M\7r¹œÁ`œ;wnúôéŒLyï.€õÆà“Ä`0@çD¥RA5…aä`› “ÉÔk Üê„U¢G 7ÖRÃ1Óét …¿‚w®ðhÀš{t Ñ Cœy©Tªw”&‘G´·Ëårbd€ "øèÑðúÄ~t:8}¯2ð÷SEÉ{þeLÂ0‰TÂ56WÈU/+ê‹0;²Z…Ñ(Žad\¦P¾Ð° Ë>¶ð÷f°Ùb‰ÄÌÌŒHo }ÃüˆX*• ˜P'y<Þ?þxêÔ©mÛ¶ñù|ÈBÈÕj5¬T„bWÐW–›Èõ@†$àkЯÐÀÐöIäË 3R—€l¥—ýT&“!|9xexŠR©”Éd x³{#çyÄ­@ äØ NWÄ‹00ð) L&ƒ&ÉözÐYôP?Ð9јò}0r™B~ö°æž {Yt9ÎùóçËËË'Mš¸áÄ»¾ûò$×_W+ ÃtŸôÍ$ Óèp2‰„á†c¤ÏèÀк!.;4Eĉ‚=±¿¿?ðá@¡Pyò/p‡mÒ#ðù|Ä1¿ÓòU™0 {òäIYYÙùó狊Š\\\®\¹réÒ%@`mm lÉÑ£G“’’ÌÍÍ-,,pW*•|óæÍÇ1 ëС…B¹sçΩS§”J¥««+qå}§èø8Ž3Y¬×YYö.n±°0'[¤ÆY|ŒLÑé0VEÁOn‚¨@Iy‰¸ª"0Àiì ˆÉÉÉÙ¼ys»víPšµZ••ÅårQ z.°Ät:ýéÓ§·nÝrtt”ö/;2™\RRRQQabb‚Ì*ååå«W¯ƒÊ7è¬o¨c_ÌðUˆ eÍš5»víâp8çÎ0`@QQ‰Dš2eJyy¹R©?~|ii)•J0aBvv6“Éœ>}zzzºJ¥ºwïð'ûöí;xð ÝöíÛ/_¾ ¡s Ÿõ×i4sssK3Ó7Ïž:Û˜Žšh¡ ¨Ïu©É‹’æ/ò5ëÒª%Ÿ‚¿IOõóók(BƒˆÛ¿KKK^%|uuuëÖ­‘û¨úÁÃü·nÝÚ©S§cÇŽÕ××Á£Øÿ‡I ‹µvíÚñãÇƒŽª¢¢B,ÛØØ¼}ûv„ l6[/LÏPǾDêÿØý<-›Í;vlxx¸µµõÞ½{þùg Ã^¼xñþýû§OŸr8œ¥K—‚ïĉC† yÿþýµk× ŸEII‰R©ôôô3f …BÙ¸qcMMÍÝ»wÁ AƒD"ѺuëÞ¿ß¼yóAƒÑéô„„©TÚ­[7EúðáÃСC5 ‹Åz÷îÝŠ+*++/^|ððð Ú¨ å»9S†2qâD•Jåïïoll öcÇŽuttd2™;vì8{ölmmíÆ===årùúõë;&‹—/_Þ—S¦LñòòJOOîÒ¥ Ñ7í{•C0ìW–˜„‘Id„t<–…f—¸B`LBzzºŸŸŸ™™¤Û…”ö/_¾¤R©Ã† ·{©TZXXèçç§V«A$ñöö®¨¨h×®ŽãHZFn3 õE!ðv®¬¬ÉX$ØI‘yÉ g~g20Q+ý·G( ^¦jµÚÑÑÑÝݼ2:vìnC¦¦¦“&MB–aPzMœ8éBÁ\‡ÜqƵ}_uÒ'_ Çp 'æÈü@óÿ[hôúáp8 :÷IØ„´d³Ù³gϪ^·nƒƒø6^êþýû111{÷ºyóæÂ… ±OxNÐ-fëù9€•ûääVb"õ~ßâ­Žh–ú5Ú ‰9”I$’J¥R*•°Àw,pþ §­V+‰Ðc`ƒ‹ÅDùù_¦8Ñ{Fáʼn³ïìì\WW'“ÉØlvÛ¶m.\øìÙ³¤¤$¹\®R© 4ŸL&÷êÕ Ã°Ó§O»ººwâììl‹5xð`Ð>ÀakbbòäÉhöòåKðs&¹\Îd2áì…˜{à ª¬ï®=õêà…G¤Fä!€œW!Γx A˜›Þ(ôËîÿî:øc„††*ŠÂÂBFþÓO?uèС}ûö³gÏf0‰ÄÎÎî—_~éÓ§Ott´¯¯ïöíÛaÞCH—.]ìììœÃ®^½ŠãxmmíðáÃkjjBBBÚ´i“œœ r!1¢££I$Ò£GÜÝÝÍÍÍáü7¸I|/õÿx3l(óY và¾}ûš˜˜ìܹS$ñx¼Û·o—––¶oß¾¶¶ÖÚÚP{³³³?~lii£Óé4MNNŽ………™™`S$&&²ÙìV­Zåææººº}øðáÞ½{Mš4ñð𨯯wuuýðáƒJ¥rvv¦P(eee>lÙ²¥‹‹‹··÷œ9s† ¢a(ß&Õ@ÀÿHп>DEE9r$22R&“ ÀÆT*›€Î:`[X,¸^¡¸? à ƒÁ€˜m©à'3†~]¸paRRÒ;w@CaPA—ZhÃü#'0™LV*•ÎÎÎ;vì8zôhTT :‹%R)Ô(ü{à€H¢ÕjÁhˆY ³€f)àYH‚0‰?¾|ùòøñã€ø/‰û<Á¨‹´ÒýßY‡€ÛsAÿ Ç2˜»¾ìHk¨kuôÉ ,ô?ÏKÿS§ŸžQÑð-¾K-ôWæ6Ô±¿,ÑÙ?ÑBŒ¯0|‹ï1ÉpŠ¡”X†Ò ZX/ªÞP Å@Àß´(K£ÑP è{È®a~ Å@Àßtáp8yyyf@£ÑÌÍͽ¼¼X,ÖoB #:$pzÿÆÝ9v¢aÉýÊèdà?a¤R“’’ªªª¬¬¬ ;DIIÉǼ¼¼d„¼*ĸWÁý;ÙoÄ#P©Tƒ™J¾Y!àšQFŽ?‡¾g'pÿÑ%E§Ó¯]»™u©T*YÖÕÕݸqÃÓÓ’DëÑ0Àßètºšš###$‘HYóïIΆaä:Âq¼®®.---** ‚™¾Á©¦R©:Ž˜RëS/1ÑÌwW ¬È:»Ølvrr2›Ínß¾½J¥’J¥*• b³Äb1‡ÃéÙ³ç›7oÊÊÊÄ$º—Ãá=z400rjoß¾ÃáhµÚüüüââbd*€Ô­³U0Bˆq•뵿k(à}©÷ 0<–““Ó£GðëR«ÕÄܨÏF™ø‰Q¨7ÀÙC-шïnÞÄf½§@îž•+W._¾2$¢çAü´„ÒèƒôL¡PÂÂÂŽ;Æf³Á}ƒ üïçœëêê>|øÐ½{wäÞˆ~f6›šžžÞ¥K””(ÿÎ;Çß²eKÛ¶m_¾|Ù·o_ÇÇ?iÒ¤fÍš­_¿r¸"`:HÌÉçóÕj5ñx<ˆµF:t:Å‚_4¨Öˆ”@D#ãr¹ƒ1bÄäÉ“u:ŸÏ766f±X€ " +/´`=â~AÌTܱ=lgzÉV 7qÀ£6(élçÍ=šÃáo$>Šz–H$:nÕªU®®®J¥’ØaÃa|›åW\hCù“ÉÌÎΦR©îîîc±!{¦ÑhŒŒŒ²³³­¬¬Px=B‡­««;xð ™™™†a%%%™™™—/_.))\555 ,غuë³gÏ‚ƒƒI$ÒìÙ³ííí‰võêÕõõõ^^^àÏÌ`0>~ü8oÞ¼mÛ¶½zõ*$$„ÃáìØ±£²²rÞ¼yW¯^õôô´´´„Ô› …bþüù}úÐh´{÷îÍœ9óСCjµ:((ˆB¡œ;wîÎ;·oß^½z5 ­^½zíÚµ999¡¡¡T*•Íf;vlþüùgΜár¹ÞÞÞ&!!ÁÜÜÜÆÆfÍš5•••[¶lÙ±c•Jõõõýöa† ,ôï'`H&djjú[Žã4ÇãAÚ!”›F«ÕvïÞ=//oÆŒïß¿Ç0lñâÅëÖ­³··¦¦¦NNNR©4,,,77wذaÉÉÉ={ö422ºpáÂÎ;i4ZIIɼyó|ŒX‰¤uëÖEEE½zõºsçNLL ‰Dª©©Y´hÑöíÛÛ·oÿîÝ»^½z¡T $ÉÓÓ“ÉdZ[[C¿ºººýû÷·iÓæÝ»w=zô€ÔÐmÚ´)++ëի׎;æÌ™‡³V«e±X‡š2eJ—.]\]]Û·o÷î] …c~úôiïÞ½©TjffæÌ™3ß½{}æÌ™   W¯^uîÜùܹs?ýô“É|þüy»víìììbccÇŒsêÔ)@«†”‹7nœ¯_¿nddTWW'—Ë!çð¨Q£¼¼¼à×Ó§O'%% … . 13 •JµnÝ:Ôl×®]ÆÆÆP?zô¨¹¹9Žãݺu\ÇgÏž‚ã¸H$’J¥J¥ÒÚÚzÆ ðk=ºwïÞ0a\d0Ä–*•ª  @"‘ªT*Vkjj@Q·dÉ’#FLÚìÙ³#""€ã@cFÇ5° pš°!‹¸¼¼¼¬¬ÌÏÏÇñúúzSSSh@£Ñ*++åryHHº”––¶iÓF£Ñ¨Tª‰TVV 0 ¾¢P(–––ðP  ³ÇãñŠŠŠÀ(ETøñù|`›aGÀ¾ù0iÿ~Öh4vvv©©©_0º_ªV«MMM¥©¬^½ÚÇǧK—.~~~Û¶m“Éd6l0`zþüyÏž=OŸ> D«P(ìíí[·n½téÒüüüéÓ§Ãê„5Íçó Éd2hnêëëQ69”ÑSoEBŒ1NGKœØ"“ÝÜÜN:UYYÉårMLLx<žZ­Û5•J½yóæ«W¯nݺJõ®]»ž;wÆÜ©S'dh¼4Ø5Pú?ØøT*U\\ÜÔ©SkjjLLLŒŒŒ€Š …2Žã2™ ^ r}ÀÄB~FðxÓh4`“Ã>¥¡€¡‡Â7êß¿?“ɼvíš¹¹yóæÍ¡+â® /GôwáBGÖ‡Ø1 }]”œ :¾~ýšËåê`0ŒÔÔTwww¢qˆ$77wĈoß¾Åq¼ªª*--ÍÅŰåTUUi4šfÍš1™ÌóçÏËd2Xš£G>~ü¸±±qóæÍÁÍ h¸_¿~·oß~òä ŸÏ?sæL^^^—.]€ÕGÃnh  o´â‰é•Je=ÒÓÓëêêÂÂÂH$Ò™3gÀL­ÑhØlöˆ# äëë;}útkkëׯ_ÃãИO½!-`ºvízùòessó-ZÞ½{ž¢R©LLL‚‚‚Ö¯_‡jj*(«;wîË–-óôô466F %èuôêÅÅÅŽŽŽæææ/^¼€ìS SDÊEô¡Ñ˜âu~SÉÍ~;3ƒ¡Þh¦O­VGEE]¼x‘Ëå:99¥>9ƒÁ R©÷ï߇Œ=اÔÞÛ·o§P(mÚ´±°°¾tÍš5:nðàÁS§N¥P(;wîìÝ»wHHˆµµµ±±±‰‰Imm­••U‡LMMÛ·oO£Ñär9$¸‘ËåmÛ¶]ºtiïÞ½íì슋‹wîÜéèèX\\ÌçóÑ'‡ÌIèup8pàÚµk)J÷îÝ™L&jÉçóE"QÛ¶m,Xãìì\ZZ:bÄHS ¸|K—.V«ÕVVV#GŽ´°°èÓ§³©©iUUè™á¡4 W8Eù|¾B¡˜={vNNޝ¯¯ÍÇãããÑ$«ÕêmÛ¶uíÚÕËËËÌÌ Ã00öÄÇÇ8000¸ô'N_ƒD§Óуà¡8ޝ^½zÔ¨Q·nÝ222²²²ª©©ãØÞØl6â Øl6œùz~ZßZfƒ'Öâ¢Úª®®îöíÛVVV>>>,À/^¼`±XíÛ·GTMŒ¡'“ÉL&óíÛ·ùùùzŠÁ`<þÃ0‰”––¦ÓéBCCKJJx<ž©©©L&óòòºté’¯¯/ÑÁ ²™åçç¿}ûÖÇÇÇÎÎN&“i4šºº:SSSnkjj „J¥¦§§ÃTYYiaa8Á H“Éd6› ƒtsssqq3,‚‘J¥Ïž=£R©!!!àˆF£Ñž={†ÆlddZ ?¹\.‘HÌÌÌ€õ‹Å06&“™‘‘QQQhnnŽl°`®‹Åéé鎎Ž"‘ÈÄÄàï“““åryXX“ÉT*•àˆnllŒ}Ê%U%‰R©455e±XÅÅÅyyyþþþ haaQUUøUUU\.¶€êêj0Âã^–þC ‡FÓjµ/^¼øðáF&“ÉÞÞÞÆ­áFŽ˜4À¬1g¸H"‘€!§™LLøýû÷׬YC¥Rˆ¹iR :Ôh4r¹ ²¨T*B%@¡Óé NG¿"·P°Ð lbFH?\!î¿9ô½—&ŽUˆn8f4½:|/té~s¢¾E&nœ¸°?’«&(´y£…òg= ä:pQ$.t÷øßÌd8ÿrûÏí“`˜aC1ØÿZÖúÏ·ûbÙ …HÀ†ÜP åû-†íÜP å{&`.´¡n¨wuô×p¢²Ìúß_@ßö]¸ïÿ·ï¸%䥈^™ÚP0D$d‡Ü$À6'¨rGáñxßÂrPù; ÜËårÁ¡ê÷M)xh"omw33ü3u .—+—ËsrrÄb1x)ƒC8îþWkå+,¦nçp8à¶]^^¾{÷nð!k˜~ýsÏ"6øoÇ 7žFûœ .—‹5p®øÍ±ÞÉ“'Ÿa_ËËËÛ¿?ºòM3dà …ÉdÆÇÇôéÓ'88xÞ¼y ð'Oždff"O#ÎëLâáI”‹¶Gá`'²‚°ä "1¾Ì5üÍõ_O`ƒ8ú窣tŸÊ$IXOžþ<òÇöìYÀX…Ø÷W¯^uïÞ=,,lРA%%%»7f̘M›6µlÙ²uëÖIIIÐ@í†ZQQ±oß¾íÛ·óx<Ç7mÚ -ét:ôУGÐÐбcÇBø1: X/444""âÈ‘#L&“F£åææ¢1çää0Œ .L™2eÖ¬Y!!!}úôyýúõ´iÓBBBzõêõþý{ …ÂápnܸѦM›Õ«WÓétD½‡Z¿~½T*íÞ½{UU†aÓ¦M mÛ¶íÕ«WA¸>}úêÕ«»té¸mÛ6H<Û1 c³ÙÛ·ooÑ¢EDDÄÉ“'9ΪU«Ö­[Çb±ètzbbâ˜1c¨TªX,þñÇCCC{ôèñöí[è¡QH]ƒëßS`‰0™LΧ@Ð’1D& 4¨´´´OŸ>©©©*•jܸq‹/޵±±ñððˆ­««kÓ¦‰‰ÉÖ­[u:]÷îÝÁ›7o ¸  `ûöí¶¶¶pœÒh´?¶mÛÖÒÒrÅŠ"‘¨}ûöjµZ&“íÞ½ûþýû³gÏ633ëׯŸJ¥‚ {*•:`À@ܲeK Ãjkk“““gΜiffÖ·o_ Ã*++Û·oïä䟒’2iÒ$&“ ,(‹ÅÚ²eË/¿ü²råÊ!C† :ôúõë8ŽGEE¡1÷ìÙ“L&¿}ûvÓ¦M&&&€,Ù¼ys*•ºhÑ¢·oßþðà ãÎ;}úô0`À²eËÖ®]»{÷n@“S«Õ!!!,kÈ!Æ KHHXºtilll÷îÝïß¿Ïd2;vàÀ#F :t„ .\€ a4á@~ëׯ_²dÉüùóGŒ1lذœœœ&Mš¬^½¶6mÚTWWG§Ó»víúîÝ»µk׬÷·Õ 3”?\$ „Ú½yó&))éÞ½{ÉÉÉïÞ½ƒø^‰DÒè-æÙ³g:u222rwwß³g°ˆ:uš|8{ö,¤Y:|ø°™™Žã6lðööÆq\*•ŠD"Ç—,Yâîî» HŸ?ÐBª««qÏÉÉáp8…………Ðá½íÞ½{Ä–jïàà ‘Härù¥K—8NuuµR©½‰'B1ŽãÉÉÉ"‘(==8f¥R¹nݺfÍšÁÀöïßoeeõS§N¨]§Nzöì©R©”JåÌ™3¡±D"§;vÌÑÑÇñììl …’ ·÷ïß¿cÇŽ8ŽÛÙÙ9r.0 ]»v8Ž‹Åb‰D µ^gjjºaÃ¥R©R©"""ÆŽ‹ã¸™™Ù;w …©©é«W¯RSS)J^^žT*-,,¤Ñh™™™/^´´´”J¥r¹\*•~SkÏà ý'°Íl6;+++++‹Ïç[ZZÒét±Xœ–––žžÞ²eK333…B¡çà ÀWÁÁÁ %%%'Ož;v¬R©üé§Ÿ”J¥B¡Ðjµ.\2dˆM]]‹Å …qqq?ýôSzzú;wºv튀`Þ¼y ÑhÎÛÛûÕ«W^^^d«Õjá¨! ± û|s Ãh4±¥Z­þðáƒP( …ˆY333‘HdddD¡P”JåÊ•+%Ipp°‰‰É”)S† †ãxJJÊСCaÌÀ†@ç0N•JÅãñ€ €dÈê’•• v …@ó ÐO§ÓI¥RF£ÑhrrrÌÌ̬­­…B! æïÚµ &  poÚ´ééÓ§±ÿŸ»œF£) µZ½}ûöÝ»w“ÉäúúzûÃ0@дiÓ½{÷Òh´^½z)•J …"Äbñ·œ<É@À”sf³ÙIII;v455%†¡&$$´jÕÊÎÎŽˆüòê´iÓüüü† faañóÏ?íÝ»wüøñ@H åÉ“''NLII ÊÊÊŠŒŒT*•–––ÑÑÑ ,(..^¶lÔÎÜÜ<33“J¥Bd|yy¹µµ5Zyçˆ5jÇd2‰û j  Ónnn>¬®®æp8ÀÙ‚©I§ÓïÙ³G(&%% 4ððððqãÆ¥¥¥Á˜ÃÃÃÑA…ÐH0ÀöìÙ3>>¾ªªÊØØ˜J¥"èLŒÄÒÒR$P…B)--åóù°5ðù|@⪠„v@2X±bELLŒP(411=ň#–-[VXXØ»wo‚˜L&(½„ÍfŸ8q:7ÈÀÿ¶³ôF•••}úôáñxÀe£%—Ë]]];wîüðáC‘H„ &€€aÿôÓOIIIb±8++ëêÕ«Í›7‡¥¥¥r¹RõÈåò?®ZµJ(Âj=zô7¬¬¬üüüˆ vÆ KJJ:{ö,†a7n,--íÖ­›P(DyÒpW*•zÖ­VûáÃàÞ<~æàÀÏž=»~ýº¥¥eJJÊ¢E‹dàŸþ¹]»vt:=::ÚÄĤ²²ŽY4f±X J¥’¨KGó —Ë1 :tèòóó---=ºoß>´¡F«©©)//ppp˜>}ºB¡ÈÈÈØ¶mÛ¨Q£€DOŸ>][[›››»gÏž^½z=³ŠB¡DGG¯ZµJ¡P-_¾üÑ£G$©]»v‰äÂ… #GŽÔjµÀ“oܸÑÔÔ´ººžè?†øßVÈd²B¡xýúuLL À&n0 ð'__ßgÏžuìØáh4š““À¦"˜‹ñãÇ/X°€Ãá 4ÈÁÁµtuu…>wïÞ=mÚ´E‹)ŠiÓ¦¡#T­VoÙ²eøðáAAA&$$dÔ¨QFFFÄ1{xxTVVššš6iÒ(ŠÏçÛÛÛ#?¹\>a„âââ.]ºþÞúõëÔ†Z­†¤ -Z´xøðá¥K— "“É&L˜0zôh0­}øð¡K—.EEE;w7nœB¡€ ´»víúá‡@ËÒÒrøðár¹µ¤¤¤xxxˆÅb33³Ë—/ÿôÓO—.]R*•111€äèèøm.B’^º*Cù¯Žßׯ_—––vêÔ ’ŸkyåÊ•˜˜½…`† …%%%&&&666° °X¬’’NgmmÍ`0Þ¿¯Ó霜œ@S%ª««ýýýïÞ½ëââB”®!ã!ä[svvæp8ðqÁû”7Á>#’wïÞÑétSSS¥R &Ph ‡-›Í …ÅÅÅvvvFFF(7/‚ÏÍÍ¥R©...À2°X,4f¡P¬2`¸#§‹†u‹U^^^SSãîîN§Ó‰O¡ÓéR©´¢¢ÂÚÚìF¹¹¹ÀÖÖV.—Óh4U«Vµoß¾ªªÊÃÃCÏX â4@mÓéôÂÂBµZíáá0`È#8‡*•*??ßØØØÆÆôhœþ÷H¿çÁƒ|>ßßߟˆ«G½L&3!!ÁÛÛ»I“&(A!â'!{ ¤œ ^ÍÜŽa) åĉkÖ¬ñõõ=~ü8 "§Õj!A!dýƒ_‘¬WG/ü*p [¢AŽñ‰à³ vWD Ð!Œ¥ƒ‚ëÈ¿¢a]«Õ‚G'¤$î†fè€2QòD¸nnn¾|ùòñãÇCÞF=N"|Ì'‰D‚ïõ9ˆ/@8C ŽÓÀBÿ«ŠZ­f0¿é³šèý :a8maÉd" dŒLÇ4­¸¸¸cÇŽ‹-R*• Ï|”…Ø¡žÚYod2çdÖÝ „Š BP‡0f”ðA²O¯JoPé½ º‚ŸˆƒÑét‹- …l/z#$>Zo>¿ é=â[NÔ` à?T ÓÇVìÜ …R„4Ú¹=ë‰Ðzu Œùóçc¹4êuˆ}ò”F*å†=7¼øß½/,ßFóª~}Ï_󔆛‘é˜2e èÆRoÃ{¿’n"-ô¿ªÀ±`mmýñãGìóðW 9LLL¾lÙ~~ó¡(ãáoR‡Ã'á=jà¶ÿo‚C ]¥R9::*Š’’6›M”ëÐáÀ`0222š4i‚4lC£ÑRRRºwï $ÖXè ô†éõÚÀEH :[G`£ÇÝ÷^‡ä2ÿSk3„b8$êaaa·oß‹ÅÚ‚‚ Zèõë×åååÁÁÁD-1ÞÉdR©ÔŠŠŠ„„¸ Hòô piPr8H{ q¼Dc)tÅápÀôB¥R= 7¡@Ò4gøŽØ÷©cÐBÿ~(Ífçå奦¦º¸¸€Y§ÓI$’/^”——ÇÄİX,"ÿŒ<˜L&$àÎÏÏ:thnn.“Éd0ååå%%%®®®&&&r¹\­VËår“¬¬,@àìì¬Õj333ØQÉd2ƒÁxûömmm­———ËU*•d˜Çã …BP½æåå9::BŸè¨7|ÊﺔX¿³ $ r¹ÜÍÍÍÄÄ$999++ËÈÈì–b±¸I“&=zôWA"ÁÀ_ …2räÈ+W®€cƒÁP«Õà—_~Ù°aƒ©©iMMÍêÕ« ôìÙ³áÇ{zz—––Nš4);;;++«¼¼|âĉK—.•Éd?þøãíÛ·y<žL&;pà@DDÄìÙ³óóó¯^½ºiÓ¦„„33³wïÞI¥Ò“'O¶hÑ¢¡{¶¡dàÿ9X¨€w^—.]:tèàââbeeÕ´iÓ®]»FFF‚G1[Ƚ,ëĉ‡¾{÷î£GÂÃÃ…B¡@ HII™6mÚÞ½{Ÿ?¾xñâÁƒ—••±X¬¢¢¢aƽxñ">>~éÒ¥ááá›7o^¾|¹H$zñâÅÓ§OSSS333[´h1}út ÃÄbq}}=†ar¹¼  `õêÕ/_¾ôôô\¹r%ѯÓð¿oذ‡ý.™4L&ãp8ÎÎΞžžMš4x=%âíçÎëÛ·o³fÍX,V÷îÝA;uìØ±V­ZuêÔI.—5ÊÙÙùÊ•+L&“ÏçÇÆÆÒh´¨¨(@Я_?:ÁãñŠŠŠZ¶lùàÁƒË—/¯Y³F(‚ƒ1·lÙ2 €Á`´nݺººúA5ý¿ÂB|ÿYu}Q´@Ã,{z§X,vtt„XsˆYÃ0¬¦¦ÆÒÒ|€Øl¶¹¹yUU8Eð\.‡`ÈHªÕj™Lfqqq‡¼¼¼QÆ`bÞ3Ȧ n I×ðí¾Çºú/<™õÐÏ-nnniiiT*•Âäçç÷ìÙ3 …ÙC³²² Ä,%°)ë$ÉØØøðáÃd2ùâÅ‹ .Œ‹‹G.pÆ>¥á…Æ Ž6|£Ï l`¥þÅ™¬Õj'L˜4mÚ4ÿ•+W‚ÞkÔ¨Q›6m0`@ß¾}·nÝêèè}ÿþýúúzýW[[‹*X# `Ñ¢Ek×®ÕjµË—/755Å0L*•ÖÕÕa&‘H@&^l”«7”ï®PÀ5ÏPþæ#Z£Ñ4iÒ$<<üìÙ³yyyC‡õóó 522êÑ£GRRRBB‚——×þýû9ŽR©¤Ñhy ÈíÛ·g±XjµZ£Ñ´lÙ288ØÒÒòìÙ³ …bòäÉæææmÛ¶U*•ŽŽŽÍ›7—ËåNNNÍ›7§N[[Ûððpðå2ðw¿–È(Q­ŠÒ(ÿÅu„KüàáLÄÇ€ÈPG)•JN1q—u c€¡@"]õ*†¡:‘t ßå{\?ð×`þg ÄăššÈZHÒR@(‚Z­†Ð<ðÓ’H$Ä:´@vÔ9•J…Î) äpÑ]üdz1ÊŸ#¦àŸ†õvV l½‘_£u=Ä©†ý€ú #8ŸfþßÃBge(†b(ßå`f0Ô õï®þÍpŠ¡|Ç'°a þtíÔ—#Š¡”Xß"Ý+è‡!¯ÁÖj(þ ä¡¥R©ÕÕÕ555jµšÍf[XX@\î7‹‡f(ÿ‚bÿêe±X©©© …ÂØØ˜F£_¤••Uhh(•JýÊ+ÝóÑP Å@Àõfgg§§§‡††:99!øo©Tš‘‘ñþýû˜˜ÈÄ݆õœ±>.ýM,”o#Á°3( ö/Ò·œÓ ƒëɽ £¸¸8==½gÏžîîî …B¡€—rBBB£ ’ôàÁƒS¦L¬¶€‡ŽŒ(3u£&þªgc ^×k¦#=±ô+‚ÈëܹóÕ«WàZ/´­á#à"ê Põ>GÄ_Ñ0¾;\l@:~ìØ±Þ½{#çð/ôÙè´4|S‭?pàÀ={ö ü7KÉþ£;tJJJ»víØl6x•“? Ã$‰»»»]ZZ€ûʱbÅŠÎ;C¨ÐèѣnjY׎Ãá°Ù솕€ ¿bŸ’¼ €D¯Ã>abB3”=”Éd²X,Hº‡2îÑét‹Åd2ûÀb±P("@á½y󦦦†B¡ðx<ä‰I'<‚J¥Â`âO«Õ²ÙlHwþ9‚äp84 Á`èõ‰öJ Ãz÷î]\\L&“?~ü˜M&“¹\.jIìÁ÷Aœ@T‡Þ Q@ó7„b?~¤P(úЙá_xü²Ùlȧ?¹TªR©ôóó»~ý:‘#2ÞóçÏ¿víZll,†a?üðƒ¿¿ÿ!C"""H$REEÅÓ§OÍÌÌ"""PJ´æT*Õµk× F«V­póæ dz°°§è’’www‡Ü‹‹‹¯¯¯R©¬¨¨€®>|ø`jjjaaadd„aXyy9 ðù|È–››keeÅf³•JeNNއ‡‡Ãáóù/_¾|ÿþ}dd$ÇS*•§²²òÉ“'666Í›7W*•µµµ"‘ˆÉdfggGDDp8œÌÌÌ   {{{$#€?6Nøðammmxx¸……ŒP­Vs8œ'Ož¸¸¸4mÚ<ÃÉd²D"IJJ:þ|TT”……ƒÁ022ª¯¯¿ÿ¾««kÓ¦M!§1ôYWW׺uk>Ÿ _Èd2è]]]I$RuuµB¡°±±Á0¬°°L&ÛÚÚ2Œ”””òòòððpsss ØL&Ç{óæM^^^dd¤‰‰ ôöm-D¹¡ü®˜IIIÏž=pŒF›hÆ•+WJJJ€Á–Ëåb±Çñøøx€³‹Åc’’òöí[Ǭ­­ÃÃÃ]\\âââ¤R©B¡€‡ªTª¢¢¢fÍš¸ºº¶nÝZ§ÓMž<¹uëÖpþÌŸ??88Çñ£Gš™™µhÑÂÄÄdùòå(k¦½½}÷îÝ;tè0hÐ ¸¥uëÖÓ§Oÿé§Ÿ €ãxii)Ç;pàŽã—.]²µµ•H$~~~ÞÞÞ­ZµrrrjÚ´iYY™F£ILL´±± µ°°˜0aŽãgΜ122rqqñóóS«ÕsæÌ±¶¶ 311¹~ý:D_Èår…B!•J;wîìêêÚ¢E ›7nà8þË/¿X[[·mÛ6$$„ÍfïÙ³G§Ó‰D"­VûòåËÐÐP6›íããsëÖ­ýû÷·iÓµ„λtéâææàââRPP V«a¶“““MMMß½{‡ãøÈ‘#›6m §nÓ¦M7oÞŒãø°aÃìííCBB¬­­SRRpoÕª•½½}«V­|||ìíísrrÔj5Ê ûÿ!¾}ûö›7o¾@ÀÐìÖ­[ùùùaðäÉ“!FW*•VWWüøQ&“©T*±X Ùºp¯¯¯·´´\²d йD"Áq¼}ûöÆ Úsrr:|øpQQ‡Ãyÿþ=Žã^^^;v쨯¯g2™7oÞÄq<==2 îܹ“Ëå¾|ùÇñÇ ¹\±_¼xqñâE;;;Ç!ÃðÀq7n\—.]pwppò‹Å<ïСCÆÜÜ|ïÞ½8Žüø‘Åbåçç'$$P©Ôû÷ïã8~íÚ5‡SUU…ãøæÍ›½¼¼` ƒ×_´h‘ ¤\\´hd®Øºu+‡ÃÉÊÊÂq|êÔ©žžž€û`uuµ‘‘ÑÇa3âñx¨¥««+l^ÞÞÞ03½{÷†J,C²e‡“'OÂQ©ÔwïÞ}øðA TVV9rÄÂÂäáiÓ¦aHHH‡…;""¢[·n8ŽÃôí ýÇ$*õË©ŸANV©T “S"ÉV£Ñôïßÿýû÷uuuû÷ï·µµ•ÉdãÇ—Ëåà§Ÿ~ºpáÂÂ… I$N¯©©IKK³°°˜7oä+=þü!CìííoݺS^^>xðà[·ná8þèÑ£»wïBháË—/I$’““S³fÍT*U×®]ÇŸšš éê}}}-,,d2YYYÙÕ«WÇ÷ìÙ3±XüâÅ‹áÇÛßµkW ø\®ƒƒƒT*ÍÏϯ®®ÎÉÉ™3g‹ÅR(?¶±±177ŠŠÂ0ìæÍ›ÆÆÆ;wî”Ëå•••ÙÙÙ>|°³³ÃÇ… ÆÇãñ ŤI“âããsssÉd²‹‹‹Žãþþþ/^þh ‚EL.—;;;£–.\À0ìÖ­[FFF‹/ÖjµuuuyyyA­Ñh˜LfË–-ŸEê5ÚL.—K$” þÚØØ”——ƒ„¶}ûv‰* ÍÌÌ ï®F£Ñh4|>ejXĵµµjµºW¯^-Z´Àq¼oß¾7nÜH$AAA\.·¢¢‚ÉdÖ××ÆÝœ9sž?Ú]…B!:vìxòäIµZG&“­­­½½½÷îÝ›››{æÌ™‘#G}ÅŠöööwîÜÑjµ®®®666ÅÅÅ]»vU(‘‘‘°/¬[·nÔ¨Q-[¶9@¡áÔjÕªŸÏçóù€›…ãxÇŽëêêZµjçUEEEPPØcjjjÏO]]]MM‰‰ÉøñãCBBV®\9uêT__ß²²2Ç+++©TªZ­þá‡ØlvXX؆ :tè0lØ0˜€[ºtiJJʈ#Ö®]Û³gÏéÓ§óùüšššÚÚZxŠB¡€Ñ¢[—Ë]¸pá«W¯H$RUUj w-_¾­¨¨˜5kV×®]íÙÍÍ­}ûö¾¾¾pÊõîÝ›Ëå>yòD ¬_¿Þ‚B¡x{{ûùùǛ;ÿ~xxx§N@¼–––Ý»wçr¹ÀÚÚ:..ÎÈÈÇq@ТE sssNÇçó쬬:wîlgg÷øñcPª»»»ët:77·   èàÀ555/^¼X½z5í ØØØtíÚõùóç“&Mš1cHª^^^0Búd!Æd2CBB²²²¼½½›6mêìììïï-ÝÝÝýýýmmm»wïþúõë¼¼¼¾}ûN™2M;|/GGÇ:øøøhµZ—V­Zùûû+•JSSÓþýû¿{÷.++«}ûö , P(gĈeeeEEEË—/ïÑ£‡B¡Ð;ÉײuäIDATË·üϯCƒ+åƒÁ"'''##ƒÃáXYY1 ±X\^^N£Ñ"""Œü°ÿ¶Žœˆj-°4BŸÄ‹Dð  ¢!–8rÁÃÔŒˆhG&“ß¼yÓ®]»{÷î¹FÙAçØÀÃ4v QòÐ# ‹¼…N§£R©H{Ý¢±é½;ô †:¤‰C͈Îj _€‹ÐR¯O²&œØ?ªÃ”‚Þ>qö0  è[“I`(G w˜ûï«ëD@&“©V«‹‹‹kjjà$±¶¶¶±±AÄÐò:-R(´¾Át° SÁ '9:aÀ c¡0 Œ&®°Ùì-[¶,\¸pÒ¤I qZ­ah}e8N8Û‘´ ÿþšÅçÓ-zîð"p²Á+Àí ¬¢ÑhD"„‹ðލýëÄ>õn'öu¢Ó(ñC€úŠ8zŸïŸ]{¿þ5ðŸRA )`ÐC\²ŸûðĆ}&ŸC£÷~ÍbjÈöÃZ¯¨¨H$^^^pýîEù•ãÔ×ßýk6Í?Øækæês/øð× …þsÜ*á|#Z>ô4^_œ]+ ?ÞçÓ×Èêz¸N§³µµ\Û?È~ý8¿Lðÿ•ØòÇÛ|Í8s32ÈÀ†òï;¤ï½¢‘þ×é†ò]Cr3C1”ïùþàByBn°¡þ?… ýU,42ZþAÀT¤ýÊöèq5ª¡÷m†Yÿ¼î«ì1œNÿrЗƒi $`'Zž¾^k.J€ÕˆŒ–Ÿ+ € Ê1Ol@§Ó‘­ÿ»ÓòÒs"3i£û B4¤a¢ñõù;¼…`wF¾Ç†AÄF°ô"¼½ö Ç–ªßêê÷M#˜sNþ«‡A‚q˜c† ‰–äÁFRZZúñãGH~Ù´iSÈp‰fC‰@®•••eee6¹ ûÆ ãØ±cööö-[¶|üø±ŸŸ›Í¯hÌd2=zT\\<`À 1µ²¼aо)†½Œx´m/‹òæ ‹•JÕjµ ½G¾fƒF®K …F£A¸ëŽ\0ø†»*êJoWEïK¼@ˆô£~ýŽ#‘H¸\.¬ŸF_ö730}³~5«R©(bAJáÅ‰í¿ økfŠN§oÚ´iÙ²e—.]Ú²e˰aÃJKKáLt%ØnN‡¯N¡PX,™Lf2™l6›Á`\ºt‰N§gff;v âËÇú¯ »Æýû÷srr0 ;sæL}}=t ]¯LNN΃à¡, 9!²Ùlðb'“Éèú·C½à`TXX8{öìqãÆ;vΜ9Ïž=,ìSÈ‚k£R©íÛ·¿pá¼”N§Óh40opb@x™L®ªª|ø°`Á¹\^\\>Çq‡SXXyâÄ ƒñ±‡°V]] ' áælL3ä „Ç‹ÅBù"ÀCá¶±ò€Ý}õêà~À~!‹—-[VQQ!‰V­Z%‰¸\nUUUttôÚµk)J^^ÞâÅ‹ÁÇ›H$T*uË–-OŸ>…Á ­•JÝ¿ÿ’%KîÝ»G£Ñ€“ª¯¯‰D E ÀV®7HÄŽ!¨:À¯.¬ªª ç0¶°¹£9a±X@·p;‹ÅBŽ–ðâIIIkÖ¬“ƒB¡”••-_¾\©T¾{÷nÍš5R_çÈ‘# %!!aÆ °m} J,ª^8áç´ DyÕÚÚº¼¼ðŋ———›ššž>}zÿþý6lˆ‹‹ëÙ³çâÅ‹ù|þ† ._¾üêÕ«‰'öïßßÞÞ¾wïÞ•••çΛ:ujAA\.ö왇‡Ç¢E‹JKKMMMÏž=»eˇ;%|fF3nܸ3gÎ$''ÇÇÇÇÆÆ?~üäɓا¼¸?ýô“‡‡GHHÈÆ_¼xѤI“Í›7oÛ¶J¥._¾|ß¾} £a¢“¿¢þ9MRÃ6 ÅØØxëÖ­ð Ó¦M[²dIÿþýÙl¶D"9räˆJ¥êÑ£@½ ØW÷âÅ‹‡Z[[wëÖD"]½zõáÇd2ÙÃÃÃËËkܸq¶¶¶ÉÉÉ\.×ÃÃÃ°ŠŠ €˜c³Ùiii?öôôìØ±# uƒ™™Qhâr¹4 Xܵk×ZYYa´páÂ3f°Ùl###â²æY&“ݾ}ûÈ‘#DA”N§ …„„„víÚíÝ»·G(§1ƒÁxüøqZZZ›6m|}} ‹ÅJKK{òäI“&MÅ|Ërrr£¢¢`íO®P(} Åß 0„#‹N§«Ôêz¡P£Q3,€ÿe 9ÀÇ\¾|™Ïç××ׯX±búôéd2yâĉ͚5;sæ †a:uZ»ví–-[PWQQqûöíæÍ›+ .—›‘‘qèÐ!__ßQ£F7ðeårù?þ¸yóæ‚‚WW׫W¯®X±¢²²rΜ9ééé¾¾¾ÅÅÅM›6?~¼³³3¬Ë/˜ p¿y󦃃ƒL&›éä¿?V«Õ111ýúõsqqgmm½qãFX£ ·¤ÓéGŽ™={¶P(ܳg­­­­­íDZO8ãÄ /‹J?è¬*• ¡ŠCKô/¤pB¡Èd²æÍ›wïÞ}Ê”)/^¼•3gÎäççÏ›7¯²²rüøñ Àÿu*8y”*Uê£Ç%¥ÈT™BѨÕT2ÙÛÓÓËÛ[­Váÿð¦ Ayúôéœ9sæÏŸ/•J³²²lll†J&“‹ŠŠöéá6mÚ´aÆ5kÖ€*X.—ÃY$•J‘þO*•º¹¹¹¹¹%$$tîܹ®®®G/^¤P(0Ï4M,¿|ùÀõÔ¶HÜB²âöíÛ`èС€;£§-‡èÙ¢¢¢œœœ½{÷"ð7¸þîÝ»gÏž-X°@$õíÛ÷—_~Y²d  [ûøøÀÚèÙ³ç¡C‡T*ÕÔ©SW®\YVVÖ¥K—»wïb6þüèèh++«úúz??¿›7oþøãŸË#‡$ ÌêtºG1Œ¹sçÊd2FSSS“——Úðʼn–' …¢V«õ¾pXß–'ÖW¶“J¥555Z­¶M›6FFF¿üòKttt}}ýáÇ߾}»zõêììl&“iii™——×´iÓ€€€çÏŸ;88€Ýp›P˜êìì쌌ŒöíÛ‹D"ègÕªUùùù_"‘@4y}}=Äú®†aB¡Žq*•Ú½{w__ßÉ“'S(”iÓ¦¡5 ˆ67nüBn±?~ö2ŒÊªê³ç΋ÕÚ€VíÃb{4íÓÍ- äu^þÕ«W‘E­!GÃf³ïÞ½ „‘––†®Þ¢££ã„ V¬X'<üÚ¦M››7o2dĈàd{=…GÿþýoÞ¼yìØ±ˆˆ:^__ Êžžžnnnû÷ï â„Àê„¥‰ ÐîyþüùÇÏŸ??##£Ñ<)À[9r$ ÀÚÚñpýܹs‰d„ !!![·n}÷î@ñÁ_;E"ÑäÉ“ìììV­Z †Fdp†Aêqû«r»¢9_år9ŸÏ÷öövssóóó;xð ½½½žø;xqè¢ ¿â¢QùÖO``‡¢££íííá“Ì;÷Î;€¶wïÞÌÌÌæÍ›êo—.]\\\¨T*ŸÏŸ7o^pp°V«µ¶¶îÝ»7ôãîîÞ­[7ØÒÓÓïÝ»7uêÔÍ›7ïÛ·úqww5¬V«íÔ© 4ˆN§{{{ƒ)ð>}ú///X[¸pá¶mÛªªªvïÞ½uëÖíÛ··nÝzèС………€<üQ/…B©«ÞHHŠjcâ`_ôQô!ãµJ¡à NNŽQ]»e>ztýFB×.q:•ªáÄÁáp–/_nooéÒ¥nݺ5iÒ„N§Ïš5 Ã0‘H'0™L=\RRRff¦¯¯ïÇAà ,$K&,ß~ýúíÝ»755uÿþý†Ö××÷íÛ×ÎÎðÜÜ\KKK 0Ç=<<ª««_¼x†aØãÇ …½½=\™ççŸþå—_vìØ1iÒ$=€U ü . øñÜã)'o-9qífAE¹?{åÚó/€_€íçÊÊJü´iÓP(LOO±±±&L°°°ät>Ÿ¿uëVÇ;uêdkk;dÈ___ ÃNœ8ãx¯^½š4irðàÁ¢¢" Ã^¼x3Ó¥KÈQ “9iÒ$>Ÿ?qâÄèèè¦M›VUUÁW“Éd:nÒ¤IÆÆÆ#GŽ4h‘‘ÑÚµkð¬¬,èpóæÍ†ÕÖÖÞ¼y¯Ñh@÷vûöm¥R‰f^DÜòòrÇa%À½µµµýû÷§R©ýúõ6l…B9zô(ŽãÇ755?~|ÇŽ½¼¼À}¨]»v>>>S¦L±³³Äùììl Þ?)œúé'€ï„¼ }úôiҤɮ]»4M¯^½¬¬¬&MšÔ²eˈˆø°JÕjuß¾}­¬¬ÆŒÓ«W/ccãÇCJ ½¯‰Z-Z„aX=bccccc T__Ó¨ø'ÊW¹Rêù3!_9dRCb*ܯ4D<³ ´ ûÑ{(ì÷@–°q-õHåKìº">ú¸=~Î{©´¬ìqrjD×ÏóKÎ$¥f›{æËÉRµÆœÍp×Ô†h«ûŶ窤™îõêÑ]§ÓbØ2}üøññãÇ]ºt“A*•^ºt©cÇŽ666ïÞ½;räˆP(Œ‹‹kݺ5dBòòòrqqQ(,..îß¿yyy“&M|||jkkwíÚÜÍ… :vì(0 ËËË«ªªŠˆˆ0*ƒqõêÕ»wïZYY9ÒØØ˜è°Å`0îÞ½{óæMÖ£G   µZ- Á¾ÀçóA1{öìÙÖ­[Cã®]»Äápìää´lÙ2©TŠ8^ …òòåËÒÒRP˜+guÛ¶mß¾}K£Ñ ž?Û®];…BÁd2/\¸””dii9lØ0 `˜:ôúõëÐÐÐþýûk4±Xœ˜˜Ø®];###±X|àÀÊÊÊ®]»VUU…††š™™ÕÕÕíܹÓÙÙyàÀà ”œœìììkp·Ðð=÷×±*hL¥ÀÈdL«£q¹îuog…8¶ j–|íbdx˜…¹9‘`€×E ™LïEµZ (mˆE"‘H ›‹Ÿ^’¥R ];À‰èùýÁ˜‘Ó…ž»%ñWì8<ÀÖ#`4x‰TPP`ccƒœÉˆȆ¾‡ ñºzODÃFƒ„þ¡ì$rö„~ô¼¸aLJ‹D;PÇêe{%>9´6úu€¯Ö[Zÿ, ýµ*5pë•RC‡„†)0ßYžXúÐþWÞ§z©%wõ–NÃ"“É9fV …&»F\ (:ŽBÁ1ŒD%«Õêl5ã}E5‰‚ÑY,™TJ¶´ÔSì#c),VP¿ƒ#1²‘ÀÎ…°o RŒ £V«‘µÐF"S¿"og½ù$þŠž #’ÊÈŒ𙼽½‰tN$ˆQ+Ð 'ò]Gp|  ±™N§CoŠ ¶0'Ä‹¨=º½!¶ñ‰ KûÜ×t“zN ÿl²ò×ÐFÛ¸q# æƒcÒ¿Á<ª>ihÐOZœWQÊf¢âŽ¨Í£P(R©tüøñˆ!m¾°°¼;ô1ŸB¬@-¢÷/z(ú—hl æ’F=Ý>xð`Á‚pú5>}²F£¦RÈ, Óᆡv$ŒDÒiYt†axcl<|{"p$ÚÝaÅS©TÄw ¥Œšþ ¹¢Æzá>h¹Ã @·H[«÷^èW"£Þ9 ÷6\¸ àh”«j4ñ*ŠmBÇ]Ãaè5lFœ¶ÞEÔÝÞè1Ð苟…æ= Ê?ž*‰ü•g£££#ŸÏ£9Ê 2À¼yóŠŠŠ€)"&F! `ï… \A8ÆìO(EЃí©S§ÊËËÑZGá àõ î¯À{³Ùl&“YSS¾~°>Ð#`;@C¢Óéè'à/€Ñ€+ˆù¬©©Á>®hld$ª©f2ÈaŽ–táG-I!adàJt˜›¶¾©³ƒF¡–K%##=Î ½‹…À}ÙÞž½_o“„÷B³Š,´¢S~ÓÍP¾6›ýñãÇ[·nÑéô¤¤¤ððð¾}û8p ##cÇŽS¦Lqww¿zõê­[·lmmüñG‡sêÔ)©TZ\\|X(FGGÇÄÄÀQO´g‚m~~þ˜1cÝ‚Éd^»v 2ÓŽ;V©Tž8qbøðáàÈ‘#¦¦¦OŸ>}õêÕ¦M›~øá ÃvîÜ™ŸŸÕ§OŸ÷ïß?|øðãÇ666þþþ/_¾”H$™™™½{÷†„z‰‰‰ ,kèСàH gÃ¥ –C'g—WÙ9©<ÌßwDéí}¥ù[ŒLÖÉ”–uEcBœìªÞærÙ,c##=)dλwïž:ujÇŽÀÅP(¹\~ùò娨(ÈçÐß#“ɇÊÊÊš6mä ùrÄ•JMMM•H$QQQðPÇ?|ø0sæLðÐh¸³Ê÷R¾ê¦R©»wïÎÎΖËåË–-«¬¬ìܹóöíÛ“’’¼¼¼¸\®³³³±±ñ… >x×ÎŒ3<¦í²fF±š÷á²·èå«ÚzwˆhASÈß¼H n¨8¡R©¥¥¥Ã‡ïÒ¥ ·@®555}úô)((‡$³ €øyóæMžŒŒŒ ÑJ"éÎ;:uBãÁqüôéÓ!!!\.744ôñãǵµµ6lHIIY¸páŠ+\]]#""¸\n§NÞ½{—’’ÒºukçååuñâE0Ü/[¶Ìßß_¡PtèСgÏžC† ±²²ÊËËóóó[¿~½V«577‡<ΈGm8?ðB¡ ¥bxJb¢51 ¶ÕêAq›úwZ8°[û~qõý«|}­­¬@aC<~i4Úœ9s:tè'“ÉØl6—Ë¥R©fffFFFðh¢Ì1 åÌ™3›7oÞ½{·¹¹9Fãr¹ÀöòX,¤Lf±X|>Ã0ÄíQëÖ­Á·nݺÜÜÜsçÎû É뾋:úKÕ‹&z§ ÒÊd2°% TàtªÕjóòòÊÊÊ´ZmçαOy}@K7²ÙlÐ^â8¾mÛ6•Jåíí Š{½§Cô¿X, ó ¨5M~~~yy¹V«íÒ¥‹R©´±±±±±)**jÙ²%$¼‡Ó¬®®ŽL&ß¼y?Ú´i#‹Éd²T*…%Vbø2Ù.Z´ÈÇÇ@5hý‡•ÅqÜÔÔª.q=züàÒY [;3k[*“Yû®4»ä½¤®¶eX¨›«Ë¯Ì3‰„}šgx\bbâ­[· \®°°pÞ¼yõõõ‘‘‘`,5ø¼yó’““œœ–,Ybaa1}úôêêêmÛ¶ÏŸ??''gåÊ•ååå¾¾¾sæÌ1119tèP(œ0a?óóóçΫR©Ølvnnî”)S0 9räœ9sÂÃà °iÓ¦^½z5úކú·\ÿO<ðo¦VÁ„#"m,5gETTÔ AƒÀóÆØØvz¢bäX‡SPPðìÙ³‡‚댞Ø×„„„   ƒ±ì\.=¥´´ÔÆÆ&))©´´488xݺu3fÌ€®¨Tªµµ5™LþùçŸMMMÕjµ\./,,DÊO”Xö.—{üøqGGÇùóçWWW߸qµÑS\ý:}pÇq S«TQ‘>55¹yyUEù:–F£9ÛZ{´kÃ`0r9‰Lưÿ÷à[’œœL§Ó!¹®L&kÛ¶­§§çÀÏ;W__Çiß¾}«««gΜ¹ÿþž={>~ü¸yóæ‡vuu .)) >|xÿþýgÏž——wåÊ•›7o~øðaÒ¤I†=|øðÞ½{sçÎ弑‘QHHHRRRXX˜¥¥%ŽãíÚµÛµk—P(är¹à/aH—ó½äåúïR« OFî§R©@ïboo¿bÅŠ5kÖ̘1cúôéàýÃçóW®\‰ì™äÅ—ŠD"{{{SSÓŸ~úI ddd@¢t8 Aê–ÉdÉÉÉK–,bF„=iÒ¤Y³fåååUVVÏ™3géÒ¥³gÏnÑ¢E§NZ·níìì,‹,X°xñâ>}ú <RxŽ5ÊÉÉ e¢Ðh4Èú¥R©¤Ri‡fÏž=sæÌêê꺺:ˆïi4¼CUT@Þ¢…ž‰_©P~µôà8öë ¥  ÀØØŒÌW®\©¯¯¿~ý:…Béܹ³½½=‹ÅÊÌ̼yóæû÷ï›4iåè蘚šÚ¯_¿¹sçÆÆÆFGG¿ÿ>!!!""B¡PLž<ܧÁ3 ÁápŒŒŒ`ŸU(–––#GŽÜ´iÓØ±cMMMq·³³S«Õ¥¥¥ ËTYߟú7YhP·.Z´ÈÒÒ’Á`¬Zµ <&NœÈf³Õjõ‚ ÀÜÝÝýСCжm[Ð5iÒD­V[XXÄÇÇóx<µZ=tèPðCܵk×íÛ·œœÆŒtil•J%NOKKssssvvs<œÞ*•*00ðСC÷ïßoÞ¼yÇŽ…BáÊ•+H$ÒÞ½{A\߸qc~~¾R©7n\óæÍ_¿~T[[‹Æß©S'ð1Ä0låÊ•¶¶¶¦¦¦›6mzùòe‹- ž)44ÔÉÉ ­ì/ˆÀ‰ (bêÀOsK4c†I$„÷æÍ///€•“H$ÀA¼~ýšF£ÅÅů™L®­­…§ˆÅb­VëààpãÆ‰'š˜˜”——óx<Øãˆ±øDáÇñÚÚZÇ«ªªŒa£ÿŒ€i`S¿'úk¨\§Ó5mÚ–…¯¯/Dxxxæ«‘‘Qÿþýu:\.·¶¶×ShɦËÒÏÏ.:99ASSSh KG©T€f"EýýýQà81%¬••ܨT*-„ã ? …Â×ׯ)—˃ƒƒƒƒƒá:ŸÏGã·±±‚Á0 ƉnDžR$ à_ci# D®ÏÝ" `ddT__Ø#`oƒ“ɼxñ"¨LMMAÜ5…B¹zõê”)SRRRüüü._¾ f3ˆO†p8¢ ‰˜ÞšŽß­Ô­ ‹B\®B¡êÒjµ2™ bfÀ{Ú X¸„ ‡*¸L) ˆ_o„}ƒ·ê‘ÄÁÃS@»$x¢`&TGyœÑøU*2ÌÂ8¡1еÑxûçj=<Ľûÿ>€ B!æD°r¢ÞKÏi•XrôCG‡Þ1B| ñqÐ3Òœ¡Æ_?'ÄŽëi¹þôÏüvXX˜N§ƒH=//¯ 6Œ=ÚÏÏïÈ‘#ÎÎÎ …ÂÈÈèÌ™3ëׯ lÙ²å»wï˜L¦N§366†3³{÷îmÛ¶õññ ­««333«©©5j”¥¥e³fÍ¢££e2™……†qwvvnݺullì7H$ÒíÛ·ýýý¹\.XÛ@ß~ý?ñ5ü¡¡ü¹\2ØlöĉËËËÏž=+•J9λw着ªE"N§R© C"‘¼zõÊÔÔÔÝÝœ:„B!¸‚Â.–‘‘Ád2===?~ü6aµZ™™iaaakk+ ù|>DüüªJ¥zýúµ««+—ËuuuݳgO‡áÙði¾»BB˜ô¿;G»¡þ»ëR©´E‹óçÏ4hT*°“ë>l0DÛL„@@nÛt:™ÜA=]A’„#‰~9r¤Z­>rä¬ÃwùŽêˆf¿ ÚPÿsëØ' "ccãS§NªFE2!¹î¢’(¯bŸâ])!( j‡Æ 3£¨`FZë5kÖèáKêßKý׿úŸâ¢ÒÀÜh õ_]PèÿïÈSg(ß m à¶ Àý¿ÿÑDÌ#õ~¯f¤A‚ïïºNÔ1þÍc Fð¾ö}&ø6œÀ>oŒœ" åï*TÃü‰¤‹À÷ˆFlÃÌŠ€¿ƒSÔQà > @þGä[C1°¡|-õ‚rAAA^^Ò'óùüfÍš+õ—Ïa=¸yüî<¼î¿—Þ¨0BŠ&$À®ý%_4¼Žl׿cä`$ÿSfkàÖÞ0Y<±ÁßÏpdà?ú511‘D"yyyYXX@,ä‡rssþ@À- ðå„$¿cHÈ…ãsûJ¤{ÜþE÷"t`7 7½ö¯¶On¤ ¯ñ·!oôÿÏÎ1G,‚õEž¶Ø'àa4¿™SÖ@Àß" _¸pÁÓÓÓßß¾(JÕ¥ÕjoܸÁçó!,¡Ñ“"( e]¸paÔ¨Q€tóõ›:°î/^d2™ÑÑÑrïø¹ÅM˜D"!"f3“Éa sss Ã` I$À ý2w —ËQV!ây AT0!jµzß¾};wvppø¯d˜gÏž½yófذa&µwwxâ—{ƒ²ár8”ªÃ0SSS‹¿:HÐùw.?ƒxöû ¬¹¤¤$gggHÑ„§!Â)..®ªªª°°°aö ”&44tÞ¼yt:"º §L™QÁD„:"œ52$ ¨#ø•B¡lݺõàÁƒàAIDÒËÂÂÂ7n ëÄÛ‰R© {ô茊N§8põêÕt:½ÿþmÛ¶  ¼~ý:ƒÁ¨«« NKKwÎFI—N§;öرcÄ6p}Ô¨QÑÑш€•JåäÉ“³³³؈˜Œfƒ˜!‘ø 󔘘¸xñb½óH$¡PxéÒ%±X ´MœU½/ ™Pét:¨¯[·®OŸ>t:}åʕ͚5kÛ¶mdd¤ÏæÍ› NïÚµë®]»À=Æ@ÀßA¡ÑhÕÕÕõõõÁÁÁ€âOÜïQƦ-Zdff6š’“F£Ý»w/;;ûÒ¥Kõõõ°ÙÓh4SSSsss …Âb±˜L&,P¨3 €ìÂ>å³f0padd@vl6M£Ñ=z4|øpˆ†>õnGË]/ÙzUU•P(Ä0¬   _¿~·oßNLLŒ‰‰éÚµkii)N/--ý×Ê`0JKKd³ÙçÏŸ÷óó[´h‘ÞøÑ+#Ý‚Ràóù666, ‰&ÿ‘D -ôRQJ$KKKìóžpÚp¹\‘HdjjФ28|ÊÊÊîß¿¿}ûv>Ÿ¿oß>€Ô Óéµµµñññç΋‰‰©¬¬ÌÌÌüñÇÏœ9#bbbT*Õ† ~øá‡[·n8p ¢¢2t>±—>tqqÇ¥¦¦R©Ô-[¶tèÐáôéÓ'N´´´Œß²eˉ'***† âêꆒÝ5døî4‚¼½wï^}}½««+Ìç4X ß:sæÌ¼yóþßâ£Ru:Ý‘#GæÏŸïéé#‹9™L–ËåéééK—.}ûöíèÑ£=<<ãââfϞݮ]»ü±k×®©©©˜4iÒáÇMMM‡ VSS³k×.¤KËÎÎå"†a……….\X¼xñðáçOŸ>räHOOÏÛ·o:tß¾}vvv={ö4554iHûØÿw~Ò›™R^^žžžÞ·o߆í üÝñï3ö0Œ£G8::Ž?~Ë–-oÞ¼ñööV*•\.wûöí§M›6§OŸ¾~ýº•••R©477 +,,,..®®®>zôhbbbdd$,ÖU«V >m%ŒêÆÖÖ688øÊ•+ âZ¿~ýœ9sš5kæçç¼oß¾-ZU;¾ÇÛ¹sçƒärynnî‚ üüüÊËË?wüÿÓ§O¥R)<¥kb2™=’J¥Ã† Ã0ÌÚÚúÂ… C‡¹wÍš5.ãâÅ‹û÷ï÷õõ …æææÁÁÁ€gªÓéÖ®];oÞ¼>}ú`vøðáŽ;nݺ±, p€ØX,–‰‰IÇŽÉdrLLŒ……ÅêÕ«cbbbbbt:ÝСCwïÞ=iÒ$bz¤F¿5Ç»víZçΕJeQQQçÎG…ý¦; ý7ªïI$ø–µµµ_ dà % ŸÏGhAÈäpüøq•Jµzõê={öH$’“'OmS(±X j0GGÇׯ_GEE­[·nðàÁñññ!!!>|`0ŽŽŽ*•J­VÀHRq¡Äãàu*++µZíÎ;ÃÃÃÃÃÃKJJ ¥01â¥n^A5kÖlÀ€ÖÖÖ†-]º©ÊáYè/"`‰´oß¾˜˜&“‰,C°S9rD¥R­Y³fõêÕjµúðáÃØ§´Ÿ]­V»»»óùü+W®lÚ´ÉÅÅ¥ÿþÞÞÞZ­¶¦¦Æ××W­V«Õjggg@ÛFúBSMÔö‰D"ôW(&''·hÑ¢eË–çÏŸ·µµEy§‘–‘˜®«T*›DEE®Y³$m” =Ô@Àß4uAîùÏeN¦Ñh†™˜˜×.ƒÁxþüy~~¾··÷‹/^½zqêÔ)ìS6&###&“I¡Pª««­¬¬Þ¿?tèЂ‚‚S§Nݾ}{ذa®®®2™¬¾¾žN§Óh´’’”#– <è­0$Úñù|µZ½zõê—/_>zôèÝ»wñññ‡ÔE`òü×°¡€šG¥REEE <øÈ‘#fÕªU`0ƒ|øpĈDÿ ¹víZDDDffffffpppjjjqq1‡ÃÑét|>ÄÎòòrHØíááñòåËÛ·o³X¬ÈÈHÆf³KKKAÊ­««S*•P ñÀ ™“H$8Ћł½µOŸ>¯_¿~ôèQnnî7PKìSj. …‚fd•Jåìì|ø‡ÜÝÝoܸakkëããS__aØÈ‘#.\˜““SQQ1~üø6mÚ°Ùl±X 3àé陑‘ñòåËwïÞíÛ·¦6”œœ¥RùÃ?ìܹ399™B¡üòË/›7o¦ÓéHˆ8pà¾}ûÅbñÍ›780tèPøîë«R©Ö¯_ýúõ[·na™^¿~–––žž^TTô7xÑ~UfC½Ñ:¸DFFž?ps1‚#,…«W¯šššº¸¸9ètº\.ûöíÏ?ÿ p¶†q8œaÆ%&&Ž=:44477722R$íÛ·ÏÔÔô‡~xóæMll,N·°°Ø·oŸZ­>vìØÈ‘#£¢¢´Zí Aƒ ƒ‹‹‹@ Àq|Ö¬Y/_¾lÙ²¥]³fÍpïСƒ‡‡GÛ¶mïÝ»·cÇŽÑ£G·k׎N§;;;O™2˜a¾Ü±cÇ´iÓzôèA£Ñ Æ… BBBp÷òò²²²=ÓСC8pôèÑ &øúúnذð5Íüùó ,åÖ­[üñGìÿƒã8ž””àR©DÖÉ“'Ÿ?^*•FEE±Ù옘˜ŠŠŠ3f€àº~ýú &0 …ròäI­V;kÖ¬ÊÊʸ¸8 …âîî¾oß>Ç-,,<==q‹‹ëß¿ll¬•••………¿¿? 8pĈûöí;vliiéÀ!]+dÆG¥R7N,?äU«V;Çq0YÉårŸqãÆíÙ³§}ûöAAAE#àæ Ê2jÌ}€ÔÖ ~„Þˆ|'uè‡1ëÁâ+àœDtu†ŸˆäÐ.†Þœ´8.Â8a< .Ò{âðà@. &Ð3˜èN2¤«ƒN´Z-¨ @g)q#†1ÃHôp›QH)öWæF2ð%`âNŒ} '›>¬âwmxoÃè=»E£!Az‹k 4í/zxh@3h¡7šSBïÕÝ€~sب 1»ÕnløS£¯ÖèxÐk6œÛ/tòå>¿0ç Çü…géíÚúÛµ #œ`¥â”ar ÅàÈñˆÄD#jãÌP åÏ7#}en$CÝP7Ô±o/7’…6CùžO`ìë’›ꆺ¡þ &73xbŠ¡|Ïš—ßDW1C1”oš…6”?±ü#A¡†ò¿KÀ†Ô*¼Ž"éPnq"œ•a® uì/J­b`¡ÿ”Sû„f*‘HÀç"ø !˜¡ü…Jô£48Hþ>§6ðUÎÈÈ(**Â0 ¢À FÓ¦Mõ ΪØ'hâW€h»†â_S×vÿ}É£‰£BƒÄ>¹ }QE¯=±Ï†žÒŸ{x¡þ¾1C¤Œð÷}S¬A~â{ù)âëèµÇþÞ߆øž½T*U$%&&š˜˜4mÚÔÄÄ<ãËËË333ù|~Û¶mQÀM£=@à! %‡¸ðþÿ‡6Äýê¥íFåë³@¤Zµ€´®ÑhP¤>ö @zÓk¯÷‚ Ò»ÿböûÀÜÑíðÅI$„. M b¤!ª5Cxî Û”Xßõ’Éd™LvõêÕ   öíÛ[ZZÂQ@§Ó]\\zöìI¡Pnݺõ9°oXR%%%€Ø çÄ ´Úçå½:;wî¬9™L>uêÔ•+W?¬ò¬¬¬ýû÷4 âÕáv⨠Åÿµ÷ÝqQëûgû²t”&EÀЛ b,¨ –M®š«I®íjÔ˜ÄÄ^"b#Q°àxE!Š €*½÷º°,˲íüþx¿Î=¿Eš2Ï|†³çÌ™™3ïÌ;ï¼ó¼ÞÞÞ÷î݃é…ÉdFDDlß¾ÉdΞ={ìØ±óæÍ ±··?vìpPùûû'&&Rå²jllœãÆ!à·`à»rÆ—-¨är¹¾¾>“ÉlkkCæ*"##7nÜhmm}úôiD#®P(-Zäîîngg 'ηmÛæìììééùÁ& #""€Ö|óæÍ À@ÄgŸ}¶uëV&“Éd2ÿýïïܹóÂ… ;wî F_±b…»»»““ÓÖ­[U‚¿¨ð9Qø€DŽÃá,Y²DOO/;;û… $Û… €u•ªT“$yäÈ‘}ûö)•JÎ9M§§§ƒƒÃ­[·`Z[½zµ«««««ë§Ÿ~ Êm]]]pp°““ÓþýûmÖ¥ADDD?~*¾pá“'O°•””À«ÿÆý|œðw¡«« /¼"ø A]]] M¿§¼¼üÁƒ±±±\.÷øñã_|ñlG ##£Ë—/ÇÇLJ‡‡?þñãÇ7nÌÉÉáóù£FÚ¸qcTTÔ‡~XUUuíÚµæææÀÀ@>Ÿ¿råJ¤go¬´´”F£-_¾üéÓ§?þøã¡C‡LLLV¯^}ûöíää䦦&???77·€€€îîn¤`¿b`9>>›6m:p൓AÐ Hs¹\&“©¥¥eaaÁb±¥RéñãÇçÌ™ÓÜÜÌb±Nž>>ööö+V¬8zô¨’Oj ‚8vìXPP(ÿÔí£G†‡‡s8œU«VeggWUU¡ÑpåÊ•666;wî$I2==]GGG*•æä䘙™ÕÔÔDDDäåå=~üø§Ÿ~²´´ Zºté?ü@}µºº:²Ó-Ä‚QSS:thmmmBBÂܹskjj ccc©¶†— ^<oýúõÞÞÞÆ Û³gϹsç´µµ3ø3žû®è¡¥¥ÕÚÚJ¼ÜOhŸ„B¡––u[Œ=.\ ÑhK–,a0mmmgΜqssƒ%¢@ €)ccã’’’ùóç_¸paÛ¶m6lpqq‰‰‰©ªªB\vAØÚÚBd-ê0òC6)¹\Å>wîÜÅ‹a:t(u'ø“a›Ö “b±8((hÑ¢E‰‰‰Ç_¼xqï`|°L …©©©—.]¢î”²ÙìÎÎΫW¯:tÉ’%A477_ºté³Ï>ƒŠG'“É” 6 ©„ìˆZYÂd2èØ°v€8L4M[[ÛÄÄD¥â°TF;O ωäÃ?œ:uêO?ýôàÁƒT/h"dNû+EÏÀo/À …ÂÒÒ²¾¾žJç¯2 ±X¬šš‹¥­­::l*Þ¿¿¶¶6$$DCCCSSsΜ9qqqÄs.mmmXúÖÔÔX[[?~üxøðá>ÌÊÊjmm]°`ÁСCÅbq}}=¬H ´•ØÅbk'ì-ƒyœÍf3™LÔ´eË–¬¬¬ÌÌÌììì7‚ÁY©TÂÒ®µµ•Á`hhh0Œææf°) GGG__ßmÛ¶©©©­Y³¡Úð@àãã㌌`¶Gú3ØíH’ PWW×ÕÕ>}ú‰'`C… T*•–––iii999éééiiik×®uuumjjêèèPWWg±XOŸ>…ðTÅ?¸øÀh¬‰ † 4H¡PüôÓO¨âÿøÇ? â$IjjjJ¥R°™«««Óh´––mmmmwww__ߨ¨¨ÊÊJ FZZZp?—Ëý‹ãRŒ·…D"rãääd’${zz$IOOl A`…Bqîܹšš¥R ?I¥R=iҤɓ'£¹66.]ºTPP@Ä'Ÿ|’››»nÝ:àm=räA7nÜ(..=zthh(I’sæÌ>|ø£G’’’ÔÔÔ8@’䨱cá×5kÖ 4(33óÊ•+\.wöìÙ$Iž>}‚ŒJ¥Ò•+W4(555''gÚ´iñññ$IvwwCñV¬X¡¯¯íÚµÜÜÜÕ«W«©©åçç“$9dÈ/¿ü&¨Ë—/QXX2´Ì(‡ &9r® S*•#FŒX¶lª8D®€Z±aÆÜÜÜ?üPOOO©T®]»VKKëÞ½{ùùùÆ [¹r%I’¾¾¾£G~òäIll,ƒÁ¸|ù2I’C‡]µjI’ááá@é~êÔ)‚ Ö®]K’ä÷߯¯¯ÿèÑ#¥R6lذ‡>xð 00ðÞ½{J¥R"‘À9s¦­­mrrrNNÎüùóõõõ›ššär¹ººztt4L³‘‘‘t:½­­íÙ³gA:t(111!!!!!¡¦¦F.—£oýgƒ±qãF<þž°™™ÙãÇ[[[---Q 0vww_¹rÅÊÊÊÎÎŽJO ìÇqqq_|ñÅ!C$‰T*…˜¶¶677·ªªªAƒíܹ³¨¨(&&føðá®®®\.w×®]çÏŸ·±±‰ŒŒd³ÙS¦L)**Ú·o_RRÒ_|ñù矓$YXXhnn>zôhWW×gÏžEEEUTT¸»»;::Ž9ÒÔÔ4//ï§Ÿ~š1cFhh¨@ سgÏåË—ííí?üðC˜= ^R©422òÂ… b±øçŸvrr"Ib 8;;K$GGÇ¢¢"±XìííýàÁƒñãÇ[[[CÐݬ¬¬ýû÷ôôôÕÕÕ_á«Â¥Nõ›Gg$P\6ŸÏ·µµíììÌÎÎ>|8t•X$l6»©©)...++KWWW__ŸÚ5a+**zøð¡­­-šÆ ÝqAAAff&üŠDT¥Ô X,kåÊ•­­­NNNð.:þôéÓÖÖV}}}xcmmm~~¾‰‰IMMMfffAAAQQ‘H$255yËËËkoo×ÓÓëcmxtuuåääSgà!>[[[ Tf8üpýúuƒ¡««‹ŒÊ ÔÓººº*§Dz×*›ŸŸ¿bÅŠ‰'ª««ÃD*‘H222tttmíÇ‹#333//¯°°°²²’Çãikk+•J±XüàÁ}}}8ÙGúÞÿdV†ñ¶BàË—/—––’$ ÄîÀ“ `x¸yófNNPv gá§ÿüç?úúú...^^^ZZZ111R©”J¥`‹ŒŒ9r$büC7>$yàÀøŸà¢B¡@…¡>Dvvv@R¨3&Mš O$IîÙ³gРA$InÙ²… SSÓ€€€ÖÖV’$G½`Á’$Åbqïf¼aÃsss¡PÈf³÷îÝûË/¿ttt”––zzzŽ5jäÈ‘ 88øâÅ‹ #//ÏÉÉiÒ¤IÁÁÁ~~~‘‘‘ câĉñññ cæÌ™3gΜ6mÚ¨Q£f̘ÑÕÕágÏž=bÄ Ù…yûeµS‘ P^àâ¼yóX,Vuu5‡ÃQ1naO¬wÝÝÝÀÕøj’ººzWW—ÊÅüü|kkkè4 =:88£]MMM[[[RRÒüù󫪪êêꂈ‹‹‹ŒŒ¼víZJJŠAnn.AB¡°¦¦,.>\¼xqff¦¯¯ïÚµkétúÏ?ÿÜÒÒ’ŸŸ_\\ ìYЧ_hïé†È]]]R©ôÑ£G±±±ÁÁÁ¿i7"âÇ âp8°‹Æd2»ººÚÛÛíííaåO’¤™™›Í.//JÍiÓ¦eddèéé•••‰Åb6þ|kkëÌÌÌ]»våååAü·êêjhÉ’’’ÖÖÖK—.¥¤¤\»víæÍ› cóæÍk×®ÍÉÉ9|øðgŸ}&‰@y}«¤X,‹ÅB¡pÓ¦Mjjj¶¶¶P˜¾iÁ"0/ôïÐÍüæ~#"…é½{LÊØl6Xz żyóœá ¯ÆÆÆ†……yxx±pá„„ °J$''§É“'üàÁ‚ >û쳈ˆˆ'NH$]]ÝúúúÞv‘—uewJJJ|||º»»+**V¯^½lÙ2‚B=ýB«xgggJJÊ¥K—T¶¦ÀbWÀ ­Œó_|ñT“Åbñx<±XüìÙ³'Nhii999ùøø@ä‡o§ÑhŸ~ú)0³;::VTTñðáÃìììC‡ …B‡ÓÚÚúÂp6½U ¨¯††ÆÆ###ëëëÕÕÕÿóŸÿðx¼ÞdC}«b!ü=ÐÕÕmnn~µ„+ ¡P&M•gl·‚Mµ¡¡¯€… q²Ãý†††@PÓ‘ÊÒq‘ƒŒ ˆ»wïzyy%%%UTTÀºúe:$„ ¢†ýÂÂÂâòå˱±±žžž <°˜{; z†–ñññ TˆHgY,V{{»R©DUJ¥ƒ¤££ƒj‹îììd³Ù|>,Xˆ[‹Z_‘Hš Ï»dÉ’E‹———¿,º2•³šgìêêúâ‹/._¾¼dÉ6› ÖA¨Ø¡¾}j6Æüös¯B¡°²²jjj‚žÚû»ÂÄ[^^Îãñ /¢(AL™2%//¯¸¸XMM æœäää)S¦À¼ ;нà~KKËœœ‹Åd2ÕÔÔ ÏÁ %à4clÚ´) àôéÓ[·nuvv†I œÆ¨å4hPII ”CÁ¤T*544,--]\\Ö¯_ÿÑG‚@’$Çc2™<Ëå¢íSxéÏ?ÿ}:(À===“&M‚5pCCƒŸŸŸ™™ÙÌ™3[[[cbb ÔÓÓcddXWWçççgnnÞØØèëëkffF4—½½ýÈ‘#/]º”––öÁ˜™™¹¸¸èêêvvvNž<¼¯`ž2e —Ë=}úô;w\\\~úé'…BÑÔÔäïïoff&“ÉÞ{ï½ÆÆFMMM{{ûêêêššš’’’òòrˆè=dÈ>"Àø0áÆ0™ååå&&&&&&{ºªªª½½ÝÇÇ:ÄË>6Õ¸…ȲÝ@’deeefffhh(AëÖ­»råJ^^Z¡õ~¶ŽUˆ]UîDïíí5 .„Äs¿Eآ栒-L\.\pqq±¶¶î½}Ù[`ÌB¾Š¹R©¼r劽½ýСC L• ,xa- (ÝU,UÔÌ_ØìÄsÏM•–A›Ã½v%u;à?à2ÑÙÙYTTÔÞÞ®P( ØüСC+ú+ôptª-ð¨ýàµËf³«««§OŸ ÝúúúØØX°ÍÂ:j ( Ð!G´…¥»Êaª•îDTé(Oê¿*ò vú—õï¾Å…B þÉû÷ïß±c‡µµuYYÙèÑ£AßvÉÞ‡+ÐR™êRòÂ-U¥Ù©gô.•êPøa~GžÉ½§»?ê8Œà(‰üüü455_=4ü]vÞ£Ã[×·®®îáÃ‡ÆÆÆÔ X€ÿ,1¦ÎKloû¿ãcÏ5jØŸ|·©Ü°„¥ p¿×Õ©Ž¡¾0ë¾ÛC` Œ |˜§qº?GfÀ30žq§qÏÀo4ã&ÀÀè¿xãßÄs×ÖßtQŸêahLF‹Ó8ýÇø~ãÓHðØkž¨B¤Ç}–ÐàMA=Þ¯wb©åͺ ÇLâE,<o»ýfþ*”#¯Sð*ë#¤ü/ß”Ø|ËÊÊ>|ÈãñT©Så\"‘Œ7NWWùR§bð€EHˆ—sS‡œß¼ÿeúÂod£Z¼‚4\Åû|*~Ï8ú‡Ô I§^wbä³õê|zÎ/{bS~•NOÄˈæ{·áËãíÚ¶wþ¯¨Ëoæ Ô?ˆøöÝ!v27CCC'''ĺ 2ñ²ÙìÛ·o777ëéé½°—0™LÄ—ýŠ)¹¿Â=âµI½áÙW{ð¼P›€õîX¨Øhlþjäðõ¢ö~¢sÄ5déey¢ûá Ä+ÜŒQ,+99yôèÑ@ÙÑ›¯øeDó( 7*ñ¨¨é7jÉWäîAG>^ÝΨ ©©©NNNšššhz¶‘PKéëëkkkè¿ÚÚÚ:::*O¡ÏL§Ó›šš.\¸@%[EJŠè‹Å¢Ñh»víjjj‚xo‚êƒð—ÍfSC"Àa=âÿ@§ÓóóóOœ8qèСèèèÜÜ\肽‹ÇVæÍ›wôèQ8þ2õLEç¤ú?¢r¢·£zÁ9!ê ÔYò¡²·+À™3gîß¿] 17nÜHHH 6œè­¶¶¶úùùåçç£Î­N5“ÉܸqãÞ½{!ºŽÊŸ2..îÊ•+pb ²‚TvþüùÑÑÑPrø.pJ‘ÍfÃ=(ì,ÔF½ËßT%(!*üT__ïëë[^^ŽBÆônô:8–ôàÁƒÐÐPÄ/ß7·‘Þr\AÑ÷€ß¨7¨ *2 _úøñãaaaééé(|QÄQ ŸsÕªU‰‰‰ £££#..N Àqùÿ#Å¥ÓA¼y¤‹’$¹`Á‚ªª*˜çQ瀞JàØØØ?ü0)))666 `Ù²eÔcnðŠ!ðèÑ£ÊÊJ:®¦¦†Î¯±X,4i 4z#ó9  bŒH$Š‹‹kooò:`{¥bðT†$`‘H Z 1AAAÀ>G<çd†–AŒŒ fiii"‘qÇ ; J4#‹u÷îÝcÇŽgnn^WW÷Ë/¿0 8²sîÜ9‚ LMMÑÁÚòòòäääúúz˜ÜPÌ‘´´4™L¼ç$Iª©©µµµ%''WTT@!å…F£}õÕWË—/×ÖÖ®¨¨hmm…õõõ¨Ÿÿr¹ÜÖÖÖäääÂÂB¤p©|¯––’$¿û¨(¡PˆúL_#v'` EÑŒú²4(?÷î݃p!2Cåˆyñßÿþ·  @åøé—_~±²²ÊÊÊÒ×ׯ««^•¦¦&oooGGÇ#FŒ5 ίkhh 2dûöí<¯±±qݺu0›mÙ²ÅÛÛ›$É 6=ZOOïèÑ£nnnêêêööö.\Ú'333''' ‹'Ož@,ˆ¬ñÕW_1B.—ÒŒ¡÷/_¾=•››K’¤¿¿¿ŸŸßСC‡ VQQ¡T*­¬¬Îž= MìèèxðàA’$cccuttœœœüýýÍÍÍ£¢¢ N ŸÏwvvö÷÷711¹qãFkk+ŸÏ/))ihh0667nœ»»»ŽŽÎ¼yó  ›6mâóù...~~~FFFÈJ^[[kgg7a„ÀÀ@øÃÕÕ5((ÈÕÕšzóæÍFFFÞÞÞƒ>räróæÍ|>ßÕÕÕÃÃÇãedd$™`hhèææ¦¯¯I àRWW§¯¯ÿäÉ¥R¹råÊI“&Ág577ß±c‡R©|üø±H$ ‡¨+óçÏ1bĸqãŒ=zD’䨱cíííÇŽkkkkccÓÐаmÛ6MMÍÙ³g¯[·nÈ!šššS§Níììôññ±³³300ˆ‹‹KLL>žN§C°2>ŸåÊ’$ïß¿¯­­ÝÐБH’LJJ244×ääd}}}…BQ YöîÝëää„o$I†††ÚÚÚ655\-Z´ˆ$IŸQ£F‰D"¹\njjúí·ßÂàëááFwwwH[ZZ†††¶µµI¥Òhᆆ‚ òóóKKK ‚øõ×_I’}º­­íÍ›7¡H&L b̘1jjjl6;##£§§§°°ðÉ“' £½½ýÁƒÁÁÁ°Dlhhàr¹°kèããZý•+WæÏŸ_PPÐÚÚšžž¥‚–—H$'NškWWׯÆF¸8{ölG„££#"šÂÃÃutt¤Ri\\Ü/¿ü²nÝ:’$ÕÕÕ{zznݺåèè8zôh™LnhhH§ÓµµµüñǧOŸfff:´§§q\ÚYCCãÎ;ÚÚÚŸ|ò‰T*µ¶¶ž3gN||¼‡‡õ{YZZ¢¾¡£££†Š)«¯l#©X¡{Kñ""ÿÞ«ÜWß *L&óêÕ«---+V¬€tOžŸßÓÓóÕW_…‡‡Óh4ccc¡Pˆž.eÖÙÙ ÝëáǰË-“ɨ[Ä …ÂÚÚZ ”””¸¸¸Ë'GGǪª*Ð{‰ç41…!* V4ggç7‚ B © Žl6[(Ž7ÎÀÀ <<|äÈ‘&&&¹ OOÏ;v€ÄJ¥R/(—ËŸ>}Šò„©iذa]]]ÑÑÑ?ð¹¡t‰D"‹!Ûððð+VØÙÙ9::N:uõêÕ–––žžžT#<˜!Q_xQjr8´ŽÒˆºÈeŸ>}jooOÄ×_­P(ÜÜܶoßN§ÓÕÕÕÅbñÒ¥K÷îÝ+•JW¯^=oÞ<33³Q£FM:•Ú¼,«§§ÇÝݽ´´´±±ÈÜLßÖÖ–ú½$ jç¶¶6gC¼FHš¿Áë­eì…±íT|b g³Ùìôôôû÷ïŸ={ÖÜÜ~íèè˜5kÖöíÛ·nÝÂçó ÆÆš9sæ•+W:::jjj&OžljjvìØ1¹\®®®ÞÜÜ,† rðàÁààಲ²ÜÜܨ¨¨¤¤$¥R) ÛÛÛœœf̘1f̘•+WÞ¹s§±±qÙ²e<oΜ9è{UTT@Ð…BQ^^þÙgŸõMé%Þ‚ØœT*++¹\îàÁƒQì*`%YVVÆçó ¨s]iiéˆ#‚‚‚@[“É´±±ñòòruuMLL¬©©Ù³gOHHˆR©9rdnn.‡Ãñõõe±Xþþþ<$Iè‚2™LWWwܸqwïÞmiiY¿~½ƒƒƒƒƒƒžžž³³óýû÷mll<==gÍš•——÷ðáCŸ¯¾ú v¡œÇÀÀ ³³“Åb-\¸pûöí°ï§§§–›››™™éãã³yófØ;ˆˆ())ÉÍÍýúë¯çÌ™#—Ë:;;ÓÒÒF5iÒ$wwwccã°°0–œœPTTôÞ{ïy{{ôÑGééé3fÌÈÈȰ³³c0þþþ\.—ËåŽ3ºŽººúèÑ£utt>þøãgÏžååå…„„üúë¯sæÌ111As#—Ë;v¬–––•••¾¾þœ9s`ÇØÜÜÜÇLJËåΞ=;??ÿÞ½{¾¾¾‡†½ÙüüüÜÜܹsçŽ5ÊÝÝ]SS r·nÝb0;wî´´´„·Èår>ŸŸ’’ÒÜÜ<~üxЉtttBCC x<ÞàÁƒ§M›aV™L¦‹‹Ëðáà †‹‹ pÓ3 Ø\`2™^^^p§‡‡‡½½½T*ÍËË 1bDOOO^^Þ´iÓx<ž‘‘NŸ:ujqqñ³gÏ>ùä+++ssóY³fÝ»wo̘11110½{yy™››{zzòx<:®¯¯ßÔÔësÍ"•J“’’ Àà'—ËgÍšEý^ŽŽŽ>>>@C¿{÷nQ­¯ 0íM)ªa¿ûñãÇ<  go!ohh˜:uª©©)Õ±‚zÙTˆ¹u‘JJ ·!o[ª aoâ_*wo.rê¾¼ŠãòîDTæ/ÌåLeE¦¶À?ü0f̈s›žžîááñý÷ßÏ™3ÇÊÊ*))iòäÉÅÅÅ–––HgADm"‹÷ìÙ³téR==½cÇŽýë_ÿªªªâóù°~F·¡‚Q™œ©Ñ*ÎL/l.î8ô@ÙÎÉÉ™4iRvv¶‘‘8`¨¼‚ú]Py^ç"r\Ñ5÷þÜ*-ß»j/«ø I¤©Î³,kß¾}þþþè{¥¥¥y{{{zzÎ;wÅŠ*ºO?V¡ÁãÏÑÑÑÆÆæe'Њ‚#S%\&“A‡ Ž2™ ¦qª"| X^B‹C´È ®£q²¥:#oGxn þªR$ªÇ,Z±÷~ŠZBê8‚ª‰¼8 ‚ ÑÐÐhnnÞºu«§§§R©‹Å&Làñx­­­ÑÑÑ–––ð ÈU6-`¶¬®®öòòâr¹§OŸÖÒÒB„²°†ÈÇÑ¡ÔÈè:µ Ô‹h´… ÖØÔ8 Ðr¹ÜÅÅåßÿþ÷'Ÿ|råÊ(*Ò¶P„š%T."áAij”@Øz…45[•ÃõÞUCy¢RE lш¨]¥¦H=Dß ü ¶lÙbaa±bÅ ˆÚ7=±ho$âuÎ ¼ZÂßm0 ‘HTTT4dÈ4W·µµUTTX[[kiiõ˜ôÂm­†††ºººáǃ•þoQä`NËÉɱ··YÐÝwé{)Š'OžØÙÙQ]Pß)Æx5Àh‡”4¤Ýõ¾øšùÀìô¦'uþ@Àš¢Ïzÿáßë7Ïia~Ç܉{Ÿž{#fö·xäÏ“áw˜c]¥‘¡¡/— 0F?&µÃÀÀŒ 0Æ€`Z§qºß¥ÿ÷[¡10° UhœÆiœþ he100° ñ»€Xý|Va´Ã+ œÆé>žþŸÑê]=†×À}[€ß46Nã4NÿíiôÏÀýx Œ×Àx ŒÓ8Óo´Æ*4V¡100°c```ÆÀÀŒ 0` ,ÀX€100°c``ÆÀÀÀŒñ× 0&vÇiœîwéÿýŧ‘00° UhœÆiœÆ±‘00ð¯100þ.Ʊ‘p§ûkl$¥R‰‡1 Œþ:cZYœÆé~—&ph ŒwX…ÆÀèçF, ,À¹c#Nãt¿K£¿x ŒUh ,ÀX€10°c```ÆÀÀÀŒ 0` ,ÀX€100°c```ÆÀÀxMÆ‘p§û]úñqB ¬Bc```§q§± Uh Œ¾bÊÂÀÀè—30•äŽÀÜ8Ó}>þ2I’¤Ñhè/Zã4NãtŸM#™Åk` ¼ÆÀÀø»ÖÀýU€qhœÆé~—þߪ«ÐxÆiœÆi<c```#` ,ÀX€100°c``ÆÀÀÀŒ 0` ,ÀX€10°c```ÆÀÀÀŒãÝS.—ãVÀÀè§ÀŒýyŽÇ­€ñ—«Ð ·FF£Ñh¸ÞåOü×Á`€§·R©hrË`0Ð1øW¡P 4¿w¨ø+nP*•­oôÐét:>`ëŽÒZZZ|>ŸÚ¡qßÀ3p_tétºB¡ bÚ´i‹/ÞµkWjj*Nc-TSOOoéÒ¥ÁÁÁfff …¢¨¨èüùóÇŽ“Ëå4Ú€8Õ444 xá$L’$NðàÁ“'OH›ôÇ¿pá5ŒŒ$‚Éd¹×ÛÛ»¬¬Œì…_ýÕÄÄDeŠ~·{ÂÙ³gÉW¢´´”Ãá`KAÒ™544¾ùæ›ÎÎN’${zzärùîÝ»‚ÓétfiiÙÒÒB’¤T*U(°Æ“ËåR©”$ɇª©©Áa,»qã†\.—H$²— ¡¡–X€ûÄÄ^PPƒ«\.—Éd$IîÙ³g€0Aqqq ½½g›žž’$×®]Km±w»5¡'ôn ¥RI’dmm­††à¿NNN×®]ƒo#“Éàó †þjaa!‘H`ÖíÝe …B¡ÈÏÏg±Xï|—…¹~ýú«¸®®®¿ pÿ^Ñh4uuõï¾û.##cÊ”)Ðw™Læ@P¡¾ööö‡$ÉVÌ{æææ°Æsλ~0ñ|s(**Šº‘&“É@%!IréÒ¥ÄÀpä€:&%%ÉårpPL&“Ëåx¸Ïõ`‚ ¬­­cbb ãþðÃD€ÑxùòåÕÕÕÔ]“¼¼¼éÓ§`˜Úbbb^í‰õäÉ6›Ý¯=±ÞA_htÇÏÏoÁ‚‡ÊÌÌ ¾ÐÄs7`mmm___kkk™L–ŸŸÿ믿Êd²Ø£FB‡ÒzÏÒ999•••غ/jPö4Ò˦YLþnUï|?~™Uv ¨Ó "Ç£Ù¯¸a`ö Œÿÿ‘¤Yˆ5¥ËIEND®B`‚httrack-3.49.14/html/img/addurl5.gif0000644000175000017500000002267315230602340012571 GIF87a^PªÿÿÿÿÞÖÆÖε½­µRRÿ)!!ssk,^P@ÿ(±Üþ0ÊI«½8ëÍ»ÿ`(‚Æ"„A‚1F[ (0ÐxŽ·îÿ@œ Ô‚;€ñøSâz¨t@¥Q¯V©uKèi»]­ ®š±béÕÌ ¯ßTÞ[Ϋêøûý£,ú€Jƒ„‚…&‰Š  ‹/} ™‘Ž (34*4¦H«¬«TK­±²³]°>S?¸c»dgnekÀnÁpÅkvzzvxË€ 6‚ÒƒÓ}…ØÙÚÛÜÚ¡Ž‰áá˜0š“%싊äáæî10%ä þý¡,ÝScÝ‚M4︉®´PdÏ!À{Ä­ÃÄ®ÿ;±ðx»ùJ¸H×ɤuMr @Ò!¼H4Í‹¹@e$’“.ú³I´¨E£‹â÷¯)Ó§N£Ben\HµÊõêU¬À‚ ›µÂ¿®h½ŽåºV«Õ¶bÓÊUK®WnñÞ}÷ôÁY¶dõ7ïà·„GdÀ*ª' 1bw’2›(ñ L)ç8X×I¦™AeÍ ÙäÇÀŸ̔=w6ÍzhÒ†ârUZT(nÛ»u~ôwðã¼yë>¾ÜvrâÈ¡?N}ºuéØó`²›÷ïàËO¾¼ùóèÓ«_Ͼ½xA·»ŸO¿¾ýûøóëß>wKÿÚdâ74•2È9¥ÑHPÊ'J4˜M& x@>¥ `C)> ‚nÈ ! p`†Jè‘€îÔÇ€"ž˜à6 6èaŠ¥„X ‰ÕÌ!ŒÚ<‡2È¡wJ8H‰ä˜¤BâXaŽ€‰Í›vªè‡Jâç™?Ž˜'›h¾  %vr‡wô)œWZš$Ú<ò%šƒ¨˜éu28¥‡!–ˆæ›Ž˜å–«e)무Öjë­¸Â*®¼öê^&¾+,yºv·æŠ "j‘ÿúÈ,6ÏBáejîx%™Ú([¦›(&"µ ¾¢ì·ÙhKˆ•Ù¾©ãƒçú˜¦†;Jz$xg6Xc®2¯·ß™ nˆì’ðœ&Ê£¡NŽÚßj\b¡ÃF,ñ~5ŠÖ«¿û) ñ{ Ç:ñÇ ‡,²ÄÅnÌ$ÁWª¸ Šj6’¬šÔÚ`œZ2-”6Î‹í‚ ê £HUâIí¹äŽlôÑ핬 “¬‡Œ½öà¯m󅓸±á§¯þ~߯ïþûhŸ_>üô×ÿ]ûöç¯ÿôñ¡¿ÿÿĨ>ð€Ù3 ø82ð†s 'è7 Rð‚w+–M`R‰=dÄ!¡QLðA¤˜ð„(L¡Ex Âº/X … #š¾ˆ/RÉ!]tÈC¨ ¥‡N‰}ø—Nf8#Ü|n°zp¯, Ê&V·DÜP!¹!¢ÿ‡ÈÅ-zñ/,È$V† Q$+{>Ä ‘ä$%TQ& GwdŒc¡C.DÌè p pȬàæÈâPn H,!6¤;†{è!8Ô¢LÎÑ …€£)‰¢M™ˆ°†Å+^&RéZ¸ò•°Œ%-¼(äb ¼ø‚¢Ë2„aÆæä0¤!-c˜ÊP†¨ñfêÍ;Ý;„¾1Š@!*Є>Pº,á›;`‚(׃!hˆ ¿«Á `¹È¬shR§7myÎsn®ví,B;}IK~öŸºä¥Þ 3s Éf2ˆ™‡cFRCU¬@4 AÿÑ?BaѼD©2Ä~裛°ÙÌèXÆp|‚šV”H%RB‚T”ŠHÆ òf‰_Ž<ôˆBœn¢¥ÅyaLZ¦à‰¶¹©û²TçÜ©Fj ¡ZÔAæ´‹ClÌTfŸ”㉣ÔN¸§ÆI’!Šì‡iªxVsÈãÓáËv`™Ðu„Ié BÓ¦DÀµ3“hAOáKØ~½k%è“ÅF±F‰‡@î8W׌q›µ¡©P‘BUÎôª "UZÃ+ÿ•§$ê1ˆQ7ËÚÖºöµ°­lgY­Îc¬¸Í­nwËÛÞúö·À ®p‡KÜâ÷¸ÈM®r—«\ÿ€¢óàtù†½heCâAW°Îa+í(ºkRwC5¯{ LQ)ºƒ„ü”ÞûŒ—WÕ…‰.´/²‰(g{’š¼Ð»ßû¶«`Ú*‘ÀÐk.ön Ä{Œß”Uk`Ͱ~ÿ :ë’—¿FÂð¢4\ ò¡¨¾…ðÐÕneÁ³-xºw³Ø«ä‡âÎyÎٲЫ] Ÿˆ[Ÿ˜¾n4µm èT2>~Ѥ2¬BPÐ\„›9h]®z‘„¡.*9YÃ2ú–#c†/"?8Êo*U÷ÞT&ü–àH j׌´ |,€S¢Ç||ä:ÝÁÉ€x“ž¹(}ä™O5*ªøÕ%l±×ÿÎ‚ØØ†F ®-‰M£€¤§FãΔ^pÕ¾,ha*\ç5ÕÕícaZkB3Hr¢å©+ÄG^˜œçâZgų"]·7a[ÛMr÷’2¬Kê,ob öo6´‹-_8Ö—Ñ|]A\#x^ÔÎ6ÈJ¬ín÷ŠÛÞw­À-îró‡ÜæN÷}Эîv»‡ÝîŽwzà-ïzǺÙXÞuÅy¥pÖ®u;^<ý=p2ä.x  žî>7»Ý‘aáþÖÃÝé;áý›—Ý2joYã»Ö˜Þ3MˆüpÀëÇ òmü`T+·ðZ^ ˜CC柷µsÎsûлçÿ“xƒõs 3ϼ%YÑnô¥3½çNzΣ.u{S½êò¾:ÖÝ­õ­«»ë^77ØÃ.ÝÛºòõÖÎö¶»ýíp»ÜÓ¿>rp‚6 #Z¹zòS27Åjh/ø³xÆ#)@bwâ)NZC—òH"›ƒG©ˆr@ 1ÕD€â%cNix™¥ªæ÷!AUsç‘§à[QME-¦Z¾bz‰ Ð@Êæ,%(my†_DpùÿøË Ez…—üÔùÏg¾ó§}ê[¿úØ¿¾ö³_ýí{ûÒ)÷ǘB9žðè?¿úÓÏþõ»?ý´¿üçß ôÀ°xÊýÿ:T!Ëþûÿ ”óHÐO\€§<½ä »dP X ¥PÈ´PÉÔPÊ$=jG x è E•ðú@rE$˜t(Õ,@J¹×û'N Gqß>` êdOìtâôM7`Nà€¶4@˜ƒ;X9Ç#NR`ñ¤O«Óƒ‘QÊóOPØ€¿´€ ø Çð€8ÅDh6À  …1w8a={E #8,B&Ø÷‡M˜W 2 €h€@p„®0KY@OYðNˆqGˆÈº€€% ^ € H LXh \hLÉÔ…µL&§våL™r%ÇSq–ÿ UØ”'‡ŸD¬H †Ñš'|ÈW‹PEøP`Ø…ðI ÕÄ ¹¨­XÑù*Vš·¼uEüàWˆ°U&A?%ˆñ¾GHôujáYð`1àHŒaQ$ØÂABÀ˜Å)uþY3áª%HšE[%8õ~…‡R¼—ªaJùÀ†0¡†ühJj%X±I ¹ZâR‘Œ/pÑAô8Saé0iÎåþ¤Äö°åQ¤D'I†u¡ñ‘žÕ4ÁA‰†OûxTKáWS«hTÁAÝØ ÉAÿ)aµZ&á”î`:µ”S锉WãH•vdBý’`©‘dù“YÉA°7À7”úØSLI”\d”­Á\tY—È%j•g\xÉIæ`*y™[~É[9V{É—©\…I˜}i—ŒÙ˜Ä…R%ÑHwF¡ •—Ùf¢Ä†Ï*¥šYz¦/Ü“'Ñz˜!J•”Åøš°›²ÙŠñᘽ5˜†)\¸™›¾U ‹?„À9w ‹k‘œšGÃ9ÊYœÚœÐ)†ÏYÔ‰ÀgZg×Ï€†oåâYsàã9ž$4ܹ¦m2tV0¾âžø!*Z"_àÿAŸ ·NBd­âƞ៓‚,?†½¶öIto•žÛ`c¡y‚B’ÿešM„<Ђ’²Mì`($ÉA–#I‚}b¡÷ ¡Z *-a*g¢)"¡S9¢’‡º¼ËëÓ˾œ>ÀÌà3ÌÄœ@|̹œÌÊÌËÌÜÌ¿üÌÐ,ÌÒ<ÍÅŒ«ÌL;•…Æ0TÜüÍàÎHË'ÎæÌÍÄi‹ê¼Îòàš )Yt–m&CADh_IŒ[9›±e˜Ñ&‹ÅÏ¡!À©×{Hè8ÁC¹×»QëÔ  E Œ ‰ ¡I„Y€Z`±¬$9£èÎÓ !5Vo‘‚0E8 {8¤í÷Òpù4ô(!éœ@GnÄp2GmD$Á—*‹ÓCôÜÐ’°¯`ÐÿT•QSú·aÄ£;I¯z•“¥q+ C¢™Ô{z)hD2ñŠûçÂ7Hq@U*8½ÌéÏKù“ð°S0=×D¹Ö×P Øb81¤7tÖE@Ôy±Rk°ÝñQ»Ò6~?•V7t3 ÕÒÝh™Ù/– Ø0Á¡RšGFXç|Ú¨Úª½Ú¬½Ú˜)B,5C4$Û˜ùÚÁôÚµý͹MC¼ÝÛ¾ÝͳÍÛ¸ λ-ÛÅ`ÛßÌì¼ÜÌÝÜÎýÜÇwŒw<ÝÔ]ÝØO ¸ˆ¹D…ÕÚãl‰5ž8Þ1‰ðI§€ ‹…-hÝîýÞ¨´”ˆ ÿøKÚ͈VØÝÂTPèŒL\øß•‰½(QÕ‰c8 W¬ÁLCq84E çIãÔ k|Ç4XÎ;Z ì4ÇØíKÿdP÷­€S8‰h€Ä”…È á-àÞ#WàåLdrF€’#òá†Â†~EÐÀw q‡«D<ÞpNø:>P9ªÓw"Ìo—'1¸O@Àį#ÅSîGì=W;zÝOP%ž'ùME ÎÈàÍàÀè ~à6^ÞÙïì¹aÝ1ŽáB=äªdW‰ÕDh,:ètq¼ãMÁcN>Ã0ȇö˜3Æ27„5 „mœ›ÿîÆn<æˆX愨Ýõ]…jNPÁ„â¸…àŒ¾HÂ'†#wçw½ÞUØÅçþ0 ИxiäŸi©FbäWB€Ã=¸Å.Hq8ˆƒ™£N´„ËNÅ®p$|ƒY^ •2ÅúôåFæ2/…¤žÝU :N˜µâúýÝppL¼à_†0Qˆç·Ns$gÛÄà°X˜ECm(DNì+°J+2Ùßïäðý—;{èƒ#>êÛ݈«Ãßüí€Å¤P->¼hï1Ñ/³^Þ¨µùÅI{Âò‹¹—1ƒ—~yR„ñ6ÇŠØ€…€Æð îžÚ?ïZX‰ÇðóqîPÊÿ”‰Ã¨‹0ò~ï@‹Qoàä]õTŸï#–ÍY²ÉFäŒe1|‚m|¹ëMÁˆ‰»8çNÿÃØÔð ›À—¸•¼îTΑm‰“áÒo=7ô”›u?BiTŒŸø[¤YèWW^T•[¥çC‘“×ÈyïTBA×ÉÐJ1÷tŸYY¤ôÜf–Õ&¡Ï% —¦Žò•£DøæiYæŒ×ÈŸï‘J¡æ Ѽ·ŒÀj•ÑÓů–w†åFuõûlr[ $­™t1Ð ~>y£ÛDô8÷ž‹ où³OåZJú÷zožVÄê€y–+ÿ‘‚蟣ÑZX¯¸úËHÜÌ̈*¼aFkáœP0˜ƒh-”ƒñaÖùQËaÀ¨!„%çäTƒb·ûX‚Óƒ19*sË&’ ] —“ªõŠÍf¥FiRñ²h¶ôilH6Ùpôüzcò¥¨9ñR/5-PpÐ"Asv´6`fÁ!ð±x7b8H10&‘ihTYsç„„£bzÑ(h‚ƒ(ëÔ';µóª•««Åge”ôàKÛ Äçã‡'—¼2\Ìì¼-M}¨M n=ÍlìUEMžÞçLJ‘=ÔmÎR¬s[;{vo›¿ÛïßËn ={ˆ¨L©&î?9ÿÍñÚá¯XךçðbƉ¸*>Áç'Þ¶‰jBv© Êcý¹ÌK-ÖØT3³fΙYnúÜ©sMOž?Š%èÑC‹*ý©”¨Qœ<™>]ª3WÔ P±z½ ö«Ø°dÇVí¡€ÚµlÛº} 7®Ü¹tëΰH“^MCòúí x¯`¿|Ö{øð߆÷öEÌ8qdƃ?ž¼8³d͘7{î š³èÃEF@P©1{Ühu¬BÓ•‚KóQm˵ g{Üçäµ/qX7.üòåÃI†Tü7óèÔ§[—޽z•>zÀ¸i€eâoß¡ü‚óä‹<ÿ²>†‹ôèM˜˜ÙŠËLÔg¿Þ ¾ôÜu¤ÐV vÜ´ÆÚuÑ%¨Ã+N˜… ZÈÜu ‚ z•$›R÷…h'5훇j¦"'zx‚yxŒ'[‰/ÊG¹Õ£Ý;FXœG´1ä…B×à.id“2iœ†>¼Ce•V^‰e–ZF#É–^~ f˜bŽIf™fžiåzÂ@›n¾ gœrÎIgvÞ‰gžzîÉgŸ~þ h ‚J¨žÎ °a(Êh£Ž> i¤’NJ餇®D¥šnÊi§ž~ ª > êL¦¡žŠjªª®Ê*—–ºh«²ÎJk­¶ò9*¦±ÞÊÿk¯¾þúé«ʹ_¸:ˆžˆKé²uú×iˆ Ñf±]Ò¨Œ±€µ©í´ÛFê,«¹ÂJçj%;gkí¹–x¬šêZЉh»â ¯ òÆi® mª‹n¿è’ €¿Õžë&¢îBºn«Â²9§Àî«ê"öƫּŒZ\À íò‹pµoJìæ {rÈÜ.쨺jÉ:î°«,g½·i€Z_ì&Åia0ó :Áš¼œðZ9¯•ìÑ:»kó¿§l¯Ëç<„½ ›Ë «Ö¢VŸ ô¿6k’pÎ|`mç×%Ó<2Ü` g½0}2kÀ2ר›lÃT}êæ‚Lÿ·œV»¹tÓa÷=òÝ,Nê"ÛøÒ÷&«¥…e¡2\ï|'§h®yù#ßü¸Ó¯ÆÉfñ›æšw¿¡…¯zÇ3ß½*˜@ϱŽÔXìTH¿Ðou1ä_©vCÖ¬{i ÜÐF'yeðyéÑU¹ä¶;©Q0déÿÛ—Ín˜AñœF|âYÚ¹Ó­ Q\TM'+Îkõ[”X>Ø…lq«áönWCJïN$«[÷\GµñåÑ]bÛW/±BI9X1‚î¾s,Òa<…ô@! ﲃ#[d%›–È b°ü²œò¨Œƒ€£l]HÇÀR<‘O0v­J&‘^Ddµj)Á’ኻ4¥%?‰<|ÒdÕe—‚à5JZªˆäb–ŸÂçÌhJÓN‹–šš9Í<ý1›Üì¦È<½Ãysœä,'ªiÎtªs‚d¦ÌØ ÏxÊsO蜧=ï‰Ïp>ŸêÌ?ÙYϪ“c¨ÿ;£ç&«éQ]bS[ʇEªí3tp"ßøà7óqÇŠ9›wµ@Eõqj4× Û•Á1æì¡±ZéCa‚vÁÒ¡oä ïn)4(âí`Á¤„%ªQ5.¥ŠS[beSÐq­ ÃCùÀU“ž×|'œJèJó5•vT,cº(§¼Ô! Ùk^ƒ9²Ökk¶³¢ ˜Ã›V€•1ô›ëæU%j°_ñ£^ñFÆ´Ì/•õ;1ÁšE¯–•«w=aeè.— °Æ{ŸÊþˆ²´è‘Œ¸:¨8…篖^tS#+â&*Ófî¬p*-è°ŠCß A¨…íbÙ÷8Í‚N“4äªõ`ÿÚ=›áö§h½X"Ø0ÕÖõÅ]Xþ"ªÑÞÆºõ í3«ŠP;âo´bÈÊüÕ!¯Z!è(S¯ÍLnò0ÝÀ6'ÕvŽ–UùKÿØùwÖ^úºy]s•›}í¤&ö|Ù÷¶£=îtg:v?[÷¼|îzï;¦‰í÷Àß“æ‚/|>ïncÃ+¾œ„_¼ãÕ øÇK>›Ÿ¼å)øËkž›•ß¼ç{ùÏ‹Þa|½éa–ùÓ«õ¬Îîê_ßÀÔÃ~ö´.=íoO©Ðã~÷…ê<ïß{ÙøÁo=Þ‰ü>é>ùÌw•í›ýg ?úÔw¾ñ_ýè/?ûÍ÷=÷«¿ýï#ßûâ‡>à €~¼¢Ÿ?ÿXûÓ¯'÷oŠýüeú—?]¶Ï¿2Ù¿~ùGo²~('ˆ~ ´~ƒ€è—Pò'ø€H' h€m”€ø~H€8 ‚¸D3}H‚è€ù‡‚c”‚(8€ ‚ï7/ògƒDCˆƒúç3øè-ˆ‚©”îâ~6˜ƒ(ƒ@(‚2øeâ×y X+H…8…R$‚¸0øƒ{¡LKh„=˜‚`8‚5(†VÈ-÷¨„ȆúW‚ÿr‚\X7\è~˜0؆쇇ÜB‡i¨©D†#è&>øƒVÈ‚C¨À€x‡Hxå‘€Kˆ†ûç}&ÿ€€‘e1Ȇ©T€”‰ ØpŠU€ÿR€¸–@˜0¨Š ƧˆŠU5Š£X‰ß~µ‰qhj¥·‰Á(ŒÃHŒÅhŒÇ8Œ€ŒËÈŒ‡»è‹·G~Ñ|ÐH°7×hOØG+Ö¨éÔ5Oh+ÙøñÔRÌâåHN ÅDt}ê¨h»Bqí{²fhðˆO1°Àð+äˆéÔWŽzsøø¤fãø|‰©¯ç ùyé‘’÷©yi‘‹W‘9yÉ‘…·‘éx)’~’%ix$‰’yw’+x*é’q×’1©w0I“k7“7Iw6©“2—“=Év<ÿ ”êö“C¹tBi”ºV”IYpHÉ”v÷ŽO9’ )•5™UÉ’T‰•;y•[)“Zé•AÙ•a‰“`I–G9–gé“f©–M™–mI”l —¶”s™iNi—üT—y©hxÉ—ö´—ùO~)˜ñNýa‰©˜‹É˜é˜ ™‘)™“I™•i™—‰™™©™iJ°™Ÿ š¡)𣙥¹¦‰š§©š©ÉšM™/V\15R³i›³É—q›»É›½é›¿é"ÀIœÅé…"Q ˆ9šËÉœÍÉ(¡˜rö7Wp ƒÀfð *òß žáy*’ âiž³‘œ¸9×ÿY›2ÑÀ ¿žb0Áž©‘’ð /¸1kÙŸÖi±¨ ^†Ÿ\¢Œ8v¡ôç ¡Ú91>màöéÁaŸˆréñU œÜÙƒ§ƒ5ØaŒ( 8[[0[ö‘ðž‚UãT¡™ü!IÄ |A †4€ ˆHÊà¡ʤ:%²v?Cb)s4ƒ°' 4/5m–fÄãvQþÒ !B¦; Üb¥áŸç°¨AüHg1±˜:|0€×©'Š#f€$º§ûX®$iŠBq RòyIfp(ãÐ °;6ÐîÿѤ— žÊ¡ÝA|óPUÊI´R$¶©¬ iz!¥aj¥+úœ²‰ ’«@Ÿ= `xU’Ê7Óé!@4!¨ ’j«oÊ Qª]c: 6j1†Ð- Êzw¡Ð¨š«±ñ¨˜ê­ÿ­ qý! Xú¦ˆÔ ¶‘ `0©È 7æªÌ€&xÓY›ðj­Àˆ÷Jç°~üŠ~åêŸëYr«Æª¬I@Lçª º` ™2v¨ñ\A¹™Ñù¤rÚ øáµ0­ û‹$'k²)[²+KÝšÿìûi Õ€‰¯»"çš©óÁªVˆ žnxy‘£*˜8Ý @¤‡ª)7”ÌY«J¦P/`å¶,‡ª;GJDIÖÊCÍJp:5)O>ß`™k@ßJß (à@M™|øÔåS$ÏÆ ÐGØ/Ï¿‡³â½›·è¢›óŒ+·´éÓ¨S·¤;íÎׇ:Ü5[5†Ø³ç}¨}µmÞï|“Èí®ñˆé¸§*Ý(Ø‹âÔG:¹€ˆá…7Ÿ„{aX_€>g$iMhdWE@ aÖ§HèfáH7"…XgÚæçŸ€*è TG衈&ªè¢ŒFÕf£F*餔®öèâ`¸„Û;¯Áõ¨`.À’T ˜§¦¥øôb?f•¦š¦nRÙý8Û§¸ÄWO„;%Ù$w½5_„ãZ¬°ÿÁ’º,Jމȗ†%!\ôÔvH³çtw׋¡»H¸ÛÖn¸ãæF¤·fVê®N›Îu©[¾GÇ Z¦Xü9Pª½ÿ©R§ºQ½'¬ð ?4p¼…Îû¤¦è¡×œ`±© wìñÇ=\—`O|qÉ ˜ÁÈ ·ìòË7@pk(€)¡•Ρ¾Æë¨¤Š*_´>wòÿ¬ôÒ‹\pÍõpÇò ’áÊôÕXOê4Í(ÓëUª‘E‰ghzZmXÅ ‰}H‹qgU¾YÇ-wÇ[ËÛõÄ@í%šE•t6~s.øàTìXlÞm3áŒ7îx±(N¯ä‚ýøåÿ˜ >Ê]3Û=r¦¡|ÈšA¬”Nú馧ŽúꪷÎúë®Çûì²×Nûí¶çŽûîº÷Îûï¾üð« ‚-}WAùòÌ7O•òŸE騾@w5Ú¸Uo½qH›kWÚÕѾ«åö“ôl£á;ߨÁsí­aa«g&µ£™o±{èR`UÍOÊT±ß4kTÿËÏÙÄ?õ8ÆSß{âøG½ï}h4ñÉ è*æ©tÌ//)à ÞF?s9fX€ÙŸ¨Æ,¦„Çã ÷އÂÑc6hztÁÂÍ}ú‚‡HDæÁ¯ˆHL"推Ä&:qnL|¢§ø²(RñŠMô›¤ÿ¤ä9,z‘ŠëÃ@M²2ÃÁH0Š)#aJ‘7p1b”û¢ÆE½ñ`qœ£÷8(§ ã€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜\d.„ÁÉNzò“  eÈ`†d£¤CŒ¡ 3Ôaˆ,g9‡?B¸,¤;ÂÁË?vKøðå9±Žß„€¢PEP¢LÕ-ä™Ðl]bð$Dè5m`M"áf×t8“NQšó“Ĉ”5€á¥L%1ЀÊVÊ“–ø„Æú@‡[Rö´:j G ‘ØAQŽ8 ˜9<Áÿ€Mà# HSFŠÒ9Ót)ˆ,Í’î c|L©J唕ºô¥¶i)Ìö7óWzò SÁ©2“1‰Iò’ ðålô ]Q†ú“¢ <%áÅ2T/¥$HV7 V0d*¯´”.&ÂxŽº]l§_*’•„j.Á*jæùV¿|Z¶Í]U‹aÚ¡Qcå)ÐlfBÐ’L(2D û¼*«ÚÅ^7Ѹ±z#êV´³Àÿo²ÙÒck dU1U9«\sÓ—lyÆ©vê«jšF¥¤A{ˆLËb®R¤¶Qa Lw;©ÙJ€¦PÙjtSàNb¼M.¢|ÛšëÿXé³~땃jE¤ÌHP¦¨å›q˜’ v+bÝiÞ84ÑàkKLÝÌN–\üM¸htO°œÚÙ·€U‘-Š„BÂöæ`¬ÿõªSsÁ_ õ¯§ê×bÅê7¤¤ˆ?“E^bqÝçú-õB-§Î[ ›;Ý¥RmÓd•óË~#¾‰_)ë^ÄœâT)QR¯«öNh©5Õì„/ToiÆA¢kj³Ã–ï¼FÅ % ×”Ëä&O„¹ ê‘íšÉH†?'ô,..#ß´ÓÉ`&"”ÃLæ2;ŠM–3³š‘R³²lÌx³ß„C³ƒ¯¥¼’ `l¼0¥Å¼ ÜÌ(òªóåÿŒŸ‰n •\ÞìÖ¿›j=ëæzejÎâ1ÛÊŠg¯èù% Éð£E¥€/8åQ.J<Ø[ ØÕ‹)kEÖþ°*Þ ƒ\LÙ5·Òp|Ú×Ll*v.Ø4Ks±—=Äcãñiãâi» ­®I°õ¨˜TI´â´¦dËtM’ hf›Û4ÎÆJ'æ³O¹f=ív Ñ”ooù -1iŒqÏÍ{rÐ~ºÀ4À`¹&> Æw‡–?eO iýŽøDþý$4×?ÑwØ’Æ»0zà©XÿP]'ïÂGÎOùŸ(~ 4{`j*yÀX54ç¾Æðߦ+óž7íùÿX2͆íó¢¿L 4'´ “:ýéPºÔ§Nõª[ýêXϺַÎõ®{}h3Ÿf=‘Ó ·FOû»Òwvß|nÝj{áüܺ÷-µ†à„D2–¬âö#¸Æ {“$Ér§3nŸ= ”Á>v°—Qò—¿D¸3ÿùŽS>ô§8éSÿúX³>ö·¿¤TN#oàcE~3jàŽêæ¾úƒ‹r g[g?JøÃW,âÿvõÏ^¿ÿþÝÔîþûÿÿ€8€(tûw€Ud» JìótJòO«DOùtè 0È‚ 8‚€`K°•K*˜‚,¸‚Ú …ƒˆÐ ÝI„ôKÅÄ÷°ƒƒâ®3R!Uøƒ¶ ˆ( ÒØfTLj xؘðí”N¥(†®TfHJnP޲˜O´ÈO&ø†ÿ‡ð vXPÁHƒ@ÄÅhQyH ð@÷°þørAçŒÎhˆÒˆˆIU§}Øî‘‘‘Y‘ŠB‘™‘}ä|IÑñGfobEbúøX„&6|‡/ô‘ ò.™FÐbY¿Q²S÷Ö/¶(Ée¶B%7ò6Ûvdo±ôÀú'çSe,©o—ÿ'!¹e‹á’=)@c¥”¸2U–&±¦bÅ2–UVdS5ŸQe{ýã’p¡`iU!é©7e’E•§"2‘'8‰ $²)gG’¢6’-ée>%@|7mí±7à6•Q)=M‰–OÆ‘ò%3£±#bx–ŸQF7ô<åZÚ“÷ Ô/VZ†—¨Âw?™?…Óõw®¹e8vbšjÁ—ú†—þB@å{pBšCÅS¦!7¢˜WEXqœ³Ñ`“Ð6"r;9š ¹™R5'"Rò?Â9žuGQ2™º¹+/yœÁ‚œIÅ]9e!l„+Þy8¥!Ë©›¶ÿU~¡uwži’j!ÂwĉTwâp€‘qs) Ú8Öw> Ö,ed$—æ#üs!|yš„!—Õ#›Tr$‚¡o‰-\”q· M&}i´ajzVy"Íi¶Ò®g¾'kcy×%ƒT¥U«G$æåRážv¢jö ·¢2n¤k¦}¤Æ)Ëxh§(ÀéíWIVn°oagWS±XZÎÉ2È;)3_Z&Jr\ÌH¦B!¦ùgvÕž>³B(§aòŹcBª+asaRS›‡ó%yù‘†¥Gê 6f+™øå{6&¬_z£¤[²UŸÿzoº"V‰%5DÕks©7”¨’¶WY9¥åS†ºÞVSJ]<h”µ]š¨9¶Y]Ub­›¹)«¶z”ì‰eô——»JhŸr_ìõV©¢©ŽGŸÙ¦[‰›-¤>k“ fhüR| (x*—«g Tš¦ö‡ª".ZG§ëZ¯ãZ\⪕öó‘«*$‚zƒ[êj¯h¥™2¡ V¡•Lû°-±«:± Ò·6µ±Û±û± ²";²$[²&{²(›²*»²,Û².û²0³2;³4[²ôZsÐÖX}r³·Ñ±:›!ösj6µ]@ÙV”™6•×F<ÿ{Mû§&Qˤ¹Ù¦—l?£“·£ÛñYˆc<—{™Â-aYYÛka³C:Y£gåžå/rÖx“±Ö:™á‘$aºVÃÙe·'æe² ®ïeT¶'+m¹†»µ€‡ž#òx|Sœÿ%$1Yä…k²J6´‡<VV;˜—ŠGlþgµ—³Ê4¢¢—4öPo&<¨+Ùb@n¡Ç-Ó1¨Ü²ƒS‹oâLõ@¡=¤3Áû«ûºG»Yž›-Ç">xµa@sCÇr»•.Èk’Ü‚.U©ÀÂ9;GuƒlòÒ®[¾þBº;t滾b„¾8›lì¿ìã¾J¿òÿ{¿uG¿‘:¾m$n ¢S 2W¢·!Z%œƒ™r)p/Y´ì6ä‹¿|”tû1âj[¨r+íÕ­œÑTƒåW-6mÄ!e "¹Á`&Á˨èyÑÂ?!€(w*,™™r–×pÂiŠoò–"®Ĺ ¥@Ä3¬G5Œf0o—?ýÛr-2Ò3N|@lW|ÄÆ¦¿+X0üÅ`œÅ'ÆZüDI,lcn¿ZÆwÆC—)Û«ªðàž–?Gñ®¦–žíYÂnœrp<¾ ¯`\ úÇËÈcŸçñ"¢O‹È×§È&Sd—ûTkóWa+É×we€‹ÿÜ.Ý*æò½œÜs­ðÉ |0d|ÊúG:‰#l®L°¡¢ofñ5Ë)o¯ÁŸìyQc„C8ÌÂ\ÌDxÌÄŒÌÆœÌ̼ÌάÌÐÜÌÑüÌÒ\ÍÔ|ÍÓœÍÖ¬ÍØ¼ÍÞÜÍàÌÍâüÍã\ÌAg·ìr‡žLÎîÎï\ÎòÏô Ïö<Ï÷\Ïø¼ÏúÜÏùüÏü|ÌWû<º\Ð¥kÐ]±¿ ÙF2òÀq½Ãj?_6Ê‚TÈ{X2ÒT£ÒÅ[ѱ‘`¬Õ+ŸÁñº&i³kÑÁ L§ÉÒ0­Ñ°»Ò4 ÒÝ¿Ö{÷U }ÀiÊÇv'Â~ ¢ÿâ™X2­ïQ,¬YÏêÁLÕR&ÁW"šWÝ™}&_ %±£$R¨bëÔI•”5yš2Ú¸ÏI"<£¿'ÖÏ›bæ`!q8°Yœ3MÖþ: 0#5™2==™€Ö*L} ](%@m¼Ø‹r4çÕGœœØ m¾”]Ù{Ù˜=±š½ÙÛÙžM° Úõ:Ú¤M¥¦}Ú,šÚªÝ<•Q³°M²DÇÚ­9ÏÛ([¶Êµ½G„L\+©@_Ùö¦~©§Æé·Û*õ¦bá@Ȫ«‡0Åí¹m7Ê­R½MDí~È=Ð× ¾ÌÆâ=Þ`Œ~ÞýÝòKÛè}€ê½ÞúG_ßò=ß&ÿÅÏÝÏ“ßijßúÝßüýßþ]ˆéƒÞQÍtàÞLÖ¨ ÞàîIéä…÷T†¬hötŽžáϰŽ.Ø‚e|hH~»„1©¬ô½î……¦ ¢èìÔŠ£HŠ~ãcxJ]øeÐã上ãXqPO­8±¨á®‚ÔP‚LîOµÈäƒ ¥‚¹Øòx‡@ÍÀ¤ƒÕ;SÑg.Ì@§â'®ˆX×â˜Ø<F ã.—HNVØMVÀ8þ‰Þ˜ã:NŠ\ ç`èŠäGNᯈäIΆ×жx‹ÞOL>38åòHP…”0ŒxûHO„Aÿ8æŠ8æ]LjVçT(…’XM¨^NW…™xêœØêwÎàyÞã2þiŽaHªDnŽÀnèüäèN¾äk¸ä‰þäÔ0å¿(Uå™P‡“pPÅÁƒ™à.Ýå^nà©S [æíLR¢>ê›ë5ЈržêM‰A€…ì>±nq>ëÚØ€£ô…e€Þ¨¨ï‚ް4ä®OÓ€KŠ~‹ÓÀáéÈᾋ—®é– íðˆŒ`QP ɸ2¾ñ²ÐX fNuhÙPòcHØ…ÙpYp3û¨ ôŽç6¾ò}îã)oëüžë^á¾Þïåxä?ìmˆìÆ^ðšÿh K.íàð ÓñÓQ›@Q~ØCɘñ°>éQ‡(R(þu#?ófö·¾ò|®çaÀãüîòù®Šy‹A?ôΰèßèIŸìŒŽ‹N?œPÆ8ñ˜@  QZñA×ßR1¡îuí )&¾RÍs‡¬4—í6Ýú€H\æ ƒ[ÓœëÞé-Dªo¯•ßúØ÷ú°Ø¬?ûLjE¶_Ú’™Fæ,Úm¼zŒ²ÉÉQaü‘Ý[BÁ_0È/[šÑÿ[ºÝ*™õ{ctÔd5trCÀWrß!åpBõ#rÛ«)¼ñ}Ý/åAÃÿB“%”k@óc=*QÂC­*>ÂUÔ  dL¢#ÂÌÃ| ô‘@ÆlÐØvñd†ŽÌ‘QDæÛÛh-Ì'Ѓ!¨Uh. É`:`°!>ƹ5DÔ©:¿Óµ§‰| §bO¸©"ŒªvaÑVÕbxˆ˜¨xø€µ¸ÂÄt±&2¡×ñÒE2çööùÙÙ$ÚQ€TÁô:èõJõÙÂ*’ZÑUÕ¹âð¶$Ì€ë ò…Ôüubz,Úµ@:‹»â`j¹dR<³'a8º¼²”<êpÅbÚÜäë˜âWcìÖ^T)WŒU48 Sî›LÿgŠ0A€AT¯`ò×IS”³ZaûWèß™ÆÞ•€w"£$†:‚R)¦ÌŽbÞ3Tj…`ÃøL(æk( ~Êè&•½zɨ\‰€eVÒZ'+nèipXƒ„VPÂÊV¾WËÒY}ed˜ƒÄ͹Ë­QnH0 ]ϸ~NC÷£…¯‹¦ÄE\Ñq`R¨ÆnQ¤’b«áŸŒm +  CŠZUÄC"—é0Nµ8Ô›š\ÓNå ƒmÂ^ÏB5PhVa[&7öòŽÞ¹è‘L0gW”JfÈ¿DÄØÕüùrsÐCX‘®P‡_8;7ôËêóîÚqÖy¡Ýû!>ßÉ›ÿ»~åÜ‹6¾ÿzýxéõÓ‡Œ¾œeú1G#ó½‡^t¶—wài`" 1s6WÞ‚ïa¸‚3ÄÓƒíMÕ žmØ FÚ LjB#$ÉÅHc1)a#"Oä¨@&6âãŽ!æHd‘(Thd’J.£â1‰\q‹<‚#”VÎSÓ•ZnÉe—^~ f˜bŽIf™66òˆ™‚Å'"i÷æ!_ÅiÓ©‰gžzîÉgŸbÎIC\ÂÍ.SôW)4‚¡ÁhÒlgØ9Gì„!Âz´Óè$DêÄÂúÖy~žŠjªª®Š' ‹4DÕ?ísQD;´éš?–±dÿ‘°zцg?åÌGøØëiº Éj³Î> m´2š"Ó“päŒ$0e)x’€…éLÂk$›ªbA LK¬gÄòÄ'×ZtîHNÙ"m¾úî˯šhÖ‰$$FÐé¬6ÆMÓo /Ìð™BBpÃOLqÅéj"FD!›4šº¤Ç ¿%áÃAºbäH1æÈàÁCäŽ(Í„ð—°IÉlët‰ƒS‹˜´ž”aV©µ3Éìk.Z%Æ!,Ë->iËa‘1]ïaß–X[,Š^»–ÔQô ‹ÒÒër,`ÌqB¸!qžÚ'Aíµ–¹ímºÙ/ ……µÖ¶=·$¶”½ÿ<ó¬ëu¤&l”ÅÒêNv ÖJ$t¸m¶,ö…OÅøåPˆkÄâŠÓ‹Úد«®ê|Ýv e+– ʃáÑbûBñ‰§ˆ1P¸B”ÍÊ$–ñ¶`#©ÍNˆ?Ø? Vªˆ¦YHs€ô£‰éˆˆ}‘)f$¯‘LÌmð‚¯La瀹³b¦P±ƒýÅÃP„KÓ”^<êvÐxÄ[f†2iÈÑx,¤vCDl/ºÌ’/™ŒG¤)b‚é%Ná&]ަ ZC/唌, Ó˜ÑLÄ0mÍhóMÜ„Ó3»YÌgVs›5±M5Ù•Ìp*S ±É4­ÉÎx"SœÚ”É5ùK!µóœö”&?s<>Œ_»¸˜ÿAJжÊhm¨C Q‰ñ¡(¨ˆ8DïxÃ: ²hD? Ò:t¢º¼×0Ô¡¸£0ÅgŒ8» P¤4­©M÷Pvò¡"(OôС«SØ©½©QŠÔ>åT§~{3Ó·4DÄX š‚¡%u«\í*“H2­zu¬d-+ÏjiÖ´ªu­¬Z*[ß ×¸–É­r­«]ïª$°âu¯|ík"ôš èv°„-¬a‹ØÄ*v±Œm¬c ÙÈJv²”­¬e/‹ÙÌjv³-0!;Ίv´¤-­iO‹ÚÔªvµ¬-í¦õYD¤kŸZjç4‰YLpR›¸õ«oåÿ ¡×.°Kðä:ÐZ#çðßyU tƒìD=çIÔ &%Gƒak&á+RŠº¤2>qNLãý-™à–.UÞ¹çÈŠB>+DfcCð•”ꈾPèlîݬîØN{¡,!§È£`,_¡EÁšˆnU—³£¢ùõ€ȇ&{XŽNÒTdœ´† OØ‘I;BúÒ+èÁIÓ‚‚-Œ('­Ã,æ°}•Öax(Ô¼Fz“zaÛ[Ó&RÚú]4ô¶ðI.#?¨§™'Ç#ÉÑèç˜ì<¯ÑK êØ u¨¬ydëŒ/Ù†>"w* ˆ°C±oäñV( eîÆJ°g8ÿé­3@uÇ#¡²éÇ]Z‰¡{KW§YÑiñU}í»±¦ÖLVиq7N’±÷ 3‚vLp¾wëˆt?Ðp‡+x¦•ÖôŽotXÒ•ÄN©;gé0”˜?€I`m òccit©ƒGãø‚ø‹ÄÎ%¡Áôãá²7bõ+¬´c%9»áÚ³ÇmäLÛ’ßþ'D{[n®†û¯ ýY¶Ó ïxûÉÇÂwlönyë{ßçeW½ÙmœÕñ{àßÓºKðj|á çÒÁÑnE¯á¯ø’è舃Váï¸Ç§äïŒ'9È÷_Ïä¡«œ­÷VÀ‘±“#ÿ°Iç™éÊoNÖ–Ó$È—ØŽÊÇJ@°qYÂ2È¢õо܄¥DŒAM‰Òó¨S ãž rÒ>qD ·JFZèŒæ®Â6€†Þk¯œI}íý¢úz_®¢DŽ4hØôéžä¶k¸ÍN!ÔæÕ¸I³}ðüÒ9–f2qÙ‘ðŒ÷­áUqïö`ª”¯¼å/ùÌg~Iƒm¼çSåv ËuÄaÉßCùNõCv°•9R&íÝŸ¯}˜B/턃n÷—aå¡ ]Þ§~÷S….”Êkûä÷éñĽ0<Šïâÿ¾(Ia/GpTÞÛÚæ¸ò¿&æk\¶«‡ ØðÄé»~(ÿÚ/ ï±ïûã{üô—}È«>z@óüï¿ÿ·Ï$ÈWX[÷÷vˆ7ùÒB€ è%âw/F$.c&´ç€X$ÈsáJq:ø“ü$Ô$®÷zs s¨‚[‚{ö¶ùuöP–Pjï=· àÀá@ æ´‚?¨&-pˆ§IŒÖÁ q"€J:AªP‚„SX&H„DãLåw"Â.ã•F% ŸRTH†UøoÇs98öÔmeè†y"„h˜oH‡‡—p¦T5PTjW‡ˆ*$&Q rØ+¸ƒ-¿æÛˆÈ':‰Íôv<<Õó&ÿᇎ¨‰AZ!‰¢érc\(k›ˆŠzb[znÍ—€©‹óvKzy4A„±ˆ‹Ñ2‹È]ã‡o¹Œúò]  ŒÇ¸*V8z)ˆŒÍè%®£Œ¡øŠÎHÐv†xhu'WÛ¸%¡chH‡¡˜Òt<³èOçhŽé8N눎쨎íï(îHñXóhùˆûxý¨þÈÿ(Iiy‰í¸‹Äeo·è牼8‘´X‘I‘i‘‰‘é‘ ’)’9’!I’'i’)Y’+‰’,©’- “/)“.I“1Y“3i“9‰“yŽì7n¹‡€Xÿ0Žhb[©“7‰”G©”;™”L¹”M •O)•NI•QY•Si•Y“¬XMC‰\¸•hçaÌÓ‰y•g©•h‰•k©–m™–oÉ–pé–qI—s ‰5± f7ã‹ô‰‘ˆ—¹Šƒ)˜…I˜‡i˜‰‰˜‹©˜É˜é˜‘ ™“)™•I™—i™™‰™›©™É™Ÿé™¡Y”¬ø—¿D[°Å©91©š­ÙV}éš±ùšµ(›µy*¬i›¹é/ãöÎç1¯È€q&L¦@gŒˆN7ÎvDÓ!…HW"€qD”ç›±_#ÏI‡aÉɃ>IÁ áRñ! £4^š°bÍÿ†C‘ð áß‚cp.íÓ#j]+¦D 9ÁEŸË))@f¸æi¿6žŠÈÛå~nS=#6B+6bêiEZ—ó¢9Y€‚¢# žá›Š#pÑ( ö:QlŽè VU^AƒàxR`R©]ù°?RÃ6Z†& 6Jen6 ²Ð¢9Z5jÖ&PhRñã¢æ£FÔ“ ÛÅKÄâÄÀHd>æ#aÓ8í’.¯5T „:HAÓ&Ö¹høÀøƒ¬>jä«GgÜ’lBy&êH Ö)‡âD)’uÐ †;Ž„ØÉ7€ªtaŠŽT,µœG:v¨T,±§º#Ÿ°9„ÿ:8\á)S…Su Gðt–Ѝÿ5¢œJ©T¤m4¦œjtªj)Ó耸™Mn‚¦À4L·t0ò‰îdMµ«ðDO²g“«³ZOã—3‘«G«¹˜¢ºé¬fÒ¬Ï*­Có“Ój­gu­Ùº›´©­ÝúU°é­áš$°*®å PÕj®éJKܪ®í:‰î ¯É…®ñJ¯W¯÷Žøª¯Ø¸¯ýj‹þê¯ä °Þ­[®k°á*° «o\ð— ±+±K±»x@ɰ7׆ ãDïš±*7¯Î񱀿±Ç5òAsz€jf€Š}}W##‹±%Ûq'#&š•Çj5*“3‰ 7„4ëqÑ9z{Z1v”,;j1 ´r(´²ƒ–J_Ø6÷yÄZO˯Q[qS‹Mr’¬Òéµ.¶g³ #³™¶G´ûҶǵoû[áòy«·{Ë·}ë·{¶;g·+¶ƒëš k¸ª‰°‰›‹Ë¸­é¸›šÞ¸•k¹—‹¹™«¹›Ë¹ë¹Ÿ º¡+º£Kº¥kº§‹º ;httrack-3.49.14/html/img/addurl3.gif0000644000175000017500000002444115230602340012562 GIF87a®÷ªÿÖÆµÖεÿÿÿµ¥„99ÿÆÆÿJJB,®÷@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Žäg(a¬†0´BEZÔ„p§öÞû9]AÇË}‚cmXl:ŸÐ¨tJ­Ÿ¸ì•°äu¿Ü°mŒ —µËôm½6s}_°ºÍvËÙxz~ÏïûÿBx7:…C‡B†C…†‹‘’“‘32, //(VŸ ¡¢£¤¥Nhv©rªidstof­m±q²zoxº¸µ¸¿ÀÁÀƒkŽl‰„ˆÉŽŠÌʔҔ3Ù2ÛÚÝÜßÞáàãâÙØçèééàêíëáîå2ñæØäÜðè÷ïìöõäüþ•ó7oß¹yæðá;HP^ÂzêîC‘!Ànú2>¤Gÿâ;ŽãU;qÍ¡ŒLÛ`À’¥(MʼH¯]¿šºSpbÁ€z2°´íÀŒ.8ršÓ§P£JJµªÕ«X³jÅ:´c@œ3¬5¼÷ÂÀsG·%-»âÀÏ—g‚µ‰q®Åºt¡T_·háÖM c«áÈ+^̸j€’!3zÝ)V¦¿»3ÇÝl7gç»:+ê8Z¢Cm(K¨^ͺµëÖ'cÆ9òñØ|C{5ÍÙàç|iоLš8ï+_μ¹óçУ;g'»!ØÚ%ãÇòxoàÁ¹ÏþÑøèâÚ“K_Ͼ½û÷ðA*”?¾2YK ß¾<áöïÑÿdb-h”€gÈRØø˜” Xà aõT`-(¥”†›Xbá5ÕõÓ„1 C5¦¨àc-(!‚}g£\7æˆãŽ:öÈã>ö¨Rh"Ù'ÎÛ™7ÛFJš‘n9IÚnQi‘;é¥^@vÉå—^† æ˜bzƒduë9’ÝiéRnÛÍ£R“’•w™”NR9_”§a™×FÇIØØ ‡-U&™ˆªè}~F¤¦™L–f[¸‚=˜åá_ øR™Ý)©¨žµyedny— „¶ÊÕ§‰Æºè¬_žYI·¥©’Y– ZEËkžÀîúA–§jCÿ©½æ,{Ñ*­¬Ôòhëu~敨& ÞMÖÇ$žÞR'ZzÝ*Kj7Fµëî»ðÆ+ï¼ôÖko½LM«oµüBš¬>Ù¢flžý´I‰,ÈR Be)¬Fä®û«©è¢©ÙºÜèêÆVÚïÇû†\x”á*϶Ã%G.šs÷pÄWynŸé^Ÿ°Á.õ€P‚¡§wA=ûõ@BÃÛ}b ~s*¼l`#—5}ÒKù»ó­‹úüdч åï×  ÙòFÀDhp @Uür¼¯ÉLyµ›^ð·=èMЮ 77®yð4·Q ÑÂ6»:ÕzI¢àÑŒG²þY†zSã  ±§µrfbðáô÷ÀâÜOKÔ_ùDíÀp†H\Û—sÙD‡ ¤_¨®&qtiÿª$zqlL cë –¦âQ'}ÊÊsÐ¥Ô¨MZ|a¹¾HG0ЉÑI ~ö(K¥Hf¬’ÞìR”àå'îê‡T’Èvý$B²ûŒ ÜHqŽuÌd{¸­õ”È [@Áò8É?î-;G2ŠYV;Vº²•°|¥,cIËYÚ²–i©dAˆIMú:µR%.oIÌa³˜È4å Áp)/iƒ‘Ìž9› ‚ËŠr4Õ/·ÉN¦ÌiÓ¬¦4Å Íeè1)˜A VÔ€˜âðŒ§<çY-¨B «°'>ï¹aè¢üìg|ÁO_ã F2”†6#Y™@P8Aÿ’hÖx²&A Dð¨@y„&”T íNJÏ–º´žc Ã)îS/Èô 6Ãda‡]ô“uð)+šÐ¢þ uÆ!aŒ¦.â©Ì`„T"!ŠòMŒßI#É–vÍœ ²vƒã·¬è±–•š¼ÄŸË¶ØCß]R] ä" ØÅº~eh̴ᎴjÎ,nƒ ±Ú‹.šP“Hýð5ƒXµµîµQgýkd¡'‰E°:<ŒáÒý§%3ê,Å×êù5YÛÐ8„ÀÞ±öœo$È&vFÛÚÚö¶Z)ŸÃnuUÂI®æñ¦$ÿ*E–Ù,ùb`UqËÜæÿ:·|KW_ωJÅ‚êˆl½áoºÊUâ‰Wè¡™i¹IÞ:q·më­u—¤M0•6†ž1.8‹®ñ–÷¾<¯_Ó[ÝÌ((’J4zј´DÕÈÄ X–'xH‰ ðY7§Bj‚Á#{è|B»LecÀ™hp…[’÷„Ä/íZ€ˆßQ¿Åâ¯ÿPVÅp ‚IJÇW%+à…Øhs&Ç¡ÆÑÙc¢ qvõŠU&;9Œ^ãÈGdðÆñ»7ãÃkYò YãÍñ ›Læ'›ykQ¤zýÕË‚¸qBáPL  tÈ”ÜÛr8Í:d©‡ÅRbÕs9Ö³2Zÿdi>åŒcVÂrUùšÿc1—õÄè°^Уô ]Uè3{Úƒ‰^æšµÅhéÖWìmÚ°æHF!*W³˜¶Î¡ûµäYZL¡&Þ¨Vå)½™µ,iß#/ ¸˜Ü5…«î2Œ«öê?“Je—À¦uÖi[[ûP¹.㮋Öf»•fxÝën1J÷zÌm]ڳisºÇ׎7®‰ °¼r»½Îd¯Á=›»Ï`†õº‡X@&÷ÖòS¶ë½müá¸Ä'NñŠƒ Ì:t±Æ7ÎqüjŠ™båtôc½Ú o£Ä]ÇWN¡•€˜Ä/'1L`ó–Ìæ7—9ÍkÎàçÜæ>ÿ:Íg¡ÝåÐÞ:¶ˆ:éðutå|çÞÓÓç=¾e®$á>ø®¼ä¦‹¤«”òR¶eB Z‹~.7Dæ²/pNÊ*5·Z¥Ed$€ ¶Ñ-¿Ä:p±%äâ GÕl"^™—Úüú‹%´¸Æ/Ø7œäÈÒ-À“¿<ä5OùÌ?¾ó›ÿüä g–k¸@Szß ïÃÓN~Ut!³gê+N¯—ŠoqÂC†ÃÕ³ÐïRœßp˜‡\tƒgг/ìðsßÝW«÷¢îïbíçzáo™öÄ<ªÑi2›Î×ôu-ýä{¿÷ͼþà³}FÍ7¸ÿ>yÃ/«ñk»ü䳸ÿ~ÝÂ]Â?ñòÇM_¢ôfÑGB_EH½ã9ŽÄ!í‚ Â¤w•#vm$;]eIˆÇ-~aÂtÒÑV ØG¥䇀 ¨nÞgXˆwiü‡%ø¸¾ÄI)ØGú†ƒ¥§fø‡lå”/ù\óõƒIóØôV3Hƒ™$\ô5_«NDHNxõX…Vx…X˜…ZèŠäN/õ…`È^˜cX†dx†à…î´†i؆lø†n‡p8‡rX‡tèN€‡zÈk˜‡iè‡yˆ ˆXˆƒhˆ7pˆŠ˜ˆŒˆˆ…hT‰’¨PU‰Nõ Í`&gQ B),p)@/ÅRÿ%9ÀQa˜ŠñTQ`O¨PPûdS5u@•%SõOAu‹z°S5‰FE KµT—ÈTËÀˆ°¼óv&ŠdQªt GÁ 4 R¥ø$U KPR@ŠJ°RmÀ,¥Šä ¬Sç¨O°8S¨€S¶àûôS° ¿TÅõ‹úŒ~ ŒI¥ÿØTÈøPi" F7[ÏHèÐP ¢XŽ9‘`xŽñXS7åè(‹Y€S÷¸‹ôHP:UBõ޽h‹ûÈ åTÉhŒ—(UГVr,P“,`UxÔ|ô¶[[ø‘@E9=ö“Bé“EcDñFåSmßfAÒÿcWÇçVI9>ô]½W—¶|SHËÁ]ç]·V~öoPÒ?‘å+ÖÅ}+ô”¶gi©Ò‚ãäwrµ,vw~™5&‡pÙDH;ézÆõ6¡Vd™ut–îXƒGõ?YY‚嘈Ù}t¹<Ýr—ב—á÷^š™Y^'ùM¶s¢9š¤Yš¦yš¨™šª¹š¬Ùš®ùš§ù/Ó¥ ¨òB…œB#Ú –Yµ]}yj途) ;‹´¹"}ÑL³ånÐÒùC‰^´™§!šð+’šœÓ_ÅZÁö.¸óÀ…1ò9ŸîVûuŠÿôB]1Zõã›r¡™â –Nƒ1Ð&|ÏIŸš ·eŸHù5ع^cÇ-î ^'XuÉeO(?+Ÿ Ú¡J( Êo"ñ þ•jßÄ„|9žî'_É–¡Ê5•=£2ÊZy]šŸFô[4Y{E¡›X-^`f_JX¤ÃÕj"º$Ez¢áy¤Dj¡Ë3Bª¡j¤Xú•W™ƒ6±¤Ö×}Bè# ¥¨Õ„Ch¥Yš¦k$3J£Y^úžD1J¹Á;?fI[æ³:i!°ù«À¬Â:¬ÄZ¬Æ:š7xw8š×¢ ¡`FtT~3'†aÇ­×Z0æfŽ#a ¦œq9=—!¦kqÄVb‡Ô®Ä¦œÕôª—‡¶ÉêtËÚif?‡Gx’æX’ÆcÊ-Vâ–t…>æW¯ k¯5„¯9©¬µÉ¬âá¯ùƒeäVYÀ•±Ts˜ëgY9WÛ°$ëdë¦ûZý*¨»B¦+A¥ò±çl"û¬Çš³ÁêŸ%{m'‹—)»+Kœj7H”Þ£EÛ¢çÿƦï×w6K—ø iÚ1<;²Xû›©´˯;œºq68œÚ!R–zæ„ÿF1 «‚R‹T[µToY[·bªœ«¯]«²_ËjZòš‚´ ³Lë·M{*w³Sk«r{tÛ³v«²ùêA[Ckj¨v|„‹¡M‹¤þœbvqÛ¸ª­!îã ŠÔ½9uvH¶ÚêËÓ|Êjc:ͲðÛlÝÌuß 9ál á|q ÎÝŒÎz¼®®Ü¥°Œ@+±:'‚Ì3’ʣʊsuBñ©oQ›'òI™ 0«s!€‹›Ü‰ÌIA­Zg5g‚žov•lÍÏv: *| ÁÞÌÜ;­J¨ÁÓÑ~:8–Àv´jÒ$ÃŒÔÎKÉ$ddœ~F\¾KdCbx-+ƒ5jÑðqËý‹¶æ€ÌîCË¢£Ï#’8®ÿj«oR""Ò)ó"]gAÔZȬcÁãÒz Ó%Ú¦Ø{kY|؇ÇÓ/ìÓ챓´ÇwlÇ{T”È{ÌlJY×rMv½>À®-­§/]³4ÀíÅí§Bë÷½Ÿ‹]hMCžh“ŽýØÙ’=Ù”]Ù–ýØök“~½Õ€Ýz‚íÙ„}؆ ¾G˜=½ØiƒÆ82I¨zÅLÊ“¯G™*tÓƒU{å«|gÚdÆêe µƒí±-¼|µÍ~‡]¼‰¼­6ªý›ÀÍÙ ÚÄ=Ü‚‡|£•1ʧÝÜeóÜÿBðó¨]-ÛÖWÓ…Ý–í§ÜlUWíÝyäÛeB¾×ÿËÕ±]}pŠÞ¢­ÞÉÝí­ØðÚò-\ËÖÈö}ÞŸM}ârÜ„E¸ý¼À¥Žƒà}IþÚžß ¾‚±ÇXÆwþÇÝ»=áïQártá´ÉÕ½IÝèGÝ×MtÝߥmÖPIâñaâ¾âã ÄùÞ×Sw ^Ö"^ã6^âÅåwÁÍ@yë ¶8p¼âM7•Jþ/ˆÄ¹¾Vä›tGMÞ•·vߥ´ã°ýåtQ´&yÿ¡­úÁ;5I­WjaÚâ‘„\näw‹ä$>¬ªÒd^wî|æ•Ìc+bìô“ˆÞÄz4\º¬KB~çÝçÞ%èIT9åÀ›M¹„ÿ$|LÇ€ ×ç“#ÍIÖ;=äçG镽=¾/…L-/Qåž®â=ÎNë´¹ŽºI…¸Þë¿ÎëÁìÄþë¿Þ‚Û-é#ÎêÓñ¤»Nì¼íÐ>íÏ>ìÕ^ìº>í?ìÈ žù…gúí˜a„É>VËÎìÝô¤fúÅ[\¥âþî)Ìí×…VÞîîöNïӇ徣èþÓêî„ì„÷.ðô¾í—}ðŸð ¿ð ßðÿðñ?ñ_ññíëŸë¿ñßñ ÿñ"ò$?ò&_ò(ò*Ÿò,¿ò.ßò)¯›Ýí3/ó4óŠœó#pzžð ùó@ô à‘(%O™Oÿe’µ¨’L¿Èð’Oe‰É(U¶µš3w69†B¿õ\?¯ø ¹`‹aH’g •MTÇ JEŒ%“P%  Pa $‚ðiU%uQ-Q*Ñ‘«8ޤXR,%Ž]¿øfߊ`¿‘c/éø´T$ÉS¯¹@Tmßy TÆ ÷ uŸ‰¥÷Ô€3¹£`ÎXQ*p“äÄÖˆøÞøµ øEpøµ*ÅøYöMPöÀŸS‰‹± EÏŽ] ‹˜/ù³°ô%™ùPÂúÈ(õ9úÒPúN+ïÓ<œˆQÓÈ"„ÿQ†ßû^€û$u´Ÿ+åû\ÿü¹ü¿ (Eø‘/Ï¿ÿ—EZ½Û¢dN;³Þ¼OÑ€( eA¢(É®æ ¿nüÁa`Á`0m‚a <€¢}>!Т#ZF¯Öê£õŠÇä²ùŒN‡µa2ã<}¿¿ÔºÜýuÌ¥•{¬ñ G±èqx(’8¢˜Òb¢I33C€ 0€¹©¤d PdÓ–†šªºÊÚêúŠvêµ—×e%%ØuJÛç‡ë'8(aaaŒ˜¼¡˜‘òìèiéRIc“­­-j“ .>N^n~Žž®³¾Ýîþÿ. J??Ÿ¹³­³³ ðÛmû Èæ Aqÿ59ÔqðŸÃˆ'rz¸c]§;6üxdCtüô¹ §° Jr2e×\Ìt?¼½T‡3gN~ìzòä)î§Ï¡äJækGÔÉ =Í!Ôe¹’PÏݼÉôeÆ«+·îìÚtÝR¡*§‚mêµ P­b‡²] ®!XuÚ½›Õ­Þ¸z£æ%[toX³|ÍÖ•Ê5°ß²ÁF\6±Z©8¹~Ì—­Ó³hUÊ…<9êgÇ}ÙÑÅ‹:uèÒ‹W~<Ú0ÑÖL Ë®Šö`Ê„çõLštZu¹“böxÛÉÛÆm\0kÓÞT[·ûZºëÒŠ“⎮|ùêÛßyÿ­ÝÛ÷YÍŒ¡WÿFîÞjôÍÈ™§}î¼÷éüN_ÿO»m[fâm+ÙÖ]yæÁW}êÕ'–dö}!{›]&_} F&tÂÙkþˆbwÙµ¶â€%ºø¢ˆK9vT6ÞˆcŽ:îÈc>þ(®ub‡ûõÍ„¶X†Ü}˜CJ5€6pЂœÀe—^~ f˜bŽIf™fž‰fšj®Éf›nž¹\LiNu7øÐCžYV—¢ú¹Ÿ“Z…r&\â€`¹ƒ•ŠFTeœT~RJ¥–^Ši¦šnÊi§ž~ j¨Š"h©?ÑYŽŒ±ƒ‹`Ó ýǤ‹µêF¢9ÀŠÿÄñ꯳j"åŽ÷¥¢.Ël³Î> m´›ù¤€5%‰Žªxâ°(–<`«$vÖx«ldÙʯwþêªí dLh™¬´öÞ‹o¾ú>KjŒ’®ˆ*KRV‰®6¯†òRו{X¹P6—äa™è?°„p„õîËqÇl/µròpmO)µU=ýÐ:n]?üápÙ ¡•QJ²•È:ïÌsÏØXæÝœ|θXÌù-Ü2ÌÕ–šeñ…çUÎ>OMuÕÒŠ,Ðàöæ—ŒÃYÇ0‚K3ý!ˆ2¨‘²V¯ÍvÛ˜b«µ%›,žÑ¦¶Øúë{}óµAj»MxálÃÿ4ÉCKØu~e#ý2ßÚ‘]!à•‡‹lB@nÎyçžú÷T·ÖáWÜßw£–÷”qSî7sGÓ÷VÒaßn{î¸ï®{ï¼»,¤ä§.Îõ¿/ÈzÒ®*ysŽƒH4 ¿ûNýôÖWýõt—®øÖ„Mú쪵n*óÜ=-ûêtKŸ}û׿ï~üð_­éhæ5æ:‘Ͼ‚ç_þ<ñ}¯ò+àü ˆÀ¾u‰ñ˜ºñ ï.ü# ®f3»¿AvÂK øÁNoA#s ÷"„¿ç}m|Ê+_“¦ä¼Ú °1ª¡ AˆÃön{ dÍÜHX·ð©‚-t!ŒFƒ¾¦é€9ÿl¢Eì‘{&< "D,î¤an Ò ´"ØPEF¬Ð Áx >qQlcyØ$û¡í'wˆQ€5¬…¥JJ@#õ?® "ÅBH;†F-‚!EsvŒX6¦Ç¹!Ld£%݈IN±‡&z JÞ ŠŠWwBT·µ¨øJ•XBÔ•Ê^u‹9E•ºµ V~# wR¥«Ty#ëU²B”$u tËX¸,%”À­BÁ2• 5¯‰ÍljS›F¼Öq$FGtyi•Y•«ÊL/ KV°ÁüA1 ôªŒb§7øÄ*›*™xj×»®”Ë{, ¿ò’ÿ'º„§Gþ²Kó4T5½xɈfr¢ÝD å2·¹8î‘g*}ÐÊr‚ô”ÂzWHo‰L”.êQ¶½m²Ns^zZÄÕ3.v´¤-í[å*7ÈvUaçÍ…b½Æñuƒšùb`×Á³д¼í­o—ÿ„Z9E²ÄlÙÜS[ÙeV·›•`g÷Ùé„v­¿­®u¯»‹ÎUµ½­kñªÛä-³ed ýZk$5·nÛl¯>° ß…·{ß$î|Ø¡AËRërà“aì¦Ë"»Îˆ}Óõ Þ„à»i‚¯ƒ­¢ÝÔžðHöE/;ˆÙÜ—(2¶Æ#ïÿš9è6†ÀÉ=– ­“=xÅ4™oRa%ò£žaè•X©¨söÊmsKl[§´ü¯P ­ý²xÉS‰°pƒRW ‚‘QþÐç?ö+xë»>î,mkÞ% ‰^®Ù£Ì¯ 3yÍÝ®š!ÂZ%ÂSšèÔU»<Ìÿ’î³].o‘,e ©·È‘92š›¥ä5+:»YÄ(w£laØ#öðÇ ˆ‰ˆR¹– ó&E«%õY'>4³T¼hE·YÂõ3§©¨ í&z?düpmáèf§ÀÎ1´©E5ëT/ÙÅ>|tŒGæsQ¶®ýñsÉ%dAƒvÔG:ó¯ýfaÇwÕOʱ3LXä);ˆþíôŸ¡h]?)…>µ±Ý`mרTsw£lh/»Ã267g=[—ù“÷p¯Á)M]yû–Ûô…±«ÁÝZÚŒ;‚¯-ï¿ÿðA³[R OLJíä†Ò°%Q÷=Þ~9PÞ²t©ý ÿXæfø‹›üpñ†{ß ê³­=âÝΜÈEØcšc—Þ}¡ë·Ã›éI|¯Í^9ˆŸ êÁN{àŽ‰æL¿ö°‹}ìd/»Ù‘‰j¥_׿Å~3É‘{¥Bm‚ÆŽ¬{µiÀŸ_àÖ8¯31Ðwƒ*Øjÿ-Ómï·3 ö¨’JEºR•ºêxËõ²Å¥mu“ùïZö•à?•öÂþðPU-œ#&ç¸;&R°Ü—,z`«¾°Öþ:ÖÅlD^c%ðŸ•ÿDoZÒ?6ñO/t5wÃ=äˆyˆ[÷wr“&ƒ*3ƒ5Hƒ7hƒ9ˆƒ;¨ƒ~õ¼Õ}MgzŠWbx‚³—wÿg,ˆ¸qÕvpQ˜2?¸p!wsPA„úg‚{±k•ÿdLj.è~Hs§C…n„ˆ÷}“µBr„»A—€¹&€ëÆyhøqz˜†L‚ýal$‡‡Ì–‚—‡kžu‡›W†|¨pŽØ‡qõ‡1„H`‰—ÿˆ‰™¨‰›È‰è‰ŸŠ¡(Š£HŠ¥hЧˆŠ©¨Š«ÈŠ­èŠ¦~m‡á$…µh‹·ˆ‹¹¨‹»q…Jst%ŒÁHŒÃhŒnÄjærŒËXŒÍÈŒÏ茭ÓmËÐhÕˆ×Qɨ"Ú˜ßèáŽHÇÝ8ŽâˆŽç¨Žé¨<Ó˜[츎ñüÁLgg÷ˆù¨ö8+káMô‰Ô#kǘ%#W%1ò¨oÄGíPÙð6‘0‘ ‘)‘I‘i‘é‘ù‘ ’Û0‘Ú ’7F¥—xie3väUY5~ŒtV4Y~™ÖAà’(³îÀQô’óÿ¸·Âc!%J½âxIyRGy”Ž×”K‰”O©”Q‰”NY•Pi•S)•ñÄQB¸’Æ%žk«,9€(|”îDS9õK9E,3“½ò+Vb,cI1"O<ÐOˆ‚—¾â-¼)£TYv–“ô–@Jµ3”BÉqMý”($4#“6²“_…3±†™—‰“)òdH÷÷h¤—L@0é‚J>pš•¬BOV‚R»d%•1Ç' ?)J®‡.çÄš“tJZV›­Ùz­‰v‚a‹‰œ-c,Ù_]¡HÐd“ÛPO’Ù™ö-õäO¯”+#Òk£LóâtÅNÖ×%ºPìôNÀ”ž¯ÿ×J7¶+˜°P£$%x(âÄQóN4UŸŠÄPŠäŸ u˜~Ye¥eɘÉùë¢ ¡I!GbÄ"K°"M„R(÷ôK­÷– /í’(»BeÛ)‡½F1]ɆéA#3é2[3HQ§E):V³h›@9^PãH¾x 7JG|´aç7e²ÖJBÐOæ9¢ó,~ÉJ1°ÂN÷€G'˜]=@:–Øàéÿ8sô29\"ëµiá¢b'·VvóŽ |¤([˜ö†LG–W‚g4åžÒ„1¯wž‘J µ–Å‚|4y[$ª’³8b{ƒn\èg•sêñEŠè ‡£‘jœÌÙäÿV“>™v}¥¢ZDB+#~aá§ó MÞ9¥®a¥ˆ¥ ¤¥ Z„U7A(÷VbdJ«Da¦‘(¹k»ª«Á«!ñ!¬1¬¸¬¿J¬Éª«‰r}®‡—‚:|„ŠB†J?ˆúaŠz3ç«cq<µê­øõN¼Ú¹:®ÅÊ«ŸÉ IB®™°®œ`®ëZ¬Çš(!Q¡s‡«¥ÚEU<ªª1ú®ªÚê!→*©@ ` ˰ ;Nõ%­&j9 t¨&—¨7°²­ò¡˜jô­êÈ‹#Ëx±ò±€hoý €Ÿ@B§rMHyØê±Å…°!;6Tø†¯Ó:9núÿ§±WÊ<"ö¨6j³G #?˜ˆ+´»²AGF.Ëi¨ fŽZ܉´Y‰\Öh”˜²ò.^I¨)A¦š·?\´bJÁ7*_E|#=iö;rËÄM ÀÞ+ÀQ\ÁD¬Åt‰Åbå;Í´;£;[ü¿¬Û¥P,ÄŒ)_òSÙ@—Ž2Bš¢ëæGë’C™ ±Kƒ\1;Ú2lÌ»aŠqq,½DìÇiLIzÿ¼O#7WŒÁbu;ÇWÝ2¥îv¼$–& Ld\+Ëç=1ìùãÈËB‘ì;vrš*E™°crqªX8ÁIáU<Ðh Â2Püð“³Ç/§È ,«ÞÆœ<°Œ;Šbiƒ.YRË­ÉüzÌÓ& ³4)uÈ„Ä(íÂ(4ÓŽÉŒyÌÊÍüÈϬ@Æé+éú ¦¼C¨ŒËQ‹.¨_’³§ÌÉ>ü¾^ܵìÌŽŒC>ˆ$µŒÉ8lÐl­þâ Ê8€l¬Ê3Ã=ÄxXñãT€x\¥?̸vèl˜¢ÉœI³¦Í›8sêÜɳ§OH⨎ʢ,HTÊ e‹-™zœú‘j9m³¶|à¨T…(c`,’%XT; m#J $=ÐÖ¦±e‘\{ömٹΎmÙjÒ²dñ6BÛhdc’hñ®u¬­ã)Kò¸h1CætYï_¨x  »¸ué¼eƒ2ÞÔ!=‚aC¾´}{(ï‡V« ïxÕ U%’+_μ9sVïõ,pÜÁ³'z¸o{ßµ‹ß>¾<ùóæšŸþ{·õÝØÑËOO½;ü‚ÅéëŸÏ¿ÿþÿÞ7náMƒÒIJÍ @Wt‘ æÂ%–e„™5à Cœ0’jr¢ÒY èö!ˆ%:8R!ѵÚ-ÁðŠš@¨€Z‚5"Àƒ‰Ž1 –¢sDiä‘HjàÒFfeL•PoSˆ@X¹7ÏQWZÙžqÜi àdŽif™ôQ´À;MZ©æA0-ߎïÕ鎘pÞiŸ—àyƒBK?*¨M  y框ªéä9mÞgàG+&õ`!•¥aMÑWsÊ&ŸU"Ô©ž» 'ˆõØlƒ¶J袆Ɗ¨|Â:N£Ö½‰^~v’G%¨{~ùdžÝ —ä±(ë²ÿ³²©(“Ó=Të°Ÿ†Š_ŸØþJj}÷iÛÍ¥à†+î¸ä–kî¹è¦{³ì6+ܳΚ¥®lŽÈ€c+âXÒE¨¶&°ÔâìµÂVçÑŸ$ÑåF˜ô{‚«²JS¡íVì®:µB+¯´Š,ðAœ­zö…<Õ‚C¬2[J ÀÚLkZ,óÅãÀ O›ÖM›­§&ÌóΣ´v<çgtŸ¼NêÇ4ÏlqÆñJ”t—¢RÏÕVg]õÖXs­u×`-¶×d‡]öØf§öÚg·­¶Ûl¿-wÜt“­±“ÖÜôÞNóíwß[*(øà„nøáˆ'®øâŒ'n+VìÓR¿—0õaHÿ“ou¹˜¨Ò “„‘H–³x/S%ºìà‡#9âêJè2¥§—$X–Nè ê]ÿí;àßu¸o3ú>[Yjö&?&Ê“<yžåÝ«ÁÛ&«÷ÔLïýïñ&V¶À‹(˜þ5ë/@9ÄÙ›P´ ƒj}ïÙSŸÝ÷üƒ/б$Òü„Ÿž ë=$ûØýüÇÀþ¡É ôä”4ZPdÝB#ÁVƒ <®*h¿vo`XÚ WB µ…טM¨,nU«~'„á w¨?ú°ì‰R5¸ç§Çeð%Rš6T½:Q‡3›}p *òÇsF¡ÿgˆ5ÁdhE#Q RFÑ©ä‹öº!·÷Ä6BqVœsÙ•–¨HÑ$ÎÏ]²È1…‘R—bž IÈÏâb^¸ÉHp5Ò‘+y£$݈¨zPê)˜Ì¤&7ÉÉNzò“™ä”?¨QCäþ&ÉJJ–§•=ÔÆ&:ñ†À˜¯Y ….wÉË^úR—¦C*¶ÐŠbʼ˜Ã0qLe®ÂĈ¦4!Œg8ƒ/ã (G9·l"+¸ZØ€–è4|` Z&îÌ‚;¡9Ï_ÚóžWÈerYLa³ eè1ë@Lu:3ÉìC-|ÁÐN“€`†”AÿgXtŠ`DO’³˜Œ³6l„å §Â†´¤K ÏÐ hC»å°’/íMé'Š–ÜëO,V0.¢´”Ø{¡·Xª­màJJ”h ‹.²F“ÄÌ•çQÃr—ˆ`+ç‰î¶ÌøD)+Û X!6Ö°¶&34ñêL¼JI¨J›*DJsJ×–B•XÿX©8³úõ¯:H™_ XWý+5“—^©ÖRšÞµ±>=;GÙÊZö²˜Í¬f7ËÙËþ´8¤ì©d!SWŽŠ¦¼écU+  >õˆÆ;ã%&²£,è"]DfÛ7ávaIË.ÛÑ *®Fv«ÿ‰$† 2 E0¢)E]9 Éus묕µ«½«vB랎µˆR³"¬¸„ܬ̕|I|@=âˆ7÷N¤A‹¢˜}çú/~À׿,AxÞwÐëfF1Ç›ÔÇ¥:8…uðNSª%Ä––Àöá£ö³„l˜ÁÕÁêü•<ºÄ„!j0 ¯g' C¸”‘e¢Z KãG¶ÀÝðÝøëóºØ¿'ñ…¬R“žÖ¤¾T—‰×âøÆX‚Á´à踰µWŽ¬Ð‚õãvtöË`Ü“ÇL[HMo¾U¾™ˆå¢\ìêV·Ãšpþ,Z"Œ‰¨brO&ã²W/ÃÀ‹2£Î[Oÿ¿ÕïS„eU¦:Ô`s©³\UÏkÍɽCC#˜‚]ÒYÞ²TäGgy{Ž=âÿ³¹ÁíÕ®±Ö†Hf¨ Ú#dlwÍë^ûú×Àv8<åQךÓÈ>ö£XÉ¡*›Þq‹µ6ŠÅO¶Uv²Ù'ìnCz 6žnzdŽþWÑA¦¢º¹Mkö½ï"îo´ß lÛ´–hb“˾@>è|Wý"ˆBgâ4zwàÏÞŠˆ_™F$Ò¯h(p*}Ò{[<ú¦óPÀ¤A®ÚÎÕŸB>ZT_/ÕvEùwµÍr‰_œÃ & £JʧœÑ-Ï9™^>¹þ™´ÿ×2^‰¨ó¢ë‡çþ¹o´ I»w€¹÷OúäO[PP¨À؀ϤP¶À ³0° ËÄL·Mí õ~€p …Q&x‚Q5vng)|5N3 Ÿó`e\¦€éD ç´DÀ®PˆN¸ƒX„ö´€X„ 8LI¨N8{À„¸Lè ¥ ˜ø"XQð‡&¨¬ñ2Ù43ð‚çQ˜ƒo`§ôvHh„tX‡tˆ„üT­PPìLÇ$…ý ØL踅Ò4‚b†'H†‘P†3qIÔãÖy˜˜‰š¸‰`v%¢×n¥j]Ä>íÿAŠ &kFÃU7¥ŠÊ"S`ÃY—0nDkuC‹°V‹¸èR`’tP7GC“='ÇSN·sGg‹gƒv‰¦ÇAx²?§ŒL÷‹½HsBf2VyŶŒæuÈE>{Õf×5ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðòøŽ§”Œ›'o[¡;*’ßxqªeD”’!¿$B0µv Ù¹dé¥q5j`ã(±æS$ÂXv—c-’!·.ò:ü Y"ƒÑVJA­ÃD˜R4(:’!ã”!QQ"~a;. Ç?p4 e4V€p2”1):Žÿá‘+çZײ_ò&fˆæ0„xFdçe'1wýÒ dW¥ •–W%F4xF²*~!LT˜—V„ÉvýÒ{é—#â`%iy&’ˆé2$gôNQŸ™áUe˜X—rU¤Ñ2”ùU¹eÁeIyÉc©ŠFfTbõ¾ù›À9›Y±h›5‡v€&1Å^®W{Îùœª·x=Wœh×b\ÖrÑ0ÍÈÜéŒâ‘Æ©@‘¥r¦u¨$aÝ™žwEÛ˜›Õ¨jØiž7çžn©žö9œ{ÿÕž¦D]H¤"¹ #1é,z+ —šCvGF"ó":yŸaLÒ( JŽØ›"i…a).¨;p– Rp±#$¢«±Z¤3$>)w>¹[¨£p+*#•b[Lä—iQ#R“™`/Ú5@¤B:¤DZ¤Fz¤ôhf²xž6[ø ™Ë%¥Ëå¤ÀÛ¥\Ó  o¦[ Ä5¥(°[(ÀfìÃ0÷2a*¿u¥Ë#A¦y¡tjuròi€Hñen.¬™­§u[9z)Ý·™äªi ˜¬²Ò©öX'·V¯Õ)¡÷qLuدýª2æ °Í²¬Jh²ta%S-Ϩ±¦Vg©êÐÙ+±Á«Ìê)íjugIª–ú±»e“ªZçJŒØÊ(úƨ#aª°,»­>ë±ÝJû°†åª3;hYgTÅÿVSêñ†Ä9†d;l/Ø*ž;´Bû ‚£03f´¤é¯Ã™´ýP³¸v³OâiR¶¨\\ÌŦbz?óWòù3 ia»4@Xa÷µ2±d»&KlKê´£Ú§+¶‹Çù«t [c{w+“`+ ~ f¸ã•®qÙ´L‹ª•7S^r›¾Ø¸‘:²ö` ·4¢ª‹« v¬ûº®»­;»°K»²{#¶$ œP»¬Û/#J²|³¬„û^;§´+†µAײ/F4M—rA…ª1‹˜‹®K{ œ 9ºê^íŽÜË^òæ½ô¨áÛ½Û+¾é¾ã‹¾ß›¾ÞÛ½êÖ¾òÛ^êE¿kÿI¾ï ¾êU¿ç›¿î ¿ý ÀÿÀ<ÀŒ¿þ‹Àð+°¸Fxá¼\½¬Äah›±|Á\žžŠ¬Í›ÁüÁ#5°¥8—\Âe!ëk"W›6›5™Ã±á þHÅà¸g{p»ÅÃE< É9’ÃiäŸÓo'ÊÀ¾‚2]œ`ˤD dòšh¨ÿ´‹8Ä®åVh¶êž~ò¸&̆ÜÅåà r9L:à^à~àþIAaK»ËàÞàþàá>á^á~ážá¾áÞá þá¾»$ž‘7râ%Žâ©»+Žâ$þâ·ÔÝ2N ? Pv˜ã:¾ãåTÎK€Ø€Â„åY.T¨åOpåuˆAîPÑÔ Dî$xä)¸ è*ˆ 0#¨»0HKûWçÁuƒ»äƒðÄ9¨=XOUNås¸å|è„_Þ‡?XaîNPŒNæ¹…gM!XÉ æö‡‚oÿ¾ä)¨ (Äjø0ú×4ø†r¨>øçJ@ODØçcðçðêƒ>åxˆèMëN0æ³ …Ž~né8éW8ä•~éê—æ%؈cxØT®ñ x/¸†v.NÖú¡ç­~BØ´Äç€Î8„Ã~ëè¾ëN‡ÞëOhëÐsæÃŽì©0ˆS˜ïÊQzÀˆF.ÏíÑ.ð2A9Aãd‰œ âäQc´€¯Ok ë»n€ó>ñé®ã?΀ˆ^èUPøê(xPñ^ø^ˆ–¾ïî÷~^XQœ>ω78¥Ž€>Ÿñ<ßód WÎåÿÄåò'/ìÿxô„Hé–~ì—îïÕæêIÞ/XÂYo‰YÝõ^¿‰/ö_8RÂ5Á|ʱmÊë{Àï¿åûzç¦>_möœ§‰´:öxŸ÷¥S­hÁqsÊ*uvøŒÒ„ïÔ•4Üf6¥v'ŒwÍ¡ÕÍéMz3åÖwx¢ ÓÍKÙƒï÷›‹mÑ—ÌM*/ÑGôLùžúªŸ‹®߬?kºøj ï«¡_7°½¯Ÿú†ïR™Î¡*Ìõ¥û¿úßû¨OϹ¿û¿_ºÊÕ¼ÏüœŸøÆ?6¡¯ùÊOý×Ü$«]üÜOüÞ?ýžýÝ_û­×–o‹·oãÏýØ/ý¾ªøŽÏ!Áÿ þß¿þõOühÓÛ3¾ÿüD²,›Œo’qu6.JÓ6–ÕI¢fÊ®®*Zó´—¬C'aÇ ‡Ä¢ñˆL*—̦ó &)/*ŒqÉh¬-# ;€Á;·ÓºV×êv:MÈÈbâÃ`Ó-v9üBo¢€@Xhxˆ˜¨¸ÈØèø)9IYié8ó†V"˜aPc%ˆÃ0b¨éÆÖ û*bQjpÖ7Súá›i1Èpil`pœ˜¼,y§ÛX 9ýˆjL`ðkƒ³½ %7F7³ÍáÊÎí. žQ{§+c?3nö­þ‘ À-Ú² ÐVH€²RŠÿ!ÈðÐ…†„"4ME¥*z¸P¡dY¼A±áA ˜v#`E‘bV,‰P Î•äqÔipcÇiwš -TŒg²€)•]»”­Ý&pY²ÑpQê°q/MÂrÞ;©dß}Àè@Ç,;Ô@—iÛ\4e<¥RÛ¼OŸê¢¨,¡\q Ö¥ qÑÐ×Ò%óÞaBz); L$Mh{‚yL9†!ÇÉ^¼ÜR³åÃ"¯ 6,Y$†µÿÄ<²ßJÁÈNíô-E8«þD(¨Y3D¿±ÌÅ:û5Ý~!*ðƒÎaÐgÝÓ¦eì˜nŽB³ý¸£éhÕ ¸¿¥ÿ}Àí’Ñï˜æzdæ†OEŸw\eõ&ÚgÍ x…Ð¥ÒeáEYf4MFX1Þ”M5¼÷'ÞhÇ[(¨°Üoe=×܉ؕ¸E‰ra%ž{…$–A†¸ç”™§£65úˆ¶¤K2Úˆ#e„dC#=âX„J29$<*Yã!¸üx£‘=æÄeŽOf‰%6Ÿ¨èpq¹(ÜŠ/rbœ*r3Õ:á 9ÈJÎìÉgŸ~þ (6¢Iâ‡oÖÈ¡nÊ™b£/,§hœÃJi¥–^Šé#V¥hAUk t&¾é蜌&ª¨nÚÀ@A)k¬²ÎJk­¶ÞŠk®ºîÊk¯¾ÿê ¢ˆœ÷ ›ò°h²¥.{*¨Æ¶)¿NKmµÖ^‹m¶½ªê¨š-‚ šJ.³Êº8n(mÜÉ®ªí¾ën¼ðÎ+o½ôÞko¾øî«o¿ð’*'†Š»®³ç–Û¬¹£Þ p¨¨& 1›KqÄœN,°> ‡Ê-ÁcLîÆÈ†ø(ÈŸlqÊ&«1±©+êÁ验2Ç3üpˆ5ïLsÏ+ÿ mÈayúíÌm¾Ì3Ðlˆ|0Òá* uÒRûüq‡…z‚tÉL7<5Ô[?ë´Ñ]MuÙQÃsª· ×®`wÚXЮñ©u`Lð§Æ}«³ÙdŸ øßtJìòÍCïâXÿòa]‹ÁÍkãä”Q´"``yqœÁÁ£T§¹ä’g¹´à2¸à~¯8ëA7Gôo±¦U”vtÕS)cÜ·;îæ®Cdè¾KOû cl™ïö>@]õ‘{'ç ÿô{ dÎæàÀ•¶âO~ù柿k,…“0‘¬?ôôf2øW@\v_[ùÒªZ u$>è!èp€¼À z$öØGdà øý ÷‹Cè„ÚyÏvèë ?ÂÞŠ² Z(. · 2. ºÃKÒT˜£¼CÅÿÌQÎïcÐÈ3V“ïÙC†ó@É*î0ŽÏhÇÙ;‡9ÿlC‚€œûНˆÅ,jq‹\좿Æ0ŠqŒd,#Á·G ìP~°ÓuÒA«ÌEtqÔ[p`+ï­WrÌ£ælç0 ’_„¤! ‰ÈC*2‘Œ´×Õ ®P¥%…: бq)´b?@‡ÉN­©7qƒ[ç¨0ÇÖ©Ru«t]Ê 3¬ÑCwäºÄö´œÅk—»Lœ¨6±±Ž¥Il®l¥1Y‰Ì_lA&d%m‰·°©‹dì¨$'D”¨«Øl“ÕPoØQζ¹´nT§èJ¨\j°L 5u‹¨QU‰F´UÔNę̀ÛW P Á[œ mš3­ñ”£•©O/ɘ u¬KºiJÏ ±}JÅ„hV_˜Èq»H TqºÕ€†”i—Zh¡;Ҭ~JçQÑ굉jb©áhj5»¢•—h©˜h8½‚íõu}õêfSå=Å&C«!,ŸŠªRÄVŒœÌì§±bê $'r2â {Pæ6u7íìª „˜‘ÿ|¡´¦u(U{ØW’siŒÍN-IöINj„êÔ«ns™Ð¯mU´˜Q’–t¤â×—ÉM­ÙÔÚZI¾…±Ì)/7:Ïx^7›òäì‚*^LU®¼ÈYRca¨ºUhºm/Wå»ÛÓ œœP~/åÔþJ˜ŸË¤›k…ù̱ ˽/G9¬à¯nàUaA&lÞŸ±´œžÐ¨c–`[¯öÕnßUâB3Å(f ×zaN°×À7þ¬;œUÛ˜Á¿\¤“É/#ó˜¿qú¯,ÌY]AdÒ¾ö0’i â%k6Zf,³™ÅhV*Oc+Nï „ñÙ>ÎxÎGή’ëfìNÿ|fHŸÿìç@zЂ.4¡mèBã¶Çj¦Ór«¹Fw½8¶»ÈŸrDg9¹íË;½±˜çÖë—È.õ‰~ìæZ€àžðôнW£Bœ&u—µë[.ˆ$J¢f„  ‰E›šÑ±e镱¶a€¶"+Ó¡‡p ^zË›Þî³61Í”7ºvÑkô;Ík&vk+Û ³q³¼òø¼<áí Ù»­5<ÇâF…•4ÜÓfv#j^cµæv  ‡H³kÀÎÚ¯äpÕÎ⻫×îé²>#÷,Nãà w4$Apƒ—Û9¨¶ðKKáq‰ iòüržk¬PÿæÁã’ÿЦ„=òœ›E±kP8SŸû Z»!R¦ó½)žI‹u—æx#Ò¡s‘k˜µ&sXR^tzâ¾uFúË{+s™gìÊ {MÊŽö³«ÝìlO{Û׎ö’Áín§­ÔïþX„«Ù1[u-éu0ÇØÓ—¦†‹õ‹r’n@O|ÁÕ€Þª«ë [Ö-ñÁžÈÕ–2®'6q‹+¡*׺”KïxÓûÆç½ƒõ¯ýìkûÜï¾÷¿þð‹üä/¿ùÏþô«ýìo¿ÿûËÿPö™}9®¿ýïÿüëÿºÇòÑ@€P€(€H€h€ ˆ€ ¨€m#yity»'ÑGЇXÌÕb36¸X¬3_Ö1­çø'h‚3LÕ|)X‚/ˆ‚0¨aÉ'‚/E‚1ˆƒ.Hüǃ°‚”S|—(Ø×Re±f—Cd€°„2è„kÕƒQ˜=E;§e7GY˜8äpi²24Ô1`x[pô xÔ…îvr¡S49ø„Òr&:x2P]/‘AY¡—1Wv0ÔCa}¶à‡9¾ .49E1ÕaÐmùS ~ a04ô‡—ÿ±‡UaSµô†/êc}{¥{ÑñHa}ËD1¡Õ†sñF$²†ôpE$?‘nq ÍSˆ£;” €(0xT?èp —µ€“ï³·9ðBž#U;²@{È=ÃøWÍŽÖ}]˜]ëŒ9TT‰”;ü IY£ÈåØyŒÑŠÞ2PmJb†µ‚il†wCG`ˆ8o4+šÆ0.™JÕè†ÓÆa¼€|–xÄ ƒ°‹óÿFUÓXŽC©Ú@@óBW ¢U;vƒ€']}'bî„s×ÔKÔ†“.ˆsZRÕd`?ГH$ˆc +b WÁ(Av0Wäzt,jCx!(zg•Ü--è2_©rv–ûåp¥“’'i“3ù|MùKO©MÎ|xÉ[Ô´•] ˜ÌrõF•™f7äF]\iyFgKkH"l•]W| I™\‰™nØ:R(›y 7éX„ÌGƒ©im’I8°ùš;gRÁ)œÃ¹xtšê¦›.W0¹–d™éœg#›³É.¶ÙQE÷wÆg ã›Ï™:¿i1‡šË™Øex­ÉšÛ‰ž]sžÞy•ÿâ–©š˜÷uœÉžõÙ,ÜÙ2‹ž¼©yI†‡Ÿéy^ºRW³)°7žñ9|ÊiŸZ5ê3+ø{þ© úŸÍ ¡š4ú L˜z*Ÿ‚¢¸Ù %j5&*s3‚ŸÆu·vt“©¡zŸ1ŠT¦ó¡‚ן"š£$*£4z1(Z1v ¢;º`Š¡@Ú£\–¤3š1Q‘£Dú¢:ª—Kê£0†¤úÔL8j¤RxäI¥WJš_úNMZ,[ ¥åÉ¥`¦bÊzlª>ûÉ¢¯w¡wY¥uZ*nʤëxgÚ¢æYxj§ö¶¦'¢6Cº¥~z¨~¨‹Z™ƒ:ƒd)Ii>2©•J©—ÿj©™Š©›ª©Ê©Ú言ú|hƒ‡ÄiªR„nƒœëÜâª5 «?uI±:«?5s·)ªTÚ3ëxf½ZfÕÃ"O©Ç¥¨µ7¥ô‰wªŒêJ<é«ÏŠfÀ*d+ê6ªæ,½ó/¢×>9zŽ¥¸¬ßº4mI€<„GåÚä=·¬Íu[-7SrµÍ6o`‘ŠáÀ @‡àʬ±Ù–yʾ ŽÞš&Òzœê¬&"dtH®×…"²?Æiñ9ýʯ<#®£J¬`1†ìši|Å…(Q ¶¨•XtùHøŠ¡S˜« ‚âê[á vD‹©š6«ª6˜˜­ÿ‡cýÆÿS¯;Ðz`€ wxµ¯;³Ý 3H~Ö?v±"²™óP K•3©“Wu9µ 1I³iK6íö£{ã8¥#µê:­XÃ>ЇmoÀª4E°ÐqWQë·„³±VZ•†Ã[[ý´*Q•Ðʸ\Ô­jû·Úˆ‰†h•K¹—k¹™+·›•½¸gdð¹ð&ºÄCºßº¦+º©‹<«û=£¹¯[3ÆÁˆ™‹¹µK»·›hÝȵ$Û¸ž÷E£©I‹{›P »¯Ô¹4µz¡$,Ì;"Ú´¸ƒ›oЫ—Äk½Ã§ƒÓ)¬¶™Îë½–zÓ+´‘K¾í¹z˜ºI{r7:zâ"¨å{½Yç%i‡y£ì¦{InðË¿ö ›2Uï'ÀLÀlÀŒÀ ¬À ÌÀëçC ;httrack-3.49.14/html/img/addurl1.gif0000644000175000017500000002272715230602340012565 GIF87a®÷ªÿÖÆµÖνÿÿÿBBÿ­œ„ÎÆçBB9,®÷@ÿºÜþ0ÊI«½8ëÍ»ÿ`(ŽägÀ0¬!® @¡ö àêÍû?Ý®°ëéŒÇ¤o@D:ŸÐ¨tJ­Z¯Èsk´i½[p·÷%ßÂ^œZ>§™o^Z¾fÇák|}ÏïûûCj;ƒD‚…„ˆ‡‡ƒŒ2Ž‘2(-•.šX ¡¢£¤¥¥9`©mª¬w¬pzv©shx¶r±´y}±z¹u½ÂÃÄÅŠu„ÇÉCË8ÍŠˆ’Ò2™'(•”(ÚØÛÝÜßÞáàãâåäçæéèëêãßìðê׿Øñõâïó÷ëöÛüþÞòõ(O`;€ÿ²¹ ˜®S…¯PP‰1RœX°ÿ#Á;ZS@à€€‘ 0U:pà¡€÷iÓ4­¦Í›8sêÜɳ§ÏŸ@ƒB ðP_Av´ÉÓdàE§ÀlÑ´dTXCf]qÌBMWíeM¦-ÙRjK´hJ$ÆI³/ãJ=9·éŒ’Xâ`17®]»wa”±Ødâ–yÇuÔ”pä’waÎpŒÙ1d³˜ã5 ²æ““e ÒR4d§›_úÜË“(D{1%•yo£½µ ß:<âmz3•Xμ¹óçÐ_˜o7C¬¹‰k/¾ýcBà\¯sß¼ùòèŸYíêùìêÓË_O9ïÜâçë§Ï¿vÿÿò´§”L™`Òc!ÃD_¹€V`¹@Ri@H“µu‘5'ebÒ §±Tš#YUšž¸ð•ˆÖ µÚ0Áð‚‡œ8¨À nM2‘„4i&‘„"ŽÝDiä‘Ä”\Râ‘}á•Bøq%ßUù›@çèe`~)f˜Nº‡Ž€MÒ\CJn)Q~]®‰•PNŸy(œ&Ôž|Þ´À˜€’™^™KŽd“Ó¹“!a;Î¥ KJ%UE š‰O˜ZÞéfwzöéé§ÔPè¨‚š§¦¥ä y¨š*qç–Y–ž›žÇ’¸*%뮤–Gh<ª>yêVYV9% ÆÖ:'%ÿ6ëì³ÐF+í´ÔVk­J½òªmV§ú§°¯$Õ­$™DãD¨aT€Wù¶-xï~Ó)¨ô õm¶øÆËP·À2¹j}YÑ©l¼Éò:o½÷”’¾ù6<“ý .ªðÂZç} _:°küêÇk¬Ã$g ¿îî>,ì²B-ÃürÌ4Ïl³Ì8לóÍ:÷ÌóÏ;í³Ð@mtÑH­ôÑK'Í4Aªb¼±ÉT—luÕäa©õÖ\wíõ×`‡-öØdM±n†¢Óºå¶mÍÚ_YõvZÕ°b…%i´€‰˜¡d¢'_h`'Ó…‡?èèÞºUãKs¡8n‚/c}u¶ÿEqÛìÙ3µ)ÏWبØT¤ãb¤°Ö´šhª£Zù$κ⦩ȗ[n{6™KÉMl“Ø;>°;ðÁ[àÝéª,'í˯Ü|ÅͪUÁµW»®¹fÏܪi?ÜÔ¯œ¬~Ô{½õ­›Œ~óÒû{앺Sÿ÷‚v¼þý²¦>Ãö û¬û£­ '@ŽÍÜ–þ¼WµþùKYó£üŒAô”ï‚çË ˜uÀzäd©«ÄÂÇ¥…Io€uK¤óžjð… ì‡Ö6@ì^xÒå@h9ïÈa Ýò)(-0IâႼ2Ë$XÃ*®o†:¡}ÿäÅ– ± tôÑá½v÷Àˆ°R£³[³Ò8—5ºoT#ç(Ç:¶ñY~‰¢ýbhÅ>vg%T ¤ IÈBòˆäÉ(± úagv9ãc$‡öpŒ(pp˜_,ç_%7Y§oåf‰—Uˆ(§p™r&*x¢–_7ÿ†o—xgc¥‡˜ˆŠærR牭¨_þ#Šë‹îA1ÂÕZº¸‹¼Ø‹¾ø‹ÀŒÂ8ŒÄXŒÆxŒÈ˜ŒÇ(E‡FqðrÊÖ ½Ó g—n¥‘D]„…‘7¢%!nÁ>gµsâ8Žä˜r8Y•‡—^r63Þè!'r#"òmš¨\B‚!Üø,y!0b]’!¡á~‘ ö“ADqq8ؘi ª¡¢UŽ N±DXBôထɔ7¥±!²D†A¹ šAD›€’˜a‘|P™’=W9‘]/]íx(ß5ÙU<ãYƒ=]!bð@P1à‘žÿ°±ž"Bg8€£æbt2ðqÁ \©-WUIÎ×,ë•-©yÓ•lé2ù"&qT9¬)š¡–&ñ˜D¬A–=•“Ž‘Žû擊XüeWƘ'áXŽ”Y™å¨QW¶s³‹ø…W+'BÕe%vC|ök¹æxªy$Ï;cT_rWpùFrŠUi+%u-G‹þÖ˜CS‹²Y”zœ¢8râšnw›»’ˆŸ&wŽiœ®HR”¨›b…œ¢œ›I[ðâ]ã]d1C!Á[Ug)¥c"ãs¼q8Ëy\‘)“D¥b È‹ °Â}c–ÿ諱B,’.æB\h”!'Áùi3ÖÀd" ö7+#N!#‚!+–xY#ã2˜4a–AÕdÊø¡ ¢":¢$Z¢&JŒ\÷RüUdœux[Ov*¿¥&2JœZ7:Z9Z.¼E£Î†.èé$©u+Ј%4ú'GúdOád¤•‹¡• æœìy;‘¢JÑU>É:ìñ`ŠRQ%Tl²ø'Ró™{Õ]!&¥hŠP·,9kôµ;Eˆ$´bfÆo_:¥xZEžg‹™¥×™Qĉ'g_Ùm'z¨%ú§iRk mê§eÅ ü8<¿L?”ž¹™„:›õ£f–Ù'gš§ƒÿ²§Í(tì>ü8ŸóI 1’‘ Iª$§¹9=žú©{b¥¢:ÚezªÂ˜Ð,D‰SÑÉc÷ŠÔÁ,f« âw‹:eÊ_}ê«W7r.qh:Ëʬžâ¬¹zu»ÚXJ­ çCÅY`•?«Ix°ù­µ«Ý5®d¤XÄ©Šš˜éÚn—6 îºáz&½:¯U•[èÆ©ÈÚm•h¬ÊÊ­õâ­Ïª>Ñ*Còz¥¦ø„áinÑFò˜1±™Z›mw®®òYK/˜Ú¯9$sîV±ºa‰#4<ºH){#ZõøqüÓ°'û)¸±T¥Òjª»žv­ÿ&²YS«;[>ÿûBÿj¦.Û¢·i­ªH2³J,˜cžp€\[€]‹"^¶`;¶_[¶bk¶d{¶j c`Û´W¯©µˆr° +eVsµ¥²Ÿh®²zqžé¶…Ʋ2;­C[©—Z©Hy Ay¸ˆ;¬Ay^Žk¸»]‘ ¹Šû¸Œk¹‹‹šœ{šžëšŸ º¢«¹{¹¥;¹•K¹¦Kº¬«º¨»º  ·Qâ\Û³*{»€{·Éñ›‹»¾›»VDc‘Š·¿[¼À;‰ ¸˜w’²ÇÛ¼öø;ëš=A·Ê;g £m„E™‘Pѽts©–DuS:ä½cQ¾3T´å(¥59h! vCŠ qjHÿD"+1Zs‘¿'ç¼db»Ýõ%f §ÝöYêѦîÆmðXs3ž£ iÑ!Im["CØ8ÙÀ7$I!VqS¢S,!¡·†’ ¢"C¤"X‘ÀÆ 5¶ÈUоî[ Ú8CçX7cQ:˜`ÂQ¡`Â1÷“€(.ôe anG] ˆv4VLL¼þk@Ì+=¬ß+7:.9qÃkšj¥c\'ò¾·ˆµH·&«·Åù¥H.ý+œŶ3ÅS"”˹7r°©Â“ï@”ëéW`䦛֓Á™¯|Ç´YÈ-œœÄ…¨ŽüÈÂxÆ‚ ±î‰p™HŠdsrœ@›\s*j¯Çÿú>™(§ÆÊa‹ìf»‰ŒŠU¯PÌŠFÛÉÐ:ŠÕÓ?³¸·pŒË~«ž Ëp²¬A8[Ë/°t;š†ÌËu»U)wʽŒ­÷º‰È s—<µ ‹Ì芛¿|9Á ÌÃL»ÓaTšä£ÉÌ<αúÌæ\Èi\Ìà\Íâ\®ÈZÎêºAo<Ïê,kdAÀå5]Ò¥:ü|vý\ÆÒÐ#»ŽòCu˜ÐaSÇ¡8w|{BUµÝRÓËŒ¾|Ð Õ ¥Ð½!ŠÆ =ëB+q‚EkA¬ZUf @ž»¼v÷ºÌÙšÚ‰sÆ&ÒÀ$FA ‡{ŒÉˆe€’3.T‘!uHÿWЊÓï¥Ñ(†j+‘“ZI}À.K #-Eãõ;; <·&*_¸.%ÉžlÊN½¨Ú™·”ÚfŠûW½ÓéI©<Ðû܇Ö%Ðz½Ï §È `?E.©[¹©9¹§›Ø.êir =7²µ^K¶’͵“Ù”}Ù–Ùœ„Ù›ýØ-¦gÌ-I‡½’6Éê˜w¢ýp_§i-ªOͧB«ËÚ £§¯ÌÚÌCÉÔÛ¾ýÛÀÜÂ=ÜÄ]ÜÆ}ÜÈÜʽÜÌÝÜÎ}HD±ÙÒ½µÓ]ÝÔ}ÝÖÝØ½ÝÚÝÝÜýÝÞÞà=Þâ]Þä=Þ[›Þ’³Þ­ÞíÝIð½ñÝÞéÿ]ߦ}ß$ðÖðô„þýßàU …VÈ….ØNc˜àú¤ƒjxUÐà&}+0mH àžá¢”…æ‡Jîáëç‚îN`hàôtK¿àÐ .€Í€†Ž0€éx#ÜðDX€Ó‡Lí›Z¨À„ ÐÖÔÏDM^°Mžá@^… >â$hN°`Këääèdâq  RÞ…28ƒ,~KúgËðâÏ€4á‘Pj0 :£™4}-ЀH Ù'E¾MXˆ8ädPäBIŽáQˆ‚Oèƒ~à«Pâ‚þä²°ítèô¾ ]N|.îf؃cŽé 3v—ãšÿD} è ¦õãx®*ÀN0Û´}9MEð}ëååL^èb JâD…LhåQéŽÎJõGƒ“ž{P† ¾|Ѱ†¾4ã8Á6ê{Éô†ž°ã4APFD~ØNHådð}»¾í²îß>ë¾äéW‚îÔëê7…ñtîî \é¿°âÃÎeˆ|7(æ;Èìi¸`C„(pêWî_ðáTë…~îìâìTåh`â¯åô>O18éÆžOÉ×O2žé>Dòë2òžL}ò(ÏÑ/°ò)¿Ð\rˆ‡¨ŽÚ¥Ò`jk’klˆíjm‡2ów8‡·ÜòB?ô{ǰú™Fÿƒ‡°Òš€šŠ°|_‘õ\wê¥íW[c3™eНfO,04vW2õÍö^õ¢iö4Í4j¬4&W¨AÓ¹“ö8÷ŽX÷rßÚM÷cš÷o_q¢ìô½Ù÷¸|÷_ÏöM/‰h/bLRöv¯÷Žßø¯ölù‰_1Hö}{ù€Ïø–ÿX„Ÿ4Œ¯ù˜ø­é¡ÿøŸOùªŸú“Ïúœ/ùDöGõïúu4ï÷†d'€æ¨ÿû«ü©_4¥ßÆü_Gú•ãÍv+l}hûÐÿøæ)ˆó5×»/ÏýÚ¿ýÜßý¿½÷‚?_uÅ%!Ä"ÍâZƒýÁ¿þ#¡mÞæZ·ÿ: ;e±´øŸÿ>A\`‰˜§±Ê½B &å2“äúŒšäÃÅ"Kì¤x" l´Ö{-´ØÂ˜m>Üökp·ÊÙí¶ÚzZ«¯ä®{n¹íšë.§ðÆØÇ€¶:Ûk¼ó¾‹î¸èò«/Àû[À/؆¬¿ṵ̀¶«ËìÂLqÃ.NLƒ²!^EéqÉ5ÇF"² ·x`+Ì«Å.c ³¸'¾ Â.®‚\ ¤ ¹=À•>_Ò‚Ê? DÑþp¢›Ò ä â\Q«l`9¾’†Ks×1{ýæ×|tJ• ¤ôC †”Ú‡à|Â9¾ pH†üÑAíSÈ.ˆ7^mí‹ß(ÿJ‡KÜM·âA‘¶wã~wrhå–_Žyæšo.´¸¶1Z\T@:éqJÕ­¾/z¢ÀíÄß®>ÎE â‹ ¨ #ego{Üâ·¶Q$¢Oi ÁJp‚¬ /ˆÁ jpƒì 9P2Pج-M•”†%ŠÅhNÓ’“žÃKèÌl® ¢Th–|°ê¡«~èà qˆB,"hDPM Rÿ©—£jÆ,ý)]6ÊLhESImŠ4lÔÇöTƒý!jb«XÁ†F-Qb5û–ž¾Ç±€¤,Œ)‘¼"FBu•,H+„ìxÆ@šqiô\Ó¢1ÁQŒxücºž¸,>>Rkaœc©IHAr“šLË“4BQÁ†“ì—##I°™I\Ã$'3 ËWÊrcÛ«£75J#I•ŸªÕÅ\ɲweo˜Vše,ÏB6: ” ¥2C¨792W» f+ë„çis›Üì¦7¿ ÎpŠ“t$pe'9¬Or/RQÈ%qf¯uORs£nuë!w*Wa­8Ê:)X›¥E/^R°]“*M©Zت±qÝjOj×Tâ•HõkX]fÙg¡€£™íhN9 [”´«…‚;I›Ö‹šV`©ÍÖ ‰ÿIL'%¶³s%è›~j[ðmlZ£,oO»U {"îpFR’™ô·=s«yZaBw^½L"ÏË*ãÄÖºÖú¬A»”ÞË”¨ÜZeÇ›0êw¿úµ'{ײٖԫF_jù—¼ø…*Ýa_Dx®0…/lá cxÃÛ[ðu?ìã8´¢Y=à©6ÑÇj1´oLTƒ @®Co3ŠÌÓ† t„ÏR}ж„O¶,¢V„—‘´YLX^úö‰šwf!ã3 å…oXä£ËøÊXC½—…W(~Lp€«å€"rgEYÏäG+÷"µ`rˆŽ'’ƒBu%FC9€²C3ht|)TrµØN372À¤‹‡Œ ÷˜—ޝŒj•E*rBš’Ö@9k Ø1ÛÅXËU_,ƒoPõp©‘z%{IUJèué¦`3“diZ‹'ÓG×8N-é’/ “19N"&x(-2c’=v‘kÕrÅèz8Ô‘[ÿç&#’9ŽødŽ=X*¹‘Òâhn×vÄ„‰Œ¤^:rjÖ“MÉ•¦G‘v‡Q£×‹[ ßh””ç”]‰ƒ›Dpáu˜[w”¤5þ––L‰—/–f89>¡fuY0Æf–$wŽx€a¦”·–)ˆgqY˜9éxgé]ré“Ї˜^9j‹Ù—¯æb€I’‰•˜ù]ši˜éx™)‰dO•HÄ8’§š‘ x|YšÓwš×Å—×7—3µ”cšÑ%›•ixµ¹—š¹c¼)Žù›‰IšO5›k‰1#qæÈ&‚y—ÔÙ›|vœji™O)š©–‡”Õ c9Wd œǨ xÒÿ9"’åIi‘ir©Á™ž¶IœT rÌŸK9Ÿwyž`©nêYžì)–£Éȹ›Ê Ÿ¤ ò¦˜Ý¹žªéDüY” JžŠ Ìù •¡*qªÙž}%Lb¢wp¢)Š¢+ª¢-Ê¢/ê¢<ˆ’ZŸzbÇ#“9ª£3ÙŠ8~â(b¤}%¤»H¤CºOëhœÙœ5Ê#MÈ_Qª_rsŒÓ©E™rGÉK®É4€K ŽM*¦“¥Rj¦´âCí©py‘pC“G T¡· µ¸\¿é¤cÊXˆHvÄRHGFô4j ‰õB.˜R*¨ûpgK”K5÷ö—3ôÔ0ÿõ•6ª§3Š_Z•ý0>"PCŠE¥i{&ã¦mª½Œ¡jÀ¶‘оwnl¥¤ʤ˜Š«§ÕI9Xçæ2ªÞ3xz%pzˆÖ áwåÄЪ¨—Ч™š«Òõ«r Â@ž‡Ø’¦» )Àh“Œ%XØ!ºD@‘,¨Eõ—&c§²9­Õj£¡z©¶…ãs|µŠÁªH3|G¢(]A|ñ˜( 1š´:£yJ¯¸²©¥hSÃB¬yKâZxŒø/”ùDG ­ÔʰÝb¯3ê@ ºþZ`~©hr¦-‹Añºœ +³ 3ˆf³†³7«³¦¦ûޤÛ6A{BÛ!D‹C‹´E›´G«´M´­‡–!;³ó;kµ9‹µWa­–œù+YjSô‹a ¶§'¶d«\kzRÛ°k”†’ˆÛå+ˆ •u{¤÷ʶy«•?Y-£‡nm9$ÐÙ¶ƒ+3Ûé)«ép&[žk zK¸ó¥¸Ï9-¸Y––¦›Ž‹¹Ñ¹úH\átŸ º¡+º£Kº¥kº§‹º©«t|“;httrack-3.49.14/html/images/0000755000175000017500000000000015230604720011305 5httrack-3.49.14/html/images/screenshot_01.jpg0000644000175000017500000001363615230602340014411 ÿØÿàJFIFddÿìDuckyÿîAdobedÀÿÛ„##""'"!!"''.030.'>>AA>>AAAAAAAAAAAAAAA!!1!!$!!1>-''''->8;333;8AA>>AAAAAAAAAAAAAAAAAÿÀé,"ÿÄ“ !1AQS‘¡±Ñ"2R’sðaqáB„E#“TÁ‚¢â3rCc$%R!QÑ1¡±Aa2‚ÿÚ ?ëš¹ƒ[2̬”N)iÀApFó¬êaß˽•‰c˜:^Óbô×TaHÓ ùzÑø‰´X°÷Œ[„+Y0lŽÛ}KVÝZÅj“wÛÒ£\ü­G‰€.€KkTY¼³fvö2Ìhh-0‰²+¸_˜ŒG–°Xض'س‰Z&̱-o ×%ºüxLg»‹OyWsjO½œ×1å¬è‚×¶È>ë­[~©s#½Èdñhš:aa]ºOiaÆÁkôJZD!ΤJº—ø'%ºüx1žï;ü–l?’sº ˆ¶º&áo"Üs™"w½¤E°h¶ÕÞž„/¦N˜H}™/ÂDä·Xöðc=Þq›Ïczèb×Äp‰`&JÙ†‹VÊO¯f  XMà¶0>Ë’ÝcÛÁŒ÷s[«;¦Þ„0\ Ýf¸Bõ‡g³®,Ϻ©k ¢%h˜K bxN½Z‚ 0K´ºX ão 4¯„*i±9-×ãÁŒ÷yñ½·îÅ̤7®ñýø¹—£Ÿ/Ú§ÂÔŸ/Ú§ÂÕymÒ Ùç†ôÞ¸w2ÈÞ™ÿÜ;‹™z òýª|-Iòýª|-N[tƒ ÙÁÏ?·w2ÞYí»¸¹—r|¿jŸ S‡jŸ Tå·H0œA¼sÛwqs) áÛ;‹™vq(v™ÂÔÄ¡Úg S–Ý ÂvrðÎmIJ3ùͳ¸—[‡iœ-LJ¦pµ9mÒ 'g,g³{gq) îojî%ÓÄ¡Ûg S‡mœ-NKtƒ ÙÍÜÖÕÜJC9™Úž%ÐÄ¡Ûg S‡mœ-NKtƒ ÙDfó;CIJ3Y¡Wq(vÙÂÔÄ£Ûg S’Ý Âv•A™Ìm Ì×Úgmœ-LZ=¶pµ9-Ò 'iWŠÝ²¤+Öí•»mœ-LZ=¶wš§%ºA„í-bµ^ÙRªöŠ–-Û;ÍLZ=¶wšœ–é´ªøˆ¸ÃO±W©¼AlhºR ½®7‰¥Ò J±‹G¶ÎóS–Ñà³uÑ>‘F¢Ù­U[¼+àô_RpÐÛi´¶ºÓérÓæjy¼i¿õ_ %Å…ÞÅÐÆ¥´gyª´ÍþJh‰p:ѳ¯­J­èÑÕ ÿ»ç˜\ 5­yœ¶b®e´›—¦Ú!â/ƒ:‘¶A[)`Ìq Ì>Hk‚Žf–XÖ.©]ᓃÑ|E“_zù 櫜ÖÓ,1a =,¹i;¿<Èá8ºéÚÈÆ,Ö¬V;¬Õ…ZŽkƒ¬lH½ÃC}zÕ‡»&3DEØ„ÁäZØÙe¿ÑJ ¬Èf¤3S¥`|Ài„ túZ¦hf‰k±úM!‹¼è7`ÑÙ³ºÞdÁ£³gu¼Ë]Y–½Æ¥`ö›š-[ÐCŽÍÖó& ›;­æSDÁ£³gu¼ÉƒGfÎëy”Ñ0hìÙÝo2`ÑÙ³ºÞe4A ;6w[̘4vlî·™MCŽÍÖó& ›;­æSDÁ£³gu¼ÉƒGfÎëy”Ñ0hìÙÝo2`ÑÙ³ºÞe4A ;6w[̘4vlî·™MCŽÍÖó& ›;­æSDÁ£³gu¼ÉƒGfÎëy”Ñ0hìÙÝo2Ñ+‘–Q/–êÀK×Ô­*ßsúoªáÏ–˜¨ wÄŸ†À¡YôÆh–äÅJ³‹etcÒšúÖܵ7¸Ô-t W|x’³3ç1++5.ºRG±-#.«›?ý1R.ëØßŠ¸Ø·9õüÌ0F„ÄݧB®iÖ}GæKÝÈlz.>¡£ú­€´×u_4¹¬Œ"}JDÄúMEÊ%æ˜/f­è©ªÔs4HWmBÛ â=gG©o§VPM7€`H1µQ$D@\ýç×Ëx£®‚çï>¾[Å…$jZk;2×F“öÀXL¶Ýê·"ʪ¶®vWÍD¶ÖètTE]ã7ü[ÿ”4ûu+ˆ‚®6zoø6í) ™³Ó€!ÑéMD=ŠÂ «MÙÙ¿1¢R !‰øcj•*¹²æŠ´C[ñ8cìô‚°ˆ*âçÿ‹H'µÛ8ÖM\àc$9æhˆÀ@umõ«(‚¦6ö͸¾“¡J\ñp(´6".ÐN¯R²ˆ*âgƒ[ -{Œb&–˜qAg9h6 Ö«(‚ «žs\0ZÇŽ¬LÂørZ¦Ú¹Â]5€#,êVjU3¥àT¤"éˆ#«ð”Ÿ:æ)¶›ÁˆÍ3cÒR²ˆ*4ç‹:@5úlmš¡o •Wçç6•6Ô<™zZb"¬¢ _šsáV›ZØu¶>ŽVûŸÓ|êÊ­÷?¦ùÐtr7VñßÈjšq³4š’ØtAc#uoümy¯æ[+A§ I¾+H¦Ùjeõñ†Àà`e7ˆr×Hî°Ãs#‘ht cq­´ãŽÜ*FxœG9Xn#YSuMåN´YQÀ|<ËŸù~¿žÔYTÝ ªza²¾·W)grTiMŽ`{å”4Æw ¿ª“_¼KÈ4©†€ àëbE¼j4ݼÚù_N›ÙôÑ5‹¢%üg•Òƒ t|7éX×/¹¯l&-×tUè K­ ‚ðt … ôëÒiÆW]b§¼úùorÐ çï>¾[Å…$jQ5×Jça4 –F K[èQ¨éÞÀ\.v›U&Õ¤èJö˜Ü*KK2¹jne0× ˆŠÜ€ˆˆˆƒpcKÍ)ù»ßzÅF—±ÍÂ[*²B \êp‡WÛêUüÝNï½?7cS»ïXòôf›µñ°ÂÒA'ñ‚›©ÒsÜãV´I-›£ÒÐ7cS»ïOÍØÔîûÑ”©±Í-«VP&=k¡mFТֆâÖ€…Ð'@üÝNï½?7cS»ïXòôd Æ­(M†:Õÿ7OQN‚æìjw}éù»ßz½ç)ê)ç)ê)ÐQüÝNï½ ¨-Á©Ý÷«Þrž¢£S6ÒÇŽ‘FèúÓ ¤×ÅÒ9Ž„Ðp–ÈÁIhËåÅ`ÖÀ€Ö—“11rÞ """ *ßsúoYU¾çôß:ŽFêÞ;ù•F´æÚMRÓ¦µÕ¼wò½ô©š¢¡l\·JÒ)°?‘{šÆ4™Hkƒª M‹KÆ]€†gœÀAÈØZnP¦ú­ÌQ{ðœÂòÖÕ{ÞÐZmضÙ7‚MŲ“`Ó6Æ Y6Å&ŸÊË¡•«Mì eLRÀ&u¶ÅoTiæ)Qè³.ö +lkG ·F¦-&Ô”²a]c‡µmDDÏÞ}|·Š9 è.~óëå¼QÈRF¥­õéS2½Á¦øElZžæ…¥qkc3ÜÖØíS,«5— 8T¥Òƒ¢+ Îå\`*´]šù–pšr30…‘–ì½1ýìVƒ#1AΑµ\~mZÝ˶q´‘wfõ³WYB˜p·®ÀBÀ¤ R§‹¦Ï‰(&×µñ—D#øˆŽU%Mô“X/#£G2Lù‹ehp„F#~+’‚h¢1Kf l±„q !µÉ Á&$ö›’ƒ(¥ƒ›Øÿ›S7±ÿ6¥Œo½f_o XvR»Œ]@ÇÕR‹J¶Àþ¯½¥öð•Z¶`ÓynÞ áßÀ·ù*Ûú¾ôòu¶õ}è+ÍX6Z.$ÚD]`„UŠo×Z Ž•‡U«>N¶Àþ¯½À¶¢" """ ""…PM7e$Xo‚šN¡ö æ ¶_<ÖJ¡¢ÓlE±õi» ÓBk.€0ZÖTDDD@U¾çôß:²«}Ïé¾t 68V.‘Yðà¶Ý”90XMY§ŒÎ„ÂãÁGwÝ_Æ W‘ %Ó6cl`#årÍ6“.°-¨ƒYËÐ7Ói‰‰°^¤iÓ&% ›£r’ ÃZÖˆ4/±es÷Ÿ_-âŽBº Ÿ¼úùor‘©(V4«U!³G Yë™]J›Œ\ÀãtJÊ®ÐÍ>¥&¼€ žÂBÙŒíAQk‹È5¢àKúÕ¨¹ŒíA1¨*xÖ˜Ö•1¨&3µOúÓúÒ¢æ3µÆv ©â?Zb?ZT\Æv ˜ÎÔi›Vð…¬yg> 1Õ ˆÒc®ô¨•:EŽ./šP% .‰¹Md“q²?‚€ˆˆˆ€«}Ïé¾ueVûŸÓ|è:[¾êþ3ù¸©îû«øÏä âÒˆ€ˆˆˆ€¹ûϯ–ñG!]ÏÞ}|·Š9 HÔ°CÆ +E\Õ:/•áÁ 9àE¢1‡"ʶøXD}k&}…UË'—íiSóÙ[:fØaÑz ëoE]ùì³æöñjË?•,.3ˆ@è0Aewg²Ík\\`á3` ¢Þe†çò®€10²Mˆ,¢"ËǤçXÒâèúÛ„Az|®¦ð$ù]Mà\‡æjŠÏ¥N|‹‹åµÂk V1ó_·©þªÔv'ÊêoO•ÔÞÇÇÍ~Ü~§ú¨ åSRd]Õ–˜jè¥Gn|®¦ð$ù]Mà\AœªléÆÿ¨»º¤39‡uhµÞÊ€ò5*;3åu7F£èHe”P\œ|×íÇêªyŒ×íÇêªTlŸ»k€lñ%¥¢Ñë[•z9Š•+:Jb›šÉâ=‘– j€ˆˆˆ€«}Ïé¾ueVûŸÓ|è:[¾êþ3ù¸©îû«øÏä âÒˆ€ˆˆˆ€¹ûϯ–ñG!]ÏÞ}|·Š9 HÔ‰±è ʳ¨p,JÝC"=H@P%n¡mö,Àj €¤G (­0ˆYrJÝC"=H@Pe"=H@Pe"=H@PW~Z¾3êÒ®)Ï‚Éú¢[æ ƒžýÓKý•ˆ@R#Ððsߺoé²Óä+Ï>;'·¥…oJÿ^ˆô"=AέãÿsM÷Ó:½mfK3N8y–¶7–¯ïW"=H@PWÁÏ~é¿¥þɃžýÓKý•ˆ@R#Ð(åê²³«U¬*¹ÌÃ2H ¦çR°±è Dzƒ(±è Dzƒ(ˆ€«}Ïé¾ueVûŸÓ|è:[¾êþ3ù¸©îû«øÏä âÒˆ€ˆˆˆ€¹ûϯ–ñG!]ÏÞ}|·Š9 HÔˆ‹*""" ""Έ’u,(¼Ô€ —Yš?ÑjU¥M¥Ïq¢'\.XÇ¡1-q€‰ZjR«U¥¯àá) ¼F7¨Œ i˜S¥4A›§‹Š 5Ù­6i‚“œÆ‚çA$ú‚ÐöæÙI¦-âÐb²á˜p áÁѯ¥†g,@"¨¶´G¥`³Ö¶Ò" !SfL0‚)Ò.!Ærèë[€®Ñ)Ç¥Æ:ráh $pªËžÆ¶b] –˜›–ºm¨Æ¼™KÞIÓ- n…6»›+…2Žž„1¨DŒAxˆˆö©1ôê±ÅÍŒ".±Tò·ò¨ô‰'¯i"m¦Ê´ÚÆÒkEÀNƒm'â6k@·üL‹šÐ\I“ê U6Ô§JQ)}¶˜ËÒ1ö¬\‚¦A°Ž’ ÎXPK£¡m³YTŽP‡áQ˜ÄN-[㙌/üÐJ›ñ)µð„Â0RP¤ÂÊMa1-$) *ßsúoYU¾çôß:–ﺿŒþ@®*{¾êþ3ù¸´‚" """ .~óëå¼QÈWAs÷Ÿ_-âŽB’5""ʈˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ ·Üþ›çVUo¹ý7΃¥»î¯ã?+Šžïº¿Œþ@®- ˆˆˆ€ˆˆ Ÿ¼úùorÐ\ýç×Ëx£¤Hˆ²¢" """ """ """ """ """ ""­÷?¦ùÕ•[îMó énû«øÏä â§»î¯ã?+‹H""" ""çï>¾[Å…t?yõòÞ(ä)#R",¨ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€«}Ïé¾ueVûŸÓ|è:[¾êþ3ù¸©îû«øÏä äBÒ‘ €‰‘‘ €¹ûϯ–ñG!]…ÏÞ]|·Š9 HÔˆ‹*""" """ """ """ """ """ *ßsúoYU¾çôß: n$8ÀÂÝk;_òNëiXAë¦v¾4™Úø×‘DºgkãI¯yAë¦v¾4™Úø×‘DºgkãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ®˜ëãI޾5äQ­é¹ÆÓ `¡Xf?ɉ©0°»áÓ¥yDTzjȬ5@m;'t£4-º*ÃZòÐItaoIyAëÉ,lbxbU Gÿ#<:XzóácãüÿÙhttrack-3.49.14/html/images/screenshot_01b.jpg0000644000175000017500000002043115230602340014542 ÿØÿàJFIF``ÿÛC 2!=,.$2I@LKG@FEPZsbPUmVEFdˆemw{‚N`—Œ}–s~|ÿÛC;!!;|SFS||||||||||||||||||||||||||||||||||||||||||||||||||ÿÀî,"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ÓÔn’ÖB‹26®ß½ÏJ/<ÄR`UÈ\”ÇÒ‰®`[’+8lÇ’Nxæ”_ZŽƒöΚ‹Ê«5Îà0 `ûØéNi²Mx­(HC?)Àù¾R}=F?´÷МllŒåJö…·©ÿ¾ >VS=À}¾NW8 Óv3ÓÓ& Îà™& Ø9çƒùTÏVØÄ6ÒØzöíJ/íð2I=þCG+²ÉtÍ‚Fìd _üt…?¯þ8?ŸöÛ_ïã‡ü(ûm¯÷¿ñÃþr°óúÿãƒü(ù½ñÁþÿ¶Z{ÿ?áGÛ-?½ÿŽ𣕀ϛ×ÿáGÍëÿŽð§ý²Óûßøáÿ >Ùiýïüpÿ…¬|Þ¿øèÿ _›×ÿáNûe§÷‡ýð¶Zxßü(å`7æõÿÇøQózÿãƒü)ßl´þðÿ¾øQöËOïã‡ü(å`>,ß0{¨â¡ûb´’*B2€ðVœnìÏRüÿ…'Úl¿Ùÿ¿gü(åar·‘jòˆ˜6ËY:Ìò˜™ÀbŽæ·…Å£d*ÇP°±Çä+ _hÞî#àyXÁR¼înÆ“Võßü}Íÿ]ùÔU%×ü}Oÿ]ùšŽº£²QE@RÔnäµò|°§{àäQ¨]ÉlП1ðr*¾¸»–Ý}_ZöÅlå·+#¾çÇÍYIµq–o¯/mdá"òÙ°„õ?­I$ÚŒvûÌQn\–öñúÓ5Ïõp×J½wÿ“×6þTõ»ÔEM:êîçJ‘ˆH<޹üë@0=5—gÿ 'ÿqÿ­VòL:)–"Û¤ÆóžÙ¡I¤3p:žŒ}è,ª@f=2ke²]Ù W-–¹ï‘R7ÙÞþçûA˜p™ÏOÃð£œV4ĖTk~<°›ºsš¶=?J¿}º_ óäŒúíã5©§y_bÈû¸ç×=óN2»h 4U)·G3™ÿHåHþü_§4A¾IVÎ-¾ñ?ćôæŸ0r=Eã=«&4Ƙí¶L]Wï­JLSÁ#$gz‘ŽSžƒôä{ÒæDFAQ‘ê+>2¾lQˆÒ2“Á>éùJl°ÆÞ†qÐax§Ì ô °H ªBļÿË!ÅAo+µÂ£ÊïÞ2Wž>ƒ\ ¥‚õ }hÎ*”qÃ,óý¡UÝ[?8\qŠ„ þZ"¬± ˆŒ9à§ëÆsG0tdzŠÎ–6… 3d‹y>ƒ‘Å#ǶØb(]>Tãw= .`4èªÖ#ý Œ3tOj³Tµ¢Š)€QEQEQE©²‰c‹Ì KFáHëê*Ž©»Îx!¶s’ñ7¥kéÿ~o¢ÿìÕ•¬ÿÇÒÿºô&®j›î¿ãîúèßÌÔu%×ü}Ïÿ]ùšŽº#²QEÀÍÕ¡k‰-bF Îøöªm¦^\lhî<å81îb Î;kN÷O¸Ô$µeWL¾Xã*3 ëM#\¡ Û›2œ±ã©Ç=sT¿0Ñ›wa{.óÎDs0“ü<ûíjgÓïZt¼2# ¤8ÜFvþYëåV_Ãz¼›·Î»®ecžžÞÃò¿ðë;vý©víÛ9±N*5E4Ëï-ÔL5È È@é“ÇÓ4ÓcP¨—ä™ü´Q'’GON hë'nn—åÆßß7éŽ)­á½Y€ :á™[ƒëÓ­R-"_+Ì7q¦2ÈNx#ó²è÷²Hœ%lí]Ìry?ï¡VÛú»Zá =I•¹ý=…ðŽëäÜ.뫇°ü¨Ô axf¸~&„wŸ˜ü)ë¥ßÄ|¸§PO;RB3Ô1Џ<9«‚ä\&dsæ·Íõãš_øGuŒö•á·Þ· ëÓ­Téš§˜WÏË£@”œdà§OΪÝÇydW͹l¹<,„ž8Íjë8¹Q’ ýëvéÛµ2O j’œÉ,N}ZB¥‚¬Ë¬FFQNH ‘ÂáÜqùVÏü"š‡÷ ÿ¾ÏøQÿ¦¡ýè?ï³þj2Í*GPFŒS<Ì\†ûÀ±çë[ðŠjÞƒþû?áGü"š‡÷ ÿ¾ÏøQ¨ÑÍ,@ˆät²±#ÈÛÙ«Ö×ü"š‡÷ ÿ¾ÏøQÿ¦¡ýè?ï³þj+Ë$„Ÿ7Ó¾Ñ0Ûûé>^Ÿ1â¶?áÔ?½ýöÂøE5ïAÿ}Ÿð£P1ÚâfûÓHxÇ,zzSRGO¸ì¼ƒÁÇJÚÿ„SPþô÷Ùÿ ?áÔ?½ýöÂ@È3®vÍ ÉÉÞMOf×7wIº‘7gæ.xÀϯµhÂ)¨zûìÿ…>/ jq8xÞÃ?ÅŸéF Bš}ôÊZ Æa»21óóO÷?Z¡æÝ7uÄ ÇÔo>¸­ÄÑu¨ÀÍn€tÛŽ¿ìûŸÌÔðŒj?ÏÏ÷¾o|úQ¨í쯮`ŽH¯]7…2œ¸¯ôÎh–ÇPŽ!º'j’G˜{¼!5z-Y…TG4 ´`sÈÏ\zóOm\h^<ï9ëþϹ4j¶„µ¤‰$Ƥ“ߊš¢¶C´HØÊ Â¥®µ±!ESÖŸ÷æú/þÍYZÇü}/û§ÿBjÕÓþüßEÿÙ«+Xÿ¥ÿtÿèM\Õ7/ÜÿÇÔÿõÑ¿™¨ê[¯øûŸþº7ó5o‚Š(ªΛÿŸöÍ¿˜­jÉÓãóþÙ·ó­XOâ (¢ aEà 9 ÒSQ–'½6˜‰L‚›æ{S)•³°UI8€$óµ'˜Õ:H¡£eu=ÔäR†V$+Tààô ùG˜}©§€IàôPHŽ'­?Ì>”¾gµW{ˆSç‰rHåÀéÖ¤3mVRp=hPëJ= Eµ½(Á¨j*Äw§ qH (¦‡Ú@Š( ŠGÎÆÚpppqš£ºpT¢Ê g!‰n®1æ~Š­hÓþv}FF*ÍL•€çÇJZAÒ–º (¢˜´ÿ¿7ÑöjËÖ?ãéÝ?úV¦Ÿ÷æú/þÍYzÇü}/û§ÿBj橸Ñ~ëþ>çÿ®üÍERÝÿÇÜÿõÑ¿E]Ù(¢Š`YÓãóþÙ·ó­Y:oü~Û6þbµ« üCAH̆m£Þ¡''š€˜µ%S¢Š(ªz”O4H« ’(}ÇË+GNƒWÕ;š’€9ϰê_*¨hU²ÙŒ†'«a€Î1ê)M–¤fm¦H„ŽÍ•þ»?0þ=k¢¢Ì)ío."™eK‚ÌØlJ62—usÙ~Ÿ]½IRæÒH y’ Ü+ † y?ZТ€9á¦^"9 ¥Ò   Ø–lg§QÍ[µŽkK›…[YJ•T‰\mUã©õÍkQ@ÚÆÚqZ«æÜ*HJ¹é· Ï^OÖ¦‘ÛÊp3»iÇÖª–»-ò–(?Ù<Ö°W]Ž…îÚD2n ‘‘·z«Z™›`ÀíïéViTz‚9ñÒ–t¥­V (¢˜´ÿ¿7ÑöjÌÖ?ãåÝ?úVžŸ÷æú/þÍYš¿ü|¯û§ÿBj橸Ñzïþ>çÿ®üê*–ëþ>çÿ®üÍE[Çd ¢Š*€³¦ÿÇçý³oæ+Xœ ÖN›ÿŸöÍ¿˜«ÓÜG‹6 ½« üCC‰Éɤ¨EÔ$$^3žôï9 3#Ú àÔ%!·•s–€cƒûΜgÓÓš>Í.@ÝHÈg_Ò•ÐÔˆ¸äõ§%´ÄI_Q'ÿZ”Ç(8&sõŸýj.†R˜¦ Xù!TdŸ3§éKäÏéýüÿëR¸ ¢”E1éäõÇúÏþµ9`¸e «R2óúQpEIökŸîEÿ}Ÿð£ì×?Ü‹þû?áEÀŽŠ“ì×?Ü‹þû?áQN$·]ÓQ}ZLåEÐ E0IÆNÓþéȤ2`IEC¹½hÜ}M1QPîoSK½©-÷ààûP1H­0¡©©ÏJ(Šý›Š}#(jgÌžâc¥- è)k¥l ¢Š)kOûó}ÿf¬Ý_þ>WýÓÿ¡5iiÿ~o¢ÿìÕ›«ÿÇʺô&®j›.¿ãîúèßÌÔu-×ü}Ïÿ]ùšŠ·ŽÈAEUgMÿÏûfßÌU¹mâ™ËºÇŒ÷ÿ<š§§ÇÙÿ®MüÅXºIÛoØëžü±øÖÜc¤'9RIêKLzÓ¼”ʃnWj¯úpÀÚ09ÎAÏãRL.¼àѰ ŸÌãò©V[˜¦M²DHúã¶*º¥šª¯ÇhÆKŸñ¬øÅîõÝÓœç£ßëJ­}´nEããJÈfª% Œ(·Âî Œž£¡¦˜,ÎsnyûçÓµMZû?4jGB:wþ•$¦mé´1ÀŽy¥`,­‡œ lV\n]ÜqžŸ™§yV…û>HéóÎò¯oÜOÏ»¹Û®*ìD’3å÷CŽ¥ÿg´Ág<œýãëŸ_Z³ëj‰ £gµgOs.óäMݸqœúЗRewËË|Ø~ƒŽœýjn—Ú¿Ø4}«ýƒYFâãp"æ2»‡ÍëV…ÔG¬¨?àb‹e¯•x(sU®§[… TmîwUîRsœ“ÏãN«²OAÎz’qŽôOJn8©€`SØC~¦œÔ´RQE`RSÚ–Š­ÐÉq4ÉûØq½O^@ ý9©²ËÔdSVÚ$¹k…P²8Ã>÷Lgò©hÒ—­!P~´™eëÈ  ÐRÒ‚–ºVÄ…QL Zß›è¿û5fêÿñòŸîŸý «KOûó}ÿf¬Ý_þ>SýÓÿ¡5sTÜh»uÿsÿ×Fþf¢©nÿãîúèß΢®ˆì„QE0,iÿñôë›1ZCNæìÿ×&þb´`‹ÍgÊHÀu±Ž+ »1¡´U´³F'rÌ9Ýœæ¡Kf+óC( /ñžryíÚ£˜dTU†µPp"¾b8nØëNŽÍë*ŒÝJ9€e¯(b™²qÃôý)M»l‚Kó¹Kr¼}>”®h¤0¾Ñû©(OÞÎ:tü*ÊÙ!Î^P3ÇÍEÀ¯EZûß“þú£ìÿ~Oûê‹V¢å¾•ìÿ~Oûê“û:#ürßT\ ú*ÿöt?Þ“þú£û:ïIÿ}Sæ¬c õ§U¯°Gýù?ïª>Á÷äÿ¾©\ ´U¯°Gýù?ïª>Á÷äÿ¾¨¸h«_`ûòßTÉ-$.ɦ‹QLŠ( Š( |t¥¤)k¥lHQEÀ³§œ<ßEÿÙ«?Vÿ„ÿtÿèMZ/6}ÿf¬ý[þ>ýÓÿ¡5sTÜh¹wÿsÿ×FþuKwÿsÿ×Fþuo‚Š(ªΛÿŸöÍ¿˜­Í4a§íåXzoü~Û6þb·¬>üßQü«ž¦ãEÊ(¢²QEQEQEQEQEQEQEQETW?êZ¥¨®ÔµP¢Š*À(¢Š(¢ŠçÇJZAÒ–ºVÄ…QL Zß›è¿û5gê ›…Ç÷Oþ„Õ¡§ýù¾‹ÿ³ULþýÝ?úW5MÆ‹7ñ÷?ýtoçQT·ñù?ýtoçQVñÙ(¢Š ,é¿ñùÿlÛùŠÞ°ûÓ}Gò¬7þ??í›1[Özo¨þUÏSq¢åQY (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š*+Ÿõ-RÔW?êZ€(QE`QEQEsã¥- éK]+bBŠ(¦­?ïÍô_ýš¨êë×ýÓÿ¡5^ÓþüßEÿÙªŽ§þ½Ý?úW5MÆ‹7ñù?ýtoçQT·_ñ÷?ýtoæj*Þ;!QT7þ??í›1[Özo¨þUƒ¦ÿÇçý³oæ+jÞA rFw\õ74(ªßkÝ4}¬pÖvfЧöõþáüèþÐ_î΋0.QTÿ´û‡ó£ûA¸:,À¹ESþÐ_îη¯÷ `\¢«}°tÑö±ýÓE€³EVûXþé£ícû¦‹fŠ­ö±ýÓGÚÇ÷MÍTÞ>á4ß·¯÷çE˜(ªÚ ýÃùÑý ¿Ü?`\¨®Ôµ@/ÔÿKr$Œ¨^´X ôQEPQ@Q@øéKH:R×JØ¢Š)kOûó}ÿfª:ŸúõÿtÿèMW´ÿ¿7ÑöjÏÕ.ýÓÿ¡5sTÜh·uÿsÿ×Fþf¢©nÿãîúèß΢®ˆì„QE0,é¿ñùÿlÛùŠ¿peê9Vc†ãÖ¨i¿ñùÿlÛùŠÓ’TŒ€íŒô¬'ñ c7I"™2È>¿ýj|t³¶Ä …€9ýjË:¨É r.G¨¨Q¼óÈľNzuoóüê%Îã•Ú£§yïÇzÒÈõ¦²†èy BØE³?>crƒŽM^û%¯üûÃÿ| ËÝ·¾?¹ÇÖ“C5>Ékÿ>ðÿß²Zÿϼ?÷À¬±!?Ä:]çûÇó£” ?²[ϼ?÷À£ì–ßóïýð+-¥ÛÕñøÒ‰<7ëG(d¶ÿŸxïGÙ-¿çÞûàU(ßÌ8 ƒõ§ãæÛæ ØÎ3Í+kì–ßóïýð(û%·üûÃÿ| ­´ÿ|~´€g£ƒF€Zû%·üûÃÿ| Gµ·JÁ pB ¯´ÿùÔjû†A$,%Jõ¤©é¦0zqV"*PHèh*GjJIê)ÁïPÑ@ÑPdކ—{zÐÔT[ÛÖíëH AÒ–‘~襮•°‚Š(¦­?ïÍô_ýš¨jŸñð¿îŸý ªþŸ÷æú/þÍT5Oøø_÷Oþ„ÕÍSq¢Õßü}Ïÿ]ùÔU-ßü}Ïÿ]ùÔU¼vB (¢¨ :oü~Û6þb´¤…$ugÚôçáYºoü~Û6þb¶P ¤5Ï=ÆŠÙ°g9º3éð¤þ̃ËÙºNÜäg¿·½]3.X›#?Ã×¼Û´Im"±8€ük;¡‘6Ÿ Ë ç8Ç®}=úÒÃe,YÉ Wœw9ô÷©>Ú˜9·”`‘÷} HïŸ(¨Ú®G=)Ü cK€ nrxÁ8ãƒíïHÖ1°$&q;œú{UêÏZ`g-„!JüÇ9äã=þ´õ´ctüç$ñþiŽœÓ)ˆ¦4èòijôéÇô§}‚,ä–?—¨öö«TPmZ®-€@Î?ÏzI‡žÛž21òÉŽùô§ÑI«[ù…LmãûsíïJ-'õíæ{cÒ¤§‰ëÍ.Q„^dHP:eÿúÔ蔬j§¨¡ïKE¬ES¤*QKE0Çèi¦3RÑ@íoJ0} Ou/»–''ס?Ò£Žíd( ÝÙqŽ¿áúÒæ˜>†§Ò¬G*Èp#+Æ~eÅG\ž¹?Κw~襤)k¥lHQEÀµ§ýù¾‹ÿ³U Sþ>ýÓÿ¡5_ÓþüßEÿÙ«?Uÿ…ÿtÿèM\Õ7-ÝÿÇÜÿõÑ¿ERÝÿÇÜÿõÑ¿E[Çd ¢Š*€³¦ÿÇçý³oæ+U—pÁ,³ü«–½3.ÃorÐ7 ‘žEW-©AÔäàã½a4Û:ÿ(zOûøßãG”?½'ýüoñ®G:–3ý©&3·¿ZBÚ€ÿk6 ÇSSÊû×ùCûÒ߯ÿj±#¦XŸç\}EXª¿##¯ùíJ[QUaøš9_`;+ŽÎ¥óÄÑþSƒÖ>£ÿAg\ÑÊÀ쩬€ýk‘?Ú@àê¯úÓwê9Çö«÷õíG+¬*GZJåKj<çU~:õ¤eÔUCMð~´ìûÕÑ\šh9ÂêŒOãH ùÿ˜£èsš,Àëh®QWP~TcÆ{Ò¨ gTa‘œsEŸ`:ÊPÄt5ɨ)çTn›»ô ý¼1Sª¶G¹¢Ï°€“ÔR‡SÞ¹/#Tÿ “þ´y§ýŸõ£•ö¯¢¹#Tÿ “þf—ÊÕè&ÿ™£–]€ë¨®GÊÕè&ÿ™£ÊÕè&ÿ™£–]€ë `’K>Oûmþ4žPþôŸ÷ñ¿Æ¹O+Uÿ ›þf+Uÿ ›þf—#ì:¿(zOûøßãNU ƒÞ¹/+Uÿ ›þfƒ¨zêOùš9`¹xt¥¦D¬‘"»neP õ4úè[(¢Š`ZÓþüßEÿÙ«?Uÿ…ÿtÿèMV iÎ#.Q©»×Ú©ê,|ØòI;Nr0~óW5MÆ[›iLò8QµœãŸsQ YJ³0½NáÅ,úÝ»P²†NJ;ûûÔqêöË ˆÞqg9ÈAÇ{Úš¨Òï²Ì †B»¸†3ùÒý–S&À¹o@sQ RÛÍGw‚ÁýZ&­fÒT›'žTpzg†ô£Ú0°­hírªÉžA¤[&ve.à2T€=piN±j-RY²yØ;cÞ’=fÜNòÈ%%”(ÿG´abOìéq)qר¤þÍ—þy'éRÿoÚrûä'ü$ŸÜŸþùãG´aa‡N”Œ”¨£û6_ù俘§ÿÂAiýÉÿï‘þ4ÂAiýÉÿï‘þ4{Fý›/?º^zò)?³eÿžKùŠ“þ OîOÿ|ñ¥þß´þäÿ÷Èÿ=£ ÿfËœùKŸ\ŠOìÉ?çŠ~•/öý§÷'ÿ¾GøÑý¿iýÉÿï‘þ4{F"þÌ—þx§éKýŸ61å®lŠ“û~Óû“ÿß#ühþß´þäÿ÷Èÿ=£ 6Pr"P}r)?³$Æ<”ý*_íûOîOÿ|ñ£û~Óû“ÿß#ühöŒ,Dšd¨>X”~"ìÙçŠ~•/öý§÷'ÿ¾GøÑý¿iýÉÿï‘þ4{F#:l¤`Ĥ{‘Iý›/üòOÒ¥þß´þäÿ÷Èÿ?·í?¹?ýò?ÆhÂÃ>ÁqýÁùŠ>ÃqýÁÿ} öý§÷'ÿ¾GøÒÂAgýÉÿï‘þ4{FöîûèQöîûèS¿á ³þäÿ÷Èÿ?á ´þäÿ÷Èÿ=£ û Ç÷ýô(û Ç÷ýô)ßÛö™dü²?ÆøH,ÿ¹?ýò?ÆhÂÃ~ÃqýÁÿ} >ÃqýÁÿ} wü$ŸÜŸþùãGü$ŸÜŸþùãG´aa¿a¸þàÿ¾…a¸þàÿ¾…;þ ?îOÿ|ñ£þ ?îOÿ|ñ£Ú0°ß°ÜpßBƒc8þÿ} wü$ÜŸþùãHÚõ› ¸Ç°úÑíXŒÛº¾ÂP1ì\fœlæ’ Ôî]õ&¹IüËàQJ…qƒøæ‹NÒm¡ZáT0T6ñê=£ -¬’Ç"„vVÛÌrl#ÿ¥ªÆÑÍuØ|¼ã9ÇÌ{Õèµ»8Sj¤ÙÀÉØ9>½k'WÔ¡¹¹FdSoÌ©>¾õw?ÿÙhttrack-3.49.14/html/images/header_title_4.gif0000644000175000017500000000370215230602340014566 GIF89a"»ÿÿÿkk¡??_{{¹ ++AUU€44Nvv±JJo-``!ù,Ž!@ÿÈI«½8ëÍ»ÿ`% $‰„hª®lë¾pŒAm m׸¶Û¡_MF ~„¢rÉl:Ÿ)pJ ô2Ó P#¨Ö“®·jiŒmàÉq—0„ ÔútAØ{ -©µ}5t6†kWb|:,; „…z˜ j<³ÇR¦?¡¼†MªÕ«X³jý'0`Ó  $úC‚Ž˜n¤ ³´Tµ+R Äó‡2&r@@BM‰¿%Nha±;°F  V°ã=ø>&A˜ Í :ÞT·™‚"Ë«EâdãÉ}%œþ +©:°cËÆôPÙYc[þPY!]m®·& ûÑÀÃ\* C`Ú9Ïœ›É&˜|›L.HlP™¥P´gWž #û‡5¼9¤ãÃrA+xV„˜ü:×ãà›ÛvðZý° ÿT QàÛ‘Ìõ‡{#±0`r — U$ 04ÅY`|„á# D)8pÇÞ5"+EUR.å£4=ì‡ÔQ@ØÕSPå·•Olü(äDù+v%L9¥£’Fv `”TViåUH^e,RØå•/ æ˜d–Å“SøÖ5].EÕ6´QqÙÂÔ¢˜}dôhMÀ‹Š<—g"ù§MKND+ìõÄ$fÙÙA~,ºCLqbéD¬aq&`“=j˜h3›Ú`‰khªù%A·˜lçH8ÑIít 0°Î” •?™ÈIŒB}”ç…\ ’NÿG˜¤fˆÈ’GbúX¤xhQ|ºýAjµáT+Fªï%ù›—±z°¦nÿW!¼Þºiœ]ÁBˆ›©ËNÀ=ÞúB¨ÀHŒ·MÊ~K­°ò ѧÀ!è ­|£P±Í¸^•R¤Pj‰#»ñŠÕn¹#O@i ˆfz- cÞ= 4àEnÑ¡ ú³m3ÄT6o³`2±ª "D®~+`¬3Hˆ( æb§02,+b0tÇ/q kÈl–LoÒ;{1 Ùƒœ13žÑñôyS×’¦‹ÖMÀœÀ6Àa€JA8pX£à’^¥v/ª76l ÀÌ6:Û*—wÿ]WdxÝrKŽ?[6\x©!åˆfáfÂ'Lë°Ç.{é#B‰úÀ·S11•SÊîûïVÒn­í«“’{š¾÷üòÌo%<Ç¿­ö×%"} Ô;¦ï˜Ê7ïý÷M<¿õº\Ší_ÀËwþúì» ¾ø¼{>Ú8Y>$0ðö H6€R_û@@+Ø 6!@`ì\ó©ÏÕ yóã—»Ú´ÚÄ„U…h Töƒµ½Nc•ðÀr4€ŒÅ ':ƒÒÁî ¯³í =à@]0x4 €†Gk™¤U1‡iîtA9•>‚ÃñÇ|sÛØ|è§Õ•Awúàølp³ JVãñV2d# ÿ`£‡Á'vb†*’êr58€l¨!1.Âf{¨ÓU "´!, ^ÙÃ˜ÐÆÔèÆÎÅÈ0@(b“ލÄrŠÐ³ ɲCØØYS:뚆BíB#ô³"ˆ5l}TÛä©wE„ñ¹z™¬Ôq'XèA\U{Ø*+`,tÏUH*AH´ äªqŠËöWa\f”ÐG×â× 1Ââg¤ôbÒŒ€ÀÑ;»œf Ò‘° póÒx™wÚñŒé2GÛ`çû>öÄa&ÑžªKWíéÂ%¾³‡UàaøD~X¯BÏú©ˆ*-ÓãÆJ‹1ÿb5¥9«ò‰8€!0¬Â)ßàaž^+[#ïI¿|¢-)Ðäf½†x/6È›F˜P;^&Mm‹…Ôæt 9T8TQ8áé1+Ž Å¨*eD×5î3MV! 9¬Frs_ª6ƒYÏ–jÐÇŒ[X‚UÅ LÉVøì±ŒU>õ4›ü¹P†äZ”ŠQ´©*à‡FÜ‚™#MHaÝ¢ÕŒ6íSŸ]#ŸB[ZÖV.1ÁêäFzB¨x°*ðÛ@œÊÉ2Ny šÚd–Ð&ðQI¬h$cå ¤AÚ ðƒWÀ„RÁê×Ð]Mt5à J%«Ò¸NÖ²ÄDnX™’[¦|¶ªVo­¡ÛJWž–M‚ÈÐG6!­\õ6¶€]o /Èr m:²TÎù–±|ÈZXó?ù±T¹.Å/†2‹²³Z@‡Œâ¼–‚[Njí̀㠵± UAEKÑð,ê´R/™gX\{k™ÜXI˜F;httrack-3.49.14/html/images/bg_rings.gif0000644000175000017500000001021315230602340013477 GIF87aõȪÌÌݹ¹ÐÄÄ×¾¾ÓÇÇÚ½½Ò,õÈ@ÿºÜþ0ÊI«½8ëÍ»ÿ`(Ždižhª®lë¾p,Ïtmß"!CàÿÀ pH,ȤÒ8h¸¨tJ­Ât…¥vËíz¿à0Øi-›ÏhBOÌn»ßð¸œ](@Ñø¼y=ïûÿBM;wzO;M€m…ŽŠ“”C„™X•š $’¤n¡¨¡—œx±åÇ—4ïúõ·suУ+Ž×xËw×§AÖ¾„{ß¿͇Ïä<ßÝDK«_½û-óg—;`:ýÿã݇ßñ CÿÁ°ŸZä'šM Î!È—i$=ÉÊ‘L¾”¤’”ô×ä”Ó< å9dP©%$V^é‡Ow£a[>Ò¢—h¢Yæ4g¦éfmk^Eâ›tž'qsÖ©'wö™Wž{Béç )"d }0B#¡Œª“á£Fúh£”Vjé”R¸!‡‰„Áé„fxé¨CЍ6ûê§§¶ZD–ªRÔ¦«´S@‘±¶ph­>(:Û=».„k¬;"Š`®l”è¢ÿ#º:,²6¬b ³Ká˜"µÐÚ"í{Òé`¶“û¶Ut¹àîö!xgXëºén9+2˜ë¼ñf`!…Ÿ ù©¦r•Ý·†\Ip®óòÚë³Sd”½e ±pŒ\ƒ†Êq«Fàîq•ÆøÃõ(›R×v0‹-‘ž©–˜0qaò¦–oS9X¬MÎlÛÍ$ˆ,•’.ßµsd@× ®Ê5d]Ò5ø,WÑe¥,!ÔRHÖÊn-}5ÖR- ÕN%vÖÃgöÙQˆ=ölVͶ^÷FöKu/97ÝhâkPÜ}ì6šwˑ߂k7È›¥—x´o"¾ÎG\?àÿÑ= ãw–ǰ¸v¢aRç,hý¥hŸ+¢9é¢ì¹úa¦û!yânóXùS±2;Ø© ¸;’òýnîç:G|)…g+:ˆ·«ÕûEïý<ˆÂÓ4}e°Z*²³L¯pO-OôšÛ~¯Ådâ§2Ìt®v=ásë°!R©齗ɳžíû§æ¯ÿ¥µ3_yü÷¿>ñO€¯ª^Y”>¾!{ë¹Ç8ö9Ð[ý:à‹(˜ ^ðƒá Â&A„™°  i…ÂuHp…Cj!pTC;ÉTó ö|uÃúð‡@ ¢‡HÄ"v.‡ U˜ŒˆµÖ õcbxLöÄ`@PŠ%ÓaÿeQb±$Ü¢›vðÅz‰QŒÇ*#ÂxÆj“Zã£4µ)-Rbc_¼_š¢ØCÙ1D^¤Ôöx«@:ʼnÀ#ØX§è勊} }þXEŠ’.‰Ó é$IÒ±± Ò©š§FÐ0D¡ ”!ÕX¾/„Ò ¬Í+KÉS]!¡$RVIËز(éàd/¥ñ$RR‘¾&E’dL¸‰—ÊÔC°fÉ] 'š}YP3??l®f?¸\çÍÿ)œ"§‰z(?kzCŽÄNyp¡¾Ç!ƒÐDAvŠTϤýò‚WÌÃrü¥mRI„¤¦ 2+!Ìúˆ§#€5ÿ­rù ÈìA#X‰†“I’E•”Oµ ô "Í?ÒœTƒÊh%6Š—V!”2½—&)7ªSÞ J%í D‘ðºýaXCµ¢–^JÔÎME%9-MP U½q0¼`ª3ŠJ­ÞtˆÈÚhZ¯¡—I•̂͢ÖȬBP¨àÒ ŒÑ5Sõ'P»:rV{͇\-w×XäÕ…`9ð×Ê„gmÞ„k]Yo&¶ιlË/ái ƒe—k‹¦pV±ÜÚ¯ØzZhi*5íi% ²–,!¶•a7'[ÎÒ(¨SHk&Ò¢bœmliBk äÿ.ö·juŒráÀ\ºI41.Ô^kØÍp÷¢¾}Óm>¢Ý›Mw¹°Ùb…)™ïú€«¬¤Sy3áÞ^y³‘émInY]TW'ðeb}c[¤T7i©E¯w¿rà|Ê}hi0¸µ_yÊe¾”JðéV£á> ó‡®íj#aí*ÀÝQp;\ ‡"ÄP”áyÝSázô—#„±3JlŒ'ÅÅëÑñ3¦Èâڙü:r*|Ì %ßEÈÚàq• ÔÅ\AY(^Í'•T‡AXÁÉ` ”ÓqåæcvT™$”»(Í6.röÁOf¥µM áÜf<§)›+äó‰lêPÇ0ÿ°D›%g Hûâ×§’P€…j‰q:´,‡kÀ6²Ìœ–ÆšÓÒPiÔ*6õ[=}P«Z[fõ§_MœMÊši¤µ`l}ëºZ×8@µ› l“ø¹×Iáád@ªØjÙ?P¢‹s¨A"ÚÈ.å³±í¢ç6šÛ×Uu¬Á­°b;`ÜänŸ¹/€ît§hݾü¶»a ïì`Þ «wÛoáê{¢üî÷$þ{ ?%8MÚyÆŠ)|UòÛ©+V¡‡[üâϸÆ7ÎñŽ{üã ¹ÈGNrýiHâß'K~'?bÐ ¿fù\þD>ÊÜ…·Íoëk ¼Ë1ÿïxÎnŠ„óüjö«|t´›è[ýpÓM)o¨+"×#÷¹Õ ƒu‹k}ëÚ)u±•öIt}±O/;,ÙË´o±·ªq#=¿Â°½ˆÛ&OłތQŽï5âõn4ƒGwyçÑáS÷Xˆ}ndÇà‡’tR<>_‘߯ä?úõmÞz¼ü͆n™X%^°¼÷Nåf‰^„¤ççm‘y@<úR±Ÿ “Z¯Ûoz¯ÿf«ì,ÃÎG{öU¨ú…õíö˜IFùT!~|Ùàû2ð>Õ‡XõQ¦'é·ù?ؾ  ÿ‘,—üÁ÷FíK?uYÍû [{û7Ð|ñƒàú{±?ÿ­—–~P?7ów^ 69X:É0yÿ7ÈoIB€ŒõLxÁÕT\8s»Ò3&ÈsxFZø‡æ—Áö3Z&È%8Â\ë×%¸‚ep( µ€2!ƒµ°¡dƒÎ€ƒÄ x>à?^bÈ‚DŽGq˜&+r7«–8 49 ëøÙK?yu5²ØD“ ÙŠÑÿ¤”C H™”‚Â2¨‡MÙy }åMMy•–ØDe%[É$E©giFš±XPWáqY=y6YÙa)sy6„H•õ”žÈ—<9[{9}Mý´CYNuÉkéšÕZ_˜ê€­õ–BИ(™ÉåY»‘˜åd™²š”–¢‚Âו‚yŠØZÃ5„³qcõ˜ÔG˜¬Y™¦™_ù€™L¢&ˆé™‘Å›¸‰—Ú \…Mi9 É Aš•‚&y™ ‘‰ÎÙ(²Éщ >VŒrIQ`µÉYÄš ¶’§•œ”`œÇ9Lè9på集ùgïI™œ%íÜÿ9(cœù°œE4lü™›õnÒENåd€Ï—]‹Õž@9ŸN³ âêeYêÉ©›ÿá‹ ¨©Lª•¼uþùCÓ‰Ÿª™Ã4g›žÙ™.ã‰k'Š¢ÚV'º:Ñ¢ÐR¢ô˜ œC”ø%¡»DKê5Ú:ÍXJz2¢¢D?¥ô¢ÿxŸTQ¤@ú£Pʤ_Ä €¡žA*E:*¢VXä¤E ¤KŽ8*H¦eùgDbú’·¥@Ÿôa,³±frÚ,izš{q¦}§–·~ ç¸@]Ú£zÚQ>4¤q@¦O!lÆ8W­"¥&P¨ßÙBJ wzÞɧÎè*œúb•z®ÿ¨WQ{:z´"©ÁØ{¬Ó¦N™Yäq‹ÛE+ƒª¯(«ùr©±©Žx–.ºZ µª”=ªÚ ÁŠ<æä"§ê'®**’¼: Ϻ5"¦]†Šß3­UP­½ÒÇß®,`‡†¸^äwോD®åê­q[æ3¬¢ v!‘¬"Ö=øêxz5o=¡¨3宯éÙfûj++æÊ+¥úA KŪnWA©Ø'/;Yea°¦A(¬Ø*o‘±ZA)PœoÁ±ÉÐS"+»C›c¢šçCŸêò“°Jð¦5Ä­%3Šž0ijKa„¥0!I­U$´>‰bÿ¤´Kû@ˆfO[žV³SfUû²7·² á´O˵ «W«ÐÖ¬c[Üf¶gk}8Kj^;([ o;`ûš¸¶upj‹·4·FÆ·…P·QH€{ [µs›}j„[¸Qà·úµ·ŽÛwk·¿Ê"‰ë!m['0÷+„&ª‹‹¡¸p†'ˆ($¸Ã‡®·ÐN½“¨¡‹*‡ˆˆ÷§ˆuD`A4±¯ ²Et¸¹{*eT¹½Û½„»ÁË#Z¼4[À‹¼›jÄ˼®lÏ ½rQoÓK½ñªp%‹½“q¼Ë½ÊqÛ ¾Îr×K¾tÈs‹¾=8ã˾~°´ë ¿t¶•XG¿0¹ 0¿ø»úïÛ¿Íû¿‰x¿|VìtG¿VÛt†Ò»£›À «hiKFÜs ü=\xÁÝ@´Ì³wZËÁúrruôGœ0G+Â*¼Â,ÜÂ. o ;httrack-3.49.14/html/div/0000755000175000017500000000000015230604720010622 5httrack-3.49.14/html/div/search.sh0000644000175000017500000000341415230602340012341 #!/bin/sh # Simple indexing test using HTTrack # A "real" script/program would use advanced search, and # use dichotomy to find the word in the index.txt file # This script is really basic and NOT optimized, and # should not be used for professional purpose :) TESTSITE="http://localhost/" # Create an index if necessary if ! test -f "index.txt"; then echo "Building the index .." rm -rf test httrack --display "$TESTSITE" -%I -O test mv test/index.txt ./ fi # Convert crlf to lf if test "$(head index.txt -n 1 | tr '\r' '#' | grep -c '#')" = "1"; then echo "Converting index to Unix LF style (not CR/LF) .." mv -f index.txt index.txt.old tr -d '\r' index.txt fi keyword=- while test -n "$keyword"; do printf "Enter a keyword: " read -r keyword if test -n "$keyword"; then FOUNDK="$(grep -niE "^$keyword" index.txt)" if test -n "$FOUNDK"; then if ! test "$(echo "$FOUNDK" | wc -l)" = "1"; then # Multiple matches printf "Found multiple keywords: " echo "$FOUNDK" | cut -f2 -d':' | tr '\n' ' ' echo "" echo "Use keyword$ to find only one" else # One match N=$(echo "$FOUNDK" | cut -f1 -d':') PM=$(tail "+$N" index.txt | grep -nE "\(" | head -n 1) if ! echo "$PM" | grep "ignored" >/dev/null; then M=$(echo "$PM" | cut -f1 -d':') echo "Found in:" tail "+$N" index.txt | head -n "$M" | grep -E "[0-9]* " | cut -f2 -d' ' else echo "keyword ignored (too many hits)" fi fi else echo "not found" fi fi done httrack-3.49.14/lang.indexes0000644000175000017500000000026115230602340011311 bg:27 es:3 cs:21 zh_tw:14 zh:13 hr:29 da:15 de:4 et:16 en:1 fi:28 fr:2 el:26 it:9 ja:19 mk:18 hu:11 nl:5 no:23 pl:6 pt_br:12 pt:7 ro:25 ru:8 sk:20 sl:24 sv:17 tr:10 uk:22 uz:30 httrack-3.49.14/lang/0000755000175000017500000000000015230604720010015 5httrack-3.49.14/lang/Uzbek.txt0000644000175000017500000011245115230602340011556 LANGUAGE_NAME Uzbek Latin LANGUAGE_FILE Uzbek LANGUAGE_ISO uz LANGUAGE_AUTHOR Shamsiddinov Zafar (zfrx94 at mail.ru) \r\n LANGUAGE_CHARSET windows-1251 LANGUAGE_WINDOWSID Uzbek Latin OK OK Cancel Bekor qilmoq Exit Chiqish Close Yopmoq Cancel changes O’zgarishlarni bekor qilmoq Click to confirm Tasdiqlamoq Click to get help! Yordam olmoq Click to return to previous screen Ortga qaytmoq Click to go to next screen Keyingi ekranga o’tish Hide password Parolni berkitmoq Save project Loyihani saqlamoq Close current project? Joriy loyiha yopilsinmi? Delete this project? Ushbu loyiha o’chirilsinmi? Delete empty project %s? Bo’sh %s loyihasi o’chirilsinmi? Action not yet implemented Hozircha tadbiq etilmagan Error deleting this project Loyihani o’chirishda xatolik Select a rule for the filter Filtr turini tanlamoq Enter keywords for the filter Filtr uchun qiymat kiritish Cancel Bekor qilmoq Add this rule Bu shartni qo’shmoq Please enter one or several keyword(s) for the rule Filtr shartini kiriting Add Scan Rule Filtr qo’shmoq Criterion Turni tanlamoq: String Qiymat kiritish: Add Qo’shmoq Scan Rules Filtrlar Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Niqobdan foydalanib siz bir necha manzillarni bira yo’la mustasno/yoqishingiz mumkin\nFiltrlarni ajratish uchun vergul yoki probeldan foydalaning.\nMasalan: +*.zip -www.*.com,-www.*.edu/cgi-bin/*.cgi Exclude links Mustasno qilmoq... Include link(s) Yoqmoq... Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Maslahat: Agar hamma gif-fayllarni ko’chirib olmoqchi bo’lsangiz, unda +www.someweb.com/*.gif. filtrdan foydalaning.\n(+*.gif / -*.gif barcha gif-fayllarni barcha saytlardan, ko’chirib olishni ruxsat etadi/taqiqlaydi.) Save prefs Moslashtirishni saqlamoq Matching links will be excluded: Ëèíêè, óäîâëåòâîðÿþùèå ýòîìó óñëîâèþ áóäóò èñêëþ÷åíû: Matching links will be included: Ëèíêè, óäîâëåòâîðÿþùèå ýòîìó óñëîâèþ áóäóò âêëþ÷åíû: Example: Masalan: gif\r\nWill match all GIF files gif\r\nHamma gif fayllarni aniqlaydi (yoki GIF) blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\n'blue' nomi ostidagi hamma fayllarni topadi, masalan 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\n'bigfile.mov' faylini topadi, ammo 'bigfile2.mov' faylini emas cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\n'cgi' satriostidagilarni topadi, /cgi-bin/somecgi.cgi ga o’xshash cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\n'cgi-bin' jildi tarkibidagi manzillarni tutib olmoq (lekin cgi-bin-2 emas, masalan) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nwww.someweb.com, private.someweb.com v. b. shunga o’xshash havolalarni tutib olmoq someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nÎòëîâèò àäðåñà òèïà www.someweb.com, www.someweb.edu, private.someweb.otherweb.com è ò.ä.\r\n www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nÎòëîâèò àäðåñà, òàêèå êàê www.someweb.com/... (íî íå òàêèå, êàê private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nÎòëîâèò âñå ëèíêè òàêèå, êàê www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html è ò.ï. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nÎòëîâèò òîëüêî www.test.com/test/someweb.html. Çàìåòèì, ÷òî íåîáõîäèìî óêàçàòü ïîëíûé àäðåñ ðåñóðñà - õîñò (www.xxx.yyy) è ïóòü (/test/someweb.html) All links will match Barcha havolarga ruxsat etilgan Add exclusion filter Mustasno filtrni qo’shmoq Add inclusion filter Faol filtrni qo’shmoq Existing filters Qo’shimcha filtrlar Cancel changes O’zgarishlarni bekor qilmoq Save current preferences as default values Joriy sozlanmani odatiy tarzda saqlamoq Click to confirm Tasdiqlamoq No log files in %s! %s-da log fayl mavjud emas! No 'index.html' file in %s! %s-da index.html fayli mavjud emas! Click to quit WinHTTrack Website Copier WinHTTrack Website Copier dasturidan chiqish View log files Log fayllarni ko’rish Browse HTML start page Boshlang’ich html sahifani namoyish etmoq End of mirror Ko’zgu yaratish bajarildi View log files Log fayllarni ko’rish Browse Mirrored Website Ko’zguni ko’rish New project... Yangi loyiha... View error and warning reports Xatolik va ogohlantirishlar haqidagi hisobotni ko’rish View report Hisobotni ko’rish Close the log file window Log oynasini yopish Info type: Ma’lumot turi: Errors Xatolar Infos Ma’lumot Find Izlash Find a word So’zni izlash Info log file Log-fayl haqida Warning/Errors log file Xatolar/Ogohlatirishlar log fayli Unable to initialize the OLE system OLE tizimiga kirib bo’lmadi WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack ko’rsatilgan jilddan bekor qilingan yuklama keshini topa olmadi! Could not connect to provider Provayder bilan bog’lanishning imkoni yo’q receive olindi request so’rov connect bog'lanish search izlash ready tayyor error xatolik Receiving files.. Fayllar olinmoqda.. Parsing HTML file.. HTML fayli tahlil qilinmoqda... Purging files.. Fayllar o’chirilmoqda... Loading cache in progress.. Keshni yuklash ketmoqda.. Parsing HTML file (testing links).. HTML fayli analizlanmoqda (havolalar tekshirilmoqda)... Pause - Toggle [Mirror]/[Pause download] to resume operation To’xtatildi (davomo etish uchun [Ko’zgu]ni/[Ko’chirishni to’xtatib turish]ni tanlang) Finishing pending transfers - Select [Cancel] to stop now! Ko’chirishni kechiktirish tugatilmoqda - bekor qilish uchun, Cancelni bosing! scanning tekshirilmoqda Waiting for scheduled time.. Tayinlangan vaqt boshlanishu kutilmoqda.. Connecting to provider Provayder bilan bog’lanilmoqda [%d seconds] to go before start of operation Boshlanishiga [%d soniya] qoldi Site mirroring in progress [%s, %s bytes] Ko’zgu yaratilmoqda [%s, %s bayt] Site mirroring finished! Ko’zgu yaratish bajarildi! A problem occurred during the mirroring operation\n Ko’chirib olish jarayonida xatolik yuz berdi\n \nDuring:\n Davomida:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Agar, zarurat bo’lsa, log faylni ko’ring.\n\nWinHTTrack chiqish uchun OKni bosing.\n\nWinHTTrackdan foydalanganligingiz uchun tashakkur! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Ko’zgu yaratish bajarildi.\nDasturdan chiqish uchun OKni bosing.\nKo’chirib olish muvaffaqiyatli bajarilganligini ko’rish uchun log fayl(lar)ni ko’ring.\n\nWinHTTrackdan foydalanganligingiz uchun tashakkur! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * KO’CHIRIB OLISH BEKOR QILINDI! * *\r\nÂðåìåííûé êýø, ñîçäàííûé âî âðåìÿ òåêóùåé ñåññèé, ñîäåðæèò äàííûå, çàãðóæåííûå òîëüêî âî âðåìÿ äàííîé ñåññèè è ïîòðåáóåòñÿ òîëüêî â ñëó÷àå âîçîáíîâëåíèÿ çàêà÷êè.\r\nÎäíàêî, ïðåäûäóùèé êýø ìîæåò ñîäåðæàòü áîëåå ïîëíóþ èíôîðìàöèþ. Åñëè âû íå õîòèòå ïîòåðÿòü ýòè äàííûå, âàì íóæíî óäàëèòü òåêóùèé êýø è âîçîáíîâèòü ïðåäûäóùèé.\r\n(Ýòî ìîæíî ëåãêî ñäåëàòü ïðÿìî çäåñü, óäàëèâ ôàéëû hts-cache/new.]\r\n\r\nÑ÷èòàåòå ëè âû, ÷òî ïðåäûäóùèé êýø ìîæåò ñîäåðæàòü áîëåå ïîëíóþ èíôîðìàöèþ, è õîòèòå ëè âû âîññòàíîâèòü åãî? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * XATOLIK! * *\r\nJoriy ko’zgu - bo’sh. Agar yangilanadigan bo’lsa, oldingi ko’zgu tiklanadi.\r\nSababi: birinchi sahifa(lar) topilmadi yoki bog’lanib bo’lmadi.\r\n=> Veb-saytning mavjudligiga ishonch hosil qiling, è/yoki proksi-serverning o’rnatilganligini tekshiring! <= \n\nTip: Click [View log file] to see warning or error messages \nMaslahat: Xatolik va ogohlantirishlar haqidagi xabarni ko’rish uchun [log faylni ko’rish]ni bosing. Error deleting a hts-cache/new.* file, please do it manually hts-cache/new.* faylini o’chirishda xatolik, iltimos, uni o’zingiz o’chiring.\r\n Do you really want to quit WinHTTrack Website Copier? Siz haqiqatan ham WinHTTrackdan chiqishni xohlaysizmi? - Mirroring Mode -\n\nEnter address(es) in URL box - Ko’zgulashtirish rejimi -\n\nURL maydoniga manzil(lar)ni kiriting. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interfaol rejimi - 'Wizard' uslubida ko’zgu yaratish (so’rovlar bo’lishi mumkin) -\n\nURL maydoniga manzil(lar)ni kiriting. - File Download Mode -\n\nEnter file address(es) in URL box - Alohida fayllarni ko’chirib olish rejimi -\n\nURL maydoniga manzil(lar)ni kiriting. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Havolalarni sinash rejimi-\n\nSinab ko’rishni xohlasangiz, URL'lari mavjud sahifa manzilini kiriting. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Yangilash rejimi -\n\nURL maydonidagi manzil(lar)ni tekshiring, so’ngra 'Keyingi' tugmasini bosing. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Olding hosil qilingan ko’zguni davom etirish rejimi -\n\nURL maydonidagi manzil(lar)ni tekshiring, so’ngra 'Keyingi' tugmasini bosing. Log files Path Log fayl yo’lagi Path Yo’lak - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Ro’yxatdan ko’zgu yaratish rejimi-\n\nKo’zgu yaratish uchun URL maydoniga manzil(lar), sahifa(lar)ni kiriting. New project / Import? Yangi loyiha / import qilinsinmi? Choose criterion Amalni tanlang Maximum link scanning depth Tekshirish maksimal teranligi Enter address(es) here Manzilni kiriting Define additional filtering rules Qo’shimcha filtrni tayinlang Proxy Name (if needed) Proksi nomi, agar kerak bo’lsa Proxy Port Proksi-server porti raqami Define proxy settings Proksini o’rnatishni tayinlang Use standard HTTP proxy as FTP proxy HTTP proksini FTP proksiday ishlatish Path Yo’lak Select Path Yo’lakni tanlang Path Yo’lak Select Path Yo’lakni tanlang Quit WinHTTrack Website Copier WinHTTrack Website Copierdan chiqish About WinHTTrack WinHTTrack dasturi haqida Save current preferences as default values Joriy o’rnatishni odatiy qilib saqlamoq Click to continue Davom etirmoq Click to define options Ko’chirish parametrini belgilamoq Click to add a URL URL qo’shmoq Load URL(s) from text file Matnli fayldan URL(lar)ni yuklamoq WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack sozlanmalari (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Manzillar ro’yxati matnli fayli(*.txt)|*.txt|| File not found! Fayl topilmadi! Do you really want to change the project name/path? Loyiha/yo’lak nomini o’zgartirishni xohlaysizmi? Load user-default options? Sukut bo’yicha o’rnatish yuklansinmi? Save user-default options? Sozlanmalar saqlansinmi? Reset all default options? Sukut bo’yicha barcha parametrlar qayta o’rnatilsinmi? Welcome to WinHTTrack! WinHTTrackga xush kelibsiz! Action: Faoliyatlar turi: Max Depth Maks. teranlik: Maximum external depth: Tashqi saytlarning maksimal teranligi: Filters (refuse/accept links) : Filtrlar (havolalarni yoqmoq/o’chirib qo’ymoq) Paths Yo’laklar Save prefs Sozlanmalarni saqlamoq Define.. Belgilamoq... Set options.. Parametrlarni moslamoq... Preferences and mirror options: Ko’chirib olish parametrlarini moslash: Project name Loyiha nomi Add a URL... URLga qo’shmoq... Web Addresses: (URL) Veb manzil: (URL) Stop WinHTTrack? WinHTTrack to’xtatilsinmi? No log files in %s! %s da log fayllar yo’q! Pause Download? Ko’chirib olish to’xtatib turilsinmi? Stop the mirroring operation Ko’chirib olishni to’xtatish Minimize to System Tray Tizim treyiga berkitmoq Click to skip a link or stop parsing Havolani o’tkazib yuborish yoki fayl analizini to’xtatish Click to skip a link Havolani o’tkazib yuborish Bytes saved Saqlangan bayt: Links scanned Tekshirilgan havolalar: Time: Vaqt: Connections: Bog’lanish: Running: Holati: Hide Berkitmoq Transfer rate Ko’chirib olish tezligi: SKIP O’TKAZIB YUBORISH Information Ma'lumot Files written: Saqlangan fayllar: Files updated: Yangilangan fayllar: Errors: Xatoliklar: In progress: Prossesda: Follow external links Tashqi havoladan fayllarni olmoq Test all links in pages Sahifadangi barcha fayllarni tekshirmoq Try to ferret out all links Barcha havolalarni aniqlashga harakat qilmoq Download HTML files first (faster) Avval HTML-fayllarni ko’chirib olmoq (tez) Choose local site structure Saytning mahalliy strukturasini tanlamoq Set user-defined structure on disk Tayinlangan saytning mahalliy strukturasini o’rnatmoq Use a cache for updates and retries Èñïîëüçîâàòü êýø äëÿ îáíîâëåíèÿ è äîêà÷êè Do not update zero size or user-erased files Íå êà÷àòü ôàéëû, êîòîðûå áûëè îäíàæäû ñêà÷àíû, äàæå åñëè îíè íóëåâîé äëèíû èëè óäàëåíû Create a Start Page Boshlang’ich sahifani yaratmoq Create a word database of all html pages Ñîçäàòü áàçó äàííûõ ñëîâ, ñîäåðæàùèõñÿ â html-ñòðàíèöàõ Create error logging and report files Ñîçäàòü ëîã ôàéëû ñ èíôîðìàöèåé î ðàáîòå è îøèáêàõ Generate DOS 8-3 filenames ONLY Ñîçäàâàòü ôàéëû â DOS-ôîðìàòå 8.3 Generate ISO9660 filenames ONLY for CDROM medias Ñîçäàâàòü èìåíà ôàéëîâ â ñòàíäàðòå ISO9660 òîëüêî äëÿ CDROM Do not create HTML error pages html-xatoliklari fayllarini yozmaslik Select file types to be saved to disk Diskka saqlash uchun fayl turini tanlang Select parsing direction Âûáåðèòå íàïðàâëåíèå ïðîäâèæåíèÿ ïî ñàéòó Select global parsing direction Âûáåðèòå ãëîáàëüíîå íàïðàâëåíèå ïðîäâèæåíèÿ ïî ñàéòó Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Óñòàíîâèòü ïðàâèëà ïåðåèìåíîâàíèÿ ëèíêîâ êàê äëÿ âíóòðåííèõ (çàêà÷èâàåìûõ) òàê è äëÿ âíåøíèõ (íå çàãðóæàåìûõ) àäðåñîâ Max simultaneous connections Ìàêñèìàëüíîå ÷èñëî ñîåäèíåíèé File timeout Ìàêñèìàëüíîå âðåìÿ íå àêòèâíîñòè çàêà÷êè Cancel all links from host if timeout occurs  ñëó÷àå ïðåâûøåíèÿ âðåìåíè îæèäàíèÿ îòìåíèòü âñå ëèíêè ñ äàííîãî õîñòà Minimum admissible transfer rate Ìèíèìàëüíî äîïóñòèìàÿ ñêîðîñòü çàêà÷êè Cancel all links from host if too slow  ñëó÷àå, åñëè õîñò ñëèøêîì ìåäëåííûé, îòìåíèòü âñå ëèíêè ñ äàííîãî õîñòà Maximum number of retries on non-fatal errors Ìàêñèìàëüíîå ÷èñëî ïîâòîðíûõ ïîïûòîê, â ñëó÷àå íå ôàòàëüíûõ îøèáîê. Maximum size for any single HTML file Ìàêñèìàëüíûé ðàçìåð ëþáîãî html-ôàéëà Maximum size for any single non-HTML file Ìàêñèìàëüíûé ðàçìåð ëþáîãî íå HTML-ôàéëà Maximum amount of bytes to retrieve from the Web Ìàêñèìàëüíîå êîëè÷åñòâî áàéò, äîïóñòèìûõ äëÿ çàêà÷êè Make a pause after downloading this amount of bytes Ïîñëå çàãðóçêè óêàçàííîãî ÷èñëà áàéòîâ, ñäåëàòü ïàóçó Maximum duration time for the mirroring operation Ìàêñ. ïðîäîëæèòåëüíîñòü çåðêàëèçàöèè Maximum transfer rate Ìàêñ. ñêîðîñòü çàêà÷êè Maximum connections/seconds (avoid server overload) Ìàêñ. êîëè÷åñòâî ñîåäèíåíèé â ñåêóíäó (íå ïåðåãðóæàòü ñåðâåð) Maximum number of links that can be tested (not saved!) Ìàêñèìàëüíîå ÷èñëî òåñòèðóåìûõ ëèíêîâ (òåñòèðóåìûõ, à íå ñîõðàíÿåìûõ!) Browser identity Èäåíòèôèêàöèÿ áðîóçåðà (ñòðîêà User-Agent) Comment to be placed in each HTML file Êîììåíòàðèé, ðàçìåùàåìûé â êàæäîì HTML ôàéëå Back to starting page Boshlang’ich sahifaga o’tish Save current preferences as default values Ñîõðàíèòü íàñòðîéêè êàê çíà÷åíèÿ ïî óìîë÷àíèþ Click to continue Davom etmoq Click to cancel changes O’zgarishlarni bekor qilish Follow local robots rules on sites Ïîä÷èíÿòüñÿ ïðàâèëàì äëÿ ðîáîòîâ, óñòàíàâëèâàåìûì ñàéòàìè Links to non-localised external pages will produce error pages Ïî ññûëêàì íà âíåøíèå ñòðàíèöû (íå ñêà÷àííûå) áóäåò ïåðåõîä ê ñòðàíèöàì îøèáîê Do not erase obsolete files after update Íå óäàëÿòü ñòàðûå ôàéëû ïîñëå ïðîöåäóðû îáíîâëåíèÿ çåðêàëà Accept cookies? Ðàçðåøèòü cookies? Check document type when unknown? Ïðîâåðÿòü òèï äîêóìåíòà, â ñëó÷àå êîãäà îí íå èçâåñòåí? Parse java applets to retrieve included files that must be downloaded? Àíàëèçèðîâàòü ÿâà-àïïëåòû ñ öåëüþ îïðåäåëåíèÿ âêëþ÷àåìûå ôàéëîâ? Store all files in cache instead of HTML only Ïðèíóäèòåëüíî ñîõðàíÿòü âñå ôàéëû â êýøå, à íå òîëüêî ôàéëû HTML Log file type (if generated) Òèï log ôàëà Maximum mirroring depth from root address Ìàêñ. ãëóáèíà ñîçäàíèÿ çåðêàëà îò íà÷àëüíîãî àäðåñà Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Ìàêñèìàëüíàÿ ãëóáèíà çàêà÷êè äëÿ âíåøíèõ/çàïðåùåííûõ àäðåñîâ (0, ò.å., íåò îãðàíè÷åíèé, ýòî çíà÷åíèå ïîóìîë÷àíèþ) Create a debugging file Ñîçäàòü ôàéë ñ îòëàäî÷íîé èíôîðìàöèåé Use non-standard requests to get round some server bugs Ïîïûòàòüñÿ îáîéòè îøèáêè íåêîòîðûõ ñåðâåðîâ, èñïîëüçóÿ íå ñòàíäàðòíûå çàïðîñû Use old HTTP/1.0 requests (limits engine power!) Èñïîëüçîâàòü ñòàðûé ïðîòîêîë HTTP/1.0 (îãðàíè÷èò âîçìîæíîñòè ïðîãðàììû!) Attempt to limit retransfers through several tricks (file size test..) Ïîïûòêà îãðàíè÷èòü ïåðåêà÷êó èñïîëüóÿ íåêîòîðûå ïðèåìû (òåñò íà ðàçìåð ôàéëà..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Îãðàíè÷èòü ÷èñëî ëèíêîâ, óäàëÿÿ àíàëîãè÷íûå ëèíêè (www.foo.com==foo.com, http=https ..) Write external links without login/password Ñîõðàíÿòü âíåøíèå ëèíêè áåç ëîãèíà/ïàðîëÿ Write internal links without query string Ñîõðàíÿòü âíóòðåííèå ëèíêè óñå÷åííî (äî çàíàêà ?) Get non-HTML files related to a link, eg external .ZIP or pictures html fayllarga yaqin bo’lmagan havolalarni ko’chirib olmaslik (msln.: tashqi .ZIP yoki graf. fayllar) Test all links (even forbidden ones) Barcha havolalarni sinab ko’rmoq (hatto taqiqlanganlarini ham) Try to catch all URLs (even in unknown tags/code) Ñòàðàòüñÿ îïðåäåëÿòü âñå URL'û (äàæå â íåîïîçíàííûõ òýãàõ/ñêðèïòàõ) Get HTML files first! Ïîëó÷èòü âíà÷àëå HTML ôàéëû! Structure type (how links are saved) Òèï ëîêàëüíîé ñòðóêòóðû çåðêàëà (ñïîñîá ñîõðàíåíèÿ ôàéëîâ) Use a cache for updates Èñïîëüçîâàòü êýø äëÿ îáíîâëåíèÿ Do not re-download locally erased files Íå êà÷àòü çàíîâî ëîêàëüíî óäàëåííûå ôàéëû Make an index Indeks yaratmoq Make a word database So’z bazasini yaratmoq Log files Log fayllar DOS names (8+3) DOS-fayllar formati (8+3) ISO9660 names (CDROM) ISO9660 standartidagi nomlar (CDROM) No error pages Xatosiz sahifalar Primary Scan Rule Asosiy filtr Travel mode Tekshirish rejimi Global travel mode Global tekshiruv rejimi These options should be modified only exceptionally Êàê ïðàâèëî, ýòè íàñòðîéêè èçìåíÿòü íå ñëåäóåò Activate Debugging Mode (winhttrack.log) Tuzatish rejimini yoqmoq (winhttrack.log) Rewrite links: internal / external Havolalarni qayta nomlamoq: ichki/tashqi Flow control Tekshrish yo’nalishi nazorati Limits Cheklovlar Identity Identifikator HTML footer Quyi HTML kolontitul N# connections N# bog’lanish Abandon host if error Ïðåêðàòèòü çàêà÷êó ñ õîñòà, â ñëó÷àå îøèáêè Minimum transfer rate (B/s) Ìèíèìàëüíàÿ ñêîðîñòü çàêà÷êè (B/s) Abandon host if too slow Ïðåêðàòèòü çàêà÷êó ñ õîñòà, åñëè îíà ñëèøêîì ìåäëåííàÿ Configure Moslamoq Use proxy for ftp transfers Èñïîëüçîâàòü ïðîêñè äëÿ ftp-çàêà÷êè TimeOut(s) Taym-out Persistent connections (Keep-Alive) Ïîñòîÿííûå ñîåäèíåíèÿ (Keep-Alive) Reduce connection time and type lookup time using persistent connections Óìåíüøèòü âðåìåíà ñîåäèíåíèÿ è îáðàùåíèÿ èñïîëüçóÿ ïîñòîÿííûå ñîåäèíåíèÿ Retries Ïîâòîðíûå ïîïûòêè Size limit Îãðàíè÷åíèå ïî ðàçìåðó Max size of any HTML file (B) Ìàêñ. ðàçìåð html-ôàéëà: Max size of any non-HTML file Ìàêñ. ðàçìåð íå-html: Max site size Ìàêñ. ðàçìåð ñàéòà Max time Ìàêñ. âðåìÿ çàêà÷êè Save prefs Sozlanmani saqlash Max transfer rate Ìàêñ. ñêîðîñòü çàêà÷êè Follow robots.txt Ñëåäîâàòü ïðàâèëàì èç robots.txt No external pages Tashqi havolalarsiz Do not purge old files Íå óäàëÿòü ñòàðûå ôàéëû Accept cookies Ðàçðåøèòü cookies Check document type Ïðîâåðÿòü òèï äîêóìåíòà Parse java files Àíàëèç ÿâà ôàéëîâ Store ALL files in cache Ñîõðàíÿòü ÂÑÅ ôàéëû â êýøå Tolerant requests (for servers) Òîëåðàíòíûå çàïðîñû (ê ñåðâåðàì) Update hack (limit re-transfers) Update hack (îãðàíè÷åíèå ïîâòîðíûõ çàêà÷åê) URL hacks (join similar URLs) Õàê URL (îáúåäåíèòü àíàëîãè÷íûå URLs) Force old HTTP/1.0 requests (no 1.1) Èñïîëüçîâàòü ñòàðûé ïðîòîêîë HTTP/1.0 (íå 1.1) Max connections / seconds Ìàêñ. ÷èñëî ñîåäèíåíèé/ñåê. Maximum number of links Ìàêñèìàëüíîå ÷èñëî ëèíêîâ Pause after downloading.. Ïàóçà ïîñëå çàãðóçêè... Hide passwords Parollarni berkitmoq Hide query strings Ñïðÿòàòü çàïðîñíóþ ÷àñòü ñòðîêè (âñå, ÷òî ïîñëå çíàêà ?) Links Havolalar Build Ñòðóêòóðà Experts Only Ýêñïåðò Flow Control Óïðàâëåíèå çàêà÷êîé Limits Îãðàíè÷åíèÿ Browser ID Èäåíòèôèêàöèÿ Scan Rules Ôèëüòðû Spider Êà÷àëêà Log, Index, Cache Ëîã, Èíäåêñ. Êýø Proxy Ïðîêñè MIME Types MIME Types (Òèïû ôàéëîâ) Do you really want to quit WinHTTrack Website Copier? Âû äåéñòâèòåëüíî õîòèòå çàâåðøèòü ðàáîòó ñ ïðîãðàììîé? Do not connect to a provider (already connected) Íå ñîåäèíÿòüñÿ ñ ïðîâàéäåðîì (ñîåäèíåíèå óæå óñòàíîâëåíî) Do not use remote access connection Íå èñïîüçîâàòü óäàëåííîé ñîåäèíåíèÿ Schedule the mirroring operation Çàêà÷êà ïî ðàñïèñàíèþ Quit WinHTTrack Website Copier Âûéòè èç WinHTTrack Website Copier Back to starting page Íàçàä ê íà÷àëüíîé ñòðàíèöå Click to start! Start! No saved password for this connection! Íåò ñîõðàíåííîãî ïàðîëÿ äëÿ ýòîãî ñîåäèíåíèÿ Can not get remote connection settings Íå ìîãó ïîëó÷èòü óñòàíîâêè óäàëåííîãî ñîåäèíåíèÿ Select a connection provider Âûáåðèòå ïðîâàéäåðà, ê êîòîðîìó óñòàíîâèòü ñîåäèíåíèå Start Boshlamoq Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Âû ìîæåòå èëè íà÷àòü çàêà÷êó, íàæàâ êíîïêó ÑÒÀÐÒ, èëè ìîæåòå çàäàòü äîïîëíèòåëüíûå ïàðàìåòðû ñîåäèíåíèÿ Save settings only, do not launch download now. Òîëüêî ñîõðàíèòü óñòàíîâêè, íå íà÷èíàòü çàêà÷êó. On hold Çàäåðæêà Transfer scheduled for: (hh/mm/ss) Æäåì äî: (hh/mm/ss) Start Íà÷àòü! Connect to provider (RAS) Ñîåäèíèòüñÿ ñ ïðîâàéäåðîì (RAS) Connect to this provider Ñîåäèíèòüñÿ ñ ýòèì ïðîâàéäåðîì Disconnect when finished Îòñîåäèíèòüñÿ ïðè çàâåðøåíèè Disconnect modem on completion Îòñîåäåíèòü ïðè çàâåðøåíèè \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Ñîîáùèòå íàì ïîæàëóéñòà î çàìå÷åííûõ ïðîáëåìàõ è îøèáêàõ)\r\n\r\nÐàçðàáîòêà:\r\nÈíòåðôåéñ (Windows): Xavier Roche\r\nÊà÷àëêà (spider): Xavier Roche\r\nÏàðñåð ÿâà-êëàññîâ: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Russian translations to:\r\nAndrei Iliev (andreiiliev@mail.ru) About WinHTTrack Website Copier Î ïðîãðàììå WinHTTrack Website Copier Please visit our Web page Ïîæàëóéñòà, ïîñåòèòå íàøó âåá-ñòðàíèöó Wizard query Âîïðîñ ìàñòåðà Your answer: Javobingiz: Link detected.. Íàéäåí ëèíê.. Choose a rule Qoidani tanlang Ignore this link Èãíîðèðîâàòü ýòîò ëèíê Ignore directory Èãíîðèðîâàòü äèðåêòîðèþ Ignore domain Èãíîðèðîâàòü äîìåí Catch this page only Ñêà÷àòü òîëüêî ýòó ñòðàíè÷êó Mirror site Çåðêàëèçîâàòü ñàéò Mirror domain Çåðêàëèçîâàòü äîìåí Ignore all Èãíîðèðîâàòü âñå Wizard query Âîïðîñ ìàñòåðà NO YO’Q File Fayl Options Tanlovlar Log Log Window Oyna Help Yordam Pause transfer Ïðèîñòàíîâèòü çàêà÷êó Exit Chiqish Modify options Èçìåíèòü íàñòðîéêè View log Logni ko’rmoq View error log Log xatolarni ko’rmoq View file transfers Fayllarni uzatish prossesini ko’rmoq Hide Berkitmoq About WinHTTrack Website Copier Dastur haqida... Check program updates... Ïðîâåðèòü íàëè÷èå îáíîâëåííèé ïðîãðàììû... &Toolbar Uskunalar paneli &Status Bar Holat paneli S&plit Ajratmoq File Fayl Preferences Sozlanmalar Mirror Ko’zgu Log Log Window Îêíî Help Ïîìîùü Exit Âûõîä Load default options Çàãðóçèòü çíà÷åíèÿ ïàðàìåòðîâ ïî óìîë÷àíèþ Save default options Ñîõðàíèòü çíà÷åíèÿ ïî óìîë÷àíèþ Reset to default options Î÷èñòèòü çíà÷åíèÿ ïî óìîë÷àíèþ Load options... Çàãðóçèòü íàñòðîéêè... Save options as... Ñîõðàíèòü íàñòðîéêè êàê... Language preference... Tilni tanlash Contents... Mundarija... About WinHTTrack... WinHTTrack haqida... New project\tCtrl+N Yangi loyiha\tCtrl+N &Open...\tCtrl+O &Ochmoq...\tCtrl+O &Save\tCtrl+S &Saqlamoq\tCtrl+S Save &As... Quyidagidek &saqlamoq... &Delete... &O’chirmoq... &Browse sites... &Saytlarni ko’rish... User-defined structure Çàäàíèå ñòðóêòóðû %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tÈìÿ ôàéëà áåç ðàñøèðåíèÿ (íàïð.: image)\r\n%N\tÈìÿ ôàéëà ñ ðàñøèðåíèåì (íàïð.: image.gif)\r\n%t\tÐàñøèðåíèå ôàéëà (íàïð.: gif)\r\n%p\tÏóòü ê ôàéëó [áåç îêàí÷èâàþùåãî /] (íàïð.: /someimages)\r\n%h\tÈìÿ õîñòà (íàïð.: www.someweb.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tDOS'êîå èìÿ (íàïð: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Masalan:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proksini moslash Proxy address: Proksi manzili: Proxy port: Port raqami: Authentication (only if needed) Àóòåíòèôèêàöèÿ (åñëè òðåáóåòñÿ) Login Login Password Parol Enter proxy address here Ââåäèòå àäðåñ ïðîêñè ñåðâåðà Enter proxy port here Ââåäèòå íîìåð ïîðòà ïðîêñè ñåðâåðà Enter proxy login Ââåäèòå ëîãèí ïðîêñè Enter proxy password Ââåäèòå ïàðîëü äëÿ ïðîêñè ñåðâåðà Enter project name here Ââåäèòå èìÿ ïðîåêòà Enter saving path here Óêàæèòå êàòàëîã äëÿ ñîõðàíåíèÿ ïðîåêòà Select existing project to update Äëÿ îáíîâëåíèÿ ïðîåêòà, âûáåðèòå åãî èç ñïèñêà Click here to select path Âûáðàòü êàòàëîã ïðîåêòà Select or create a new category name, to sort your mirrors in categories Âûáðàòü èëè ñîçäàòü íîâóþ êàòåãîðèþ äëÿ ñîðòèðîâêè çåðêàë ïî êàòåãîðèÿì HTTrack Project Wizard... HTTrack loyiha yaratuvchisi... New project name: Yangi loyiha nomi: Existing project name: Mavjud loyiha nomi: Project name: Loyiha nomi: Base path: Jild: Project category: Loyiha kategoriyasi: C:\\My Web Sites C:\\Veb saytlarim Type a new project name, \r\nor select existing project to update/resume Yangi loyiha nomini kiriting, \r\nyoki mavjud loyihani yangilash/davom etirish uchun tanlang New project Yangi loyiha Insert URL URLni qo’ymoq URL: URL: Authentication (only if needed) Autentifikatsiya (agar kerak bo’lsa) Login Login: Password Parol: Forms or complex links: Murakkab havolalar: Capture URL... Çàñå÷ü URL... Enter URL address(es) here URL manzilni kiriting Enter site login Ââåäèòå ëîãèí äëÿ äîñòóïà ê ñàéòó Enter site password Ââåäèòå ïàðîëü äëÿ äîñòóïà ê ñàéòó Use this capture tool for links that can only be accessed through forms or javascript code Èñïîëüçóéòå ýòî ñðåäñòâî äëÿ îòëîâà äèíàìè÷åñêèõ URL (javascript, ôîðìû è ò.ï.) Choose language according to preference Âûáîð ÿçûêà Catch URL! URLni tuting! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Âðåìåííî óñòàíîâèòå â íàñòðîéêàõ ïðîêñè âàøåãî áðîóçåðà óêàçàííûå íèæå çíà÷åíèÿ àäðåñà è íîìåðà ïîðòà.\nÇàòåì, â áðîóçåðå âûïîëíèòå íåîáõîäèìûå äåéñòâèÿ (ïîñëàòü ôîðìó, àêòèâèçèðîâàòü ñêðèïò è ò.ï.) . This will send the desired link from your browser to WinHTTrack. Òàêèì îáðàçîì âû ñìîæåòå ïåðåäàòü æåëàåìûé ëèíê èç áðàóçåðà â HTTrack. ABORT Bekor qilmoq Copy/Paste the temporary proxy parameters here Vaqtinchalik proksi sozlamasini nusxalamoq/qo’ymoq Cancel Bekor qilmoq Unable to find Help files! Íå íàéäåíû ôàéëû ïîìîùè! Unable to save parameters! Parametrlarni saqlashning imkoni yo’q! Please drag only one folder at a time Iltimos, faqat bitta jildni surib olib keling Please drag only folders, not files Iltimos, faqat fayllarni jildni surib olib keling, fayllarni emas Please drag folders only Iltimos, faqat jildlarni surib olib keling Select user-defined structure? Âûáðàòü çàäàííóþ âàìè ñòðóêòóðó? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Ïðîâåðüòå, ÷òî îïðåäåëåííàÿ âàìè ñòðóêòóðà ïðàâèëüíà, â ïðîòèâíîì ñëó÷àå, èìåíà ôàéëîâ áóäóò íåïðåäñêàçóåìû Do you really want to use a user-defined structure? Âû äåéñòâèòåëüíî õîòèòå âûáðàòü çàäàííóþ ñòðóêòóðó? Too manu URLs, cannot handle so many links!! Ñëèøêîì ìíîãî URL'îâ, íå ìîãó îáðàáîòàòü òàêîå êîëè÷åñòâî ëèíêîâ! Not enough memory, fatal internal error.. Xotira yetarli emas, jiddiy ichki xatolik... Unknown operation! Noma'lum operatsiya Add this URL?\r\n Ushbu URL qo’shilsinmi?\r\n Warning: main process is still not responding, cannot add URL(s).. Diqqat: so’rovlarga javob bermayapti, URLlarni qo’shishning imkoni yo’q... Type/MIME associations Ñîîòâåòñâèå òèïó ôàéëîâ (Type/MIME) File types: Fayl turlari: MIME identity: MIME identity Select or modify your file type(s) here Âûáðàòü èëè èçìåíèòü òèïû ôàéëîâ Select or modify your MIME type(s) here Fayllar turini tanlamoq yoki o’zgartirmoq Go up Yuqoriga Go down Pastga File download information Yuklab olingan fayl haqida Freeze Window Oynani qotirib qo’ymoq More information: Qo’shimcha ma’lumot: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Äîáðî ïîæàëîâàòü â ïðîãðàììó WinHTTrack Website Copier!\n\nÏîæàëóéñòà íàæìèòå êíîïêó ÄÀËÅÅ äëÿ òîãî, ÷òîáû\n\n- íà÷àòü íîâûé ïðîåêò\n- èëè âîçîáíîâèòü ÷àñòè÷íóþ çàêà÷êó File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Èìåíà ôàéëîâ ñ ðàøèðåíèåì:\nÈìåíà ôàéëîâ, ñîäåðæàùèå:\nÝòîò ôàéë:\nÈìåíà ôîëäåðîâ ñîäåðæàò:\nÝòîò ôîëäåð:\nËèíêè èç ýòîãî äîìåíà:\nËèíêè èç äîìåíîâ, ñîäåðæàùèå:\nËèíêè èç ýòîãî õîñòà:\nËèíêè ñîäåðæàùèå:\nÝòîò ëèíê:\nÂÑÅ ËÈÍÊÈ Show all\nHide debug\nHide infos\nHide debug and infos Ïîêàçàòü âñå\nÑïðÿòàòü îòëàäêó\nÑïðÿòàòü èíôî\nÑïðÿòàòü îòëàäêó è èíôî Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Ñòðóêòóðà ñàéòà (ïî óìîë÷àíèþ)\nHtml/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/ôàéëû èçîáðàæåíèé/\nHtml/html, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/ôàéëû èçîáðàæåíèé\nHtml/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/\nHtml/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/xxx, ãäå xxx - ðàñøèðåíèå ôàéëà\nHtml, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/xxx\nÑòðóêòóðà ñàéòà áåç www.domain.xxx/\nHtml â site_name/ ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/ôàéëû èçîáðàæåíèé/\nHtml â site_name/html, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/ôàéëû èçîáðàæåíèé\nHtml â site_name/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/\nHtml â site_name/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/xxx\nHtml â site_name/html, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/xxx\nÂñå ôàéëû èç âåáà/, ñ ïðîèçâîëüíûìè èìåíàìè (íîâèíêà !)\nÂñå ôàéëû èç site_name/, ñ ïðîèçâîëüíûìè èìåíàìè (íîâèíêà !)\nÇàäàííàÿ ïîëüçîâàòåëåì ñòðóêòóðà... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Òîëüêî ñêàíèðîâàòü\nÑîõðàíÿòü html ôàéëû\nÑîõðàíÿòü íå html ôàéëû\nÑîõðàíÿòü âñå ôàéëû (ïî óìîë÷àíèþ)\nÑîõðàíÿòü âíà÷àëå html ôàéëû Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Îñòàâàòüñÿ â òîéæå äèðåêòîðèè\nÌîæíî äâèãàòüñÿ âíèç (ïî óìîë÷àíèþ)\nÌîæíî äâèãàòüñÿ ââåðõ\nÌîæíî äâèãàòüñÿ ââåðõ è âíèç Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Îñòàâàòüñÿ íà òîì æå àäðåñå (ïî óìîë÷àíèþ)\nÎñòàâàòüñÿ íà òîì æå äîìåíå\nÎñòàâàòüñÿ íà òîì æå äîìåíå âåðõíåãî óðîâíÿ\nÈäòè êóäà óãîäíî Never\nIf unknown (except /)\nIf unknown Hech qachon\nAgar noma'lum bo’lsa (/ dan boshqasi)\nAgar noma'lum bo’lsa no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Íå ïîä÷èíÿòüñÿ ïðàâèëàì robots.txt\nrobots.txt êðîìå Ìàñòåðà\nïîä÷èíÿòüñÿ ïðàâèëàì robots.txt normal\nextended\ndebug Odatiy\nkengaytirilgan\ntuzatish Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Sayt(lar)ni ko’chirib olish\nSayt(lar)ni ko’chirib olmoq +savollar\nAlohida fayllarni yuklab olmoq\nBarcha saytlarni sahifalari bilan ko’chirib olish (bir necha ko’zgu)\nHavolalarni sahifasi bilan sinamoq (xatcho’p testi)\n* To’xtatilganni davom etirmoq\n* Mavjud yuklamani yangilamoq Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Îòíîñèòåëüíûé URI / Àáñîëþòíûé URL (ïî óìîë÷àíèþ)\nÀáñîëþòíûé URL / Àáñîëþòíûé URL\nÀáñîëþòíûé URI / Àáñîëþòíûé URL\nÏåðâîíà÷àëüíûé URL / Ïåðâîíà÷àëüíûé URL Open Source offline browser Open Source offlayn brauzer Website Copier/Offline Browser. Copy remote websites to your computer. Free. Veb-saytlarni oluvchi/Offlayn brauzer. Kompyuteringizga veb-saytlarni ko’chirib beradi. Bepul. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) URLlar ro’yxati (.txt) Previous Ortga Next Keyingi URLs URLs Warning Ogohlatirish Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Âàø áðàóçåð èëè íå ïîääåðæèâàåò javascript èëè åãî ïîääåðæêà âûêëþ÷åíà. Äëÿ ïîëó÷åíèÿ íàèëó÷øåãî ðåçóëüòàòà àêòèâèçèðóéòå ïîääåðæêó javascript. Thank you Rahmat You can now close this window Endi bu oynani yopsangiz bo’ladi Server terminated Server terminated A fatal error has occurred during this mirror Joriy ko’chirish vaqtida jiddiy xatolik yuz berdi Proxy type: Proksi turi: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proksi protokoli. HTTP: oddiy proksi. HTTP (CONNECT tuneli): har bir so'rovni CONNECT tuneli orqali yuboradi; faqat CONNECT'ni qo'llab-quvvatlaydigan proksilar uchun, masalan Tor HTTPTunnelPort. SOCKS5: standart port 1080. Load cookies from file: Fayldan cookies yuklamoq: Preload cookies from a Netscape cookies.txt file before crawling. Ko’chirib olishdan oldin Netscape cookies.txt faylidan cookies’ni oldindan yuklamoq. Pause between files: Fayllar orasidagi pauza: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Fayllarni ko’chirib olish orasidagi tasodifiy kechikish, soniyalarda. Tasodifiy diapazon uchun MIN:MAX dan foydalaning (masalan, 2:8). Keep the www. prefix (do not merge www.host with host) www. prefiksini saqlash (www.host ni host bilan birlashtirmaslik) Do not treat www.host and host as the same site. www.host va host ni bir xil sayt deb hisoblamaslik. Keep double slashes in URLs URL lardagi qo’sh sleshlarni saqlash Do not collapse duplicate slashes in URLs. URL lardagi takroriy sleshlarni olib tashlamaslik. Keep the original query-string order So’rov satrining asl tartibini saqlash Do not reorder query-string parameters when deduplicating URLs. URL dublikatlarini olib tashlashda so’rov satri parametrlari tartibini o’zgartirmaslik. Strip query keys: Olib tashlanadigan so’rov kalitlari: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Saqlangan fayl nomidan olib tashlanadigan, vergul bilan ajratilgan so’rov kalitlari (masalan, sid,utm_source). Write a WARC archive of the crawl Qidiruvning WARC arxivini yozish Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Har bir yuklab olingan javobni ISO-28500 WARC/1.1 arxiviga ham, ko'zgu yonida saqlash. WARC archive name: WARC arxivi nomi: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. WARC arxivi uchun ixtiyoriy asosiy nom; chiqish katalogida avtomatik nomlash uchun bo'sh qoldiring. httrack-3.49.14/lang/Ukrainian.txt0000644000175000017500000011116615230602340012421 LANGUAGE_NAME Ukrainian LANGUAGE_FILE Ukrainian LANGUAGE_ISO uk LANGUAGE_AUTHOR Andrij Shevchuk (http://programy.com.ua, http://vic-info.com.ua) \r\n LANGUAGE_CHARSET windows-1251 LANGUAGE_WINDOWSID Ukrainian OK ÎÊ Cancel Ñêàñóâàòè Exit Âèõ³ä Close Çàêðèòè Cancel changes Ñêàñóâàòè çì³íè Click to confirm ϳäòâåðäèòè Click to get help! Îäåðæàòè äîâ³äêó Click to return to previous screen Ïîâåðíóòèñÿ íàçàä Click to go to next screen Ïåðåéòè äî íàñòóïíîãî åêðàíó Hide password Ñõîâàòè ïàðîëü Save project Çáåðåãòè ïðîåêò Close current project? Çàêðèòè ïîòî÷íèé ïðîåêò? Delete this project? Âèäàëèòè öåé ïðîåêò? Delete empty project %s? Âèäàëèòè ïîðîæí³é ïðîåêò %s? Action not yet implemented Ïîêè íå ðåàë³çîâàíî Error deleting this project Ïîìèëêà âèäàëåííÿ ïðîåêòó Select a rule for the filter Âèáðàòè òèï ô³ëüòðà Enter keywords for the filter Ââåä³òü çíà÷åííÿ óìîâ ô³ëüòðà Cancel Ñêàñóâàòè Add this rule Äîäàòè öþ óìîâó Please enter one or several keyword(s) for the rule Ââåä³òü çíà÷åííÿ óìîâ ô³ëüòðà Add Scan Rule Äîäàòè ô³ëüòð Criterion Âèáðàòè òèï: String Ââåñòè çíà÷åííÿ: Add Äîäàòè Scan Rules Ô³ëüòðè Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Âèêîðèñòîâóþ÷è ìàñêè âè ìîæåòå âèêëþ÷èòè/óêëþ÷èòè â³äðàçó ê³ëüêà àäðåñ\nÿê ðîçä³ëüíèê ô³ëüòð³â âèêîðèñòîâóéòå êîìè ÷è ïðîá³ëè.\níàïðèêëàä: +*.zip -www.*.com,-www.*.edu/cgi-bin/*.cgi Exclude links Âèêëþ÷èòè... Include link(s) Óêëþ÷èòè... Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Ïîðàäà: ßêùî âè õî÷åòå ñêà÷àòè âñ³ gif-ôàéëè, âèêîðèñòîâóéòå, íàïðèêëàä, òàêèé ô³ëüòð +www.someweb.com/*.gif. \n(+*.gif / -*.gif äîçâîëÿº/çàáîðîíÿº äëÿ çàâàíòàæåííÿ ÂѲ gif-ôàéëè íà ÂÑ²Õ ñàéòàõ) Save prefs Çáåðåãòè íàñòðîþâàííÿ Matching links will be excluded: ˳íêè, ùî çàäîâîëüíÿþòü ö³é óìîâ³ áóäóòü âèêëþ÷åí³: Matching links will be included: ˳íêè, ùî çàäîâîëüíÿþòü ö³é óìîâ³ áóäóòü âêëþ÷åí³: Example: Ïðèêëàä: gif\r\nWill match all GIF files gif\r\nçíàéäå óñ³ gif (÷è GIF) ôàéëè blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nçíàéäåàéëè, ùî ì³ñòÿòü â ³ìåí³ ïîäñòðîêó 'blue', íàïðèêëàä 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nçíàéäå'bigfile.mov', àëå, ó òåæ ÷àñ, ïðîïóñòèòü ôàéë 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nçíàéäå àäðåñè, ùî ì³ñòÿòü êàòàëîãè ç ïîäñòðîêîé 'cgi', òàê³ ÿê /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nçíàéäå àäðåñè, ùî ì³ñòÿòü êàòàëîã 'cgi-bin' (àëå íå cgi-bin-2, íàïðèêëàä) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nçíàéäå òàê³ ë³íêè, ÿê www.someweb.com, private.someweb.com ³ ò.ï.. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nçíàéäå àäðåñè òèïó www.someweb.com, www.someweb.edu, private.someweb.otherweb.com ³ ò.ä.\r\n www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nçíàéäå àäðåñè, òàê³ ÿê www.someweb.com/... (àëå íå òàê³, ÿê private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nçíàéäå óñ³ ë³íêè òàê³, ÿê www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html ³ ò.ï. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nçíàéäå ò³ëüêè www.test.com/test/someweb.html. Çâàæòå, íåîáõ³äíî âêàçàòè ïîâíó àäðåñó ðåñóðñó - õîñò (www.xxx.yyy) ³ øëÿõ (/test/someweb.html) All links will match Óñ³ ë³íêè ïðèïóñòèì³ Add exclusion filter Äîäàòè ô³ëüòð, ùî âèêëþ÷ຠAdd inclusion filter Äîäàòè ô³ëüòð, ùî âêëþ÷ຠExisting filters Äîäàòêîâ³ ô³ëüòðè Cancel changes Ñêàñóâàòè çì³íè Save current preferences as default values Çáåðåãòè ïîòî÷í³ íàñòðîþâàííÿ ÿê çíà÷åííÿ çà çàìîâ÷óâàííÿì Click to confirm ϳäòâåðäèòè No log files in %s! ³äñóòí³ ëîã ôàéëè â %s! No 'index.html' file in %s! Îòñóòñòâóåò ôàéë index.html ó %s! Click to quit WinHTTrack Website Copier Âèéòè ç ïðîãðàìè WinHTTrack Website Copier View log files Ïåðåãëÿä ëîã ôàéë³â Browse HTML start page ³äîáðàçèòè ñòàðòîâó html ñòîð³íêó End of mirror Ñòâîðåííÿ äçåðêàëà çàâåðøåíå View log files Ïåðåãëÿä log ôàéë³â Browse Mirrored Website Ïåðåãëÿä äçåðêàëà New project... Íîâèé ïðîåêò... View error and warning reports Ïåðåãëÿä çâ³òó ïðî ïîìèëêè ³ ïîïåðåäæåííÿ View report Ïåðåãëÿä çâ³òó Close the log file window Çàêðèòè â³êíî ëîãó Info type: Òèï ³íôîðìàö³¿ Errors Ïîìèëêè Infos ²íôîðìàö³ÿ Find Çíàéòè Find a word Çíàéòè ñëîâî Info log file ²íôî ëîã-ôàéë Warning/Errors log file Ëîã ôàéë ïîìèëîê/ïîïåðåäæåíü Unable to initialize the OLE system Íåìîæëèâî ³í³ö³àë³çóâàòè OLE WinHTTrack could not find any interrupted download file cache in the specified folder! Ó çàçíà÷åíîìó êàòàëîç³ WinHTTrack íå ìîæå çíàéòè æîäíîãî êåøó ïåðåðâàíîãî çàâàíòàæåííÿ! Could not connect to provider Íå ìîæëèâî ç'ºäíàòèñÿ ç ïðîâàéäåðîì receive îäåðæàííÿ request çàïèò connect ç'ºäíàííÿ search ïîøóê ready ãîòîâèé error ïîìèëêà Receiving files.. Îäåðæóºìî ôàéëè Parsing HTML file.. Ðîçá³ð HTML ôàéëó... Purging files.. Âèäàëÿºìî ôàéëè... Loading cache in progress.. Parsing HTML file (testing links).. Àíàë³çóºìî HTML ôàéë (ïåðåâ³ðÿºìî ë³íêè)... Pause - Toggle [Mirror]/[Pause download] to resume operation Çóïèíåíî (äëÿ ïðîäîâæåííÿ Âèáåð³òü [Äçåðêàëî]/[Ïðèçóïèíèòè çàâàíòàæåííÿ] ) Finishing pending transfers - Select [Cancel] to stop now! Çàâåðøóþòüñÿ â³äêëàäåí³ çàâàíòàæåííÿ - ùîá ïåðåðâàòè, íàòèñí³òü Ñêàñóâàòè! scanning ñêàíóºìî Waiting for scheduled time.. Î÷³êóºìî çàäàíèé ÷àñ ïî÷àòêó Connecting to provider Ç'ºäíóºìîñÿ ç ïðîâàéäåðîì [%d seconds] to go before start of operation Çàëèøèëîñü [%d ñåêóíä] äî ïî÷àòêó Site mirroring in progress [%s, %s bytes] Ñòâîðþºòüñÿ äçåðêàëî [%s, %s áàéò] Site mirroring finished! Ñòâîðåííÿ äçåðêàëà çàâåðøåíå! A problem occurred during the mirroring operation\n Ó ïðîöåñ³ çàâàíòàæåííÿ â³äáóëàñÿ ïîìèëêà\n \nDuring:\n Ó ïëèí³:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Ó ðàç³ ïîòðåáè, äèâ³òüñÿ ëîã ôàéë.\n\näëÿ âèõîäó ç WinHTTrack íàòèñí³òü êíîïêó OK.\n\näÿêóºìî çà âèêîðèñòàííÿ WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Ñòâîðåííÿ äçåðêàëà çàâåðøåíå.\näëÿ âèõîäó ç ïðîãðàìè íàòèñí³òü êíîïêó OK.\näëÿ ïåðåâ³ðêè óñï³øíîñò³ çàâàíòàæåííÿ ïîäèâèòåñÿ ëîã ôàéë(è).\n\näÿêóºìî çà âèêîðèñòàííÿ WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ÇÀÂÀÍÒÀÆÅÍÍß ÏÅÐÅÐÂÀÍÅ! * *\r\nòèì÷àñîâèé êåø, ñòâîðåíèé ï³ä ÷àñ ïîòî÷íî¿ ñåñ³¿, ì³ñòèòü äàí³, çàâàíòàæåí³ ò³ëüêè ï³ä ÷àñ äàíî¿ ñåñ³¿ ³ áóäå ïîòð³áíèé ò³ëüêè ó âèïàäêó ïîíîâëåííÿ çàâàíòàæåííÿ.\r\nàëå, ìîæå ì³ñòèòè á³ëüø ïîâíó ³íôîðìàö³þ. ßêùî âè íå õî÷åòå âòðàòèòè ö³ äàí³, âàì ïîòð³áíî âèäàëèòè ïîòî÷íèé êåø ³ â³äíîâèòè ïîïåðåäí³é.\r\n(Öå ìîæíà ëåãêî çðîáèòè ïðÿìî òóò, âèäàëèâøè ôàéëè hts-cache/new.]\r\n\r\nÂè ââàæàºòå, ùî ïîïåðåäí³é êåø ìîæå ì³ñòèòè á³ëüø ïîâíó ³íôîðìàö³þ, ³ ÷è õî÷åòå âè â³äíîâèòè éîãî? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ÏÎÌÈËÊÀ! * *\r\nöå äçåðêàëî - ïîðîæíº. ßêùî öå áóëî â³äíîâëåííÿ, âåðñ³ÿ äçåðêàëà â³äíîâëåíà.\r\nïðè÷èíà: ïåðøà ñòîð³íêà(è) ÷è íå çíàéäåíà, ÷è áóëè ïðîáëåìè ç ç'ºäíàííÿì.\r\n=> Ïåðåêîíàéòåñÿ, ùî âåáñàéò ùå ³ñíóº, ³/÷è ïåðåâ³ðòå óñòàíîâêè ïðîêñ³-ñåðâåðà! <= \n\nTip: Click [View log file] to see warning or error messages \nïîäñêàçêà:Äëÿ ïåðåãëÿäó ïîâ³äîìëåíü ïðî ïîìèëêè ³ ïîïåðåäæåíü íàòèñí³òü [Ïåðåãëÿä ëîã ôàéëó] Error deleting a hts-cache/new.* file, please do it manually Ïîìèëêà âèäàëåííÿ ôàéëó hts-cache/new.* , áóäü ëàñêà, âèäàëèòå éîãî ðó÷êàìè.\r\n Do you really want to quit WinHTTrack Website Copier? Âè ä³éñíî õî÷åòå âèéòè ç WinHTTrack? - Mirroring Mode -\n\nEnter address(es) in URL box - Ìîäà çåðêàë³çàöè¿ -\n\nââåä³òü àäðåñó(è) ó ïîëå URL. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - ²íòåðàêòèâíà ìîäà - Ìàéñòåð ñòâîðåííÿ äçåðêàëà (áóäóòü çàäàí³ ïèòàííÿ) -\n\nââåä³òü àäðåñó(è) ó ïîëå URL. - File Download Mode -\n\nEnter file address(es) in URL box - Ìîäà çàâàíòàæåííÿ îêðåìèõ ôàéë³â -\n\nââåä³òü àäðåñó(è) ôàéë³â ó ïîëå URL. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Ìîäà òåñòóâàííÿ ë³íê³â -\n\nââåä³òü àäðåñó(è) ñòîð³íîê, ùî ì³ñòÿòü URL'è, ùî âè õî÷åòå ïðîòåñòóâàòè. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ìîäà â³äíîâëåííÿ -\n\nïåðåâ³ðòå àäðåñó(è) ó ïîë³ URL, ïîò³ì íàòèñí³òü êíîïêó 'ÄÀ˲' ³ ïåðåâ³ðòå ïàðàìåòðè. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ìîäà ïðîäîâæåííÿ ðàí³øå ïåðåðâàíîãî ñòâîðåííÿ äçåðêàëà -\n\nïåðåâ³ðòå àäðåñó(è) ó ïîëå URL, ïîò³ì íàòèñí³òü êíîïêó 'ÄÀ˲' ³ ïåðåâ³ðòå ïàðàìåòðè. Log files Path Øëÿõ äî ëîã ôàéë³â Path Øëÿõ - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Ìîäà ñòâîðåííÿ äçåðêàë ç³ ñïèñêó-\n\nâ ïîëå URL çàïîâí³òü àäðåñè ñòîð³íîê, ùî ì³ñòÿòü URL'è, ùî âè õî÷åòå äçåðêàëþâàòè. New project / Import? Íîâèé ïðîåêò / ³ìïîðòóâàòè? Choose criterion Âèáåð³òü ä³þ Maximum link scanning depth Ìàêñ.ãëèáèíà ñêàíóâàííÿ Enter address(es) here Ââåä³òü àäðåñè Define additional filtering rules Çàäàòè äîäàòêîâ³ ô³ëüòðè Proxy Name (if needed) Ïðîêñ³, ÿêùî ïîòð³áíî Proxy Port Íîìåð ïîðòó ïðîêñ³-ñåðâåðà Define proxy settings Çàäàéòå óñòàíîâêè ïðîêñ³ Use standard HTTP proxy as FTP proxy Âèêîðèñòîâóâàòè HTTP ïðîêñ³ ÿê FTP ïðîêñ³ Path Øëÿõ Select Path Âèáåð³òü øëÿõ Path Øëÿõ Select Path Âèáåð³òü øëÿõ Quit WinHTTrack Website Copier Âèéòè ç WinHTTrack Website Copier About WinHTTrack Ïðî ïðîãðàìó WinHTTrack Save current preferences as default values Çáåðåãòè ïîòî÷í³ óñòàíîâêè ÿê ïàðàìåòðè çà çàìîâ÷óâàííÿì Click to continue Ïðîäîâæèòè Click to define options Çàäàòè ïàðàìåòðè çàâàíòàæåííÿ Click to add a URL Íàòèñí³òü ùîá äîäàòè URL Load URL(s) from text file Çàâàíòàæèòè URL(è) ç òåêñòîâîãî ôàéëó WinHTTrack preferences (*.opt)|*.opt|| Íàñòðîþâàííÿ WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Òåêñòîâèé ôàéë ñïèñêó àäðåñ(*.txt)|*.txt|| File not found! Ôàéë íå çíàéäåíèé! Do you really want to change the project name/path? Âè ä³éñíî õî÷åòå çì³íèòè íàçâó ïðîåêòó/øëÿõ? Load user-default options? Çàâàíòàæèòè óñòàíîâêè çà çàìîâ÷óâàííÿì? Save user-default options? Çáåðåãòè íàñòðîþâàííÿ? Reset all default options? Ïåðåóñòàíîâèòè âñ³ ïàðàìåòðè çà çàìîâ÷óâàííÿì? Welcome to WinHTTrack! WinHTTrack â³òຠâàñ! Action: Òèï ðîáîòè: Max Depth Ìàêñ. ãëèáèíà: Maximum external depth: Ìàêñèìàëüíà ãëèáèíà çîâí³øí³õ ñàéò³â: Filters (refuse/accept links) : Ô³ëüòðè (óêëþ÷èòè/âèêëþ÷èòè ë³íêè) Paths Øëÿõó Save prefs Çáåðåãòè íàñòðîþâàííÿ Define.. Çàäàòè... Set options.. Çàäàòè ïàðàìåòðè... Preferences and mirror options: Íàñòðîþâàííÿ ïàðàìåòð³â çàâàíòàæåííÿ:: Project name Íàçâà ïðîåêòó Add a URL... Äîäàòè URL ... Web Addresses: (URL) Âåá àäðåñè: (URL) Stop WinHTTrack? Ïåðåðâàòè WinHTTrack? No log files in %s! Íåìຠëîã ôàéë³â ó %s! Pause Download? Ïðèçóïèíèòè çàâàíòàæåííÿ? Stop the mirroring operation Ïåðåðâàòè çàâàíòàæåííÿ Minimize to System Tray Ñõîâàòè â ñèñòåìíèé òðåé Click to skip a link or stop parsing Ïðîïóñòèòè ë³íê ÷è ïåðåðâàòè àíàë³ç ôàéëó Click to skip a link Ïðîïóñòèòè ë³íê Bytes saved Çáåðåæåíî áàéò: Links scanned Ïðîñêàíîâàíî ë³íê³â: Time: ×àñ: Connections: Ç'ºäíàíü: Running: Ñòàí: Hide Ñõîâàòè Transfer rate Øâèäê³ñòü çàâàíòàæåííÿ: SKIP ÏÐÎÏÓÑÒÈÒÈ Information ²íôîðìàö³ÿ Files written: Çáåðåæåíî ôàéë³â: Files updated: Îáíîâëåíî ôàéë³â: Errors: Ïîìèëîê: In progress: Ó ïðîöåñ³: Follow external links Çàâàíòàæèòè ôàéëè ç çîâí³øí³õ ë³íê³â Test all links in pages Ïåðåâ³ðÿòè óñ³ ôàéëè íà ñòîð³íêàõ Try to ferret out all links Íàìàãàòèñÿ âèçíà÷èòè âñ³ ë³íêè Download HTML files first (faster) Çàâàíòàæèòè ñïî÷àòêó HTML-ôàéëè (øâèäøå) Choose local site structure Âèáðàòè ëîêàëüíó ñòðóêòóðó ñàéòó Set user-defined structure on disk Óñòàíîâèòè çàäàíó ëîêàëüíó ñòðóêòóðó ñàéòó Use a cache for updates and retries Âèêîðèñòîâóâàòè êåø äëÿ â³äíîâëåííÿ ³ äîêà÷êè Do not update zero size or user-erased files Íå êà÷àòè ôàéëè, ùî áóëè îäèí ðàç çàâàíòàæåí³, íàâ³òü ÿêùî âîíè íóëüîâî¿ äîâæèíè ÷è âèëó÷åí³ Create a Start Page Ñòâîðèòè ïî÷àòêîâó ñòîð³íêó Create a word database of all html pages Ñòîâðèòè áàçó äàíèõ ñë³â ç³ âñ³õ html ñòîð³íîê Create error logging and report files Ñòâîðèòè ëîã ôàéëè ç ³íôîðìàö³ºþ ïðî ðîáîòó ³ ïîìèëêè Generate DOS 8-3 filenames ONLY Ñòâîðþâàòè ôàéëè â DOS-ôîðìàò³ 8.3 Generate ISO9660 filenames ONLY for CDROM medias Ãåíåðóâàòè ³ìåíà ôàéë³â â ôîðìàò³ ISO9660 äëÿ çàïèñó íà CDROM Do not create HTML error pages Generate ISO9660 filenames ONLY for CDROM medias Select file types to be saved to disk Âèáåð³òü òèïè ôàéë³â, ùî çáåð³ãàþòüñÿ íà äèñêó Select parsing direction Âèáåð³òü íàïðÿìîê ïðîñóâàííÿ ïî ñàéòó Select global parsing direction Âèáåð³òü ãëîáàëüíèé íàïðÿìîê ïðîñóâàííÿ ïî ñàéòó Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Âèçíà÷òå ïðàâèëà äëÿ çîâí³øí³õ òà äëÿ âíóòð³øí³õ ë³íê³â Max simultaneous connections Ìàêñèìàëüíå ÷èñëî ç'ºäíàíü File timeout Ìàêñèìàëüíèé ÷àñ íå àêòèâíîñò³ çàâàíòàæåííÿ Cancel all links from host if timeout occurs Ó âèïàäêó ïåðåâèùåííÿ ÷àñó ÷åêàííÿ ñêàñóâàòè âñ³ ë³íêè ç äàíîãî õîñòà Minimum admissible transfer rate ̳í³ìàëüíî ïðèïóñòèìà øâèäê³ñòü çàâàíòàæåííÿ Cancel all links from host if too slow Ó âèïàäêó, ÿêùî õîñò çàíàäòî ïîâ³ëüíèé, ñêàñóâàòè âñ³ ë³íêè ç äàíîãî õîñòà Maximum number of retries on non-fatal errors Ìàêñèìàëüíå ÷èñëî ïîâòîðíèõ ñïðîá, ó âèïàäêó íå ôàòàëüíèõ ïîìèëîê. Maximum size for any single HTML file Ìàêñèìàëüíèé ðîçì³ð áóäü-ÿêîãî html-ôàéëó Maximum size for any single non-HTML file Ìàêñèìàëüíèé ðîçì³ð áóäü-ÿêîãî íå HTML-ôàéëó Maximum amount of bytes to retrieve from the Web Ìàêñèìàëüíà ê³ëüê³ñòü áàéò, ïðèïóñòèìèõ äëÿ çàâàíòàæåííÿ Make a pause after downloading this amount of bytes ϳñëÿ çàâàíòàæåííÿ çàçíà÷åíîãî ÷èñëà áàéò³â, çðîáèòè ïàóçó Maximum duration time for the mirroring operation Ìàêñ. òðèâàë³ñòü äçåðêàë³çàö³¿ Maximum transfer rate Ìàêñ. øâèäê³ñòü çàâàíòàæåííÿ Maximum connections/seconds (avoid server overload) Ìàêñ. ê³ëüê³ñòü ç'ºäíàíü ó ñåêóíäó (íå ïåðåâàíòàæóâàòè ñåðâåð) Maximum number of links that can be tested (not saved!) Ìàêñèìàëüíå ÷èñëî ë³íê³â, ùî ìîæíà òåñòóâàòè (îïö³ÿ íå çàïèñóºòüñÿ!) Browser identity ²äåíòèô³êàö³ÿ áðîóçåðà (ðÿäîê User-Agent) Comment to be placed in each HTML file Êîìåíòàð, ðîçòàøîâóâàíèé ó êîæíîìó HTML ôàéë³ Back to starting page Íàçàä íà ïî÷àòêîâó ñòîð³íêó Save current preferences as default values Çáåðåãòè íàñòðîþâàííÿ ÿê çíà÷åííÿ çà çàìîâ÷óâàííÿì Click to continue Ïðîäîâæèòè Click to cancel changes Ñêàñóâàòè çì³íè Follow local robots rules on sites ϳäêîðÿòèñÿ ïðàâèëàì äëÿ ðîáîò³â, óñòàíîâëþâàíèì ñàéòàìè Links to non-localised external pages will produce error pages Ïî ïîñèëàííÿõ íà çîâí³øí³ ñòîð³íêè (íå çàâàíòàæåí³) áóäå ïåðåõ³ä äî ñòîð³íîê ïîìèëîê Do not erase obsolete files after update Íå âèäàëÿòè ñòàð³ ôàéëè ï³ñëÿ ïðîöåäóðè â³äíîâëåííÿ äçåðêàëà Accept cookies? Äîçâîëèòè cookies? Check document type when unknown? Ïåðåâ³ðÿòè òèï äîêóìåíòà, ó âèïàäêó êîëè â³í íå â³äîìèé? Parse java applets to retrieve included files that must be downloaded? Àíàë³çóâàòè java-àïïëåòè ç ìåòîþ âèçíà÷åííÿ âêëþ÷åííÿ ôàéë³â? Store all files in cache instead of HTML only Ïðèìóñîâî çáåð³ãàòè óñ³ ôàéëè â êåø³, à íå ò³ëüêè ôàéëè HTML Log file type (if generated) Òèï log ôàéëó Maximum mirroring depth from root address Ìàêñ. ãëèáèíà ñòâîðåííÿ äçåðêàëà â³ä ïî÷àòêîâî¿ àäðåñè Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Ìàêñèìàëüíà ãëèáèíà çàâàíòàæåííÿ äëÿ çîâí³øí³õ/çàáîðîíåíèõ àäðåñ (0, òîáòî, íåìຠîáìåæåíü, öå çíà÷åííÿ ïî-çàìîâ÷óâàííþ) Create a debugging file Ñòâîðèòè ôàéë ç ³íôîðìàö³ºþ â³äëàãîäæåííÿ Use non-standard requests to get round some server bugs Ñïðîáóâàòè îá³éòè ïîìèëêè äåÿêèõ ñåðâåð³â, âèêîðèñòîâóþ÷è íå ñòàíäàðòí³ çàïèòè Use old HTTP/1.0 requests (limits engine power!) Âèêîðèñòîâóâàòè ñòàðèé ïðîòîêîë HTTP/1.0 (îáìåæèòü ìîæëèâîñò³ ïðîãðàìè!) Attempt to limit retransfers through several tricks (file size test..) Ñïðîáà îáìåæèòè ïåðåêà÷óâàííÿ âèêîðèñòîâóþ÷è äåÿê³ ïðèéîìè (òåñò íà ðîçì³ð ôàéëó..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Çáåð³ãàòè çîâí³øí³ ë³íêè áåç ëîã³íà/ïàðîëþ Write internal links without query string Çáåð³ãàòè âíóòð³øí³ ë³íêè îáð³çàíî (äî çíàêó ?) Get non-HTML files related to a link, eg external .ZIP or pictures Êà÷àòè íå-html ôàéëè ïîáëèçó ïîñèëàííÿ (íàïð.: çîâí³øí³ .ZIP ÷è ãðàô. ôàéëè) Test all links (even forbidden ones) Ïåðåâ³ðÿòè âñ³ ë³íêè (íàâ³òü çàáîðîíåí³ äî çàâàíòàæåííÿ) Try to catch all URLs (even in unknown tags/code) Íàìàãàòèñÿ âèçíà÷àòè âñ³ URL'è (íàâ³òü ó íåï³çíàíèõ òåãàõ/ñêð³ïòàõ) Get HTML files first! Îäåðæàòè ñïî÷àòêó HTML ôàéëè! Structure type (how links are saved) Òèï ëîêàëüíî¿ ñòðóêòóðè äçåðêàëà (ñïîñ³á çáåðåæåííÿ ôàéë³â) Use a cache for updates Âèêîðèñòîâóâàòè êåø äëÿ â³äíîâëåííÿ Do not re-download locally erased files Íå êà÷àòè çàíîâî ëîêàëüíî âèëó÷åí³ ôàéëè Make an index Ñòâîðèòè ³íäåêñ Make a word database Ñòâîðèòè áàçó äàíèõ ñë³â Log files Log ôàéëè DOS names (8+3) DOS ³ìåíà (8+3) ISO9660 names (CDROM) ISO9660 ³ìåíà (CDROM) No error pages Áåç ñòîð³íîê ïîìèëîê Primary Scan Rule Îñíîâíèé ô³ëüòð Travel mode Ìîäà ñêàíóâàííÿ Global travel mode Ãëîáàëüíà ìîäà ñêàíóâàííÿ These options should be modified only exceptionally ßê ïðàâèëî, ö³ íàñòðîþâàííÿ çì³íþâàòè íå ñë³ä Activate Debugging Mode (winhttrack.log) Óêëþ÷èòè ìîäó íàëàãîäæåííÿ (winhttrack.log) Rewrite links: internal / external Ïåðåçàïèñ ë³íê³â: âíóòð³ùí³/çîâí³øí³ Flow control Êîíòðîëü íàïðÿìêó ñêàíóâàííÿ Limits Îáìåæåííÿ Identity ²äåíòèô³êàòîð HTML footer Íèæí³é HTML êîëîíòèòóë N# connections N# ç'ºäíàíü Abandon host if error Ïðèïèíèòè çàâàíòàæåííÿ ç õîñòà, ó âèïàäêó ïîìèëêè Minimum transfer rate (B/s) ̳í³ìàëüíà øâèäê³ñòü çàâàíòàæåííÿ (B/s) Abandon host if too slow Ïðèïèíèòè çàâàíòàæåííÿ ç õîñòà, ÿêùî âîíà çàíàäòî ïîâ³ëüíà Configure Íàñòðî¿òè Use proxy for ftp transfers Âèêîðèñòîâóâàòè ïðîêñ³ äëÿ ftp-çàâàíòàæåííÿ TimeOut(s) Òàéì-àóò Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Ïîâòîðí³ ñïðîáè Size limit Îáìåæåííÿ ïî ðîçì³ð³ Max size of any HTML file (B) Ìàêñ. ðîçì³ð html-ôàéëó: Max size of any non-HTML file Ìàêñ. ðîçì³ð íå-html: Max site size Ìàêñ. ðîçì³ð ñàéòó Max time Ìàêñ. ÷àñ çàâàíòàæåííÿ Save prefs Çáåðåãòè íàñòðîþâàííÿ Max transfer rate Ìàêñ. øâèäê³ñòü çàâàíòàæåííÿ Follow robots.txt Êîðèñòóâàòèñü ïðàâèëàìè ç robots.txt No external pages Áåç çîâí³øí³õ ïîñèëàíü Do not purge old files Íå âèäàëÿòè ñòàð³ ôàéëè Accept cookies Äîçâîëèòè cookies Check document type Ïåðåâ³ðÿòè òèï äîêóìåíòà Parse java files Àíàë³ç java ôàéë³â Store ALL files in cache Çáåð³ãàòè ÓѲ ôàéëè â êåøå Tolerant requests (for servers) Òîëåðàíòí³ çàïèòè (äî ñåðâåð³â) Update hack (limit re-transfers) Update hack (îáìåæåííÿ ïîâòîðíèõ çàâàíòàæåíü) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Âèêîðèñòîâóâàòè ñòàðèé ïðîòîêîë HTTP/1.0 (íå 1.1) Max connections / seconds Ìàêñ. ÷èñëî ç'ºäíàíü/ñåê. Maximum number of links Ìàêñèìàëüíå ÷èñëî ë³íê³â Pause after downloading.. Ïàóçà ï³ñëÿ çàâàíòàæåííÿ... Hide passwords Ñõîâàòè ïàðîë³ Hide query strings Ñõîâàòè çàïèòàëüíó ÷àñòèíó ðÿäêà (óñå, ùî ï³ñëÿ çíàêà ?) Links ˳íêè Build Ñòðóêòóðà Experts Only Åêñïåðò Flow Control Êåðóâàííÿ çàâàíòàæåííÿì Limits Îáìåæåííÿ Browser ID ²äåíòèô³êàö³ÿ Scan Rules Ô³ëüòðè Spider Êà÷àëêà Log, Index, Cache Ëîã, ²íäåêñ. Êåø Proxy Ïðîêñ³ MIME Types Do you really want to quit WinHTTrack Website Copier? Âè ä³éñíî õî÷åòå çàâåðøèòè ðîáîòó ç ïðîãðàìîþ? Do not connect to a provider (already connected) Íå ç'ºäíóâàòèñÿ ç ïðîâàéäåðîì (ç'ºäíàííÿ óæå âñòàíîâëåíå) Do not use remote access connection Íå âèêîðèñòîâóâàòè ï³ä'ºäíàííü â³ääàëåíîãî äîñòóïó Schedule the mirroring operation Çàâàíòàæåííÿ çà ðîçêëàäîì Quit WinHTTrack Website Copier Âèéòè ç WinHTTrack Website Copier Back to starting page Íàçàä äî ïî÷àòêîâî¿ ñòîð³íêè Click to start! Ïî÷àòè! No saved password for this connection! Íåìຠçáåðåæåíîãî ïàðîëÿ äëÿ öüîãî ç'ºäíàííÿ Can not get remote connection settings Íå ìîæó îäåðæàòè óñòàíîâêè âèëó÷åíîãî ç'ºäíàííÿ Select a connection provider Âèáåð³òü ïðîâàéäåðà, äî ÿêîãî óñòàíîâèòè ç'ºäíàííÿ Start Ïî÷àòè Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Âè ìîæåòå ïî÷àòè çàâàíòàæåííÿ, íàòèñíóâøè êíîïêó ÑÒÀÐÒ, ÷è ìîæåòå çàäàòè äîäàòêîâ³ ïàðàìåòðè ç'ºäíàííÿ Save settings only, do not launch download now. Ò³ëüêè çáåðåãòè óñòàíîâêè, íå ïî÷èíàòè çàâàíòàæåííÿ. On hold Çàòðèìêà Transfer scheduled for: (hh/mm/ss) ×åêàºìî äî: (hh/mm/ss) Start Ïî÷àòè! Connect to provider (RAS) Ç'ºäíàòèñÿ ç ïðîâàéäåðîì (RAS) Connect to this provider Ç'ºäíàòèñÿ ç öèì ïðîâàéäåðîì Disconnect when finished ³ä'ºäíàòèñü ïðè çàâåðøåíí³ Disconnect modem on completion ³ä'ºäíàòè ïðè çàâåðøåíí³ \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Ïîâ³äîìèòå íàì áóäü ëàñêà ïðî ïîì³÷åí³ ïðîáëåìè ³ ïîìèëêè)\r\n\r\nðàçðàáîòêà:\r\nèíòåðôåéñ (Windows): Xavier Roche\r\nêà÷àëêà (spider): Xavier Roche\r\nïàðñåð java-êëàñ³â: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Ukrainian translations to:\r\nAndrij Shevchuk (andrijsh@mail.lviv.ua) http://programy.com.ua, http://vic-info.com.ua About WinHTTrack Website Copier Ïðî ïðîãðàìó WinHTTrack Website Copier Please visit our Web page Áóäü ëàñêà, â³äâ³äàéòå íàøó äîì³âêó Wizard query Ïèòàííÿ ìàéñòðà Your answer: Âàøà â³äïîâ³äü: Link detected.. Çíàéäåíèé ë³íê Choose a rule Âèáåð³òü ïðàâèëî Ignore this link ²ãíîðóâàòè öåé ë³íê Ignore directory ²ãíîðóâàòè äèðåêòîð³þ Ignore domain ²ãíîðóâàòè äîìåí Catch this page only Ñêà÷àòè ò³ëüêè öþ ñòîð³íêó Mirror site Äçåðêàëþâàòè ñàéò Mirror domain Äçåðêàëþâàòè äîìåí Ignore all ²ãíîðóâàòè âñ³ Wizard query Ïèòàííÿ ìàéñòðà NO Ͳ File Ôàéë Options Íàñòðîþâàííÿ Log Ëîã Window ³êíî Help Äîïîìîãà Pause transfer Ïðèçóïèíèòè çàâàíòàæåííÿ Exit Âèõ³ä Modify options Çì³íèòè íàñòðîþâàííÿ View log Ïåðåãëÿíóòè ëîã View error log Ïåðåãëÿíóòè ëîã ïîìèëîê View file transfers Ïîäèâèòèñÿ ïðîöåñ ïåðåäà÷³ ôàéë³â Hide Ñõîâàòè About WinHTTrack Website Copier Ïðî ïðîãðàìó... Check program updates... Ïåðåâ³ðèòè íàÿâí³ñòü îáíîâëåíî¿ ïðîãðàìè... &Toolbar Ïàíåëü ³íñòðóìåíò³â &Status Bar Ïàíåëü ñòàíó S&plit Ðîçä³ëèòè File Ôàéë Preferences Íàñòðîþâàííÿ Mirror Äçåðêàëî Log Ëîã Window ³êíî Help Äîïîìîãà Exit Âèõ³ä Load default options Çàâàíòàæèòè çíà÷åííÿ ïàðàìåòð³â çà çàìîâ÷óâàííÿì Save default options Çáåðåãòè çíà÷åííÿ çà çàìîâ÷óâàííÿì Reset to default options Î÷èñòèòè çíà÷åííÿ çà çàìîâ÷óâàííÿì Load options... Çàâàíòàæèòè íàñòðîþâàííÿ... Save options as... Çáåðåãòè íàñòðîþâàííÿ ÿê... Language preference... Âèá³ð ìîâè Contents... Çì³ñò... About WinHTTrack... Ïðî WinHTTrack... New project\tCtrl+N Íîâèé ïðîåêò\tCtrl+N &Open...\tCtrl+O &³äêðèòè...\tCtrl+O &Save\tCtrl+S &Çáåðåãòè\tCtrl+S Save &As... Çáåðåãòè &ßê... &Delete... &Âèäàëèòè... &Browse sites... &Ïåðåãëÿä ñàéò³â... User-defined structure Çàäàííÿ ñòðóêòóðè %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\t²ìåíà ôàéë³â áåç òèïó (íàïðèêëàä: image)\r\n%N\t²ìåíà ôàéë³â ç òèïîì (íàïð.: image.gif)\r\n%t\tÒ³ëüêè òèï ôàéëó (íàïð.: gif)\r\n%p\tØëÿõ [áåç çàê³í÷åííÿ /] (ïð.: /someimages)\r\n%h\tÍàçâà Õîñòà (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tÊîðîòê³ ³ìåíà (ïð: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Íàïðèêëàä:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Íàñòðîþâàííÿ ïðîêñ³ Proxy address: Àäðåñà ïðîêñ³: Proxy port: Íîìåð ïîðòó: Authentication (only if needed) Àóòåíòèôiêàöiÿ (ÿêùî ïîòð³áíî) Login Ëîãií Password Ïàðîëü Enter proxy address here Ââåä³òü àäðåñó ïðîêñ³ ñåðâåðà Enter proxy port here Ââåä³òü íîìåð ïîðòó ïðîêñ³ ñåðâåðà Enter proxy login Ââåä³òü ëîãèí ïðîêñ³ Enter proxy password Ââåä³òü ïàðîëü äëÿ ïðîêñ³ ñåðâåðà Enter project name here Ââåä³òü ³ì'ÿ ïðîåêòó Enter saving path here Âêàæ³òü êàòàëîã äëÿ çáåðåæåííÿ ïðîåêòó Select existing project to update Äëÿ â³äíîâëåííÿ ïðîåêòó, âèáåð³òü éîãî ç³ ñïèñêó Click here to select path Âèáðàòè êàòàëîã ïðîåêòó Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... Ìàéñòåð ñòâîðåííÿ ïðîåêòó HTTrack... New project name: ²ì'ÿ íîâîãî ïðîåêòó: Existing project name: ²ì'ÿ ³ñíóþ÷îãî ïðîåêòó: Project name: ²ì'ÿ ïðîåêòó: Base path: Êàòàëîã: Project category: C:\\My Web Sites C:\\Ìî¿ Web Ñàéòè Type a new project name, \r\nor select existing project to update/resume Çàäàéòå íàçâó íîâîãî ïðîåêòó, \r\nàáî Âèáåð³òü ³ñíóþ÷èé ïðîåêò äëÿ éîãî àêòóàë³çàö³¿/ïðîäîâæåííÿ New project Íîâèé ïðîåêò Insert URL Âñòàâòå URL URL: Àäðåñà: Authentication (only if needed) Àóòåíòèô³êàö³ÿ (ÿêùî ïîòð³áíî) Login Ëîã³í: Password Ïàðîëü: Forms or complex links: Ñêëàäí³ ë³íêè: Capture URL... Çàñ³êòè URL... Enter URL address(es) here Ââåä³òü URL àäðåñà Enter site login Ââåä³òü ëîã³í äëÿ äîñòóïó äî ñàéòó Enter site password Ââåä³òü ïàðîëü äëÿ äîñòóïó äî ñàéòó Use this capture tool for links that can only be accessed through forms or javascript code Âèêîðèñòîâóéòå öåé çàñ³á äëÿ âèëîâó äèíàì³÷íèõ URL (javascript, ôîðìè ³ ò.ï.) Choose language according to preference Âèá³ð ìîâè Catch URL! ϳéìàòè URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Òèì÷àñîâî âñòàíîâ³òü â íàñòðîþâàííÿõ ïðîêñ³ âàøîãî áðîóçåðà çàçíà÷åí³ íèæ÷å çíà÷åííÿ àäðåñè ³ íîìåðà ïîðòó.\näàë³, ó áðîóçåð³ âèêîíàéòå íåîáõ³äí³ ä³¿ (ïîñëàòè ôîðìó, àêòèâ³çóâàòè ñêð³ïò ³ ò.ï.) . This will send the desired link from your browser to WinHTTrack. Ó òàêèé ñïîñ³á âè çìîæåòå ïåðåäàòè áàæàíèé ë³íê ³ç áðàóçåðà â HTTrack. ABORT Ñêàñóâàííÿ Copy/Paste the temporary proxy parameters here Ñêîï³þâàòè/âñòàâèòè òèì÷àñîâ³ íàñòðîþâàííÿ ïðîêñ³ Cancel Ñêàñóâàííÿ Unable to find Help files! Íå çíàéäåí³ ôàéëè äîïîìîãè! Unable to save parameters! Íå ìîæëèâî çáåðåãòè ïàðàìåòðè! Please drag only one folder at a time Áóäü ëàñêà, ïåðåòÿãóéòå ò³ëüêè îäíó ïàïêó Please drag only folders, not files Áóäü ëàñêà, ïåðåòÿãóéòå ò³ëüêè ïàïêó, à íå ôàéë Please drag folders only Áóäü ëàñêà, ïåðåòÿãóéòå ò³ëüêè ïàïêó Select user-defined structure? Âèáðàòè çàäàíó âàìè ñòðóêòóðó? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Ïåðåâ³ðòå, ùî âèçíà÷åíà âàìè ñòðóêòóðà ïðàâèëüíà, ó ïðîòèëåæíîìó âèïàäêó, ³ìåíà ôàéë³â áóäóòü íåïåðåäáà÷åí³ Do you really want to use a user-defined structure? Âè ä³éñíî õî÷åòå âèáðàòè çàäàíó ñòðóêòóðó? Too manu URLs, cannot handle so many links!! Çàíàäòî áàãàòî URL'³â, íå ìîæó îáðîáèòè òàêó ê³ëüê³ñòü ë³íê³â! Not enough memory, fatal internal error.. Çàìàëî ïàì'ÿò³, ôàòàëüíà âíóòð³øíÿ ïîìèëêà... Unknown operation! Íåâ³äîìà îïåðàö³ÿ Add this URL?\r\n Äîäàòè öåé URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Óâàãà: ïðîãðàìà íå â³äïîâ³äຠíà çàïèòè, íå ìîæëèâî äîäàòè URL'è... Type/MIME associations ³äïîâ³äí³ñòü òèïó ôàéë³â (Type/MIME) File types: Òèïè ôàéë³â: MIME identity: MIME identity Select or modify your file type(s) here Âèáðàòè ÷è çì³íèòè òèïè ôàéë³â Select or modify your MIME type(s) here Âèáðàòè ÷è çì³íèòè òèïè ôàéë³â Go up Íàãîðó Go down Âíèç File download information ²íôîðìàö³ÿ ïðî çàâàíòàæåííÿ ôàéëó Freeze Window Çàìîðîçèòè â³êíî More information: Äîäàòêîâà ³íôîðìàö³ÿ: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Ëàñêàâî ïðîñèìî â ïðîãðàìó WinHTTrack Website Copier!\n\náóäü-ëàñêà íàòèñí³òü êíîïêó ÄÀ˲ äëÿ òîãî, ùîá\n\n- ïî÷àòè íîâèé ïðîåêò\n- ÷è â³äíîâèòè ÷àñòêîâå çàâàíòàæåííÿ File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS ²ìåíà ôàéë³â ç ðîçøèðåííÿì:\n³ìåíà ôàéë³â, ùî ì³ñòÿòü:\nöåé ôàéë:\n³ìåíà ïàïîê ì³ñòÿòü:\nöÿ ïàïêà:\në³íêè ç öüîãî äîìåíà:\në³íêè ç äîìåí³â, ùî ì³ñòÿòü:\në³íêè ç öüîãî õîñòà:\në³íêè óòðèìóþ÷³:\nöåé ë³íê:\nâñ³ ˲ÍÊÈ Show all\nHide debug\nHide infos\nHide debug and infos Ïîêàçàòè âñ³\nñõîâàòè íàëàãîäæåííÿ\nñõîâàòè èíôî\nñõîâàòè íàëàãîäæåííÿ ³ ³íôî Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Ñòðóêòóðà ñàéòó (çà çàìîâ÷óâàííÿì)\nHtml/, ôàéëè çîáðàæåíü/³íø³ ôàéëè/ôàéëè çîáðàæåíü/\nHtml/html, ôàéëè çîáðàæåíü/³íø³ ôàéëè/ôàéëè çîáðàæåíü\nHtml/, ôàéëè çîáðàæåíü/³íø³ ôàéëè/\nHtml/, ôàéëè çîáðàæåíü/³íø³ ôàéëè/xxx, äå xxx - ðîçøèðåííÿ ôàéëó\nHtml, ôàéëè çîáðàæåíü/³íø³ ôàéëè/xxx\nñòðóêòóðà ñàéòó áåç www.domain.xxx/\nHtml ó site_name/ ôàéëè çîáðàæåíü/³íø³ ôàéëè â site_name/ôàéëè çîáðàæåíü/\nHtml ó site_name/html, ôàéëè çîáðàæåíü/³íø³ ôàéëè â site_name/ôàéëè çîáðàæåíü\nHtml ó site_name/, ôàéëè çîáðàæåíü/³íø³ ôàéëè â site_name/\nHtml ó site_name/, ôàéëè çîáðàæåíü/³íø³ ôàéëè â site_name/xxx\nHtml ó site_name/html, ôàéëè çîáðàæåíü/³íø³ ôàéëè â site_name/xxx\nâñ³ ôàéëè ç âåáà/, ç äîâ³ëüíèìè ³ìåíàìè (íîâèíêà !)\nâñ³ ôàéëè ç site_name/, ç äîâ³ëüíèìè ³ìåíàìè (íîâèíêà !)\nçàäàíà êîðèñòóâà÷åì ñòðóêòóðà... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Ò³ëüêè ñêàíóâàòè\nçáåð³ãàòè html ôàéëè\nçáåð³ãàòè íå html ôàéëè\nçáåð³ãàòè óñ³ ôàéëè (çà çàìîâ÷óâàííÿì)\nçáåð³ãàòè ñïî÷àòêó html ôàéëè Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Çàëèøàòèñÿ â ò³é æå äèðåêòîð³¿\nìîæíà ðóõàòèñÿ âíèç (çà çàìîâ÷óâàííÿì)\nìîæíà ðóõàòèñÿ íàãîðó\nìîæíà ðóõàòèñÿ íàãîðó ³ âíèç Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Çàëèøàòèñÿ íà ò³é æå àäðåñ³ (ïî çàìîâ÷óâàííþ)\nîçàëèøàòèñÿ íà ò³ì æå äîìåí³\nçàëèøàòèñÿ íà ò³ì æå äîìåí³ âåðõíüîãî ð³âíÿ\n³äòè êóäè çàâãîäíî Never\nIf unknown (except /)\nIf unknown ͳêîëè\nÿêùî íåâ³äîìî (êð³ì /)\nÿêùî íåâ³äîìî no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Íå ï³äêîðÿòèñÿ ïðàâèëàì robots.txt\nrobots.txt êð³ì Ìàéñòðà\nñëóõàòèñÿ ïðàâèë robots.txt normal\nextended\ndebug Çâè÷àéíà\nðàçøèðåíà\nâ³äëàãîäæåííÿ Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Ñêà÷àòè ñàéò(è)\nÑêà÷àòè ñàéò(è) + çàïèòàííÿ\nÎòðèìàòè äåÿê³ ôàéëè\nÎòðèìàòè âñ³ ñàéòè ç ñòîð³íêè\nÒåñòóâàòè ë³íêè ç³ ñòîð³íêè\n* Ïðîäîâæèòè ïåðåðâàíó çàâàíòàæåííÿ\n* Ïîíîâèòè ³ñíóþ÷å çàâàíòàæåííÿ Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL ³äíîñíèé URI / Àáñîëþòíèé URL (default)\nÀáñîëþòíèé URL / Àáñîëþòíèé URL\nÀáñîëþòíèé URI / Àáñîëþòíèé URL\nÎðèã³íàëüíèé URL / Îðèã³íàëüíèé URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Òèï ïðîêñ³: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Ïðîòîêîë ïðîêñ³. HTTP: ñòàíäàðòíèé ïðîêñ³. HTTP (òóíåëü CONNECT): íàäñèëຠêîæåí çàïèò ÷åðåç òóíåëü CONNECT, äëÿ ïðîêñ³, ùî ï³äòðèìóþòü ëèøå CONNECT, ÿê-îò HTTPTunnelPort ó Tor. SOCKS5: ïîðò çà çàìîâ÷óâàííÿì 1080. Load cookies from file: Çàâàíòàæèòè cookies ç ôàéëó: Preload cookies from a Netscape cookies.txt file before crawling. Ïîïåðåäíüî çàâàíòàæèòè cookies ç ôàéëó Netscape cookies.txt ïåðåä çàâàíòàæåííÿì. Pause between files: Ïàóçà ì³æ ôàéëàìè: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Âèïàäêîâà çàòðèìêà ì³æ çàâàíòàæåííÿìè ôàéë³â, ó ñåêóíäàõ. Âèêîðèñòîâóéòå MIN:MAX äëÿ âèïàäêîâîãî ä³àïàçîíó (íàïðèêëàä, 2:8). Keep the www. prefix (do not merge www.host with host) Çáåð³ãàòè ïðåô³êñ www. (íå îá'ºäíóâàòè www.host ç host) Do not treat www.host and host as the same site. Íå ââàæàòè www.host ³ host îäíèì ³ òèì ñàìèì ñàéòîì. Keep double slashes in URLs Çáåð³ãàòè ïîäâ³éí³ ñëåø³ â URL Do not collapse duplicate slashes in URLs. Íå âèäàëÿòè ïîâòîðþâàí³ ñëåø³ â URL. Keep the original query-string order Çáåð³ãàòè ïî÷àòêîâèé ïîðÿäîê ïàðàìåòð³â çàïèòó Do not reorder query-string parameters when deduplicating URLs. Íå çì³íþâàòè ïîðÿäîê ïàðàìåòð³â ðÿäêà çàïèòó ï³ä ÷àñ óñóíåííÿ äóáë³êàò³â URL. Strip query keys: Âèëó÷àòè êëþ÷³ çàïèòó: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Êëþ÷³ çàïèòó ÷åðåç êîìó, ÿê³ âèëó÷àþòüñÿ ç ³ìåí³ çáåðåæåíîãî ôàéëó (íàïðèêëàä, sid,utm_source). Write a WARC archive of the crawl Çàïèñàòè WARC-àðõ³â îáõîäó Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Çáåð³ãàòè êîæíó çàâàíòàæåíó â³äïîâ³äü òàêîæ ó àðõ³â WARC/1.1 ISO-28500 ïîðÿä ³ç äçåðêàëîì. WARC archive name: ²ì'ÿ WARC-àðõ³âó: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Íåîáîâ'ÿçêîâà áàçîâà íàçâà WARC-àðõ³âó; çàëèøòå ïîðîæí³ì äëÿ àâòîìàòè÷íîãî íàéìåíóâàííÿ ó âèõ³äíîìó êàòàëîç³. httrack-3.49.14/lang/Turkish.txt0000644000175000017500000011221715230602340012127 LANGUAGE_NAME Turkish LANGUAGE_FILE Turkish LANGUAGE_ISO tr LANGUAGE_AUTHOR Arman (Armish) Aksoy \r\n LANGUAGE_CHARSET ISO-8859-9 LANGUAGE_WINDOWSID Turkish OK Tamam Cancel Vazgeç Exit Çýkýþ Close Kapat Cancel changes Deðiþikleri Kaydetme Click to confirm Onaylamak için Týklayýn Click to get help! Yardým almak için Týklayýn Click to return to previous screen Önceki ekrana dönmek için týklayýn Click to go to next screen Sonraki ekrana gitmek için týklayýn Hide password Parolayý Gizle Save project Projeyi Kaydet Close current project? Açýk proje kapatýlsýn mý? Delete this project? Bu proje silinsin mi? Delete empty project %s? %s boþ projesi silinsin mi? Action not yet implemented Eylem henüz uygulanmadý Error deleting this project Bu proje silinirken hata oluþtu Select a rule for the filter Filtre için bir kural seçin Enter keywords for the filter Filtre için anahtar kelimeleri giriniz Cancel Vazgeç Add this rule Bu kuralý ekle Please enter one or several keyword(s) for the rule Lütfen bu kural için bir veya daha fazla anahtar kelime giriniz Add Scan Rule Tarama Kuralý Ekle Criterion Kriter String Dizim Add Ekle Scan Rules Kurallarý Tara Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Adresleri veya baðlantýlarý almak veya almamak için özel sembolleri kullanýn.\n Bir satýrda birden çok kelime kullanabilirsiniz.\nAyýraç olarak boþluk kullanýn.\n\nÖrnek: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Baðlantýlarý Alma Include link(s) Baðlantýlarý Al Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Ýpucu: Bir sitedeki tüm GIF dosyalarýný almak için, +www.siteniz.com/*.gif benzeri birþey kullanabilirsiniz. \n(+*.gif / -*.gif ile sitedeki GIF dosyalarýnýn alýnýp alýnmayacaðýný belirtebilirsiniz) Save prefs Ayarlarý kaydet Matching links will be excluded: Eþleþen bu baðlantýlar alýnmayacaktýr:: Matching links will be included: Eþleþen bu baðlantýlar alýnacaktýr: Example: Örnek: gif\r\nWill match all GIF files gif\r\nTüm GIF dosyalarýný eþleþtirecektir blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' mavi\r\nTüm kelimeleri ve içerdiklerini 'mavi' adlý kelimeyle karþýlaþtýracaktýr, mesela 'mavigokyuzu.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' buyukdosya.mov\r\nBu aramada 'buyukdosya.mov' eþleþecektir fakat 'buyukdosya2.mov' eþleþmeyecektir cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\n'cgi' kelimesiyle eþleþen tüm baðlantýlarý bulacaktýr, mesela '/cgi-bin/somecgi.cgi' cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\n'cgi-bin' ile eþleþen tüm dizin baðlantýlarýný bulacaktýr, fakat 'cgi-bin-2' gibi bir kelime bu aramada eþleþmez someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. siteniz.com\r\n'siteniz.com' içeren tüm baðlantýlarý bulacaktýr, mesela 'www.siteniz.com', 'ozel.siteniz.com' someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. siteniz\r\n'siteniz' kelimesini içeren tüm baðlantýlarý bulacaktýr, mesela 'www.siteniz.com', 'ozel.siteniz.com', 'www.siteniz.edu' www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.siteniz.com\r\n'www.siteniz.com' içeren tüm adresleri bulacaktýr, ama mesela 'ozel.siteniz.com' bu aramada eþleþmeyecektir someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. siteniz\r\n'siteniz' ile eþleþen tüm alt ve ana baðlantýlarý bulacaktýr, mesela www.siteniz.com/blabla, www.deneme.abc/sitenizden/, wwww.deneme.com/siteniz.html www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.deneme.com/deneme/adres.html\r\nSadece 'www.deneme.com/deneme/adres.html' dosyasýnýz bulur. Bunun için tam adresi (Site adresi + site konumu) girmeniz gerektiðini unutmayýnýz All links will match Bütün baðlantýlar eþleþtirilecek Add exclusion filter Alýnmayacaklar için filtre ekle Add inclusion filter Alýnacaklar için filtre ekle Existing filters Filtreler Cancel changes Deðiþiklikleri kaydetme Save current preferences as default values Þuanki ayarlarý öntanýmlý ayarlar olarak ata Click to confirm Onaylamak için týklayýn No log files in %s! %s içinde kayýt dosyasý yok!! No 'index.html' file in %s! %s içinde 'index.html' yok! Click to quit WinHTTrack Website Copier WinHTTrack Website Copier'dan çýkmak için týklayýn View log files Kayýt dosyalarýný görüntüle Browse HTML start page HTML baþlangýç sayfasýný tarat End of mirror Yansý Sonu View log files Kayýt Dosyalarýný Göster Browse Mirrored Website Web Sitesinin Yansýsýný Tara New project... Yeni proje... View error and warning reports Hata ve uyarý raporlarýný göster View report Raporu göster Close the log file window Kayýt Dosya Penceresini Kapat Info type: Bilgi tipi: Errors Hatalar Infos Bilgiler Find Bul Find a word Sözcük bul Info log file Bilgi kayýt dosyasý Warning/Errors log file Uyarý/Hata kayýt dosyasý Unable to initialize the OLE system OLE sistemi yüklenemiyor WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack belirtilen dizinde hiç indirilirken kesilmiþ dosya kaydý bulamadý! Could not connect to provider Servis saðlayýcýsýna baðlanýlamýyor receive al request iste connect baðlan search ara ready hazýr error hata Receiving files.. Dosyalar alýnýyor.. Parsing HTML file.. HTML dosyasý ayýklanýyorr.. Purging files.. Dosyalar temizleniyor.. Loading cache in progress.. Önbellek yükleniyor.. Parsing HTML file (testing links).. HTML dosyasý ayýklanýyor (baðlantýlar kontrol ediliyor).. Pause - Toggle [Mirror]/[Pause download] to resume operation Duraklat - Ýþleme devam etmek için [Yansý]/[Ýndirmeyi duraklat]'a geçin Finishing pending transfers - Select [Cancel] to stop now! Bekleyen transferler sonlandýrýlýyor - Durdurmak için [Ýptal]'i seçin! scanning Waiting for scheduled time.. Planlanan zaman bekleniyor.. Connecting to provider Servis saðlayýcýya baðlanýyor [%d seconds] to go before start of operation Ýþleme baþlamaya [%d saniye] Site mirroring in progress [%s, %s bytes] Sitenin yansýsý alýnýyor [%s, %s bayt] Site mirroring finished! Sitenin yansýsý alýndý! A problem occurred during the mirroring operation\n Yansý iþlemi sýrasýnda bir hata oluþtu\n \nDuring:\n \nSüresince:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nEðer gerekliyse kayýt dosyasýna bakabilirsiniz.\n\nWinHTTrack Website Copier'den çýkmak için BÝTÝR'e týklayýn.\n\nWinHTTrack kullandýðýnýz için teþekkürler! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Yansý iþlemi tamamlandý.\nWinHTTrac'dan çýkmak için Çýk'a týklayýn.\nHerþeyin düzgün yapýldýðýndan emin olmak için kayýt dosyasýna bakabilirsiniz.\n\nWinHTTrack kullandýðýnýz için teþekkürler! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * YANSI ÝÞLEMÝ ÝPTAL EDÝLDÝ! * *\r\nHerhangi bir güncelleme iþlemi için þuanki geçici kayýtlar gereklidir ve bu kayýtlar indirilen dosyalarý tutarlar.\r\nBiçimlendirilmiþ kayýt daha fazla bilgi içerebilir; eðer bu bilgiyi kaybetmek istemiyorsanýz, bu kaydý yedekleyebilir ve geçici olanýný silebilirsiniz.\r\n[Not: Bu iþlemi hts-cache/new.* dosyalarýný silerek kolaylýkla yapabilirsiniz]\r\n\rBiçimlendirilmiþ kaydý geri almak istiyor musunuz? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * YANSI ÝÞLEMÝ HATASI! * *\r\nHTTrack kullanýlan yanýsnýn boþ olduðunu tespit etti. Eðer bu bir güncelleme ise, önceki yansý geri alýnabilir.\r\nNeden: baþlangýç sayfa(lar)ý bulunamadý veya bir baðlantý problemi oluþtu.\r\n=> Web sitesinin olup olmadýðýný ve vekil sunucu ayarlarýnýzý kontrol edin! <= \n\nTip: Click [View log file] to see warning or error messages \n\Ýpucu: Hata ve uyarý mesajlarýný görmek için [Kayýt dosyasýný göster]'e týklayýnn Error deleting a hts-cache/new.* file, please do it manually hts-cache/new.* dosyalarý silinirken hata oluþtu, lütfen bunu kendiniz yapýn Do you really want to quit WinHTTrack Website Copier? WinHTTrack Website Copier'dan çýkmak istediðine emin misiniz?? - Mirroring Mode -\n\nEnter address(es) in URL box - Yansý Modu -\n\nAdresleri URL kutusuna giriniz - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Etkileþimli Sihirbaz Modu (sorular) -\n\nAdresleri URL kutusuna giriniz - File Download Mode -\n\nEnter file address(es) in URL box - Dosya Ýndirme Modu -\n\nAdresleri URL kutusuna giriniz - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Link Test Modu -\n\nWeb adreslerini baðlantýlarla birlikte test etmek için URL kutusuna giriniz - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Güncelleme Modu -\n\nURL kutusundaki adresli onaylayýn, eðer gerekli ise parametreleri kontrol edip 'ÝLERÝ' tuþuna týklayýn - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Devam Modu (Kesilmiþ Ýþlem) -\n\n\URL kutusundaki adresli onaylayýn, eðer gerekli ise parametreleri kontrol edip 'ÝLERÝ' tuþuna týklayýn Log files Path Kayý dosyalarý konumu Path Konum - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror -Baðlantý Listeleme Modu -\n\nYansýlanacak sayfalarýn adreslerini URL kutusuna giriniz New project / Import? Yeni Proje / Aktarýlsýn mý? Choose criterion Kriter seçiniz Maximum link scanning depth Maksimum baðlantý arama derinliði Enter address(es) here Adresleri buraya giriniz Define additional filtering rules Ek filtre kurallarý tanýmla Proxy Name (if needed) Vekil Sunucu Adý (gerekli ise) Proxy Port Vekil Sunucu Portu Define proxy settings Vekil sunucu ayarlarýný tanýmlayýn Use standard HTTP proxy as FTP proxy FTP Vekil sunucusu için öntanýmlý HTTP sunucusunu kullan Path Konum Select Path Konum Seç Path Konum Select Path Konum Seç Quit WinHTTrack Website Copier WinHTTrack Website Copier'den çýk About WinHTTrack WinHTTrack Hakkýnda Save current preferences as default values Þuanki ayarlarý öntanýmlý deðerler olarak kaydet Click to continue Devam etmek için týklayýn Click to define options Özellikleri tanýmlamak için týklayýn Click to add a URL URL eklemek için týklayýn Load URL(s) from text file URLleri metin dosyasýndan yükle WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack ayarlarý (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Adres Listesi metin dosyasý (*.txt)|*.txt|| File not found! Dosya bulunamadý! Do you really want to change the project name/path? Proje adýný/konumunu deðiþtirmek istediðinizden emin misiniz? Load user-default options? Kullanýcý-tanýmlý ayarlar yüklensin mi? Save user-default options? Kullanýcý-tanýmlý ayarlar kaydedilsin mi? Reset all default options? Öntanýmlý ayarlar sýfýrlansýn mý? Welcome to WinHTTrack! WinHTTrack'a Hoþgeldiniz! Action: Eylem: Max Depth Max Derinlik Maximum external depth: Maximum harici derinlik: Filters (refuse/accept links) : Filtreler (red/kabul edilen baðlantýlar) : Paths Konumlar Save prefs Özellikleri Kaydet Define.. Tanýmla.. Set options.. Ayarlar.. Preferences and mirror options: Ayarlar ve yansý seçenekleri: Project name Proje adý Add a URL... URL ekle... Web Addresses: (URL) Web Adresleri: (URL) Stop WinHTTrack? WinHTTrack Durdurulsun mu? No log files in %s! %s içinde kayýt dosyasý yok! Pause Download? Ýndirme duraklatýlsýn mý? Stop the mirroring operation Yansý iþlemini durdur Minimize to System Tray Sistem çubuðuna küçült Click to skip a link or stop parsing Baðlantýyý geçmek için veya ayýklamayý durdurmak için týklayýn Click to skip a link Baðlantýyý atlamak için týklayýn Bytes saved Bayt kaydedildi Links scanned Link tarandý Time: Zaman: Connections: Baðlantýlar: Running: Çalýþýyor: Hide Gizle Transfer rate Transfer hýzý SKIP ATLA Information Bilgi Files written: Yazýlan dosyalar: Files updated: Güncellenen dosyalar: Errors: Hatalar: In progress: Ýlerleme: Follow external links Alýnmayan baðlantýlarý izle Test all links in pages Sayfadaki tüm baðlantýlarý test et Try to ferret out all links Tüm baðlantýlarý ortaya çýkarmaya çalýþ Download HTML files first (faster) Öncelikli olarak HTML dosyalarýný indir (daha hýzlý) Choose local site structure Yerel site yapýsý seç Set user-defined structure on disk Diskteki kullanýcý-tanýmlý yapýyý ata Use a cache for updates and retries Denemeler ve güncellemer için bir kayýt kullan Do not update zero size or user-erased files Silinen veya boþ olan dosyalarý güncelleme Create a Start Page Baþlangýç Sayfasý Yarat Create a word database of all html pages Tüm html sayfalarýndan bir kelime veritabaný yarat Create error logging and report files Hata kaydý ve rapor dosyalarý yarat Generate DOS 8-3 filenames ONLY Yalnýzca DOS 8-3 dosya adlarý üret Generate ISO9660 filenames ONLY for CDROM medias Yalnýz CDROM lar için ISO9660 dosya adlarý üret Do not create HTML error pages HTML hata sayfalarý yaratma Select file types to be saved to disk Diske kaydedilecek dosya tiplerini seçin Select parsing direction Ayýklama yönlendirmesini seçin Select global parsing direction Genel ayýklama yönlendirmesini seçinr Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Alýnan ve alýnmayan dosyalar için URLleri yeniden yazma amaçlý kurallar hazýrla Max simultaneous connections Max simule baðlantý sayýsý File timeout Dosya zaman aþýmý Cancel all links from host if timeout occurs Eðer zaman aþýmý yaþanýrsa sunucudaki tüm baðlantýlarý iptal et Minimum admissible transfer rate Kabul edilebilen minimum ransfer hýzý Cancel all links from host if too slow Eðer sunucu çok yavaþsa tüm baðlantýlarý iptal et Maximum number of retries on non-fatal errors Hata durumunda maksimum dene sayýsý Maximum size for any single HTML file Bir HTML dosyasý için maksimum boyutt Maximum size for any single non-HTML file HTML olmayan dosyalar için maksimum boyut Maximum amount of bytes to retrieve from the Web Web'den alýnacak maksimum bayt miktarý Make a pause after downloading this amount of bytes Bu miktarda bir indirme yaparsan durakla Maximum duration time for the mirroring operation Yansýlama için maksimum süreklilik Maximum transfer rate Maksimum transfer hýzý Maximum connections/seconds (avoid server overload) Maksimum baðlantý/saniye (sunucuya fazla yüklenmekten kaçýnmak için) Maximum number of links that can be tested (not saved!) Test edilebilecek maksimum baðlantý sayýsý (kaydedilmeyen!) Browser identity Browser Kimliði Comment to be placed in each HTML file Her HTML sayfasýnýn içerisine yerleþtirilecek açýklama Back to starting page Baþlangýç sayfasýna dön Save current preferences as default values Þuanki özellikleri öntanýmlý deðerler olarak kaydet Click to continue Devam etmek için týklayýn Click to cancel changes Deðiþiklikleri iptal etmek için týklayýn Follow local robots rules on sites Sitelerde yerel robot kurallarýný izle Links to non-localised external pages will produce error pages Alýnmayan sayfalarý gösteren baðlantýlar hata sayfalarýna yönlendirilsin Do not erase obsolete files after update Güncellemeden sonra eski dosyalarý silme Accept cookies? Çerezler kabul edilsin mi? Check document type when unknown? Bilinmeyen dosya türleri kontrol edilsin mi? Parse java applets to retrieve included files that must be downloaded? Ýndirilmesi gereken java uygulamarý ayýklansýn mý? Store all files in cache instead of HTML only Sadece HTML sayfalarý yerine bellekteki tüm dosyalarý geri al Log file type (if generated) Kayýt dosyasýnýn türü (eðer üretilirse) Maximum mirroring depth from root address Yansýlama iþleminde ana adresten uzaklaþýlacak maksimum derinlik Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Alýnmayan/yasak adreslerin yansý iþlemi için maksimum derinlik (0, bahsedilen, none, öntanýmlý deðer) Create a debugging file Hata ayýklama için dosya yarat Use non-standard requests to get round some server bugs Bazý sunucu hatalarýndan kurtulmak için standart olmayan istekler kullan Use old HTTP/1.0 requests (limits engine power!) Eski HTTP/1.0 isteklerini kullan (sistem gücünü kýsýtlar!) Attempt to limit retransfers through several tricks (file size test..) Tekrarlanan transferleri birkaç hile ile kýsýtlandýrmaya çalýþ (dosya boyutu testi...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Alýnmayan baðlantýlarý giriþ/parola istemeden yaz Write internal links without query string Sorgulama kelimesi olmadan alýnan baðlantýlarý yaz Get non-HTML files related to a link, eg external .ZIP or pictures Bir baðlantýyla alakalý HTML türünde olmayan dosyalarý da al, örnek .ZIP dosyalarý ve resimler Test all links (even forbidden ones) Tüm baðlantýlarý test et (yasak olanlarý bile) Try to catch all URLs (even in unknown tags/code) Tüm baðlantýlarý almaya çalýþ (bilinmeyen etiket/kod içinde olanlarý bile)) Get HTML files first! Öncelikle HTML dosyalarýný al! Structure type (how links are saved) Yapý türü (baðlantýlarýn nasýl kaydedileceði) Use a cache for updates Güncellemeler için önbellek kullan Do not re-download locally erased files Yerel olarak silinen dosyalarý tekrar indirme Make an index Bir index yarat Make a word database Sözcük veritabaný hazýrla Log files Kayýt dosyalarý DOS names (8+3) DOS adlarý (8+3) ISO9660 names (CDROM) ISO9660 adlarý (CDROM) No error pages Hata sayfalarýný alma Primary Scan Rule Öncelikli Arama Kuralý Travel mode Gezi modu Global travel mode Genel gezi modu These options should be modified only exceptionally Bu ayarlar sadece kabul edilebildikleri zaman deðiþtirilebilirler Activate Debugging Mode (winhttrack.log) Hata Ayýklama Modunu Aktifleþtir (winhttrack.log) Rewrite links: internal / external Baðlantýlarý tekrar yaz: alýnan / alýnmayan Flow control Taþma kontrolü Limits Sýnýrlar Identity Kimlik HTML footer HTML sayfa altlýðý N# connections N# baðlantý Abandon host if error Eðer hata oluþursa sunucuyu býrak Minimum transfer rate (B/s) Minimum transfer hýzý (B/s) Abandon host if too slow Eðer sunucu çok yavaþsa býrak Configure Yapýlandýr Use proxy for ftp transfers FTP transfeleri için vekil sunucu kullan TimeOut(s) Zaman Aþýmý(s) Persistent connections (Keep-Alive) Aktif tutulan baðlantýlar (Sürekli) Reduce connection time and type lookup time using persistent connections Baðlantý süresini düþürün ve kalýcý baðlantýlar kullanýlarak yapýlan arama süresini girin. Retries Tekrar Deneme Size limit Boyut sýnýrý Max size of any HTML file (B) HTML dosyalarý için maksimum boyut (B) Max size of any non-HTML file HTML olmayan dosyalar için maksimum boyut) Max site size Max site boyutu Max time Max süre Save prefs Ayarlarý kaydeti Max transfer rate Max transfer hýzý Follow robots.txt Robots.txt'i takip et No external pages Tüm sayfalar alýnsýn Do not purge old files Eski dosyalarý temizleme Accept cookies Çerezleri kabul et Check document type Belge türünü kontrol et Parse java files Java dosyalarýný ayýkla Store ALL files in cache Tüm dosyalarý önbellekte topla Tolerant requests (for servers) Tölerans istekleri (sunucular için) Update hack (limit re-transfers) Güncelleme ince ayarý (tekrar eden transferleri sýnýrla) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Eski HTTP/1.0 isteklerine zorla (no 1.1) Max connections / seconds Max baðlantý / saniye Maximum number of links Maximum baðlantý sayýsý Pause after downloading.. Ýndirme iþleminden sonra beklee.. Hide passwords Parolalarý gizle Hide query strings Sorgulama kelimelerini gizle Links Baðlantýlar Build Kur Experts Only Yalnýzca Uzmanlarn Flow Control Taþma Kontrolü Limits Sýnýrlar Browser ID Tarayýcý ID Scan Rules Tarama Kurallarý Spider Að Log, Index, Cache Kayýt, Indeks, Önbellek Proxy Vekil Sunucu MIME Types MIME Türleri Do you really want to quit WinHTTrack Website Copier? WinHTTrack Website Copier'den çýkmak istediðine emin misiniz? Do not connect to a provider (already connected) Sunucuya baðlanma (zaten baðlý) Do not use remote access connection Uzaktan eriþim baðlantýlarý kullanma Schedule the mirroring operation Yansýma iþlemini zamanla Quit WinHTTrack Website Copier WinHTTrack Website Copier'dan Çýk Back to starting page Baþlangýç sayfasýna dön Click to start! Baþlamak için týklayýn! No saved password for this connection! Bu baðlantý için kaydedilmiþ parola yok! Can not get remote connection settings Uzaktan eriþim ayarlarý alýnamýyor Select a connection provider Bir baðlantý sunucusu seçin Start Baþlat Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Lütfen eðer gerekli ise baðlantý parametrelerini belirtiniz,\ndaha sonra BAÞLAT'a basarak yansýlama iþlemini baþlatabilirsiniz. Save settings only, do not launch download now. Sadece ayarlarý kaydet, indirme iþlemine baþlama. On hold Beklemede Transfer scheduled for: (hh/mm/ss) Transferin zamaný: (hh/mm/ss) Start Baþlat Connect to provider (RAS) Sunucuya baðlan (RAS) Connect to this provider Bu sunucuya baðlan Disconnect when finished Bittiðinde baðlantýyý kes Disconnect modem on completion Ýþlem tamamlandýðýnda modemden baðlantýyý kopar \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Lütfen bize her türlü hatayý ve problemi aktarýnýz)\r\n\r\nGeliþtirme:\r\nArayüz (Windows): Xavier Roche\r\nAð: Xavier Roche\r\nJava Ayýklama Sýnýflarý: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche ve diðerleri\r\nÇeviri ipuçlarý için teþekkürler: \r\nRobert Lagadec (rlagadec@yahoo.fr) About WinHTTrack Website Copier WinHTTrack Website Copier Hakkýnda Please visit our Web page Lütfen web sitemizi ziyaret edin Wizard query Sorgulama sihirbazý Your answer: Cevabýnýz: Link detected.. Bulunan baðlantý.. Choose a rule Bir kural seçin Ignore this link Bu baðlantýyý yoksay Ignore directory Bu dizini yoksay Ignore domain Bu alanadýný yoksay Catch this page only Sasece bu sayfayý önbelleðe al Mirror site Siteyi yansýla Mirror domain Alanadýný yansýla Ignore all Tümünü yoksay Wizard query Sorgulama sihirbazý NO Hayýr File Dosya Options Seçenekler Log Kayýt Window Pencere Help Yardým Pause transfer Transferi duraklat Exit Çýk Modify options Seçenekleri deðiþtir View log Kaydý göster View error log Hata kaydýný göster View file transfers Dosya transfelerini göster Hide Gizle About WinHTTrack Website Copier WinHTTrack Website Copier Hakkýnda Check program updates... Program güncellemelerini kontrol et... &Toolbar &Araç Çubuðu &Status Bar &Durum Çubuðu S&plit A&yýr File Dosya Preferences Ayarlar Mirror Yansý Log Kayýt Window Pencere Help Yardým Exit Çýk Load default options Varsayýlan ayarlarý yükle Save default options Varsayýlan ayarlarý kaydet Reset to default options Varsayýlan ayarlara dön Load options... Ayarlarý yükle... Save options as... Ayarlarý farklý kaydett... Language preference... Dil seçimi... Contents... Ýçerikler... About WinHTTrack... WinHTTrack Hakkýnda... New project\tCtrl+N Yeni Proje\tCtrl+N &Open...\tCtrl+O &Aç...\tCtrl+O &Save\tCtrl+S &Kaydet\tCtrl+S Save &As... &Farklý Kaydet... &Delete... &Sil... &Browse sites... &Siteleri tara... User-defined structure Kullanýcý tanýmlý yapý %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tDosyanýn soneksiz adý (örn: resim)\r\n%N\tDosyanýn sonekli adý (örn: resim.gif)\r\n%t\tYalnýz dosyanýn türü (örn: gif)\r\n%p\tKonum [/ ile bitmeyen] (örn: /resimler)\r\n%h\tSunucu adý (örn: www.siteniz.com)\r\n%M\tMD5 URL (128 bit, 32 ascii bayt)\r\n%Q\tMD5 sorgu kelimesi (128 bit, 32 ascii bayt)\r\n%q\tMD5 kýsa arama kelimesi (16 bit, 4 ascii bayt)\r\n\r\n%s?\tKýsa ad (örnek: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Örnek:\t%h%p/%n%q.%t\n->\t\tc:\\yansý\\www.siteniz.com\\resimler\\resim.gif Proxy settings Vekil sunucu ayarlarý Proxy address: Vekil sunucu adresi: Proxy port: Vekil sunucu portu: Authentication (only if needed) Yetkilendirme (gerektiðinde) Login Kullanýcý Password Parola Enter proxy address here Vekil sunucu adresini buraya girin Enter proxy port here Vekil sunucu portunu buraya girin Enter proxy login Vekil sunucu kullanýcý adýnýzý girin Enter proxy password Vekil sunucu parolasýný girin Enter project name here Proje adýný buraya girin Enter saving path here Saklanacak konumu buraya girinr Select existing project to update Güncellenecek projeyi seçin Click here to select path Konumu seçmek için týklayýn Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Proje Sihirbazý... New project name: Yeni proje adý: Existing project name: Mevcut proje adý: Project name: Proje adý: Base path: Ana konum: Project category: C:\\My Web Sites C:\\Benim Web Sitem Type a new project name, \r\nor select existing project to update/resume Yeni bir proje adý yazýn, \r\nveya devam edilecek/güncellenecek projeyi seçin New project Yeni proje Insert URL URL ekle URL: URL: Authentication (only if needed) Yetkilendirme (gerekirse) Login Kullanýcý Password Parola Forms or complex links: Formlar veya karmaþýk baðlantýlar: Capture URL... URL yakala... Enter URL address(es) here URL Adres(ler)ini buraya girin Enter site login Site için kullanýcý adý girin Enter site password Site için parola girin Use this capture tool for links that can only be accessed through forms or javascript code Yalnýzca formlarla veya javascript koduyla eriþilebilen baðlantýlarý bu yakalama aracýný kullanarak al Choose language according to preference Dili ayarlara göre seç Catch URL! URL Yakala! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Lütfen geçici tarayýcý vekil sunucu ayarlarýný bu deðerlere göre atayýnýz (Vekil sunucu adresini ve portunu Kopyala/Yapýþtýr yapabilirsiniz).\nDaha sonra tarayýcýnýzda formun GÖNDER (SUBMIT) tuþuna veya almak istediðiniz özel baðlantýya týklayýnýz. This will send the desired link from your browser to WinHTTrack. Bu iþlem istenilen baðlantýyý tarayýcýnýzdan WinHTTrack'e gönderecektir. ABORT ÝPTAL ET Copy/Paste the temporary proxy parameters here Geçici vekil sunucu parametrelerini buraya Kopyala/Yapýþtýr yapýnr Cancel Vazgeç Unable to find Help files! Yardým dosyalarý bulunamadý! Unable to save parameters! Parametreler kaydedilemedi! Please drag only one folder at a time Lütfen bir seferde yalnýz bir klasör sürükleyin Please drag only folders, not files Lütfen dosyalar yerine dizinleri sürükleyin Please drag folders only Lütfen sadece dizinleri sürükleyin Select user-defined structure? Kullanýcý tanýmlý yapý seçilsin mi?? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Lütfen kullanýcý tanýmlý kelimenin doðru olduðundan emin olun,\nyoksa dosya adlarý sahte olacaktýr! Do you really want to use a user-defined structure? Kullanýcý tanýmlý bir yapý kullanmak istediðinizden emin misiniz? Too manu URLs, cannot handle so many links!! Çok fazla adres var, bu kadar fazla adres tutulamayacaktýr!! Not enough memory, fatal internal error.. Yeterli hafýza yok, ölümcül iç hata.. Unknown operation! Bilinmeyen iþlem! Add this URL?\r\n Bu URL eklensin mi?\r\n Warning: main process is still not responding, cannot add URL(s).. Uyarý: Ana süreç hala cevap vermedi, URL eklenemedi.. Type/MIME associations Tür/MIME iliþkileri File types: Dosya türleri: MIME identity: MIME kimliði: Select or modify your file type(s) here Buradan dosya türlerini seçin ve deðiþitirin Select or modify your MIME type(s) here Buradan MIME türlerini seçin ve deðiþitirin Go up Yukarý Go down Aþaðý File download information Dosya indirme bilgisi Freeze Window Pencereyi Dondur More information: Daha çok bilgi: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download WinHTTrack Website Copier'a Hoþgeldiniz!\n\nLütfen yeni bir projeye baþlamak\nveya yarým kalmýþ bir indirmeye devam etmek için\nÝLERÝ butonuna týklayýn\n File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Uzantýlarý ile birlikte dosya adlarý:\nDosya adlarý içinde:\nBu dosya adý:\nDizin adlarý içinde:\nBu dizin adý:\nBu alan adýndaki baðlantýlar:\nAlan adlarýndaki baðlantýlar içinde:\nBu sunucudan baðlantýlar:\nBaðlantýlar içinde:\nBu baðlantý:\nTÜM BAÐLANTILAR Show all\nHide debug\nHide infos\nHide debug and infos Hepsini göster\nHata ayýklamayý gizle\nBilgileri gizle\nBilgileri ve hata ayýklamayý gizle Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Site yapýsý (öntanýmlý)\nweb/'de Html, web/resimler/ içinde resimler/diðer dosyalar\nweb/html içinde Html, /web/resimler içinde resimler/diðer dosyalar\nweb/ içinde Html, web/ içinde resimler/diðer dosyalar\nweb/ içindeki resimler, web/xxx içindeki resimler/diðer dosyalar, (Buradaki xxx dosya uzantýsýdýr)\nweb/html içinde Html, web/xxx içinde resimler\nwww.alanadi.xxx/ olmadan site yapýsý\nsite_adi içinde Html, site_adi/resimler/ içinde resimler/diðer dosyalar\nsite_adi/html içinde Html, site_adi/resimler içinde resimler/diðeer dosyalar\nsite_adi içinde Html, site_adi/ içinde resimler/diðer dosyalar\nsite_adi/ içinde html, site_adi/xxx içinde resimler/diðer dosyalar\nsite_adi/html içinde Html, site_adi/xxx içinde resimler/diðer dosyalar\nweb/ içindeki tüm dosyalar, (rastgele adlarla!)\nsite_adi/ içindeki tüm dosyalar (rastgele adlarla!)\nKullanýcý tanýmlý yapý.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Sadece tara\nHtml dosyalarýný al\nHtml türünde olmayan dosyalarý al\nTüm dosyalarý al (öntanýmlý)\nÖncelikli olarak html dosyalarýný al Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Ayný dizin içinde kal\nAlt dizinlere geçilebilir /öntanýmlý)\nÜst dizinlere geçilebilir\nHem alt hem üst dizinlere geçilebilir Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Ayný adreste kal (öntanýmlý)\nAyný alan adýnda kal\nAyný üst seviye adresinde kal\nWeb'deki her yere git Never\nIf unknown (except /)\nIf unknown Asla\nBilinmiyorsa (/ hariç)\nBilinmiyorsa no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Robot.txt kurallarý olmasýn\nrobot.txt kurallarý (sihirbaz hariç)\nrobot.txt kurallarýný uygula normal\nextended\ndebug normal\ngeniþletilmiþ\nhata ayýkla Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Web sitelerini indir\nWeb sitelerini + istekleri indir\nAyrý dosyalarý al\nSayfalardaki tüm siteleri indir (çoklu yansý)\nSayfalardaki baðlantýlarý test et (sýk kullanýlanlar testi)\n* Tamamlanmamýþ indirme iþlemine devam et\n* Ýndirilmiþ sayfayý güncelle Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Benzer URI / Tam URL (öntanýmlý)\nTam URL / Tam URL\nTam URI / Tam URL\nOrjinal URL / Orjinal URL Open Source offline browser Açýk kaynak kodlu çevrimdýþý tarayýcý Website Copier/Offline Browser. Copy remote websites to your computer. Free. Web sitesi Kopyalýcý/Çevrimdýþý Tarayýcý. Web sitelerini bilgisayarýnýza kopyalayýn. Bedava. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, çevrimdýþý tarayýcý URL list (.txt) URL listesi (.txt) Previous Geri Next Ýleri URLs URLler Warning Uyarý Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Tarayýcýnýz þuanda javascript'i desteklemiyor. Daha iyi sonuçlar için, lütfen javascript destekli bir tarayýcý kullanýn. Thank you Teþekkürler You can now close this window Bu pencereyi artýk kapatabilirsiniz Server terminated Sunucu sonlandýrdý A fatal error has occurred during this mirror Bu yansýlama iþlemi sýrasýnda ölümcül bir hata oluþtu Proxy type: Proxy türü: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxy protokolü. HTTP: standart proxy. HTTP (CONNECT tüneli): her isteði bir CONNECT tüneli üzerinden gönderir; Tor'un HTTPTunnelPort gibi yalnýzca CONNECT destekleyen proxy'ler için. SOCKS5: varsayýlan baðlantý noktasý 1080. Load cookies from file: Çerezleri dosyadan yükle: Preload cookies from a Netscape cookies.txt file before crawling. Taramadan önce bir Netscape cookies.txt dosyasýndan çerezleri önceden yükle. Pause between files: Dosyalar arasýnda bekleme: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Dosya indirmeleri arasýnda saniye cinsinden rastgele gecikme. Rastgele bir aralýk için MIN:MAX kullanýn (örn. 2:8). Keep the www. prefix (do not merge www.host with host) www. önekini koru (www.host ile host'u birleþtirme) Do not treat www.host and host as the same site. www.host ve host'u ayný site olarak deðerlendirme. Keep double slashes in URLs URL'lerdeki çift eðik çizgileri koru Do not collapse duplicate slashes in URLs. URL'lerdeki yinelenen eðik çizgileri birleþtirme. Keep the original query-string order Özgün sorgu dizesi sýrasýný koru Do not reorder query-string parameters when deduplicating URLs. URL'lerin yinelenenlerini ayýklarken sorgu dizesi parametrelerini yeniden sýralama. Strip query keys: Sorgu anahtarlarýný çýkar: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Kaydedilen dosya adlandýrmasýndan çýkarýlacak, virgülle ayrýlmýþ sorgu anahtarlarý (örn. sid,utm_source). Write a WARC archive of the crawl Taramanýn WARC arþivini yaz Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Ýndirilen her yanýtý ayrýca aynanýn yanýna bir ISO-28500 WARC/1.1 arþivine kaydet. WARC archive name: WARC arþivi adý: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. WARC arþivi için isteðe baðlý temel ad; çýktý dizininde otomatik adlandýrma için boþ býrakýn. httrack-3.49.14/lang/Svenska.txt0000644000175000017500000011005315230602340012104 LANGUAGE_NAME Svenska LANGUAGE_FILE Svenska LANGUAGE_ISO sv LANGUAGE_AUTHOR Staffan Ström (staffan at fam-strom.org) \r\n LANGUAGE_CHARSET ISO-8859-2 LANGUAGE_WINDOWSID Swedish OK OK Cancel Annulera Exit Avsluta Close Stäng Cancel changes Ångra ändringarna Click to confirm Klicka för att bekräfta Click to get help! Klicka för att få hjälp! Click to return to previous screen Klicka för att gå till föregående bild Click to go to next screen Klicka för att se nästa bild Hide password Dölj lösenord Save project Spara projekt Close current project? Stäng aktuellt projekt? Delete this project? Radera detta projekt? Delete empty project %s? Radera tomt projekt %s? Action not yet implemented Denna funktion är inte utvecklad ännu Error deleting this project Ett fel uppstod vid radering av detta projekt Select a rule for the filter Välj vilken regel som skall gälla för detta filter Enter keywords for the filter Skriv in ett nyckelord för detta filter Cancel Annulera Add this rule Lägg till denna regel Please enter one or several keyword(s) for the rule Skriv in en eller flera nykelord för denna regel Add Scan Rule Lägg till en sökregel Criterion Kriterie String Sträng Add Lägg till Scan Rules Sökregler Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Använd jokertecken (*) till att inkludera/exkludera URLer eller länkar.\nDu kan använda flera söksträngar i samma rad.\nAnvänd mellanrum som separator.\n\nExempel: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Uteslut länk(ar) Include link(s) Inkludera länk(ar) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tips: För att få med ALLA GIF-filer, prova och använd: +www.someweb.com/*.gif. \n(+*.gif / -*.gif kommer att inkludera/exkludera ALLA GIF-filer från ALLA webb-sajter) Save prefs Spara inställningar Matching links will be excluded: Matchande länkar kommer att uteslutas: Matching links will be included: Matchande länkar kommer att inkluderas: Example: Exempel: gif\r\nWill match all GIF files gif\r\n Kommer att matcha alla GIF-filer blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nKommer att hitta alla filer med en matchande textsträng. Skriver du ex. vis 'blue' medtages 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nKommer att ta med filen 'bigfile.mov', men inte filen 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nKommer att hitta länkar med mappnamn som matchar textsträngen 'cgi', t.ex. /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nFinner länkar med mappnamn som matchar hela 'cgi-bin' textsträngen (men inte cgi-bin-2, som ett exempel) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nHittar länkar med matchande sub-string t.ex. www.someweb.com, private.someweb.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nHittar länkar med matchande mappnamn sub-string som t.ex. www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc.\r\n\r\n www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nHittar länkar som matchar hela strängen 'www.someweb.com' , (men INTE länkar som: private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nHittar möjliga länkar med matchande text-sträng som t.ex. www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc.\r\n www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nHittar bara 'www.test.com/test/someweb.html' filen. Notera att du skall skriva den fullständiga sökvägen[URL + sökväg] All links will match Alla länkar kommer att matcha Add exclusion filter Lägg till exkluderings-filter Add inclusion filter Lägg till inkluderings-filter Existing filters Existerande filter Cancel changes Upphäv ändringarna Save current preferences as default values Spara nuvarande inställningar som standardinställning Click to confirm Klicka för bekräfta No log files in %s! Det finns ingen log-fil i %s! No 'index.html' file in %s! Dettt finns ingen 'index.html'-fil i %s! Click to quit WinHTTrack Website Copier Klicka för att avsluta WinHTTrack Website Copier View log files Granska log filer Browse HTML start page Granska HTML startsida End of mirror Kopieringen av denna webb är klar View log files Visa logfiler Browse Mirrored Website Granska kopierad Webb New project... Nytt projekt... View error and warning reports Granska fel/varnings-rapporten View report Granska rapporten Close the log file window Lås loggfils fönstret Info type: Informationstyp: Errors Fel Infos Information Find Sök Find a word Sök efter ett ord Info log file Info loggfil Warning/Errors log file Varning/Fel loggfil Unable to initialize the OLE system Kan inte starta OLE-systemet WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack kan inte hitta någon avbruten download fil-cache i den angivna mappen!\r\n Could not connect to provider Kan inte ansluta till Internet receive motagit request anmodan connect ansluta search söka ready klar error fel Receiving files.. Tar emot filer... Parsing HTML file.. Överför HTML fil... Purging files.. Ta bort filer.. Loading cache in progress.. Parsing HTML file (testing links).. Överför HTML fil (testar länkar).... Pause - Toggle [Mirror]/[Pause download] to resume operation Pause - Välj från menyn [Kopiera]/[Pause nerladdning] för att återuppta överföringen Finishing pending transfers - Select [Cancel] to stop now! Avsluta pågående överföring - Välj [Avbryt] för att stoppa scanning sökning Waiting for scheduled time.. Vänta på planlagd tidpunkt... Connecting to provider Ansluter till Internet [%d seconds] to go before start of operation [%d sekunder] kvar till start av denna operation Site mirroring in progress [%s, %s bytes] Webb kopieras nu [%s, %s bytes] Site mirroring finished! Kopieringen är avslutad ! A problem occurred during the mirroring operation\n Det uppstod ett problem under kopieringen \nDuring:\n \nUnder:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nGranska eventuellt log filen.\n\nKlicka på AVSLUTA för att stänga WinHTTrack Website Copier.\n\nTack för att du använder WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Webb kopieringen är utförd. \nKlicka OK för att avsluta WinHTTrack.\nGranska log-fil(erna) för att kontrollera att allt har fungerat.\n\nTack för att du avänder WinHTTrack!\r\n * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * KOPIERINGEN ÄR AVBRUTEN! * *\r\nDen nuvarnde cachen är obligatorisk för alla uppdaterings operationer och innehåller data från senaste nerladdning med den aktuella avbrutna överföringen.\r\nDen tidigare cachen kan innehålla mera komplett information; on du önskar att spara den informationen, ska du återskapa den och radera den aktuella cachen.\r\n[Note: Detta kan lättast göras genom att radera samtliga 'hts-cache/new.* filer]\r\n\r\nTror du att den tidigare cache-fil eventuellt innehåler mera komplett information, och vill du återställa den? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * KOPIERINGSFEL! * *\r\nWinHTTrack har upptäckt att den nuvarande webb-kopieringen är tom. Om det var en uppdatering du utförde, har den gamla kopian återskapats.\r\nMöjlig fel: Den första sidan kunde antingen inte hittas eller uppstod det ett problem med förbindelsen.\r\n=> Kontrollera att webbservern finns och/eller kontrollera Proxy-inställningen! <= \n\nTip: Click [View log file] to see warning or error messages \n\nTips: Klicka [Granska log fil] för att granska varning/fel-meddelande Error deleting a hts-cache/new.* file, please do it manually Det uppstod ett fel vid radering av hts-cache/new.* file, radera filen manuellt. Do you really want to quit WinHTTrack Website Copier? Vill du verklingen avsluta WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Kopiering av webb -\n\nSkriv webb-adressen i URL fältet - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktiv guide (frågor) -\n\nSkriv webb-adressen i URL fältet - File Download Mode -\n\nEnter file address(es) in URL box - Filöverföring -\n\nSkriv webb-adressen i URL fältet - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Länk test -\n\nSkriv webb-adressen i URL fältet - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Uppdatering -\n\nBekräfta webb-adressen i URL fältet. Kontrollera ev. dina inställingar och klicka sedan på 'NÄSTA'. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Återuppta kopiering (där överföringen blev avbruten) -\n\nBekräfta webb-adressen i URL fältet. Kontrollera ev. dina inställingar och klicka sedan på 'NÄSTA'. Log files Path Sökväg för log-fil Path Sökväg - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Länklista- \n\nAnvänd URL fältet till att ange address(er) på sidor där innehåller länkar som skall kopieras. New project / Import? Nytt projekt / Import? Choose criterion Välj kriterier Maximum link scanning depth Max sökdjup för länkar Enter address(es) here Skriv in webb-adress(er) här Define additional filtering rules Definera ytterligare filtreringsregler Proxy Name (if needed) Proxy Namn (om det behövs) Proxy Port Proxy portnummer Define proxy settings Definera proxy-inställningar Use standard HTTP proxy as FTP proxy Använd standard HTTP proxy som FTP proxy Path Sökväg Select Path välj sökväg Path Sökväg Select Path Välj sökväg Quit WinHTTrack Website Copier Avsluta WinHTTrack Website Copier About WinHTTrack Om WinHTTrack Save current preferences as default values Spara nuvarande inställningar som standard Click to continue Klicka för att fortsätta Click to define options Klicka för att definera inställingar Click to add a URL Klicka för att lägga till URL Load URL(s) from text file Hämta URL från text fil WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack inställingar (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Adresslista text fil (*.txt)|*.txt|| File not found! Filen hittades inte! Do you really want to change the project name/path? Är du säker på att ändra projektnamn/sökväg? Load user-default options? Ladda användardefinierade standardinställningar? Save user-default options? Spara användardefinierade standardinställningar? Reset all default options? Nollställ alla standardinställningar? Welcome to WinHTTrack! Välkommen till WinHTTrack Website Copier! Action: Handling: Max Depth Max djup: Maximum external depth: Max externt djup: Filters (refuse/accept links) : Filtrerings-regel (utan/med länkar) Paths Sökväg Save prefs Spara inställningar Define.. Definera... Set options.. Bestäm inställningar... Preferences and mirror options: Inställningar och kopieringsval Project name Projektnamn Add a URL... Skriv URL... Web Addresses: (URL) Webb-adress (URL) Stop WinHTTrack? Stoppa WinHTTrack? No log files in %s! Ingen loggfil i %s! Pause Download? Paus i kopieringen? Stop the mirroring operation Stoppa kopieringen? Minimize to System Tray Minimera till verktygsfältet Click to skip a link or stop parsing Klicka för att hoppa över en länk eller stoppa överföringen Click to skip a link Klicka för att hoppa över en länk Bytes saved Bytes sparade: Links scanned Sökta länkar Time: Tid : Connections: Förbindelse: Running: I gång : Hide Gömma Transfer rate Överföringshastighet SKIP Hoppa över Information Information Files written: Filer skrivna: Files updated: Filer uppdaterade: Errors: Fel: In progress: Arbetar: Follow external links Följ externa länkar Test all links in pages Testa alla länkar på sidan Try to ferret out all links Prova att utvidga alla länkar Download HTML files first (faster) Ladda HTML-filer först (snabbast) Choose local site structure Välj en lokal webb-struktur Set user-defined structure on disk Bestäm användardefinerade inställningar för lokal struktur Use a cache for updates and retries Använd cache till uppdateringar och uppdateringsförsök Do not update zero size or user-erased files Uppdatera inte filer med noll-värde eller filer som är raderade Create a Start Page Skapa en startsida Create a word database of all html pages Skapa en textbaserad databas över alla HTML-sidor Create error logging and report files Skapa felloggning och rapport-filer Generate DOS 8-3 filenames ONLY Skapa ENDAST filnamn i DOS 8-3-format Generate ISO9660 filenames ONLY for CDROM medias Do not create HTML error pages Skapa inte sidor med HTML felrapporter Select file types to be saved to disk Välj filtyp som ska sparas på disken Select parsing direction Välj överföringsriktning Select global parsing direction Välj global överföringsriktning Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Regler för hur överskrivning av URL skall ske för interna (nerladdade) och externa (inte nerladdade) länkar Max simultaneous connections Max antal samtidiga förbindelser File timeout Fil timeout Cancel all links from host if timeout occurs Annulera alla länkar från värd om timeout inträffar Minimum admissible transfer rate Min aceptabla överföringshastighet Cancel all links from host if too slow Annulera alla länkar när kommunikationen är för långsam Maximum number of retries on non-fatal errors Max antal försök efter icke-fatala fel Maximum size for any single HTML file Max storlek för enskild HTML-fil Maximum size for any single non-HTML file Max storlek för enskils icke HTML-fil Maximum amount of bytes to retrieve from the Web Max antal bytes som hämtas från webben Make a pause after downloading this amount of bytes Gör paus efter att ha laddat ned denna mängd bytes Maximum duration time for the mirroring operation Max överföringstid för kopieringen Maximum transfer rate Max överföringshastighet Maximum connections/seconds (avoid server overload) Max antal förbindelser/sekund (för att undvika överbelastning på servern) Maximum number of links that can be tested (not saved!) Max antal länkar som kan bli testade (inte sparat!) Browser identity Webbläsare identitet Comment to be placed in each HTML file Kommentarer för infogas i varje HTML fil Back to starting page Tillbaka till startsidan Save current preferences as default values Spara nuvarande inställning som standard Click to continue Klicka för att fortsätta Click to cancel changes Klicka för att ångra ändringarna Follow local robots rules on sites Följ lokala sökregler på webbsidan Links to non-localised external pages will produce error pages Länkar till icke funna externa sidor kommer att skapa felsida Do not erase obsolete files after update Radera inte överflödiga filer efter uppdatering Accept cookies? Acceptera cookies? Check document type when unknown? Kontrollera dokumenttyp när det är okänt? Parse java applets to retrieve included files that must be downloaded? Överföra java applets tillsammans med inkluderade filer som skall laddas ned? Store all files in cache instead of HTML only Lagra alla filer i chchen istället för enbart HTML? Log file type (if generated) Logga filtyp (om det genereras) Maximum mirroring depth from root address Max kopieringsdjup från root adressen Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Max kopierngsdjup för externa/förbjuden adress (0, betyder ingen, är standard) Create a debugging file Skapar en felsökningsfil (debugg-fil) Use non-standard requests to get round some server bugs Använder icke-standard förfrågningar för att kringå serverfel Use old HTTP/1.0 requests (limits engine power!) Använder gamla HTTP/1.0 förfrågningar (begränsar effektiviteten!) Attempt to limit retransfers through several tricks (file size test..) Försöker att begränsa omsändningar genom att använda flera 'trick' (file size test..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Skriver externa länkar utan att använda login/lösenord Write internal links without query string Skriver interna länkar utan frågesats Get non-HTML files related to a link, eg external .ZIP or pictures Hämtar icke-HTML filer relaterat till en länk, t.ex. .ZIP eller bilder Test all links (even forbidden ones) Testar alla länkar (även förbjudna) Try to catch all URLs (even in unknown tags/code) Försöker att fånga alla URLer (också för okända tags/koder) Get HTML files first! Hämtar HTML filer först! Structure type (how links are saved) Anger struktur (hur länkar är sparade) Use a cache for updates Använd cache för uppdatering Do not re-download locally erased files Hämta inte filer som är lokalt raderade Make an index Gör ett index Make a word database Gör en textbaserad databas Log files Log filer DOS names (8+3) DOS namn (8+3)*/ ISO9660 names (CDROM) No error pages Ingen felsida Primary Scan Rule Primär sökregel Travel mode Sökmetod Global travel mode Global sökmetod These options should be modified only exceptionally Dessa inställningar skall endast ändras undantagsvis! Activate Debugging Mode (winhttrack.log) Aktivera felsökningsloggen (winhttrack.log) Rewrite links: internal / external Skriv om länkar: interna / externa Flow control Flödeskontroll Limits Begränsningar Identity Identitet HTML footer HTML fot N# connections Antal förbindelser Abandon host if error Lämna värd om det uppstår fel Minimum transfer rate (B/s) Min. överföringshastighet (B/s) Abandon host if too slow Lämna värd om den är för långsam Configure Konfigurera Use proxy for ftp transfers Använd proxy för FTP-överföringar TimeOut(s) TimeOut(s) Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Antal försök Size limit Storleksbegränsning Max size of any HTML file (B) Max storlek för HTML-fil (B) Max size of any non-HTML file Max storlek för icke-HTML fil Max site size Max webbplats storlek Max time Max tid Save prefs Spara inställningar Max transfer rate Max överföringshastighet Follow robots.txt Följ reglerna i robots.txt No external pages Inga externa sidor Do not purge old files Radera inte gamla filer Accept cookies Acceptera cookies Check document type Kontrollera dokumenttypen Parse java files Överför javafiler Store ALL files in cache Lagra ALLA filer i cachen Tolerant requests (for servers) Acceptera förfrågningar (från server) Update hack (limit re-transfers) Uppdatera avbrott (begränsa omsändningar) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Forcera gamla HTTP/1.0 förfrågningar (inte 1.1) Max connections / seconds Max förbindelser/sekunder Maximum number of links Max antal länkar Pause after downloading.. Paus efter överföring... Hide passwords Dölj lösenord Hide query strings Dölj frågesträngar Links Länkar Build Struktur Experts Only Inställningar för experter Flow Control Flödeskontroll Limits Begränsningar Browser ID Webbläsare Identitet Scan Rules Sökregler Spider Webbrobot Log, Index, Cache Log, Index, Cache Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Vill du verklingen avsluta WinHTTTrack Website Copier? Do not connect to a provider (already connected) Anslut inte till Internet (Är redan ansluten) Do not use remote access connection Använd inte fjärranslutning (RAS) Schedule the mirroring operation Planlägg kopieringen Quit WinHTTrack Website Copier Sluta WinHTTTrack Website Copier Back to starting page Åter startsida Click to start! Klicka för att starta! No saved password for this connection! Det finns inget sparat lösenord för denna förbindelse! Can not get remote connection settings Kan inte läsa värdens inloggningsinställningar Select a connection provider Välj en Internetuppkoppling Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Justera inställningarna för förbindelsen, om nödvändigt\nKlicka på UTFÖR för att starta kopieringen Save settings only, do not launch download now. Spara inställningarna, men starta inte överföringen nu. On hold Satt i väntan Transfer scheduled for: (hh/mm/ss) Överföringen planlagd till :(hh/mm/ss) Start Starta Connect to provider (RAS) Koppla upp till leverantör (RAS) Connect to this provider Koppla upp till Internet Disconnect when finished Koppla ner förbindelsen när överföringen är klar Disconnect modem on completion Koppla ned modemet efter avslutning \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Hittar du fel eller uppstår det problem, kontakta oss)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Swedish translations to:\r\nStaffan Ström (staffan@fam-strom.org) About WinHTTrack Website Copier Om WinHTTrack Website Copier... Please visit our Web page Besök vår webb Wizard query Guidad frågeformulär Your answer: Ditt svar Link detected.. Länk funnen Choose a rule Välj en regel Ignore this link Ignorera denna länk Ignore directory Ignorera denna mapp Ignore domain Ignorera domänen Catch this page only Hämta endast denna sida Mirror site Kopiera webbsidorna Mirror domain Kopiera domänen Ignore all Ignorera allt Wizard query Guidad frågeformulär NO Nej File Fil Options Inställningar Log Log Window Fönster Help Hjälp Pause transfer Pause överföring Exit Avsluta Modify options Ändra inställningarna View log Visa loggen View error log Visa felloggen View file transfers Visa överföringsloggen Hide Dölj About WinHTTrack Website Copier Om WinHTTTrack Website Copier Check program updates... Kontrollera program uppdateringar... &Toolbar &Verktygsrad &Status Bar &Statusrad S&plit &Dela File Fil Preferences Inställningar Mirror Kopiera webbsidor Log Logg Window Fönster Help Hjälp Exit Avsluta Load default options Ladda in standardinställningar Save default options Spara standard inställingar Reset to default options Återställ till standardinställningar Load options... Ladda inställingar... Save options as... Spara inställingar som... Language preference... Valt språk... Contents... Innehåll... About WinHTTrack... Om WinHTTrack... New project\tCtrl+N Nytt projekt\tCtrl+N &Open...\tCtrl+O &Öppna...\tCtrl+O &Save\tCtrl+S &Spara\tCtrl+S Save &As... Spara &som... &Delete... &Radera... &Browse sites... &Gå igenom webbsidor User-defined structure Användardefinerad struktur %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tFilnamn utan filtyp (ex: image)\r\n%N\tHela filnamnet inkl. filtyp (ex: image.gif)\r\n%t\tEnbart filtyp (ex: gif)\r\n%p\tSökväg [utan ändelsen /] (ex: /someimages)\r\n%h\tVärddator-namn (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 frågesträng (128 bits, 32 ascii bytes)\r\n%q\tMD5 kort frågesträng (16 bits, 4 ascii bytes)\r\n\r\n%s?\tKort namn (ex: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Exempel:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proxy inställningar Proxy address: Proxy adress Proxy port: Proxy port: Authentication (only if needed) Identifikation (om nödvändigt) Login Användarnamn Password Lösenord Enter proxy address here Skriv in proxy adressen här Enter proxy port here Skriv in proxy portnummer här Enter proxy login Skriv in proxy användarnamn/ login Enter proxy password Skriv in proxy lösenord Enter project name here Skriv in projektets namn här Enter saving path here Skriv in sökvägen där projektet skall sparas Select existing project to update Välj ett existerande projektnamn att uppdatera Click here to select path Klicka här för att välja sökväg Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Projektassistent New project name: Nytt projektnamn: Existing project name: Existerande projektnamn: Project name: Projektnamn: Base path: Välj en fast sökväg till dina projekt: Project category: C:\\My Web Sites C:\\Mina webbsidor Type a new project name, \r\nor select existing project to update/resume Skriv namnet på ett nytt projekt\neller\nvälj att uppdatera ett existerande projekt New project Nytt projekt Insert URL Skriv in URL URL: URL: Authentication (only if needed) Identifikation (om nödvändigt) Login Användarnamn/ Login Password Lösenord Forms or complex links: Formulär eller komplexa länkar: Capture URL... 'Fånga' URL Enter URL address(es) here Skriv in URL adress(er) här Enter site login Skriv in webbsidornas Användarnamn Enter site password Skriv in websidornas Lösenord Use this capture tool for links that can only be accessed through forms or javascript code Använd detta verktyg för att 'fånga' länkar som endast kan nås via formulär eller javascript-kod Choose language according to preference Välj ditt förvalda språk Catch URL! 'Fånga' URL Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Sätt tillfälligt webbläsarens proxy till följande värden: (Kopiera/Klistra in Proxy Adress och Port).\nKlicka på Form SUBMIT knappen i din webbläsare, eller klicka på den specifika länk du önskar att hämta. This will send the desired link from your browser to WinHTTrack. Detta sänder den önskade länken från din webbläsare til WinHTTrack. ABORT AVBRYT Copy/Paste the temporary proxy parameters here Kopiera/Klistra in de temporära proxy parametrarna här Cancel Annullera Unable to find Help files! Kan inte hitta Hjälpfilerna! Unable to save parameters! Kan inte spara parametrana! Please drag only one folder at a time Drag enbart en mapp åt gången! Please drag only folders, not files Drag enbart mappar, inte filer Please drag folders only Drag bara mappar Select user-defined structure? Välj användardefinierad struktur? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Var säker på att den användardefinierade strängen är korrekt\nImotsat fall kommer filnamnen att vara ogiltiga! Do you really want to use a user-defined structure? Är du riktigt säker på att använda en användardefinierad struktur? Too manu URLs, cannot handle so many links!! För många URLer, WinHTTrack kan inte hantera så många länkar!!! Not enough memory, fatal internal error.. Det finns inte tillräckligt med minne, allvarligt internt fel har uppstått.. Unknown operation! Okänd handling! Add this URL?\r\n Addera denna URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Varning: Processen svarar inte, URLen kan inte adderas.... Type/MIME associations Typ/MIME sammankoppling File types: Fil typer: MIME identity: MIME Identitet: Select or modify your file type(s) here Välj eller ändra dina filtyp(er) här Select or modify your MIME type(s) here Välj eller ändra dina MIME typ(er) här Go up Gå upp Go down Gå ned File download information Filöverföringsinformation Freeze Window Frys fönstret More information: Mera information: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Välkommen till WinHTTrack Website Copier!\n\Klicka på 'Nästa' för att för att\n-Starta ett nytt projekt\n-eller uppdatera ett existerande projekt. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Filnamn med filtilläg:\nFilnamn som innehåller:\nDetta filnamn:\nMappnamn som innehåller:\nDetta mappnamn:\nLänkar på denna domän:\nLänkar på denna domän som innehåller:\nLänkar från denna värd:\nLänkar som innehåller:\nDenna Länk:\nAlla Länkar Show all\nHide debug\nHide infos\nHide debug and infos Visa alla\nGöm felhantering\nGöm information\nGöm felhantering och information Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Webbplats-struktur (Standard)\nHtml i webb/, Bilder/andra filer i webb/bilder/\nHtml i webb/html, Bilder och annat i webb/bilder\nHtml i webb/, Bilder och annat i webb/\nHtml i webb/, Bilder och annat i webb/xxx, med xxx där Datatyp\nHtml i webb/html, Bilder och annat i webb/xxx\nWebbplats-struktur, utan www.domain.xxx/\nHtml i webbplats/, Bilder och andra i webbplats/images/\nHtml i webbplats/html, Bilder och andra i webbplats/images\nHtml i webbplats/, Bilder och andra i webbplats/\nHtml i webbplats/, Bilder och andra i webbplats/xxx\nHtml i webbplats/html, Bilder och andra i webbplats/xxx\nAlla filer i webbplats/, med slumpnamn \nAlla filer i webbplats/, med Slumpnamn \nAnvändardefinierad Struktur... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Bara sök\nSpara html filer\nSpara icke-html filer\nSpara alla filer (standard)\nSpara html filer först Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Bli kvar i samma mapp\nKan gå ned(standard)\nKan gå upp\nKan gå både upp och ned Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Bli kvar på samma adress [standard]\nBli kvar på samma domän\nBli kvar på samma toppnivå-domän\n Gå överallt på Internet. Never\nIf unknown (except /)\nIf unknown Aldrig\nOm okänt (undantaget /]\nOm okänt no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Ingen robots.txt regel\nrobots.txt med undantag av guiden\nfölj robots.txt reglerna normal\nextended\ndebug Normal\nutvidgat\nfelsökning Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Ladda ner webbplats(er)\nLadda ner webplats(er) + frågor\nHämta separata filer\nÖverför alla sidor (multiple mirror)\nTesta länkarna på sidorna (bookmark test)\n* Fortsätt avbrutet projekt\n* Uppdatera tidigare projekt Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relativ URI / Fullständig URL (default)\nFullständig URL / Fullständig URL\nFullständig URI / Fullständig URL\nUrsprunglig URL / Ursprunglig URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Proxytyp: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxyprotokoll. HTTP: standardproxy. HTTP (CONNECT-tunnel): skickar varje begäran genom en CONNECT-tunnel, för proxyservrar som bara stöder CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080. Load cookies from file: Läs in cookies från fil: Preload cookies from a Netscape cookies.txt file before crawling. Läs in cookies från en Netscape cookies.txt-fil innan crawlningen börjar. Pause between files: Paus mellan filer: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Slumpmässig fördröjning mellan filnedladdningar, i sekunder. Använd MIN:MAX för ett slumpmässigt intervall (t.ex. 2:8). Keep the www. prefix (do not merge www.host with host) Behåll www.-prefixet (slå inte ihop www.host med host) Do not treat www.host and host as the same site. Behandla inte www.host och host som samma webbplats. Keep double slashes in URLs Behåll dubbla snedstreck i URL:er Do not collapse duplicate slashes in URLs. Slå inte ihop upprepade snedstreck i URL:er. Keep the original query-string order Behåll frågesträngens ursprungliga ordning Do not reorder query-string parameters when deduplicating URLs. Ändra inte ordningen på frågesträngens parametrar när dubbletter av URL:er tas bort. Strip query keys: Ta bort frågenycklar: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Kommaseparerade frågenycklar som utelämnas vid namngivningen av sparade filer (t.ex. sid,utm_source). Write a WARC archive of the crawl Skriv ett WARC-arkiv av genomsökningen Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Spara även varje hämtat svar i ett ISO-28500 WARC/1.1-arkiv, bredvid spegeln. WARC archive name: WARC-arkivets namn: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Valfritt basnamn för WARC-arkivet; lämna tomt för att namnge det automatiskt i utdatakatalogen. httrack-3.49.14/lang/Slovenian.txt0000644000175000017500000010732515230602340012440 LANGUAGE_NAME Slovenian LANGUAGE_FILE Slovenian LANGUAGE_ISO sl LANGUAGE_AUTHOR Jadran Rudec,iur.\r\njrudec@email.si \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Slovenian OK Vredu Cancel Opusti Exit Izhod Close Zapri Cancel changes Opusti spremembe Click to confirm Klikni za potrditev Click to get help! Klikni za pomoè! Click to return to previous screen Klikni za vrnitev na prejšnji zaslon Click to go to next screen Klikni za prehod na naslednji zaslon Hide password Skrij geslo Save project Shrani projekt Close current project? Zaprem tekoèi projekt? Delete this project? Zbrišem ta projekt? Delete empty project %s? Zbrišem prazen projekt %s? Action not yet implemented Dogodek še ni predviden Error deleting this project Napaka med brisanjem tega projekta Select a rule for the filter Izberi pravilo za filtriranje Enter keywords for the filter Vpišite kljuèno besedo filtriranja Cancel Opusti Add this rule Dodaj to pravilo Please enter one or several keyword(s) for the rule Vpišite eno individualno besedo kljuèno besedo za pravilo Add Scan Rule Dodaj iskano besedo Criterion Pogoj String String Add Dodaj Scan Rules Išèi pravila Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Uporabite joker za izkljuèitev/vkljuèitev URL-jev ali povezav.\nLahko vstavite posamièen string v eni vrstici.\nUporabite presledke ali separatorje.\n\nPrimer: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Izkljuèi povezave Include link(s) Vkljuèi povezave Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Namig: Za vkljuèitev vseh GIF datotek uporabite kot npr. +www.spletnastran.com/*.gif. \n(+*.gif / -*.gif bo vkljuèil/izkljuèil vseh GIF-e z vseh spletnih strani) Save prefs Shrani lastnosti Matching links will be excluded: Zadete povezave bodo izkljuèene: Matching links will be included: Zadete povezave bodo vkljuèene: Example: Primer: gif\r\nWill match all GIF files gif\r\nBo vseboval vse GIF datoteke blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nNašel bo vse datoteke z zadetki 'modro' pod string kot 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nBo zadel datoteko 'bigfile.mov' toda ne 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nNašel bo povezave z mapo kot zadetek z imenom pod string 'cgi' kot /cgi-bin/poljubwencgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nNašel bopovezave z zadetim imenom mapeing v celoti 'cgi-bin' string (toda ne cgi-bin-2, kot primer) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nNael bo povezave z zadetim pod stringom kot www.spletnastran.com, private.spletnastran.com itn. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nNašel bo povezave z zadeto mapo podstringa kot www.spletnastran.com, www.semeweb.edu, private.someweb.otherweb.com etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nNašel bo povezave zadete kot 'www.someweb.com' pod string (toda ne povezave kot so private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nNašel bo povezave zadetih pod stringom kot www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nNašel bo le povezave kot 'www.test.com/test/someweb.html' datoteko. Pazite, da boste vpisali popolno pot (URL + pot spletne strani) All links will match Vse povezave bodo zadete Add exclusion filter Dodaj izkljuèitveni filter Add inclusion filter Dodaj vkljuètveni filter Existing filters Obstojeèi filtri Cancel changes Opusti spremembe Save current preferences as default values Shrani tekoèe lastnosti kot privzete vrednosti Click to confirm Kliknite za potrditev No log files in %s! Ni log datoteke znotraj %s! No 'index.html' file in %s! Ni 'index.html' datoteke znotraj %s! Click to quit WinHTTrack Website Copier Kliknite za konec dela z WinHTTrack Website Copierom View log files Preglej log datoteke Browse HTML start page Prebrskaj zaèetno HTML stran End of mirror Konec zrcaljenja View log files Preglej log datoteke Browse Mirrored Website Prebrskaj zrcaljeno stran New project... Novi projekt... View error and warning reports Preglej napake in varnostna poroèila View report Preglej poroèilo Close the log file window Zapri okno z log datoteko Info type: Errors Napake Infos Informacije Find Poišèi Find a word Poišèi besedo Info log file Informacije o log datoteki Warning/Errors log file Napaka/Napaka log datoteke Unable to initialize the OLE system Omogoèi inicializacijo OLE sistema WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack ne najde nobene prekinitve naložene datoteke v doloèeni mapi! Could not connect to provider Ne morem se povezati z oskrbovalcem receive prejem request zahteva connect povezava search iskanje ready pripravljen error napaka Receiving files.. Prejete datoteke.. Parsing HTML file.. Razèlenjujem HTML datoteko.. Purging files.. Èistim datoteke.. Loading cache in progress.. Parsing HTML file (testing links).. Razèlenjujem HTML datoteko (preverjam povezave).. Pause - Toggle [Mirror]/[Pause download] to resume operation Pavza - Stikalo [Zrcaljenje]/[Pavza prenosa] za dokonèanje opravila Finishing pending transfers - Select [Cancel] to stop now! Dokonèanje prenosov - Izbor [Opusti] za takojšnjo zavstavitev! scanning iskanje Waiting for scheduled time.. Èakanje na èas razporejanja.. Connecting to provider Povezava z oskrbovalcem [%d seconds] to go before start of operation [%d sekund] pred prièetkom opravila Site mirroring in progress [%s, %s bytes] Site mirroring finished! Zrcaljenje strani je dokonèano! A problem occurred during the mirroring operation\n Prišlo je do napake med zrcaljenjem strani\n \nDuring:\n \nmed:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nPreberite log datoteko, èe je potrebno.\n\nKliknite na gumb KONÈANO za konec dele z WinHTTrack Website Copier.\n\nZahvaljujemo se za to, da ste uporabljali WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Zrcaljenje je popolnoma dokonèano.\nKliknite na gumb Izhod za konec dela s programom WinHTTrack.\nPreberite log datoteko(e), èe se želite preprièati, da je bilo vse vredu.\n\nZahvaljujemo se za to, da ste uporabljali WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ZRCALJENJE JE PREKINJENO! * *\r\nTekoèi zaèasni predpomnilnik je bil zahtevan za kaktere koli postopke nadgradnje in vsebuje le prenešene podatke znotraj prekinjene seje.\r\nOblikovani predpomnilnik vsebuje veè popolnih informacij; èe ne želite izgubiti teh podatkov jih lahko obnovite in zbrišete tekoèi predpomnilnik.\r\n[Opomba: To lahko enostavneje storite, èe boste roèno zbrisali hts-cache/ nemudoma * datoteke]\r\n\r\nMislite, da oblikovani predpomnilnik vsebuje veè popolnih informacij in jih želite obnoviti? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * NAPAKA MED ZRCALJENJEM! * *\r\nHTTrack je ugotovil, da je aktivno zrcaljenje prazno. Èe je bilo nadgrajeno bo obnovljeno prejšnje zrcaljenje.\r\nVzrok: prva stran ni bila najdena ali pa vsebuje napake.\r\n=> Preprièajte se ali spletna stran sploh obstaja in/ ali ste preverili vaše nastavitve proxy strežnika! <= \n\nTip: Click [View log file] to see warning or error messages \n\nNamig: Kliknite na [Preglej log datoteko] kjer boste lahko prebrali vsa opozorila in sporoèila o napakah Error deleting a hts-cache/new.* file, please do it manually Napaka med brisanjem hts-cache/ je nastala.* datotek, storite to roèno! Do you really want to quit WinHTTrack Website Copier? Zares želite konèadi delo z WinHTTrack Website Copierom? - Mirroring Mode -\n\nEnter address(es) in URL box - Naèin z zrcaljenjem -\n\nVpišite naslov(e) v URL okence - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Naèin z interaktivnim èarovnikom (vprašanja) -\n\nVpišite naslov(e) v URL okence - File Download Mode -\n\nEnter file address(es) in URL box - Naèin s prenosom datotek -\n\nVpišite naslov(e) v URL okence - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Naèin s preverjanjem povezav -\n\nVpišite spletni naslov(e) s povezavami za preverjanje znotraj URL okenca - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Nadgrajevalni naèin -\n\nPreverite naslov(e) znotraj URL okenca, preverite parametre, èe je to potrebno in kliknite na gumb 'NAPREJ' ! - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Strnjeni naèin (Prekinjena opravila) -\n\nPreverite naslov(e) znotraj URL okenca, preverite parametre, èe je to potrebno in kliknite na gumb 'NAPREJ' ! Log files Path Pot do log datotek Path Pot - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Naèin z seznamom povezav -\n\nUporabite URL okence za vpis naslova (ov spletne (straneh) za povezovanje zrcaljenja New project / Import? Novi projekt / Uvoz? Choose criterion Izberite pogoj Maximum link scanning depth Najveèja globina iskanja povezav Enter address(es) here Tukaj vpišite naslov(e) Define additional filtering rules Doloèite dodatna pravila filtriranja Proxy Name (if needed) Ime Proxy strežnika (èe je potrebno) Proxy Port Vrata Proxy-ja Define proxy settings Doloèi nastavitve za proxy Use standard HTTP proxy as FTP proxy Uporabi obièajni HTTP proxy kot FTP proxy Path Pot Select Path Izberite pot Path Pot Select Path Izberite pot Quit WinHTTrack Website Copier Konec dela z WinHTTrack Website Copier About WinHTTrack Vizitka Save current preferences as default values Shrani tekoèe nastavitve kot privzete vrednosti Click to continue Kliknite za nadaljevanje Click to define options Kliknite za doloèitev opcij Click to add a URL Kliknite za dodajanje URL naslova Load URL(s) from text file Naloži URL(je) iz besedilne datoteke WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack nastavitve (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Besedilna datoteka z seznamom naslovov (*.txt)|*.txt|| File not found! Ni datoteke! Do you really want to change the project name/path? Zares želite spremeniti ime projekta/pot? Load user-default options? Naj naložim privzete uporabniške nastavitve? Save user-default options? Naj shranim privzete uporabniške nastavitve? Reset all default options? Naj obnovim vse privzete nastavitve? Welcome to WinHTTrack! Dobrodošli pri delu z WinHTTrack! Action: Opravilo: Max Depth Najveèja globina Maximum external depth: Najveèja zunanja globina: Filters (refuse/accept links) : Filtri (zlitje/uvaževanje povezav) : Paths Poti Save prefs Shrani nastavitve Define.. Doloèi.. Set options.. Nastavi opcije.. Preferences and mirror options: Opcije nastavitev in zrcaljenja: Project name Ime projekta Add a URL... Dodaj URL... Web Addresses: (URL) Spletni naslovi: (URL) Stop WinHTTrack? Naj ustavim WinHTTrack? No log files in %s! Ni log datotek v %s! Pause Download? Zaèsno zaustavim prenos? Stop the mirroring operation Ustavi postopek zrcaljenja Minimize to System Tray Pomanjšaj v sistemsko programsko vrstico Click to skip a link or stop parsing Kliknite za preskok povezave ali zavstavitev razèlenitve Click to skip a link Kliknite za preskok povezave Bytes saved Shranjenih Bytov Links scanned Preiskanih povezav Time: Èas: Connections: Povezave: Running: Poteka: Hide Skrij Transfer rate Prenosna hitrost SKIP PRESKOÈI Information Informacije Files written: Zapisanih datotek: Files updated: Nadgrajenih datotek: Errors: Napake: In progress: Poteka: Follow external links Sledi zunanjim povezavam Test all links in pages Preverjaj vse povezave znotraj strani Try to ferret out all links Poskusi zavreèi vse skrite povezave Download HTML files first (faster) Najprej prenesi HTML datoteke (hitreje) Choose local site structure Izberi strukturo lokalne strani Set user-defined structure on disk Nastavi uporabniško strukturo na disk Use a cache for updates and retries Uporabi predpomnilnik za nadgraditev in ponovitve Do not update zero size or user-erased files Ne nadgrajuj strani z nièelno velikostjo ali uporabniško zbrisanih datotek Create a Start Page Naredi Zaèetno stran Create a word database of all html pages Naredi besedilno bazo podatkov vseh html strani Create error logging and report files Naredi zgodovino napak (log) in datoteke s poroèili Generate DOS 8-3 filenames ONLY Generiraj LE DOS 8-3 imena datotek Generate ISO9660 filenames ONLY for CDROM medias Generiraj LE ISO9660 imena datotek za CDROM medije Do not create HTML error pages Ne pripravi HTML strani z napakami Select file types to be saved to disk Izberi tipe datotek, ki bodo shranjene na disk Select parsing direction Izberi smer razèlenjevanja Select global parsing direction Izberi splošno smer razèlenjevanja Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Namesti pravila URL ponovnega branja za notranje povezave (prenesi enkrat) in zunanje povezave (ne prenesi enkrat) Max simultaneous connections Najveè soèasnih prikljuèitev/povezav File timeout Pretek èasa za datoteko Cancel all links from host if timeout occurs Opusti vse povezave z gostiteljem, èe je potekal èas Minimum admissible transfer rate Najkrajši sprejemljivi prenosni èas Cancel all links from host if too slow Opusti vse povezave z gostiteljem, èe je le-ta prepoèasen Maximum number of retries on non-fatal errors Najveèje število ponovitev on obièajnih napakah (ne fatalnih) Maximum size for any single HTML file Najveèja velikost posamezne HTML datoteke Maximum size for any single non-HTML file Najveèja velikost posamezne ne-HTML datoteke Maximum amount of bytes to retrieve from the Web Najveèa kolièina bytov za obnovo z spleta Make a pause after downloading this amount of bytes Naredi pavzo po renosu te kolièine bitov Maximum duration time for the mirroring operation Najdaljši èas trajanja zrcaljenja Maximum transfer rate Najveèja hitrost prenosa Maximum connections/seconds (avoid server overload) Najveè povezav/sekund (izogibanje preobremenitvam strežnika) Maximum number of links that can be tested (not saved!) Najveèje število povezav, ki jih je možno preverjati (ne shranjenih!) Browser identity Istovetnost brskalnika Comment to be placed in each HTML file Opombe bodo vstavljene v HTML dattekah Back to starting page Pojdi na zaèetno stran Save current preferences as default values Shrani tekoèe nastavitve kot privzete vrednosti Click to continue Klikni za nadaljevanje Click to cancel changes Klikni za opustitev sprememb Follow local robots rules on sites Zasleduj lokalnim robotovim pravilom na straneh Links to non-localised external pages will produce error pages Povezave z ne lokaliziranimi zunanjimi stranmi bodo povzroèile napake strani Do not erase obsolete files after update Ne briši zastarelih datotek po nadgradnji Accept cookies? Uveljavim piškote? Check document type when unknown? Preveri tip dokumenta, èe je neznan? Parse java applets to retrieve included files that must be downloaded? Razèlenjuj java applete za obnovo vklljuèenih datotek kadar morajo biti le-te prenešene? Store all files in cache instead of HTML only Shrani vse datoteke v predpomnilnik namesto le HTML dokumenta Log file type (if generated) Tip log datoteke (èe je bila narejena) Maximum mirroring depth from root address Najveèja globina zrcaljenja z korenskega naslova Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Najveèja globina zrcaljenja za zunanje/prepovedane naslove (0= da, ne = privzeto) Create a debugging file Naredi razhrošèevalno datoteko Use non-standard requests to get round some server bugs Uporabi neobièajne zahteve posamiènih napak strežnika Use old HTTP/1.0 requests (limits engine power!) Uporabi starejše HTTP/1.0 zahteve (omejuje moè naprav!) Attempt to limit retransfers through several tricks (file size test..) Opozori na omejitve ponovnega prenosa z naigi (preverjanje dolžine datotek..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password apiši zunanje povezave brez prijave/gesla Write internal links without query string Zapiši notranje povezave brez poizvedovalnih stringov Get non-HTML files related to a link, eg external .ZIP or pictures Vzemi ne-HTML datoteke pridružene s povezavo, npr. zunanje .ZIP ali sklike Test all links (even forbidden ones) Preverjaj vse povezave (prviè že prepovedane) Try to catch all URLs (even in unknown tags/code) Poskusi zgrabiti vse URL-je (z ne znanimi tagi/kodo) Get HTML files first! Najprej vzemi HTML datoteke! Structure type (how links are saved) Tip strukture (kako so shranjene povezave) Use a cache for updates Uporabi predpomnilnik za nadgradnje Do not re-download locally erased files Ne nalagaj ponovno lokalno zbrisanih datotek Make an index Naredi indeks Make a word database Naredi podatkovno bazo besed Log files Log datoteke DOS names (8+3) DOS imena (8+3) ISO9660 names (CDROM) ISO9660 imena (CDROM) No error pages Ni napak strani Primary Scan Rule Primarno pravilo iskanja Travel mode Prenosni naèin Global travel mode Splošni prenosni naèin These options should be modified only exceptionally Te nastavitve spreminjajte le izjemoma Activate Debugging Mode (winhttrack.log) Aktiviraj Razhrošèevalni naèin (winhttrack.log) Rewrite links: internal / external Ponovno zapiši povezave: notranje / zunanje Flow control Nadzor poteka Limits Omejitve Identity Istovetnost HTML footer Glava HTML dokumenta N# connections Število prikljuèitev Abandon host if error Zapusti gostitelja v primeru napake Minimum transfer rate (B/s) Najmanjša hitrost prenosa (B/s) Abandon host if too slow Zapusti gostitelja, èe je prepoèasen Configure Nastavi Use proxy for ftp transfers Uporabi proxy za ftp prenose TimeOut(s) Premorov Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Ponovitev Size limit Omejitev velikosti Max size of any HTML file (B) Najveèja velikost katere koli HTML datoteke (B) Max size of any non-HTML file Najveèja velikost katere koli ne-HTML datoteke Max site size Najveèja velikost strani Max time Najdaljši èas Save prefs Shrani lastnosti Max transfer rate Najveèja hitrost prenosa Follow robots.txt Zasleduj robots.txt No external pages Ni zunanjih strani Do not purge old files Ne poèisti stare datoteke Accept cookies Sprejmi piškote Check document type Prevarjaj tip dokumenta Parse java files Razèlenjuj java datoteke Store ALL files in cache Shrani VSE datoteke v predpomnilnik Tolerant requests (for servers) Toleriraj zahteve (za strežnike) Update hack (limit re-transfers) Nadgradi pokašljevanje (omejitev ponovnih prenosov) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Vsili starejše HTTP/1.0 zahteve (ne 1.1) Max connections / seconds Najveè prikljuèitev / sekund Maximum number of links Najveèje število povezav Pause after downloading.. Odmor po konèanem prenosu.. Hide passwords Skrij gesla Hide query strings Skrij poizvedovalne stringe Links Povezave Build Izgradnja Experts Only Le za eksperte Flow Control Nadzor poteka Limits Omejitve Browser ID ID brskalnika Scan Rules Iskanje pravil Spider Hitrost Log, Index, Cache Log, Indeks, predpomnilnik Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Zares želite konèati delo z WinHTTrack Website Copier? Do not connect to a provider (already connected) Ne poveži se oskrbovalcem (povezava je že vspostavljena) Do not use remote access connection Ne uporabi oddaljeni dostop povezave Schedule the mirroring operation Razporedi opravila zrcaljenja Quit WinHTTrack Website Copier Konec dela z WinHTTrack Website Copier Back to starting page Nazaj na zaèetno stran Click to start! Kliknite za zaèetek! No saved password for this connection! Ni shranjenih gesel za to povezavo! Can not get remote connection settings Ne morem prevzeti nastavitev oddaljene povezave Select a connection provider Izberite oskrbovalca povezave Start Zaèni Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Prosimo, da izravnate parametre povezovanja, èe je potrebno \nter pritisnite na gumb KONEC za zagon zrcaljenja. Save settings only, do not launch download now. Le shrani nastavitve, ne poženi takoj prenosa. On hold Ob pritisku Transfer scheduled for: (hh/mm/ss) Razpored prenosov za: (uu/mm/ss) Start Zaèni Connect to provider (RAS) Poveži se z oskrbnikom (RAS) Connect to this provider Poveži se zs tem oskrbnikom Disconnect when finished Prekini povezavo, ko bo konèano Disconnect modem on completion Izkljuèi modem ob dokonèanju \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Prosimo Vas, da nas obvestite o kakršnih koli težavah ali napakah)\r\n\r\nRazvoj:\r\nVmesnik (Okna): Xavier Roche\r\nHitrost: Xavier Roche\r\nJavaParserRazredi: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche in drugi sodelujoèi\r\nVELIKA ZAHVALA za namige prevodov gre:\r\nRobertu Lagadecu (rlagadec@yahoo.fr) About WinHTTrack Website Copier O programu WinHTTrack Website Copier Please visit our Web page Prosimo, da obišèete našo spletno stran Wizard query Èarovnik poizvedb Your answer: Vaš odgovor: Link detected.. Ugotovljena povezava.. Choose a rule Izberite pravilo Ignore this link Prezri to povezavo Ignore directory Prezri mapo Ignore domain Prezri domeno Catch this page only Zagrabi le to stran Mirror site Zrcaljena stran Mirror domain Zrcaljena domena Ignore all Prezri vse Wizard query Èarovnik poizvedb NO ne File Datoteka Options Možnosti Log Log datoteka Window Okna Help Pomoè Pause transfer Pavza med prenosom Exit Izhod Modify options Sprememba možnosti View log Preglej zgodovino View error log Preglej zgodovino napak View file transfers View file transfers Hide Skrij About WinHTTrack Website Copier O programu WinHTTrack Website Copier Check program updates... Preveri možnost nadgradnje programa... &Toolbar &Orodjarna &Status Bar &Statusna vrstica S&plit &Razdeli File Datoteka Preferences Nastavitve Mirror Zrcaljena stran Log Log datoteka Window Okno Help Pomoè Exit Izhod Load default options Naloži privzete nastavitve Save default options Shrani privzete nastavitve Reset to default options Obnovi privzete nastavitve Load options... Naloži možnosti... Save options as... Shrani možnosti kot... Language preference... Jezikovne nastavitve... Contents... Vsebine... About WinHTTrack... Vizitka... New project\tCtrl+N Novi Projekt\tCtrl+N &Open...\tCtrl+O &Odpri...\tCtrl+O &Save\tCtrl+S &Shrani\tCtrl+S Save &As... Shrani &Kot... &Delete... &Zbriši... &Browse sites... &Prebrskaj spletne strani... User-defined structure Uporabniško doloèena struktura %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tIme datoteke brez konènice (npr.: slika)\r\n%N\tIme datoteko s konènico (npr: slika.gif)\r\n%t\tLe konènica datoteke (npr: gif)\r\n%p\tPot [brez zakljuèka /] (primer: /poljubnaslika)\r\n%h\tIme gostitelja (npr: www.poljubnastran.com)\r\n%M\tMD5 URL (128 bitov, 32 ascii bytov)\r\n%Q\tMD5 poizvedovalni string (128 bitov, 32 ascii bytov)\r\n%q\tMD5 majhen poizvedovalni string (16 bitov, 4 ascii bytov)\r\n\r\n%s?\tKratko ime (Npr.: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proxy nastavitve Proxy address: Proxy naslovi: Proxy port: Proxy vrata: Authentication (only if needed) Ugotavljanje pristnosti (le, èe je potrebno) Login Prijava Password Geslo Enter proxy address here Tukaj vpišite naslov proxy-ja Enter proxy port here Tukaj vpišite vrata proxy-ja Enter proxy login Vpišite prijavo za proxy Enter proxy password Vpišite geslo za proxy Enter project name here Tukaj vpišite ime projekta Enter saving path here Tukaj vpišite pot shranjevanja Select existing project to update Izberite obstojeèi projekt za nadgradnjo Click here to select path Tukaj kliknite za izbor poti Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... Èarovnik HTTrack projektov... New project name: Novo ime projekta: Existing project name: Ime obstojeèega projekta: Project name: Naziv projekta: Base path: Osnovna pot: Project category: C:\\My Web Sites C:\\Moje spletne strani Type a new project name, \r\nor select existing project to update/resume Vpišite novo ime projekta, \r\nali izberite obstojeèe za nadgradnjo/prevzem New project Novi projekt Insert URL Vpišite URL URL: URL: Authentication (only if needed) Ugotavljanje pristnosti(le, èe je zahtevano) Login Prijava Password Geslo Forms or complex links: Obrazci ali kompleksne povezave: Capture URL... Zagrabi URL... Enter URL address(es) here Tukaj vnesite URL naslov(e) Enter site login Vpis prijava na spletno stran Enter site password Vpišite geslo Use this capture tool for links that can only be accessed through forms or javascript code Uporabite to orodje za grabež za povezave, ki lahko izbajajo obrazce ali javascript codo Choose language according to preference Izberite jezik za izbor lastnosti Catch URL! Zagrabi URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Prosimo, da nastavte zaèasne nastavitve proxy brskalnika z naslednjimi vrednostmi (Kopiraj/Prilepi vrata in naslove Proxy-ja).\nPotem kliknite na gumb Opusti obrazca znotraj vaše spletne strani ali pa kliknite na doloèeno povezavo, ki jo želite zagrabiti. This will send the desired link from your browser to WinHTTrack. To bo poslalo izbrano povezavo z vašega brskalnika k WinHTTrack. ABORT PREKINITEV Copy/Paste the temporary proxy parameters here Tukaj Kopiraj/Prilepi zaèasne proxy parametre Cancel Opusti Unable to find Help files! Omogoèi iskanje datotek s pomoèjo! Unable to save parameters! Omogoèi shranjevanje parametrov! Please drag only one folder at a time Prosimo, da zagrabite istoèasno le eno mapo Please drag only folders, not files Prosimo, da zagrabite le mape, ne pa datotek Please drag folders only Prosimo, da zagrabite le mape Select user-defined structure? Naj izberem uporabniško doloèeno strukturo? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Preverite pravilnost uporabniško doloèenega stringa,\ ker bodo imena ponarejena! Do you really want to use a user-defined structure? Resnièno želite uporabljati uporabniško doloèeno strukturo? Too manu URLs, cannot handle so many links!! Preveè URL-jev, ne morem rokovati s tem številom povezav!! Not enough memory, fatal internal error.. Ni dovolj pomnilnika, usodna notranja napaka... Unknown operation! Neznano opravilo! Add this URL?\r\n Dodaj ta URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Opozorilo: glavni proces je nepremièen in ne morem dodati URL(je).. Type/MIME associations Tip/MIME združevanja File types: Datoteèni tipi: MIME identity: MIME pristnost: Select or modify your file type(s) here Tukaj izberite ali urejajte vaš tip datotek Select or modify your MIME type(s) here Tukaj izberite Izbor ali uredite vaše MIME tipe Go up Pojdi gor Go down Pojdi dol File download information Informacije o naloženi datoteki Freeze Window Zmrzni Okna More information: Veè podatkov: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Dobrodošli pri delu z WinHTTrack Website Copierom!\n\nKliknite na gumb NAPREJ za\n\n- zaèetek novega projekta\n- ali dokonèanje posameznih prenosov File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Datoteke z podaljškom:\nImena datotek vsebujejo:\nTo ime datoteke:\nVsebina map z imenom:\nTo ime mape:\nPovezava z domeno:\nVsebina povezave z domeno:\nPovezava s tem gostiteljem:\nVebina povezave:\nTa povezava:\nVSE POVEZAVE Show all\nHide debug\nHide infos\nHide debug and infos Prikaži vse\nSkrij razhrošèevanje\nSkrij informacije\nSkrij razhrošèevanje in informacije Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Never\nIf unknown (except /)\nIf unknown Nikoli\nÈe je neznan (uveljavi /)\nÈe je neznan no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ni robots.txt pravil\nrobots.txt izloèen èarovnik\nzasleduj robots.txt pravila normal\nextended\ndebug obièajno\nrazširjeno\nrazhrošèevanje Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Prenos spletne (nih) strani\nPrenos spletne (nih) strani) + vprašanja\nPrevzem posameznih datotek\nPrenos vseh posamiènih strani (veèkratno zrcaljenje)\nPreverjanje povezav znotraj strani (preverjanje zaznamkov)\n* Nadaljevanje prekinjenih prenosov\n* Nadgradnja obstojeèih prenosov Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relativni URL / Absolutni URL (privzeto)\nAbsolutni URL / Absolutni URL\nAbsolutni URI / Absolutni URL\nOriginalni URL / Originalni URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Vrsta proxyja: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protokol proxy. HTTP: standardni proxy. HTTP (tunel CONNECT): poslje vsako zahtevo skozi tunel CONNECT, za posrednike, ki podpirajo samo CONNECT, kot je HTTPTunnelPort v Toru. SOCKS5: privzeta vrata 1080. Load cookies from file: Nalozi piskotke iz datoteke: Preload cookies from a Netscape cookies.txt file before crawling. Predhodno nalozi piskotke iz datoteke Netscape cookies.txt pred zajemanjem. Pause between files: Premor med datotekami: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Nakljucni zamik med prenosi datotek, v sekundah. Za nakljucni obseg uporabite MIN:MAX (npr. 2:8). Keep the www. prefix (do not merge www.host with host) Ohrani predpono www. (ne zdruzi www.host z host) Do not treat www.host and host as the same site. www.host in host ne obravnavaj kot isto spletno mesto. Keep double slashes in URLs Ohrani dvojne posevnice v URL-jih Do not collapse duplicate slashes in URLs. Ne zdruzuj podvojenih posevnic v URL-jih. Keep the original query-string order Ohrani izvirni vrstni red poizvedovalnega niza Do not reorder query-string parameters when deduplicating URLs. Pri odstranjevanju podvojenih URL-jev ne spreminjaj vrstnega reda parametrov poizvedbe. Strip query keys: Odstrani kljuce poizvedbe: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Z vejicami loceni kljuci poizvedbe, ki se izpustijo pri poimenovanju shranjenih datotek (npr. sid,utm_source). Write a WARC archive of the crawl Zapisi arhiv WARC iz pregledovanja Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Shrani tudi vsak preneseni odgovor v arhiv WARC/1.1 ISO-28500 poleg zrcala. WARC archive name: Ime arhiva WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Neobvezno osnovno ime arhiva WARC; pustite prazno za samodejno poimenovanje v izhodni mapi. httrack-3.49.14/lang/Slovak.txt0000644000175000017500000011000015230602340011721 LANGUAGE_NAME Slovak LANGUAGE_FILE Slovak LANGUAGE_ISO sk LANGUAGE_AUTHOR Dr. Martin Sereday (sereday at stonline.sk)\r\n LANGUAGE_CHARSET ISO-8859-2 LANGUAGE_WINDOWSID Slovak OK Áno Cancel Zruši Exit Ukonèi Close Zatvori Cancel changes Zruši zmeny Click to confirm Potvrdi zmeny Click to get help! Pomoc Click to return to previous screen Predchádzajúca obrazovka Click to go to next screen Nasledujúca obrazovka Hide password Skry heslo Save project Uloži projekt Close current project? Zatvori projekt? Delete this project? Vymaza projekt? Delete empty project %s? Vymaza prázdne projekty? Action not yet implemented Akcia zatia¾ nebola zaradená Error deleting this project Chyba pri mazaní projektu Select a rule for the filter Vybra pravidlo filtra Enter keywords for the filter Vloži k¾úèové slovo pre filter Cancel Zruši Add this rule Prida toto pravidlo Please enter one or several keyword(s) for the rule Vlož jedno alebo nieko¾ko k¾úèových slov pre pravidlo Add Scan Rule Pridaj previdlo pre vyh¾adávanie Criterion Kritériá String Reazec Add Pridaj Scan Rules Pravidlá pre vyh¾adávanie Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Použi masky na vylúèenie alebo doplnenie URL alebo linkov. n\Do jedného riadku možno vloži aj viac reazcov.\nAko odde¾ovaè použi medzeru.n\n\Napr.: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Vylúèi linky Include link(s) Prida linky Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tip: Ak sa majú zaradi všetky GIFy, použi napr. *www.stránka.com/.gif.\n(+*.gif /-*.gif bude onsahova/vylúèi vešetky GIFy zo všetkých stránok). Save prefs Uloži nastavenia Matching links will be excluded: Zodpovedajúce linky budú vylúèené Matching links will be included: Zodpovedajúce linky budú zaradené Example: Napr.: gif\r\nWill match all GIF files gif\r\nZodpovedá všetkým GIF súborom blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nNájde všetky súbory obsahujúce skupinu znakov 'blue' - napr. 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nZodpovedá súborom 'bigfile.mov', ale nie 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nVyh¾adá všetky linky s názvom adresára obsahujúcim skupinu znakov 'cgi' - napr. /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nVyh¾adá všetky linky s názvom adresára obsahujúcim skupinu znakov 'cgi-bin' (ale už nie napr. cgi-bin-2) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nVyh¾adá všetky zhodné reazce napr.: www.someweb.com, private.someweb.com atï. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nVyh¾adá všetky adresáre obsahujúce reazec napr.: www.someweb.com, www.someweb.edu, private.someweb.otherweb.com atï. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nVyh¾adá všetky linky obsahujúce úplný reazec napr.: 'www.someweb.com' (ale nie linky napr.: private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nVyh¾adá všetky linky obsahujúce reazec napr.: www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html atï. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nVyh¾adá iba súbor 'www.test.com/test/someweb.html'. POZOR!, musí sa napísa úplná cesta (URL + cesta v rámci štruktúry) All links will match Všetky linky sa budú zhodova Add exclusion filter Zada filter pre vylúèenie Add inclusion filter Zada filter pre zaèlenenie Existing filters Existujúce filtre Cancel changes Zruši zmeny Save current preferences as default values Uloži aktuálne nastavenia ako základné hodnoty Click to confirm Potvrdi kliknutím No log files in %s! V %s neexistuje protokol! No 'index.html' file in %s! V %s neexistuje súbor 'index.html ! Click to quit WinHTTrack Website Copier Vystúpi z WinHTTrack Website Copier View log files Zobrazi protokoly Browse HTML start page Prezrie úvodnú stránku HTML End of mirror Koniec sahovania View log files Zobrazi protokoly Browse Mirrored Website Prezrie stihnutú stránku New project... Nový projekt ... View error and warning reports Prezrie chybové a varovné hlásenia View report Pozrie hlásenie Close the log file window Zavrie okno protokolu Info type: Typ informácie: Errors Chyby Infos Informácie Find Nájs Find a word Nájs slovo Info log file Protokol informácií Warning/Errors log file Protokol chýb / varovaní Unable to initialize the OLE system Nedá sa incializova OLE systém WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack nenašiel žiaden cache prerušeného súboru v špecifikovanom adresári\r\n Could not connect to provider Nedá sa spoji s providerom receive Prijímanie request Požiadavka connect Spojenie search H¾danie ready Pripravené error Chyba Receiving files.. Prijímanie súborov Parsing HTML file.. Analýza HTML súboru... Purging files.. Uvo¾nenie súboru Loading cache in progress.. Prebieha napåòanie chache.. Parsing HTML file (testing links).. Analýza HTML súboru (testovanie linkov) Pause - Toggle [Mirror]/[Pause download] to resume operation Pauza - Pokraèova [Stránka - Kópia]/[Zastavi kopírovanie] Finishing pending transfers - Select [Cancel] to stop now! Ukonèenie prebiehajúcich prenosov - Zvoµ [Zru¹i»]! scanning Skenovanie Waiting for scheduled time.. Èakanie na plánovaný èas... Connecting to provider Pripájanie providera [%d seconds] to go before start of operation [%d sekúnd] chýba do zaèiatku operácie Site mirroring in progress [%s, %s bytes] Prebieha kopírovanie stránky [%s, %s bytov] Site mirroring finished! Kopírovanie stránky ukonèené! A problem occurred during the mirroring operation\n Poèas kopírovania sa vyskytol problém\n \nDuring:\n \nPoèas:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nAk treba, pozrie protokol.\n\n\r\nKliknutím na KONIEC opusti WinHTTrack Website Copier.\n\nVïaka za použitie WinHTTrack!\r\n Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Operácia kopírovania ukonèená.\nKliknutím na Exit opusti WinHTTrack.\nPozrie protokoly súbor(y), ak sa treba uisti, že všetkoje v poriadku.\n\nVïaka za použitie WinHTTrack!\r\n * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * KOPÍROVANIE PRERUŠENÉ! * *\r\nAktuálna doèasná cache je potrebná prevšetky aktualizaèné operácie a obsahuje iba dáta stiahnuté poèas tejto prerušenej operácie\r\nPredchádzajúca chache môže obsahova kompletnejšie informácie. Ak sa tieto informácie nemajú strati, treba ju obnovi a vymaza terajšiu aktuálnu cache.\r\n[Poznámka: Dá sa to urobi teraz vymazaním súborov hts-cache/new.* ]\r\n\r\nObsahuje predchádzajúca cache obsahuje kompletnejšiu informáciu a má sa obnovi?\r\n * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * CHYBA KOPÍROVANIA! * *\r\nHTTrack zistil, že táto kópia je prázdna. Ak mala by aktualizovaná, predchádzajúca kópia bola obnovená.\r\nDôvod: Úvodná stránka buï nebola nájdená, alebo nastal problém so spojením.\r\n=> Presvedèi sa, èi webstránka ešte existuje a/alebo skontrolova vlastné nastavenie proxy! <= \n\nTip: Click [View log file] to see warning or error messages \n\nTip: Kliknú na [Zobrazi protokol] a pozrie na upozornania alebo chybové hlásenia Error deleting a hts-cache/new.* file, please do it manually Chyba pri mazaní súborov hts-cache/new.* . Vymaza ruène Do you really want to quit WinHTTrack Website Copier? Naozaj opusti WinHTTrack Website Copier?\r\n - Mirroring Mode -\n\nEnter address(es) in URL box - Mód kopírovania -\n\nUda adresu(y) do políèka URL - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Mód interaktívneho pomocníka (otázky) -\n\nUda adresu(y) do políèka URL - File Download Mode -\n\nEnter file address(es) in URL box - Mód kopírovania súboru -\n\nUda adresu(y) súboru do políèka URL - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Mód testovania linkov -\n\nUda adresu(y) www s linkami na otestovanie do políèka URL - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Mód aktualizácie -\n\nOveri si adresu(y) v políèku URL, ak je nutné, skontrolova parametre, potom kliknú na 'Next' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Mód pokraèovania (prerušenej operácie) -\n\nOveri si adresu(y) v políèku URL, ak je nutné, skontrolova parametre, potom kliknú na 'Next' Log files Path Cesta k súborom s protokolmi Path Cesta - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Mód zoznamu linkov -\n\nPouži políèko URL na zadanie adresy (adries) súboru(ov) obsahujúcich linky ku kópii\r\n New project / Import? Nový projekt / Import? Choose criterion Zvoli kritériá Maximum link scanning depth Maximálna håbka skenovania linkov Enter address(es) here Sem zada adresu(y) Define additional filtering rules Definova dodatoèné pravidlá filtrovania Proxy Name (if needed) Meno proxy (ak je potrebné) Proxy Port Port proxy Define proxy settings Definova nastavenie proxy Use standard HTTP proxy as FTP proxy Použi štandardný HTTP proxy ako FTP proxy Path Cesta Select Path Vybra cestu Path Cesta Select Path Vyba cestu Quit WinHTTrack Website Copier Ukonèi WinHTTrack Website Copier About WinHTTrack O WinHTTrack... Save current preferences as default values Uloži aktuálne nastavenia ako základné hodnoty Click to continue Kliknutím pokraèova Click to define options Kliknú a definova nastavenia Click to add a URL Klikuntím vlo¾ URL Load URL(s) from text file Naèíta URL z textového súboru WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack - nastavenia (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Textový súbor so zoznamom adries (*.txt)|*.txt|| File not found! Súbor nenájdený! Do you really want to change the project name/path? Naozaj zmeni názov/umiestnenie projektu? Load user-default options? Naèíta užívate¾ské - základné nastavenia? Save user-default options? Uloži užívate¾ské - základné nastavenia? Reset all default options? Obnovi všetky základné nastavenia? Welcome to WinHTTrack! Vitaj vo WinHTTrack! Action: Akcia: Max Depth Maximálna håbka: Maximum external depth: Maximálna externá håbka: Filters (refuse/accept links) : Filtre (odmietni/potvrï linky): Paths Cesty Save prefs Uloži nastavenia Define.. Definova... Set options.. Nastavi nastavenia... Preferences and mirror options: Nastavenia a nastavenia kópie: Project name Názov projektu Add a URL... Zadaj URL... Web Addresses: (URL) Adresa www: (URL) Stop WinHTTrack? Zastavi WinHTTrack? No log files in %s! Žiadne protokoly v %s! Pause Download? Pozastavi kopírovanie? Stop the mirroring operation Zastavi operáciu kopírovania Minimize to System Tray Minimalizova na systémovú lištu Click to skip a link or stop parsing Klinutím preskoèi link alebo zastavi analýzu Click to skip a link Kliknutím preskoèi link Bytes saved Uložené byty Links scanned Skenované linky Time: Èas: Connections: Spojenia: Running: Prebieha: Hide Skry Transfer rate Úroveò prenosu: SKIP PRESKOÈI Information Informácie Files written: Zapísané súbory: Files updated: Aktualizované súbory: Errors: Chyby: In progress: Spracováva sa: Follow external links Preh¾ada vonkajšie linky Test all links in pages Testova všetky linky na stránkach Try to ferret out all links SKúsi preh¾ada všetky linky Download HTML files first (faster) Skopírova najprv súbory HTML (rýchlejšie) Choose local site structure Zvoli vnútornú štruktúru stránky Set user-defined structure on disk Nastavi užívate¾sky definovnú štruktúru na disku Use a cache for updates and retries Použi cache pre aktualizácie a obnovenia Do not update zero size or user-erased files Neaktualizova prázdne súbory alebo súbory vymazané užívate¾om Create a Start Page Vytvori úvodnú stránku Create a word database of all html pages Vytvori databázu všetkých slov ako html stránky Create error logging and report files Vytvori protokoly chýb a hlásení Generate DOS 8-3 filenames ONLY Vytvori LEN DOS-ovské 8-3 názvy súborov Generate ISO9660 filenames ONLY for CDROM medias Vytvor názvy ISO9660 IBA PRE CD ROM. Do not create HTML error pages Nevytvára HTML chybové stránky Select file types to be saved to disk Vybra typy súborov, ktoré majú by uložené na disk Select parsing direction Vybra poradie anaklýzy Select global parsing direction Vybra globálnu analýzu Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Nastav URL prepísaním pravidiel pre vnútorné linky (u¾ skopírované) a vonkaj¹ie linky (e¹te neskopírované). Max simultaneous connections Maximum súèasných spojení File timeout Maximálna èakacia doba pre súbory Cancel all links from host if timeout occurs Po vypršaní èakacej doby zruši všetky spojenia Minimum admissible transfer rate Najnižšia prípustná úroveò prenosu Cancel all links from host if too slow Zruši všetky spojenia, ak je prenos príliš pomalý Maximum number of retries on non-fatal errors Maximálny poèet pokusov pri nepodstatných chybách Maximum size for any single HTML file Maximálna ve¾kos jednotlivého HTML súboru Maximum size for any single non-HTML file Maximálna ve¾kos pre jednotlivý nie-HTML súbor Maximum amount of bytes to retrieve from the Web Maximálny poèet bytov kopírovaných z www Make a pause after downloading this amount of bytes Po skopírovaní tohoto množstva urobi pauzu Maximum duration time for the mirroring operation Maximálny èas pre kokpírovanie Maximum transfer rate Maximálna úroveò kopírovania Maximum connections/seconds (avoid server overload) Maximum spojení za sekundu (predchádza preaženiu servera) Maximum number of links that can be tested (not saved!) Maximum linkov, ktoré majú by testované (nie uložené!) Browser identity Identifikácia prehliadaèa Comment to be placed in each HTML file Komentár, ktorý má by umiestnený do každého HTML súboru Back to starting page Spä na úvodnú stránku Save current preferences as default values Uloži aktuálne nastavenia ako základné hodnoty Click to continue Pokraèova Click to cancel changes Zruši zmeny Follow local robots rules on sites Prija pravidlá lokálneho robota na stránkach Links to non-localised external pages will produce error pages Linky na nelokalizované externé stránky vyprodukujú chybné stránky Do not erase obsolete files after update Po aktualizácii nevymazáva prebytoèné stránky Accept cookies? Prija cookies ? Check document type when unknown? Kontrolova dokumenty, ak nie je známy ich typ? Parse java applets to retrieve included files that must be downloaded? Analyzova Java applety, aby sa zistilo, ktoré súbory musia by kopírované? Store all files in cache instead of HTML only Uloži všetky súbory v cache, nie iba v HTML Log file type (if generated) Typ protokolu (ak bol vytvorený) Maximum mirroring depth from root address Maximálny håbka kopírovania od koreòovej adresy Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximálna håbka kopírovania externých/zakázaných adries (0 znamené žiadna - základné nastavenie) Create a debugging file Vytvori debugovací súbor Use non-standard requests to get round some server bugs Použi neštandardné požiadavky na obídenie jednotlivých chýb servera Use old HTTP/1.0 requests (limits engine power!) Použi staré HTTP/1.0 požuadavky (obmdzuje pracovné tempo!) Attempt to limit retransfers through several tricks (file size test..) Pokúsi sa rôznymi trikmi obmedzi opakované transféry (test ve¾kosti súborov). Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Zada vonkajšie linky bez užívate¾ského mena/hesla Write internal links without query string Písa vnútorné linky bez overovacích reazcov Get non-HTML files related to a link, eg external .ZIP or pictures Prebra iné, než HTML súbory súvisiace s linkom, napr. externé ZIP súbory alebo obrázky Test all links (even forbidden ones) Testova všetky linky (aj zakázané) Try to catch all URLs (even in unknown tags/code) Pokúsi sa zachyti všetky URL (vrátane neznámych tagov/kódov) Get HTML files first! Prebra najprv HTML súbory! Structure type (how links are saved) Typ štruktúry (ako budú linky uložené) Use a cache for updates Na aktualiizáciu použi cache Do not re-download locally erased files Nesahova znovu lokálne vymazané súbory Make an index Vytvori index Make a word database Vytvori slovnú databázu Log files Log súbory DOS names (8+3) DOS názvy (8+3) ISO9660 names (CDROM) Názvy ISO9660 (CD ROM) No error pages Žiadne chybové stránky Primary Scan Rule Základné skenovacie pravidlá Travel mode Vyh¾adávací mód Global travel mode Globálny vyh¾adávací mód These options should be modified only exceptionally Tieto pravidlá majú by upravované iba výnimoène Activate Debugging Mode (winhttrack.log) Aktivova mód vyh¾adávania chýb (winhttrack.log) Rewrite links: internal / external Prepí¹ linky: vnútorné / vonkaj¹ie Flow control Kontrola toku Limits Limity Identity Identita HTML footer Päta HTML N# connections Poèet spojení Abandon host if error V prípade chyby opusti zdroj Minimum transfer rate (B/s) Minimálna úroveò sahovania (B/s) Abandon host if too slow Opusti zdroj, ak je prenos príliš pomalý Configure Konfigurova Use proxy for ftp transfers Pre prenosy cez ftp použi proxy TimeOut(s) Interval(y) èakania Persistent connections (Keep-Alive) Trvalé spojenie (Udr¾a»-¾ivé) Reduce connection time and type lookup time using persistent connections Zní¾ dobu pripojenia a zadaj èas vyhµadávania pri trvalých spojeniach Retries Opätovné pokusy Size limit Limity ve¾kosti Max size of any HTML file (B) Maximálna ve¾kos jednotlivého HTML súboru (B) Max size of any non-HTML file Maximálna ve¾kos iného ako HTML súboru Max site size Maximálna ve¾kos stránky Max time Maximálny èas Save prefs Uloži nastavenia Max transfer rate Maximálna úroveò prenosu Follow robots.txt Použi pravidlá z robots.txt No external pages Žiadne externé stránky Do not purge old files Nevyprázdòva staré súbory Accept cookies Prija cookies Check document type Overi typ dokumentu Parse java files Analyzova súbory v Jave Store ALL files in cache Všetky súbory uloži do cahce Tolerant requests (for servers) Prípustné požiadavky (pre servery) Update hack (limit re-transfers) Trik pre aktualizáciu (obmedzenie opakovaných prenosov) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Použi staré pravidlá HTTP/1.0 (nie 1.1) Max connections / seconds Maximálny poèet spojení Maximum number of links Maximálny poèet linkov Pause after downloading.. Pauza po skopírovaní Hide passwords Skry heslo Hide query strings Skry vyh¾adávacie reazce Links Linky Build Vytvori Experts Only Iba pre expertov Flow Control Kontrola toku Limits Limity Browser ID ID prehliadaèa Scan Rules Pravidlá skenovania Spider Pavúk Log, Index, Cache Log, index, cache Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Naozaj chceš ukonèi WinHTTrack Website Copier? Do not connect to a provider (already connected) Nepripája providera (už je pripojený) Do not use remote access connection Nepouživa spojenie dia¾kového ovládania Schedule the mirroring operation Naplánova kopírovanie Quit WinHTTrack Website Copier Ukonèi WinHTTrack Website Copier Back to starting page Spä na štartovaciu stránku Click to start! Spusti! No saved password for this connection! Pre toto spojenie nie sú uložené žiadne heslá! Can not get remote connection settings Nemožno získa nastavenia pre vzdialené spojenie Select a connection provider Vybra poskytovate¾a spojenia Start Štart Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. V prípade potreby nastavi parametre spojenia,\npotom stlaèi DOKONÈI na spustenie kopírovania. Save settings only, do not launch download now. Uloži nastvenia, nespúša teraz kopírovanie. On hold Zastavi Transfer scheduled for: (hh/mm/ss) Kopírovanie naplánované na: (hh/mm/ss) Start Štart! Connect to provider (RAS) Spoji s poskytovate¾om (RAS) Connect to this provider Pripoji k tomuto poskytovate¾ovi Disconnect when finished Odpoji, ak je kopírovanie ukonèené Disconnect modem on completion Odpoji modem po dokonèení \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Oznám nám akúko¾vek chybu alebo problém)\r\n\r\nVývoj:\r\nProstredie (Windows): Xavier Roche\r\nPavúk: Xavier Roche\r\nKontrolór Javy: Yann Philippot\r\n\r\n(C)1998-2001 Xavier Roche a ostatní pomocníci\r\nVE¼KÉ POÏAKOVANIE za preklady:\r\nDr. Martin Sereday (sereday@slovanet.sk) About WinHTTrack Website Copier O WinHTTrack Website Copier... Please visit our Web page Navštív našu web stránku Wizard query Otázky pomocníka Your answer: Tvoja odpoveï: Link detected.. Nájdený link. Choose a rule Zvoli pravidlo Ignore this link Ignoroav tento link Ignore directory Ignorova adresár Ignore domain Ignorova doménu Catch this page only Prebra iba túto stranu Mirror site Umiestnenie zrkadla Mirror domain Doména zrkadla Ignore all Ignorova všetky Wizard query Otázka pomocníka NO NIE File Súbor Options Vo¾by Log Protokol Window Okno Help Pomoc Pause transfer Prestávka kopírovania Exit Zavrie Modify options Upravi nastavenia View log Ukáza protokol View error log Ukáza protokol chýb View file transfers Ukáza prenosy súbporov Hide Skry About WinHTTrack Website Copier O WinHTTrack Website Copier... Check program updates... Skontrolova aktualizácie WinHTTrack... &Toolbar &Nástrojová lišta &Status Bar &Stavový riadok S&plit R&ozdeli File Súbor Preferences Nastavenia Mirror Zrkadlo Log Protokol Window Okno Help Pomoc Exit Zavrie Load default options Naèíta povinné nastavenia Save default options Uloži povinné nastavenia Reset to default options Obnovi povinné nastavenia Load options... Naèíta nastavenia... Save options as... Uloži nastavenia ako... Language preference... Nastavenia jazyka... Contents... Obsah... About WinHTTrack... O Win HTTrack... New project\tCtrl+N Nový projekt\tCtrl+N &Open...\tCtrl+O &Otvori...\tCtrl+O &Save\tCtrl+S &Uloži\tCtrl+S Save &As... Uloži ako... &Delete... &Vymaza... &Browse sites... &Prezera stránky... User-defined structure Štruktúra definovaná užívate¾om %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNázov súboru bez udania typu (napr.: obrázok)\r\n%N\tNázov súboru vrátane typu (napr.: obrázok.gif)\r\n%t\tIba typ súboru (napr.: gif)\r\n%p\tCesta bez ukonèenia /] (napr.: /obrázky)\r\n%h\tNázov zdroja (napr.: www.someweb.com)\r\n%M\tMD5 URL (128 bitov, 32 ascii bytov)\r\n%Q\tMD5 vyh¾adávací reazec (128 bitov, 32 ascii bytov)\r\n%q\tMD5 malý vyh¾adávací reazec (16 bitov, 4 ascii bytov)\r\n\r\n%s?\tKrátky názov (napr.: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Príklad:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Nastavenie proxy Proxy address: Adresa proxy Proxy port: Port proxy Authentication (only if needed) Autentifikácia (iba ak je potrebná) Login Login Password Heslo Enter proxy address here Sem vloži adresu proxy Enter proxy port here Sem vloži port proxy Enter proxy login Vloži login proxy Enter proxy password Vloži heslo proxy Enter project name here Sem vloži názov projektu Enter saving path here Sem vloži cestu uloženia Select existing project to update Vybra existujúci projekt, ktorý má by aktualizovaný Click here to select path Kliknú sem a vybra cestu Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Project Wizard... New project name: Názov nového projektu: Existing project name: Názov existujúceho projektu: Project name: Názov porjektu: Base path: Základná cesta: Project category: C:\\My Web Sites C:\\My Web Sites Type a new project name, \r\nor select existing project to update/resume Napísa názov nového projektu, alebo zvoli existujúci projekt, \r\nv ktorom sa má pokraèova alebo aktualizova\r\n New project Nový projekt Insert URL Vloži URL URL: URL: Authentication (only if needed) Autentifikácia (iba ak je potrebná) Login Login Password Heslo Forms or complex links: Formuláre alebo komplexné linky: Capture URL... Prebra URL... Enter URL address(es) here Sem vloži adresu(y) URL Enter site login Vloži login stránky Enter site password Vloži heslo stránky Use this capture tool for links that can only be accessed through forms or javascript code Použi tento snímací nástroj pre linky, ktoré môžu by prístupné iba cez formuláre alebo java scripty Choose language according to preference Zvoli jazyk pod¾a nastavení Catch URL! Prebra URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Nastavi doèasne nastavenia proxy prehliadaèa na tieto hodnoty (Kopírova/Vloži adresa a port proxy).\n\rPotom kliknú na tlaèidlo POŠLI na stránke prehliadaèa, alebo kliknú na konkrétny link, ktorý sa má prevzia.\r\n This will send the desired link from your browser to WinHTTrack. Toto odošle požadovaný link z tvojho prehliadaèa do WinHTTrack. ABORT PRERUŠI Copy/Paste the temporary proxy parameters here Kopírova/Vloži sem doèasné parametre proxy Cancel Zruši Unable to find Help files! Neviem nájs súbory nápovedy! Unable to save parameters! Nemôžem uloži parametre! Please drag only one folder at a time Sahova súèasne iba jediný adresár Please drag only folders, not files Sahova iba adresáre, nie súbory Please drag folders only Sahova iba adresáre Select user-defined structure? Vybra štruktúru definovanú užívate¾om? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Presvedèi sa, že užívate¾om definovaný reazec je správny,\ninak budú názvy súborov chybné! Do you really want to use a user-defined structure? Naozaj sa má použi užívate¾om definovaná štruktúra? Too manu URLs, cannot handle so many links!! Príliš ve¾a URL, neviem zvládnu tak ve¾a linkov! Not enough memory, fatal internal error.. Nedostatok pamäti, závažná interná chyba... Unknown operation! Neznáma operácia! Add this URL?\r\n Prida toto URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Upozornenie: hlavný proces ešte stále neodpovedá, nemôžem prida URL.. Type/MIME associations Typ/MIME priradenia File types: Typ súborov: MIME identity: Identita MIME: Select or modify your file type(s) here Vybra alebo upravi typ súboru(ov) Select or modify your MIME type(s) here Vybera alebo upravi MIME súboru(ov) Go up Nahor Go down Nadol File download information Informácie pre kopírovanie Freeze Window Fixova okno More information: Viac informácií Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Vitaj vo WinHTTrack Website Copier!\n\nKliknú na tlaèidlo NEXT \n\n- a spusti nový projekt\n- alebo pokraèova v èiastoène skopírovanom File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Názvy súborov s príponou:\nNázvy súborov obsahujúcich:\nNázov tohoto súboru:\nNázvy adresárov obsahujúcich:\nNázov tohoto adresára:\nLinky na tejto doméne:\nLinky na doménach obsahujúcich:\nLinky z tohoto hostu:\nLinky obsahujúce:\nTento link:\nVŠETKY LINKY Show all\nHide debug\nHide infos\nHide debug and infos Ukáza všetko\nSkry ladenie\nSkry informácie\nSkry ladenie a informácie Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Štruktúra stránky (default)\nHtml vo webe/, obrázky/iné súbory vo webe/obrázky/\nHtml vo webe/html, obrázky/iné vo webe/obrázky\nHtml vo webe/, obrázky/iné vo webe/\nHtml vo webe/, obrázky/iné vo webe/xxx, kde xxx je prípona súboru\nHtml vo webe/html, obrázky/iné vo webe/xxx\nŠtruktúra stránky, bez www.doména.xxx/\nHtml v názve stránky/, obrázky/iné súbory v názve stránky/obrázky/\nHtml v názve stránky/html, obrázky/iné v názve stránky/obrázky\nHtml v názve stránky/, obrázky/iné v názve stránky/\nHtml v názve stránky/, obrázky/iné v názve stránky/xxx\nHtml v názve stránky/html, obrázky/iné v názve stránky/xxx\nVšetky súbory vo webe/, s náhodnými menami (gadget !)\nVšetky súbory v názve stránky/, s náhodnými menami (gadget !)\nUžívate¾om definovaná štruktúra.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Iba skenova\nUloži html súbory\nUloži nie-html súbory\nUloži všetky súbory (default)\nUloži najprv html súbory Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Osta v tom istom adresári\nMožno ís nižšie (default)\nMožno ís vyššie\nMožno ís nižšie aj vyššie Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Osta na tej istej adrese (default)\nOsta na tej istej doméne\nOsta -//- najvyššej úrovne\nÍs hocikam na webe Never\nIf unknown (except /)\nIf unknown Nikdy\nAk nie je známe (s výnimkou/)\nAk nie je známe no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Ignorova pravidlá v robots.txt\nPrevza pravidlá -//- okrem filtrov\nPrevzia všetky pravidlá v -//- normal\nextended\ndebug normálny\nrozšírený\nladenie Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Skopíruj web stránku(y)\nSkopíruj web stránku(y) + otázky\nPreber jednotlivé súbory\nSkopíruj v¹etky umiestnenia na stánkach (viacnásobné zrkadlo)\nOtestuj linky na stránkach (testuj zálo¾ky)\n* Pokraèuj v preru¹enom kopírovaní\n* Aktualizuj existujúce kópie Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relatívna URI / Absolútna URL (prednastavené)\nABsolútna URL / Absolútna URL\nAbsolútna URL\nPôvodná URL / Pôvodná URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Typ proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protokol proxy. HTTP: ¹tandardné proxy. HTTP (tunel CONNECT): odo¹le ka¾dú po¾iadavku cez tunel CONNECT, pre proxy podporujúce len CONNECT ako HTTPTunnelPort v Tore. SOCKS5: predvolený port 1080. Load cookies from file: Naèíta» cookies zo súboru: Preload cookies from a Netscape cookies.txt file before crawling. Naèíta» cookies zo súboru Netscape cookies.txt pred zaèatím s»ahovania. Pause between files: Prestávka medzi súbormi: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Náhodné oneskorenie medzi s»ahovaním súborov, v sekundách. Pre náhodný rozsah pou¾ite MIN:MAX (napr. 2:8). Keep the www. prefix (do not merge www.host with host) Zachova» predponu www. (nezluèova» www.host s host) Do not treat www.host and host as the same site. Nepova¾ova» www.host a host za tú istú lokalitu. Keep double slashes in URLs Zachova» dvojité lomky v URL Do not collapse duplicate slashes in URLs. Nezluèova» opakované lomky v URL. Keep the original query-string order Zachova» pôvodné poradie re»azca dotazu Do not reorder query-string parameters when deduplicating URLs. Nemeni» poradie parametrov re»azca dotazu pri odstraòovaní duplicitných URL. Strip query keys: Odstráni» kµúèe dotazu: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Kµúèe dotazu oddelené èiarkami, ktoré sa vynechajú z pomenovania ukladaných súborov (napr. sid,utm_source). Write a WARC archive of the crawl Zapísa» archív WARC z prehµadávania Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Ulo¾i» aj ka¾dú stiahnutú odpoveï do archívu WARC/1.1 ISO-28500 vedµa zrkadla. WARC archive name: Názov archívu WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Voliteµný základný názov archívu WARC; ponechajte prázdne pre automatické pomenovanie vo výstupnom adresári. httrack-3.49.14/lang/Russian.txt0000644000175000017500000011266515230602340012131 LANGUAGE_NAME Russian LANGUAGE_FILE Russian LANGUAGE_ISO ru LANGUAGE_AUTHOR Andrei Iliev (iliev at vitaplus.ru) \r\n LANGUAGE_CHARSET windows-1251 LANGUAGE_WINDOWSID Russian OK OK Cancel Îòìåíà Exit Âûõîä Close Çàêðûòü Cancel changes Îòìåíèòü èçìåíåíèÿ Click to confirm Ïîäòâåðäèòü Click to get help! Ñïðàâêà Click to return to previous screen Âåðíóòüñÿ íàçàä Click to go to next screen Ïåðåéòè ê ñëåäóþùåìó ýêðàíó Hide password Ñêðûòü ïàðîëü Save project Ñîõðàíèòü ïðîåêò Close current project? Çàêðûòü òåêóùèé ïðîåêò? Delete this project? Óäàëèòü ýòîò ïðîåêò? Delete empty project %s? Óäàëèòü ïóñòîé ïðîåêò %s? Action not yet implemented Äåéñòâèå íå ðåàëèçîâàíî Error deleting this project Îøèáêà óäàëåíèÿ ýòîãî ïðîåêòà Select a rule for the filter Âûáðàòü òèï ôèëüòðà Enter keywords for the filter Ââåäèòå çíà÷åíèÿ óñëîâèé ôèëüòðà Cancel Îòìåíà Add this rule Äîáàâèòü ýòî óñëîâèå Please enter one or several keyword(s) for the rule Ââåäèòå îäíî èëè íåñêîëüêî çíà÷åíèé óñëîâèé ôèëüòðà Add Scan Rule Äîáàâèòü ôèëüòð Criterion Âûáðàòü êðèòåðèè: String Ââåñòè çíà÷åíèå: Add Äîáàâèòü Scan Rules Ôèëüòðû Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Èñïîëüçóÿ ìàñêè âû ìîæåòå èñêëþ÷èòü/âêëþ÷èòü ñðàçó íåñêîëüêî àäðåñîâ èëè ññûëîê.\nÊàê ðàçäåëèòåëü ôèëüòðîâ èñïîëüçóéòå çàïÿòûå èëè ïðîáåëû.\nÏðèìåð: +*.zip -www.*.com,-www.*.edu/cgi-bin/*.cgi Exclude links Èñêëþ÷èòü Include link(s) Âêëþ÷èòü Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Ñîâåò: Êàê ïðèìåð åñëè âû õîòèòå ñêà÷àòü âñå âêëþ÷åííûå gif-ôàéëû, èñïîëüçóéòå òàêîé ôèëüòð +www.someweb.com/*.gif. \n(+*.gif / -*.gif ðàçðåøàåò/çàïðåùàåò äëÿ ñêà÷èâàíèÿ ÂÑÅ gif-ôàéëû íà ÂÑÅÕ ñàéòàõ) Save prefs Ñîõðàíèòü íàñòðîéêè Matching links will be excluded: Ññûëêè ïîäõîäÿùèå ïîä ýòî óñëîâèå áóäóò èñêëþ÷åíû: Matching links will be included: Ññûëêè ïîäõîäÿùèå ïîä ýòî óñëîâèå áóäóò âêëþ÷åíû: Example: Ïðèìåð: gif\r\nWill match all GIF files gif\r\nÎáíàðóæèò âñå gif (èëè GIF) ôàéëû blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nÎòëîâèò âñå ôàéëû, ñîäåðæàùèå â èìåíè ïîäñòðîêó 'blue', íàïðèìåð 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nÎòëîâèò ôàéë 'bigfile.mov', íî, â òî æå âðåìÿ, ïðîïóñòèò ôàéë 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nÎòëîâèò àäðåñà, ñîäåðæàùèå êàòàëîãè ñ ïîäñòðîêîé 'cgi', òàêèå, êàê /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nÎòëîâèò àäðåñà, ñîäåðæàùèå êàòàëîã 'cgi-bin' (íî íå cgi-bin-2, íàïðèìåð) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nÎòëîâèò òàêèå ëèíêè, êàê www.someweb.com, private.someweb.com è ò.ï. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nÎòëîâèò àäðåñà òèïà www.someweb.com, www.someweb.edu, private.someweb.otherweb.com è ò.ä.\r\n www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nÎòëîâèò àäðåñà, òàêèå êàê www.someweb.com/... (íî íå òàêèå, êàê private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nÎòëîâèò âñå ëèíêè òàêèå, êàê www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html è ò.ï. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nÎòëîâèò òîëüêî www.test.com/test/someweb.html. Çàìåòèì, ÷òî íåîáõîäèìî óêàçàòü ïîëíûé àäðåñ ðåñóðñà - õîñò (www.xxx.yyy) è ïóòü (/test/someweb.html) All links will match Âñå ëèíêè äîïóñòèìû Add exclusion filter Äîáàâèòü èñêëþ÷àþùèé ôèëüòð Add inclusion filter Äîáàâèòü âêëþ÷àþùèé ôèëüòð Existing filters Äîïîëíèòåëüíûå ôèëüòðû Cancel changes Îòìåíèòü èçìåíåíèÿ Save current preferences as default values Ñîõðàíèòü òåêóùèå èçìåíåíèÿ êàê ïî óìîë÷àíèþ Click to confirm Ïîäòâåðäèòü No log files in %s! Îòñóòñòâóþò ëîã ôàéëû â %s! No 'index.html' file in %s! Îòñóòñòâóåò ôàéë index.html â %s! Click to quit WinHTTrack Website Copier Âûéòè èç ïðîãðàììû View log files Ïðîñìîòð ëîã ôàéëîâ Browse HTML start page Îòîáðàçèòü ñòàðòîâóþ html ñòðàíèöó End of mirror Ñîçäàíèå çåðêàëà çàâåðøåíî View log files Ïðîñìîòð log ôàéëîâ Browse Mirrored Website Ïðîñìîòð çåðêàëà New project... Íîâûé ïðîåêò... View error and warning reports Ïðîñìîòð îò÷åòà îá îøèáêàõ è ïðåäóïðåæäåíèÿõ View report Ïðîñìîòð îò÷åòà Close the log file window Çàêðûòü îêíî ëîãà Info type: Òèï èíôîðìàöèè Errors Îøèáêè Infos Èíôîðìàöèÿ Find Íàéòè Find a word Íàéòè ñëîâî Info log file Èíôî ëîã-ôàéë Warning/Errors log file Ëîã ôàéë îøèáîê/ïðåäóïðåæäåíèé Unable to initialize the OLE system Íåâîçìîæíî èíèöèàëèçèðîâàòü OLE WinHTTrack could not find any interrupted download file cache in the specified folder!  óêàçàííîì êàòàëîãå WinHTTrack íå ìîæåò íàéòè íè îäíîãî êýøà ïðåðâàííîé çàêà÷êè! Could not connect to provider Íåâîçìîæíî ñîåäèíèòüñÿ ñ ïðîâàéäåðîì receive ïîëó÷åíèå request çàïðîñ connect ñîåäèíåíèå search ïîèñê ready ãîòîâ error îøèáêà Receiving files.. Ïîëó÷àåì ôàéëû.. Parsing HTML file.. Ðàçáîð HTML ôàéëà... Purging files.. Óäàëÿåì ôàéëû... Loading cache in progress.. Èäåò çàãðóçêà êýøà.. Parsing HTML file (testing links).. Àíàëèçèðóåì HTML ôàéë (ïðîâåðÿåì ëèíêè)... Pause - Toggle [Mirror]/[Pause download] to resume operation Îñòàíîâëåíî (äëÿ ïðîäîëæåíèÿ âûáåðèòå [Çåðêàëî]/[Ïðèîñòàíîâèòü çàêà÷êó]) Finishing pending transfers - Select [Cancel] to stop now! Çàâåðøàþòñÿ îòëîæåííûå çàêà÷êè — ÷òîáû ïðåðâàòü, íàæìèòå Cancel! scanning ñêàíèðóåì Waiting for scheduled time.. Îæèäàåì çàäàííîå âðåìÿ íà÷àëà.. Connecting to provider Ñîåäèíÿåìñÿ ñ ïðîâàéäåðîì [%d seconds] to go before start of operation Îñòàëîñü [%d ñåêóíä] äî íà÷àëà Site mirroring in progress [%s, %s bytes] Ñîçäàåòñÿ çåðêàëî [%s, %s áàéò] Site mirroring finished! Ñîçäàíèå çåðêàëà çàâåðøåíî! A problem occurred during the mirroring operation\n  ïðîöåññå çàêà÷êè ïðîèçîøëà îøèáêà\n \nDuring:\n  òå÷åíèå:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack!  ñëó÷àå íåîáõîäèìîñòè, ñìîòðè ëîã ôàéë.\n\nÄëÿ âûõîäà èç WinHTTrack íàæìèòå êíîïêó OK.\n\nÑïàñèáî çà èñïîëüçîâàíèå WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Ñîçäàíèå çåðêàëà çàâåðøåíî.\nÄëÿ âûõîäà èç ïðîãðàììû íàæìèòå êíîïêó OK.\nÄëÿ ïðîâåðêè óñïåøíîñòè çàêà÷êè ïîñìîòðèòå ëîã ôàéë(û).\n\nÑïàñèáî çà èñïîëüçîâàíèå WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ÇÀÊÀ×ÊÀ ÏÐÅÐÂÀÍÀ! * *\r\nÂðåìåííûé êýø, ñîçäàííûé âî âðåìÿ òåêóùåé ñåññèé, ñîäåðæèò äàííûå, çàãðóæåííûå òîëüêî âî âðåìÿ äàííîé ñåññèè è ïîòðåáóåòñÿ òîëüêî â ñëó÷àå âîçîáíîâëåíèÿ çàêà÷êè.\r\nÎäíàêî, ïðåäûäóùèé êýø ìîæåò ñîäåðæàòü áîëåå ïîëíóþ èíôîðìàöèþ. Åñëè âû íå õîòèòå ïîòåðÿòü ýòè äàííûå, âàì íóæíî óäàëèòü òåêóùèé êýø è âîçîáíîâèòü ïðåäûäóùèé.\r\n(Ýòî ìîæíî ëåãêî ñäåëàòü ïðÿìî çäåñü, óäàëèâ ôàéëû hts-cache/new.]\r\n\r\nÑ÷èòàåòå ëè âû, ÷òî ïðåäûäóùèé êýø ìîæåò ñîäåðæàòü áîëåå ïîëíóþ èíôîðìàöèþ, è õîòèòå ëè âû âîññòàíîâèòü åãî? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ÎØÈÁÊÀ! * *\r\nÒåêóùåå çåðêàëî — ïóñòî. Åñëè ýòî áûëî îáíîâëåíèå, ïðåäûäóùàÿ âåðñèÿ çåðêàëà âîññòàíîâëåíà.\r\nÏðè÷èíà: ïåðâàÿ ñòðàíèöà(û) èëè íå íàéäåíà, èëè áûëè ïðîáëåìû ñ ñîåäèíåíèåì.\r\n=> Óáåäèòåñü, ÷òî âåáñàéò âñå åùå ñóùåñòâóåò, è/èëè ïðîâåðüòå óñòàíîâêè ïðîêñè-ñåðâåðà! <= \n\nTip: Click [View log file] to see warning or error messages \nÏîäñêàçêà: Äëÿ ïðîñìîòðà ñîîáùåíèé îá îøèáêàõ è ïðåäóïðåæäåíèé íàæìèòå [Ïðîñìîòð ëîã ôàéëà] Error deleting a hts-cache/new.* file, please do it manually Îøèáêà óäàëåíèÿ ôàéëà hts-cache/new.*\r\nÏîæàëóéñòà, óäàëèòå ôàéë âðó÷íóþ.\r\n Do you really want to quit WinHTTrack Website Copier? Âû äåéñòâèòåëüíî õîòèòå âûéòè èç WinHTTrack? - Mirroring Mode -\n\nEnter address(es) in URL box - Ðåæèì çåðêàëèðîâàíèÿ -\n\nÂâåäèòå àäðåñ(à) â ïîëå URL. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Èíòåðàêòèâíûé ðåæèì - Ìàñòåð ñîçäàíèÿ çåðêàëà (áóäóò çàäàíû âîïðîñû) -\n\nÂâåäèòå àäðåñ(à) â ïîëå URL. - File Download Mode -\n\nEnter file address(es) in URL box - Ðåæèì çàêà÷êè îòäåëüíûõ ôàéëîâ -\n\nÂâåäèòå àäðåñ(à) ôàéëîâ â ïîëå URL. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Ðåæèì òåñòèðîâàíèÿ ëèíêîâ -\n\nÂâåäèòå àäðåñ(à) ñòðàíèö, ñîäåðæàùèõ URL'û, êîòîðûå âû õîòèòå ïðîòåñòèðîâàòü. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ðåæèì îáíîâëåíèÿ -\n\nÏðîâåðüòå àäðåñ(à) â ïîëå URL, çàòåì íàæìèòå êíîïêó 'ÄÀËÅÅ' è ïðîâåðüòå ïàðàìåòðû. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ðåæèì ïðîäîëæåíèÿ ðàíåå ïðåðâàííîãî ñîçäàíèÿ çåðêàëà -\n\nÏðîâåðüòå àäðåñ(à) â ïîëå URL, çàòåì íàæìèòå êíîïêó 'ÄÀËÅÅ' è ïðîâåðüòå ïàðàìåòðû. Log files Path Ïóòü ê ëîã ôàéëàì Path Ïóòü - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Ðåæèì ñîçäàíèÿ çåðêàë èç ñïèñêà-\n\n ïîëå URL ââåäèòå àäðåñ(à) ñòðàíèö(û) ñ ëèíêàìè äëÿ ñîçäàíèÿ çåðêàëà. New project / Import? Íîâûé ïðîåêò / èìïîðòèðîâàòü? Choose criterion Âûáåðèòå äåéñòâèå Maximum link scanning depth Ìàêñ.ãëóáèíà ñêàíèðîâàíèÿ Enter address(es) here Ââåäèòå àäðåñà Define additional filtering rules Çàäàòü äîïîëíèòåëüíûå ôèëüòðû Proxy Name (if needed) Ïðîêñè, åñëè òðåáóåòñÿ Proxy Port Íîìåð ïîðòà ïðîêñè-ñåðâåðà Define proxy settings Çàäàéòå óñòàíîâêè ïðîêñè Use standard HTTP proxy as FTP proxy Èñïîëüçîâàòü HTTP ïðîêñè êàê FTP ïðîêñè Path Ïóòü Select Path Âûáåðèòå ïóòü Path Ïóòü Select Path Âûáåðèòå ïóòü Quit WinHTTrack Website Copier Âûéòè èç WinHTTrack Website Copier About WinHTTrack Î ïðîãðàììå WinHTTrack Save current preferences as default values Ñîõðàíèòü òåêóùèå óñòàíîâêè êàê ïàðàìåòðû ïî óìîë÷àíèþ Click to continue Ïðîäîëæèòü Click to define options Çàäàòü ïàðàìåòðû çàêà÷êè Click to add a URL Äîáàâèòü URL Load URL(s) from text file Çàãðóçèòü URL(û) èç òåêñòîâîãî ôàéëà WinHTTrack preferences (*.opt)|*.opt|| Íàñòðîéêè WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Òåêñòîâûé ôàéë ñïèñêà àäðåñîâ(*.txt)|*.txt|| File not found! Ôàéë íå íàéäåí! Do you really want to change the project name/path? Âû äåéñòâèòåëüíî õîòèòå èçìåíèòü íàçâàíèå ïðîåêòà/ïóòü? Load user-default options? Çàãðóçèòü óñòàíîâêè ïî óìîë÷àíèþ? Save user-default options? Ñîõðàíèòü íàñòðîéêè? Reset all default options? Ïåðåóñòàíîâèòü âñå ïàðàìåòðû ïî óìîë÷àíèþ? Welcome to WinHTTrack! WinHTTrack ïðèâåòñòâóåò âàñ! Action: Òèï ðàáîòû: Max Depth Ìàêñ. ãëóáèíà: Maximum external depth: Ìàêñèìàëüíàÿ ãëóáèíà âíåøíèõ ñàéòîâ: Filters (refuse/accept links) : Ôèëüòðû (âêëþ÷èòü/âûêëþ÷èòü ëèíêè) Paths Ïóòè Save prefs Ñîõðàíèòü íàñòðîéêè Define.. Çàäàòü... Set options.. Çàäàòü ïàðàìåòðû... Preferences and mirror options: Íàñòðîéêè ïàðàìåòðîâ çàêà÷êè: Project name Íàçâàíèå ïðîåêòà Add a URL... Äîáàâèòü URL... Web Addresses: (URL) Âåá àäðåñà: (URL) Stop WinHTTrack? Ïðåðâàòü WinHTTrack? No log files in %s! Íåò ëîã ôàéëîâ â %s! Pause Download? Ïðèîñòàíîâèòü çàêà÷êó? Stop the mirroring operation Ïðåðâàòü çàêà÷êó Minimize to System Tray Ñïðÿòàòü â ñèñòåìíûé òðåé Click to skip a link or stop parsing Ïðîïóñòèòü ëèíê èëè ïðåðâàòü àíàëèç ôàéëà Click to skip a link Ïðîïóñòèòü ëèíê Bytes saved Ñîõðàíåíî áàéò: Links scanned Ïðîñêàíèðîâàíî ññûëîê: Time: Âðåìÿ: Connections: Ñîåäèíåíèé: Running: Ñîñòîÿíèå: Hide Ñïðÿòàòü Transfer rate Ñêîðîñòü çàêà÷êè: SKIP ÏÐÎÏÓÑÒÈÒÜ Information Èíôîðìàöèÿ Files written: Ñîõðàíåíî ôàéëîâ: Files updated: Îáíîâëåíî ôàéëîâ: Errors: Îøèáîê: In progress:  ïðîöåññå: Follow external links Çàêà÷àòü ôàéëû èç âíåøíèõ ëèíêîâ Test all links in pages Ïðîâåðÿòü âñå ôàéëû íà ñòðàíèöàõ Try to ferret out all links Ñòàðàòüñÿ îïðåäåëèòü âñå ëèíêè Download HTML files first (faster) Çàãðóçèòü âíà÷àëå HTML-ôàéëû (áûñòðåå) Choose local site structure Âûáðàòü ëîêàëüíóþ ñòðóêòóðó ñàéòà Set user-defined structure on disk Óñòàíîâèòü çàäàííóþ ëîêàëüíóþ ñòðóêòóðó ñàéòà Use a cache for updates and retries Èñïîëüçîâàòü êýø äëÿ îáíîâëåíèÿ è ïîâòîðîâ ñêà÷èâàíèÿ Do not update zero size or user-erased files Íå êà÷àòü ôàéëû, êîòîðûå áûëè îäíàæäû ñêà÷àíû, äàæå åñëè îíè íóëåâîé äëèíû èëè óäàëåíû Create a Start Page Ñîçäàòü íà÷àëüíóþ ñòðàíèöó Create a word database of all html pages Ñîçäàòü áàçó äàííûõ ñëîâ, ñîäåðæàùèõñÿ â html-ñòðàíèöàõ Create error logging and report files Ñîçäàòü ëîã ôàéëû ñ èíôîðìàöèåé î ðàáîòå è îøèáêàõ Generate DOS 8-3 filenames ONLY Ñîçäàâàòü ôàéëû â DOS-ôîðìàòå 8.3 Generate ISO9660 filenames ONLY for CDROM medias Ñîçäàâàòü èìåíà ôàéëîâ â ñòàíäàðòå ISO9660 òîëüêî äëÿ CDROM Do not create HTML error pages Íå çàïèñûâàòü ôàéëû html-îøèáîê Select file types to be saved to disk Âûáåðèòå òèïû ôàéëîâ, ñîõðàíÿåìûõ íà äèñêå Select parsing direction Âûáåðèòå íàïðàâëåíèå ïðîäâèæåíèÿ ïî ñàéòó Select global parsing direction Âûáåðèòå ãëîáàëüíîå íàïðàâëåíèå ïðîäâèæåíèÿ ïî ñàéòó Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Óñòàíîâèòü ïðàâèëà ïåðåèìåíîâàíèÿ ëèíêîâ êàê äëÿ âíóòðåííèõ (çàêà÷èâàåìûõ) òàê è äëÿ âíåøíèõ (íå çàãðóæàåìûõ) àäðåñîâ Max simultaneous connections Ìàêñèìàëüíîå ÷èñëî ñîåäèíåíèé File timeout Ìàêñèìàëüíîå âðåìÿ íå àêòèâíîñòè çàêà÷êè Cancel all links from host if timeout occurs  ñëó÷àå ïðåâûøåíèÿ âðåìåíè îæèäàíèÿ îòìåíèòü âñå ëèíêè ñ äàííîãî õîñòà Minimum admissible transfer rate Ìèíèìàëüíî äîïóñòèìàÿ ñêîðîñòü çàêà÷êè Cancel all links from host if too slow  ñëó÷àå, åñëè õîñò ñëèøêîì ìåäëåííûé, îòìåíèòü âñå ëèíêè ñ äàííîãî õîñòà Maximum number of retries on non-fatal errors Ìàêñèìàëüíîå ÷èñëî ïîâòîðíûõ ïîïûòîê, â ñëó÷àå íå ôàòàëüíûõ îøèáîê. Maximum size for any single HTML file Ìàêñèìàëüíûé ðàçìåð ëþáîãî html-ôàéëà Maximum size for any single non-HTML file Ìàêñèìàëüíûé ðàçìåð ëþáîãî íå HTML-ôàéëà Maximum amount of bytes to retrieve from the Web Ìàêñèìàëüíîå êîëè÷åñòâî áàéò, äîïóñòèìûõ äëÿ çàêà÷êè Make a pause after downloading this amount of bytes Ïîñëå çàãðóçêè óêàçàííîãî ÷èñëà áàéòîâ, ñäåëàòü ïàóçó Maximum duration time for the mirroring operation Ìàêñ. ïðîäîëæèòåëüíîñòü ïðîöåññà ñîçäàíèÿ çåðêàë Maximum transfer rate Ìàêñ. ñêîðîñòü çàêà÷êè Maximum connections/seconds (avoid server overload) Ìàêñ. êîëè÷åñòâî ñîåäèíåíèé â ñåêóíäó (íå ïåðåãðóæàòü ñåðâåð) Maximum number of links that can be tested (not saved!) Ìàêñèìàëüíîå ÷èñëî òåñòèðóåìûõ ëèíêîâ (òåñòèðóåìûõ, à íå ñîõðàíÿåìûõ!) Browser identity Èäåíòèôèêàöèÿ áðîóçåðà (ñòðîêà User-Agent) Comment to be placed in each HTML file Êîììåíòàðèé, ðàçìåùàåìûé â êàæäîì HTML ôàéëå Back to starting page Íàçàä íà íà÷àëüíóþ ñòðàíèöó Save current preferences as default values Ñîõðàíèòü íàñòðîéêè êàê çíà÷åíèÿ ïî óìîë÷àíèþ Click to continue Ïðîäîëæèòü Click to cancel changes Îòìåíèòü èçìåíåíèÿ Follow local robots rules on sites Ïîä÷èíÿòüñÿ ïðàâèëàì äëÿ ðîáîòîâ, óñòàíàâëèâàåìûì ñàéòàìè Links to non-localised external pages will produce error pages Ïî ññûëêàì íà âíåøíèå ñòðàíèöû (íå ñêà÷àííûå) áóäåò ïåðåõîä ê ñòðàíèöàì îøèáîê Do not erase obsolete files after update Íå óäàëÿòü ñòàðûå ôàéëû ïîñëå ïðîöåäóðû îáíîâëåíèÿ çåðêàëà Accept cookies? Ðàçðåøèòü cookies? Check document type when unknown? Ïðîâåðÿòü òèï äîêóìåíòà, â ñëó÷àå êîãäà îí íå èçâåñòåí? Parse java applets to retrieve included files that must be downloaded? Àíàëèçèðîâàòü ÿâà-àïïëåòû ñ öåëüþ îïðåäåëåíèÿ âêëþ÷àåìûå ôàéëîâ? Store all files in cache instead of HTML only Ïðèíóäèòåëüíî ñîõðàíÿòü âñå ôàéëû â êýøå, à íå òîëüêî ôàéëû HTML Log file type (if generated) Òèï log ôàëà Maximum mirroring depth from root address Ìàêñ. ãëóáèíà ñîçäàíèÿ çåðêàëà îò íà÷àëüíîãî àäðåñà Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Ìàêñèìàëüíàÿ ãëóáèíà çàêà÷êè äëÿ âíåøíèõ/çàïðåùåííûõ àäðåñîâ (0, ò.å., íåò îãðàíè÷åíèé, ýòî çíà÷åíèå ïî óìîë÷àíèþ) Create a debugging file Ñîçäàòü ôàéë ñ îòëàäî÷íîé èíôîðìàöèåé Use non-standard requests to get round some server bugs Ïîïûòàòüñÿ îáîéòè îøèáêè íåêîòîðûõ ñåðâåðîâ, èñïîëüçóÿ íå ñòàíäàðòíûå çàïðîñû Use old HTTP/1.0 requests (limits engine power!) Èñïîëüçîâàòü ñòàðûé ïðîòîêîë HTTP/1.0 (îãðàíè÷èò âîçìîæíîñòè ïðîãðàììû!) Attempt to limit retransfers through several tricks (file size test..) Ïîïûòêà îãðàíè÷èòü ïåðåêà÷êó èñïîëüçóÿ íåêîòîðûå ïðèåìû (òåñò íà ðàçìåð ôàéëà..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Îãðàíè÷èòü ÷èñëî ëèíêîâ, óäàëÿÿ àíàëîãè÷íûå ëèíêè (www.foo.com==foo.com, http=https ..) Write external links without login/password Ñîõðàíÿòü âíåøíèå ëèíêè áåç ëîãèíà/ïàðîëÿ Write internal links without query string Ñîõðàíÿòü âíóòðåííèå ëèíêè óñå÷åííî (äî çíàêà ?) Get non-HTML files related to a link, eg external .ZIP or pictures Êà÷àòü íå-html ôàéëû âáëèçè ññûëêè (íàïð.: âíåøíèå .ZIP èëè ãðàô. ôàéëû) Test all links (even forbidden ones) Ïðîâåðÿòü âñå ëèíêè (äàæå çàïðåùåííûå ê çàêà÷êå) Try to catch all URLs (even in unknown tags/code) Ñòàðàòüñÿ îïðåäåëÿòü âñå URL'û (äàæå â íåîïîçíàííûõ òåãàõ/ñêðèïòàõ) Get HTML files first! Ïîëó÷èòü âíà÷àëå HTML ôàéëû! Structure type (how links are saved) Òèï ëîêàëüíîé ñòðóêòóðû çåðêàëà (ñïîñîá ñîõðàíåíèÿ ôàéëîâ) Use a cache for updates Èñïîëüçîâàòü êýø äëÿ îáíîâëåíèÿ Do not re-download locally erased files Íå êà÷àòü çàíîâî ëîêàëüíî óäàëåííûå ôàéëû Make an index Ñîçäàòü èíäåêñ Make a word database Ñîçäàòü áàçó äàííûõ ñëîâ Log files Log ôàéëû DOS names (8+3) DOS-ôîðìàò ôàéëîâ (8+3) ISO9660 names (CDROM) Èìåíà â ñòàíäàðòå ISO9660 (CDROM) No error pages Áåç ñòðàíèö îøèáîê Primary Scan Rule Îñíîâíîé ôèëüòð Travel mode Ðåæèì ñêàíèðîâàíèÿ Global travel mode Ðåæèì ãëîáàëüíîãî ñêàíèðîâàíèÿ These options should be modified only exceptionally Êàê ïðàâèëî, ýòè íàñòðîéêè èçìåíÿòü íå ñëåäóåò Activate Debugging Mode (winhttrack.log) Âêëþ÷èòü ðåæèì îòëàäêè (winhttrack.log) Rewrite links: internal / external Ïåðåèìåíîâàòü ëèíêè: âíóòðåííèå/âíåøíèå Flow control Êîíòðîëü íàïðàâëåíèÿ ñêàíèðîâàíèÿ Limits Îãðàíè÷åíèÿ Identity Èäåíòèôèêàòîð HTML footer Íèæíèé HTML êîëîíòèòóë N# connections N# ñîåäèíåíèé Abandon host if error Ïðåêðàòèòü çàêà÷êó ñ õîñòà, â ñëó÷àå îøèáêè Minimum transfer rate (B/s) Ìèíèìàëüíàÿ ñêîðîñòü çàêà÷êè (B/s) Abandon host if too slow Ïðåêðàòèòü çàêà÷êó ñ õîñòà, åñëè îíà ñëèøêîì ìåäëåííàÿ Configure Íàñòðîèòü Use proxy for ftp transfers Èñïîëüçîâàòü ïðîêñè äëÿ ftp-çàêà÷êè TimeOut(s) Òàéì-àóò Persistent connections (Keep-Alive) Ïîñòîÿííûå ñîåäèíåíèÿ (Keep-Alive) Reduce connection time and type lookup time using persistent connections Óìåíüøèòü âðåìåíà ñîåäèíåíèÿ è îáðàùåíèÿ èñïîëüçóÿ ïîñòîÿííûå ñîåäèíåíèÿ Retries Ïîâòîðíûå ïîïûòêè Size limit Îãðàíè÷åíèå ïî ðàçìåðó Max size of any HTML file (B) Ìàêñ. ðàçìåð html-ôàéëà: Max size of any non-HTML file Ìàêñ. ðàçìåð íå-html: Max site size Ìàêñ. ðàçìåð ñàéòà Max time Ìàêñ. âðåìÿ çàêà÷êè Save prefs Ñîõðàíèòü íàñòðîéêè Max transfer rate Ìàêñ. ñêîðîñòü çàêà÷êè Follow robots.txt Ñëåäîâàòü ïðàâèëàì èç robots.txt No external pages Áåç âíåøíèõ ññûëîê Do not purge old files Íå óäàëÿòü ñòàðûå ôàéëû Accept cookies Ðàçðåøèòü cookies Check document type Ïðîâåðÿòü òèï äîêóìåíòà Parse java files Àíàëèç ÿâà ôàéëîâ Store ALL files in cache Ñîõðàíÿòü ÂÑÅ ôàéëû â êýøå Tolerant requests (for servers) Òîëåðàíòíûå çàïðîñû (ê ñåðâåðàì) Update hack (limit re-transfers) Update hack (îãðàíè÷åíèå ïîâòîðíûõ çàêà÷åê) URL hacks (join similar URLs) Õàê URL (îáúåäåíèòü àíàëîãè÷íûå URLs) Force old HTTP/1.0 requests (no 1.1) Èñïîëüçîâàòü ñòàðûé ïðîòîêîë HTTP/1.0 (íå 1.1) Max connections / seconds Ìàêñ. ÷èñëî ñîåäèíåíèé/ñåê. Maximum number of links Ìàêñèìàëüíîå ÷èñëî ëèíêîâ Pause after downloading.. Ïàóçà ïîñëå çàãðóçêè... Hide passwords Ñêðûòü ïàðîëè Hide query strings Ñïðÿòàòü çàïðîñíóþ ÷àñòü ñòðîêè (âñå, ÷òî ïîñëå çíàêà ?) Links Ëèíêè Build Ñòðóêòóðà Experts Only Ýêñïåðò Flow Control Óïðàâëåíèå çàêà÷êîé Limits Îãðàíè÷åíèÿ Browser ID Èäåíòèôèêàöèÿ Scan Rules Ôèëüòðû Spider Êà÷àëêà Log, Index, Cache Ëîã, Èíäåêñ. Êýø Proxy Ïðîêñè MIME Types MIME Types (Òèïû ôàéëîâ) Do you really want to quit WinHTTrack Website Copier? Âû äåéñòâèòåëüíî õîòèòå çàâåðøèòü ðàáîòó ñ ïðîãðàììîé? Do not connect to a provider (already connected) Íå ñîåäèíÿòüñÿ ñ ïðîâàéäåðîì (ñîåäèíåíèå óæå óñòàíîâëåíî) Do not use remote access connection Íå èñïîëüçîâàòü óäàëåííîé ñîåäèíåíèÿ Schedule the mirroring operation Çàêà÷êà ïî ðàñïèñàíèþ Quit WinHTTrack Website Copier Âûéòè èç WinHTTrack Website Copier Back to starting page Íàçàä ê íà÷àëüíîé ñòðàíèöå Click to start! Íà÷àòü! No saved password for this connection! Íåò ñîõðàíåííîãî ïàðîëÿ äëÿ ýòîãî ñîåäèíåíèÿ Can not get remote connection settings Íå ìîãó ïîëó÷èòü óñòàíîâêè óäàëåííîãî ñîåäèíåíèÿ Select a connection provider Âûáåðèòå ïðîâàéäåðà, ê êîòîðîìó óñòàíîâèòü ñîåäèíåíèå Start Íà÷àòü Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Âû ìîæåòå èëè íà÷àòü çàêà÷êó, íàæàâ êíîïêó ÑÒÀÐÒ, èëè ìîæåòå çàäàòü äîïîëíèòåëüíûå ïàðàìåòðû ñîåäèíåíèÿ Save settings only, do not launch download now. Òîëüêî ñîõðàíèòü óñòàíîâêè, íå íà÷èíàòü çàêà÷êó. On hold Çàäåðæêà Transfer scheduled for: (hh/mm/ss) Æäåì äî: (hh/mm/ss) Start Íà÷àòü! Connect to provider (RAS) Ñîåäèíèòüñÿ ñ ïðîâàéäåðîì (RAS) Connect to this provider Ñîåäèíèòüñÿ ñ ýòèì ïðîâàéäåðîì Disconnect when finished Îòñîåäèíèòüñÿ ïðè çàâåðøåíèè Disconnect modem on completion Îòñîåäèíèòü ïðè çàâåðøåíèè \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Ñîîáùèòå íàì, ïîæàëóéñòà, î çàìå÷åííûõ ïðîáëåìàõ è îøèáêàõ)\r\n\r\nÐàçðàáîòêà:\r\nÈíòåðôåéñ (Windows): Xavier Roche\r\nÊà÷àëêà (spider): Xavier Roche\r\nÏàðñåð ÿâà-êëàññîâ: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Russian translations to:\r\nAndrei Iliev (andreiiliev@mail.ru) About WinHTTrack Website Copier Î ïðîãðàììå WinHTTrack Website Copier Please visit our Web page Ïîæàëóéñòà, ïîñåòèòå íàøó âåá-ñòðàíèöó Wizard query Âîïðîñ ìàñòåðà Your answer: Âàø îòâåò: Link detected.. Íàéäåí ëèíê.. Choose a rule Âûáåðèòå ïðàâèëî Ignore this link Èãíîðèðîâàòü ýòîò ëèíê Ignore directory Èãíîðèðîâàòü äèðåêòîðèþ Ignore domain Èãíîðèðîâàòü äîìåí Catch this page only Ñêà÷àòü òîëüêî ýòó ñòðàíè÷êó Mirror site Ñäåëàòü çåðêàëî ñàéòó Mirror domain Ñäåëàòü çåðêàëî äîìåíó Ignore all Èãíîðèðîâàòü âñå Wizard query Âîïðîñ ìàñòåðà NO ÍÅÒ File Ôàéë Options Íàñòðîéêè Log Ëîã Window Îêíî Help Ïîìîùü Pause transfer Ïðèîñòàíîâèòü çàêà÷êó Exit Âûõîä Modify options Èçìåíèòü íàñòðîéêè View log Ïðîñìîòðåòü ëîã View error log Ïðîñìîòðåòü ëîã îøèáîê View file transfers Ïîñìîòðåòü ïðîöåññ ïåðåäà÷è ôàéëîâ Hide Ñïðÿòàòü About WinHTTrack Website Copier Î ïðîãðàììå... Check program updates... Ïðîâåðèòü íàëè÷èå îáíîâëåíèé ïðîãðàììû... &Toolbar Ïàíåëü èíñòðóìåíòîâ &Status Bar Ïàíåëü ñîñòîÿíèÿ S&plit Ðàçäåëèòü File Ôàéë Preferences Íàñòðîéêè Mirror Çåðêàëî Log Ëîã Window Îêíî Help Ïîìîùü Exit Âûõîä Load default options Çàãðóçèòü çíà÷åíèÿ ïàðàìåòðîâ ïî óìîë÷àíèþ Save default options Ñîõðàíèòü çíà÷åíèÿ ïî óìîë÷àíèþ Reset to default options Î÷èñòèòü çíà÷åíèÿ ïî óìîë÷àíèþ Load options... Çàãðóçèòü íàñòðîéêè... Save options as... Ñîõðàíèòü íàñòðîéêè êàê... Language preference... Âûáîð ÿçûêà Contents... Ñîäåðæàíèå... About WinHTTrack... Î WinHTTrack... New project\tCtrl+N Íîâûé ïðîåêò\tCtrl+N &Open...\tCtrl+O &Îòêðûòü...\tCtrl+O &Save\tCtrl+S &Ñîõðàíèòü\tCtrl+S Save &As... Ñîõðàíèòü &Êàê... &Delete... &Óäàëèòü... &Browse sites... &Ïðîñìîòð ñàéòîâ... User-defined structure Çàäàíèå ñòðóêòóðû %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tÈìÿ ôàéëà áåç ðàñøèðåíèÿ (íàïð.: image)\r\n%N\tÈìÿ ôàéëà ñ ðàñøèðåíèåì (íàïð.: image.gif)\r\n%t\tÐàñøèðåíèå ôàéëà (íàïð.: gif)\r\n%p\tÏóòü ê ôàéëó [áåç îêàí÷èâàþùåãî /] (íàïð.: /someimages)\r\n%h\tÈìÿ õîñòà (íàïð.: www.someweb.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tDOS'êîå èìÿ (íàïð: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Ïðèìåð:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Íàñòðîéêè ïðîêñè Proxy address: Àäðåñ ïðîêñè: Proxy port: Íîìåð ïîðòà: Authentication (only if needed) Àóòåíòèôèêàöèÿ (åñëè òðåáóåòñÿ) Login Ëîãèí Password Ïàðîëü Enter proxy address here Ââåäèòå àäðåñ ïðîêñè ñåðâåðà Enter proxy port here Ââåäèòå íîìåð ïîðòà ïðîêñè ñåðâåðà Enter proxy login Ââåäèòå ëîãèí ïðîêñè Enter proxy password Ââåäèòå ïàðîëü äëÿ ïðîêñè ñåðâåðà Enter project name here Ââåäèòå èìÿ ïðîåêòà Enter saving path here Óêàæèòå êàòàëîã äëÿ ñîõðàíåíèÿ ïðîåêòà Select existing project to update Äëÿ îáíîâëåíèÿ ïðîåêòà, âûáåðèòå åãî èç ñïèñêà Click here to select path Âûáðàòü êàòàëîã ïðîåêòà Select or create a new category name, to sort your mirrors in categories Âûáðàòü èëè ñîçäàòü íîâóþ êàòåãîðèþ äëÿ ñîðòèðîâêè çåðêàë ïî êàòåãîðèÿì HTTrack Project Wizard... Ìàñòåð ñîçäàíèÿ ïðîåêòà HTTrack... New project name: Èìÿ íîâîãî ïðîåêòà: Existing project name: Èìÿ ñóùåñòâóþùåãî ïðîåêòà: Project name: Èìÿ ïðîåêòà: Base path: Êàòàëîã: Project category: Êàòåãîðèÿ ïðîåêòà: C:\\My Web Sites C:\\Ìîè Web Ñàéòû Type a new project name, \r\nor select existing project to update/resume Çàäàéòå íàçâàíèå íîâîãî ïðîåêòà, \r\nèëè âûáåðèòå ñóùåñòâóþùèé ïðîåêò äëÿ åãî àêòóàëèçàöèè/ïðîäîëæåíèÿ New project Íîâûé ïðîåêò Insert URL Âñòàâüòå URL URL: URL: Authentication (only if needed) Àóòåíòèôèêàöèÿ (åñëè íóæíî) Login Ëîãèí: Password Ïàðîëü: Forms or complex links: Ñëîæíûå ëèíêè: Capture URL... Çàñå÷ü URL... Enter URL address(es) here Ââåäèòå URL àäðåñ Enter site login Ââåäèòå ëîãèí äëÿ äîñòóïà ê ñàéòó Enter site password Ââåäèòå ïàðîëü äëÿ äîñòóïà ê ñàéòó Use this capture tool for links that can only be accessed through forms or javascript code Èñïîëüçóéòå ýòî ñðåäñòâî äëÿ îòëîâà äèíàìè÷åñêèõ URL (javascript, ôîðìû è ò.ï.) Choose language according to preference Âûáîð ÿçûêà Catch URL! Ïîéìàòü URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Âðåìåííî óñòàíîâèòå â íàñòðîéêàõ ïðîêñè âàøåãî áðîóçåðà óêàçàííûå íèæå çíà÷åíèÿ àäðåñà è íîìåðà ïîðòà.\nÇàòåì, â áðîóçåðå âûïîëíèòå íåîáõîäèìûå äåéñòâèÿ (ïîñëàòü ôîðìó, àêòèâèçèðîâàòü ñêðèïò è ò.ï.) . This will send the desired link from your browser to WinHTTrack. Òàêèì îáðàçîì âû ñìîæåòå ïåðåäàòü æåëàåìûé ëèíê èç áðàóçåðà â HTTrack. ABORT Îòìåíà Copy/Paste the temporary proxy parameters here Ñêîïèðóé/âñòàâü âðåìåííûå íàñòðîéêè ïðîêñè Cancel Îòìåíà Unable to find Help files! Íå íàéäåíû ôàéëû ïîìîùè! Unable to save parameters! Íåâîçìîæíî ñîõðàíèòü ïàðàìåòðû! Please drag only one folder at a time Ïîæàëóéñòà, ïåðåòàñêèâàéòå òîëüêî îäíó ïàïêó Please drag only folders, not files Ïîæàëóéñòà, òàùèòå òîëüêî ïàïêó, à íå ôàéë Please drag folders only Ïîæàëóéñòà, òàùèòå òîëüêî ïàïêó Select user-defined structure? Âûáðàòü çàäàííóþ âàìè ñòðóêòóðó? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Ïðîâåðüòå, ÷òî îïðåäåëåííàÿ âàìè ñòðóêòóðà ïðàâèëüíà, â ïðîòèâíîì ñëó÷àå, èìåíà ôàéëîâ áóäóò íåïðåäñêàçóåìû Do you really want to use a user-defined structure? Âû äåéñòâèòåëüíî õîòèòå âûáðàòü çàäàííóþ ñòðóêòóðó? Too manu URLs, cannot handle so many links!! Ñëèøêîì ìíîãî URL'îâ, íå ìîãó îáðàáîòàòü òàêîå êîëè÷åñòâî ëèíêîâ! Not enough memory, fatal internal error.. Íåäîñòàòî÷íî ïàìÿòè, ôàòàëüíàÿ âíóòðåííÿÿ îøèáêà... Unknown operation! Íåèçâåñòíàÿ îïåðàöèÿ Add this URL?\r\n Äîáàâèòü ýòîò URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Âíèìàíèå: ïðîãðàììà íå îòâå÷àåò íà çàïðîñû, íåâîçìîæíî äîáàâèòü URL'û... Type/MIME associations Ñîîòâåòñâèå òèïó ôàéëîâ (Type/MIME) File types: Òèïû ôàéëîâ: MIME identity: MIME identity Select or modify your file type(s) here Âûáðàòü èëè èçìåíèòü òèïû ôàéëîâ Select or modify your MIME type(s) here Âûáðàòü èëè èçìåíèòü òèïû ôàéëîâ Go up Ââåðõ Go down Âíèç File download information Èíôîðìàöèÿ î çàãðóçêå ôàéëà Freeze Window Çàìîðîçèòü îêíî More information: Äîïîëíèòåëüíàÿ èíôîðìàöèÿ: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Äîáðî ïîæàëîâàòü â ïðîãðàììó WinHTTrack Website Copier!\n\nÏîæàëóéñòà íàæìèòå êíîïêó ÄÀËÅÅ äëÿ òîãî, ÷òîáû\n\n- íà÷àòü íîâûé ïðîåêò\n- èëè âîçîáíîâèòü ÷àñòè÷íóþ çàêà÷êó File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Èìåíà ôàéëîâ ñ ðàøèðåíèåì:\nÈìåíà ôàéëîâ, ñîäåðæàùèå:\nÝòîò ôàéë:\nÈìåíà ôîëäåðîâ ñîäåðæàò:\nÝòîò ôîëäåð:\nËèíêè èç ýòîãî äîìåíà:\nËèíêè èç äîìåíîâ, ñîäåðæàùèå:\nËèíêè èç ýòîãî õîñòà:\nËèíêè ñîäåðæàùèå:\nÝòîò ëèíê:\nÂÑÅ ËÈÍÊÈ Show all\nHide debug\nHide infos\nHide debug and infos Ïîêàçàòü âñå\nÑïðÿòàòü îòëàäêó\nÑïðÿòàòü èíôî\nÑïðÿòàòü îòëàäêó è èíôî Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Ñòðóêòóðà ñàéòà (ïî óìîë÷àíèþ)\nHtml/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/ôàéëû èçîáðàæåíèé/\nHtml/html, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/ôàéëû èçîáðàæåíèé\nHtml/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/\nHtml/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/xxx, ãäå xxx - ðàñøèðåíèå ôàéëà\nHtml, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû/xxx\nÑòðóêòóðà ñàéòà áåç www.domain.xxx/\nHtml â site_name/ ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/ôàéëû èçîáðàæåíèé/\nHtml â site_name/html, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/ôàéëû èçîáðàæåíèé\nHtml â site_name/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/\nHtml â site_name/, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/xxx\nHtml â site_name/html, ôàéëû èçîáðàæåíèé/äðóãèå ôàéëû â site_name/xxx\nÂñå ôàéëû èç âåáà/, ñ ïðîèçâîëüíûìè èìåíàìè (íîâèíêà !)\nÂñå ôàéëû èç site_name/, ñ ïðîèçâîëüíûìè èìåíàìè (íîâèíêà !)\nÇàäàííàÿ ïîëüçîâàòåëåì ñòðóêòóðà... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Òîëüêî ñêàíèðîâàòü\nÑîõðàíÿòü html ôàéëû\nÑîõðàíÿòü íå html ôàéëû\nÑîõðàíÿòü âñå ôàéëû (ïî óìîë÷àíèþ)\nÑîõðàíÿòü âíà÷àëå html ôàéëû Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Îñòàâàòüñÿ â òîéæå äèðåêòîðèè\nÌîæíî äâèãàòüñÿ âíèç (ïî óìîë÷àíèþ)\nÌîæíî äâèãàòüñÿ ââåðõ\nÌîæíî äâèãàòüñÿ ââåðõ è âíèç Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Îñòàâàòüñÿ íà òîì æå àäðåñå (ïî óìîë÷àíèþ)\nÎñòàâàòüñÿ íà òîì æå äîìåíå\nÎñòàâàòüñÿ íà òîì æå äîìåíå âåðõíåãî óðîâíÿ\nÈäòè êóäà óãîäíî Never\nIf unknown (except /)\nIf unknown Íèêîãäà\nÅñëè íåèçâåñòíî (êðîìå /)\nÅñëè íåèçâåñòíî no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Íå ïîä÷èíÿòüñÿ ïðàâèëàì robots.txt\nrobots.txt êðîìå Ìàñòåðà\nïîä÷èíÿòüñÿ ïðàâèëàì robots.txt normal\nextended\ndebug Îáû÷íàÿ\nðàñøèðåííàÿ\nîòëàäêà Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Çàãðóçèòü ñàéò(û)\nÇàãðóçèòü ñàéò(û) +âîïðîñû\nÇàãðóçèòü îòäåëüíûå ôàéëû\nÇàãðóçèòü âñå ñàéòû ñî ñòðàíèöû (íåñêîëüêî çåðêàë)\nÒåñòèðîâàòü ëèíêè ñî ñòðàíèöû (òåñò çàêëàäîê)\n* Ïðîäîëæèòü ïðåðâàííóþ çàãðóçêó\n* Îáíîâèòü ñóùåñòâóþùóþ çàêà÷êó Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Îòíîñèòåëüíûé URI / Àáñîëþòíûé URL (ïî óìîë÷àíèþ)\nÀáñîëþòíûé URL / Àáñîëþòíûé URL\nÀáñîëþòíûé URI / Àáñîëþòíûé URL\nÏåðâîíà÷àëüíûé URL / Ïåðâîíà÷àëüíûé URL Open Source offline browser Open Source îôôëàéí áðàóçåð Website Copier/Offline Browser. Copy remote websites to your computer. Free. Êà÷àëêà âåáñàéòîâ/Îôôëàéí áðàóçåð. Êà÷àåò âåáñàéòû íà âàø êîìïüþòåð. Áåñïëàòíî. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) Ëèñò URL'îâ (.txt) Previous Íàçàä Next Âïåðåä URLs URLs Warning Ïðåäóïðåæäåíèå Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Âàø áðàóçåð èëè íå ïîääåðæèâàåò javascript èëè åãî ïîääåðæêà âûêëþ÷åíà. Äëÿ ïîëó÷åíèÿ íàèëó÷øåãî ðåçóëüòàòà àêòèâèçèðóéòå ïîääåðæêó javascript. Thank you Ñïàñèáî You can now close this window Òåïåðü Âû ìîæåòå çàêðûòü ýòî îêíî Server terminated Server terminated A fatal error has occurred during this mirror Âî âðåìÿ òåêóùåé çàêà÷êè ïðîèçîøëà ôàòàëüíàÿ îøèáêà Proxy type: Òèï ïðîêñè: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Ïðîòîêîë ïðîêñè. HTTP: îáû÷íûé ïðîêñè. HTTP (òóííåëü CONNECT): îòïðàâëÿåò êàæäûé çàïðîñ ÷åðåç òóííåëü CONNECT, äëÿ ïðîêñè, ïîääåðæèâàþùèõ òîëüêî CONNECT, íàïðèìåð HTTPTunnelPort â Tor. SOCKS5: ïîðò ïî óìîë÷àíèþ 1080. Load cookies from file: Çàãðóçèòü cookies èç ôàéëà: Preload cookies from a Netscape cookies.txt file before crawling. Ïðåäâàðèòåëüíî çàãðóçèòü cookies èç ôàéëà Netscape cookies.txt ïåðåä çàêà÷êîé. Pause between files: Ïàóçà ìåæäó ôàéëàìè: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Ñëó÷àéíàÿ çàäåðæêà ìåæäó çàêà÷êàìè ôàéëîâ, â ñåêóíäàõ. Èñïîëüçóéòå MIN:MAX äëÿ ñëó÷àéíîãî äèàïàçîíà (íàïðèìåð, 2:8). Keep the www. prefix (do not merge www.host with host) Ñîõðàíÿòü ïðåôèêñ www. (íå îáúåäèíÿòü www.host ñ host) Do not treat www.host and host as the same site. Íå ñ÷èòàòü www.host è host îäíèì è òåì æå ñàéòîì. Keep double slashes in URLs Ñîõðàíÿòü äâîéíûå ñëýøè â URL Do not collapse duplicate slashes in URLs. Íå óäàëÿòü ïîâòîðÿþùèåñÿ ñëýøè â URL. Keep the original query-string order Ñîõðàíÿòü èñõîäíûé ïîðÿäîê ïàðàìåòðîâ çàïðîñà Do not reorder query-string parameters when deduplicating URLs. Íå ìåíÿòü ïîðÿäîê ïàðàìåòðîâ ñòðîêè çàïðîñà ïðè óäàëåíèè äóáëèêàòîâ URL. Strip query keys: Óäàëÿòü êëþ÷è çàïðîñà: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Êëþ÷è çàïðîñà ÷åðåç çàïÿòóþ, óäàëÿåìûå èç èìåíè ñîõðàíÿåìîãî ôàéëà (íàïðèìåð, sid,utm_source). Write a WARC archive of the crawl Çàïèñàòü WARC-àðõèâ îáõîäà Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Ñîõðàíÿòü êàæäûé çàãðóæåííûé îòâåò òàêæå â àðõèâ WARC/1.1 ISO-28500 ðÿäîì ñ çåðêàëîì. WARC archive name: Èìÿ WARC-àðõèâà: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Íåîáÿçàòåëüíîå áàçîâîå èìÿ WARC-àðõèâà; îñòàâüòå ïóñòûì äëÿ àâòîìàòè÷åñêîãî èìåíîâàíèÿ â âûõîäíîì êàòàëîãå. httrack-3.49.14/lang/Romanian.txt0000644000175000017500000011537615230602340012253 LANGUAGE_NAME Romanian LANGUAGE_FILE Romanian LANGUAGE_ISO ro LANGUAGE_AUTHOR Alin Gheorghe Miron (miron.alin@personal.ro) LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Romanian OK LANGUAGE_WINDOWSID Cancel Anuleazã Exit Ieºire Close Închide Cancel changes Anuleazã schimbãrile Click to confirm Click pentru confirmare. Click to get help! Click pentru ajutor! Click to return to previous screen Click pentru revenire la fereastra precedentã Click to go to next screen Click pentru a trece la fereastra urmãtoare! Hide password Ascunde parola Save project Salveazã proiect Close current project? Închid proiectul curent? Delete this project? ªterg acest proiect? Delete empty project %s? ªterg proiectul gol %s? Action not yet implemented Funcþia nu este încã implementatã Error deleting this project Eroare la ºtergerea acestui proiect Select a rule for the filter Selectaþi o regulã pentru filtrare Enter keywords for the filter Introduceþi un cuvânt cheie pentru filtrare Cancel Anulare Add this rule Adaugã aceastã regulã de filtrare Please enter one or several keyword(s) for the rule Introduceºi unul sau mai multe cuvinte cheie pentru regula de filtrare Add Scan Rule Adaugã o regulã de scanare Criterion Criteriu: String Cuvânt cheie Add Adaugã Scan Rules Reguli de scanare Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Folosiþi ? sau *pentru a exclude sau include URL-uri sau linkuri.\r\nPuteþi pune mai multe adrese pe aceeaºi linie.\r\nFolosiþi spaþiile ca separatori. \r\nExemplu +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Exclude link(uri) Include link(s) Include link(uri) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Pentru a include toate fiºierele GIF dintr-un singur site, folosiþi ceva de genul +www.nume_site.com/*.gif.\r\n(+*.gif / -*.gif va include/exclude toate fiºierele GIF din toate siturile) Save prefs Salveazã preferinþele Matching links will be excluded: Link-urile care se potrivesc acestei reguli vor fi excluse: Matching links will be included: Link-urile care se potrivesc acestei reguli vor fi incluse: Example: Exemplu: gif\r\nWill match all GIF files gif\r\nVa potrivi toate fiºierele GIF blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nVa gãsi toate fiºierele care conþin un subºir 'blue' cum ar fi 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nVa detecta numai fiºierul 'bigfile.mov', dar nu ºi 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nVa gãsi linkuri spre folderele în numele cãrora se gãseºte subºirul "cgi" cum ar fi /cgi/bin/oricecgi,cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nVa gãsi linkuri spre folderele în numele cãrora se gãseºte numai subºirul 'cgi-bin' (dar nu ºi cgi-bin-2, de exemplu) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nVa gãsi linkuri ce conþin acest subºir cum ar fi www.someweb.com, private.someweb.com etc.\r\n someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nVa gãsi linkuri ce conþin acest subºir cum ar fi www.someweb.com,www.someweb.edu,private.someweb.otherweb.com etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nVa gãsi linkurile care conþin tot subºirul 'www.someweb.com' ( dar nu ºi linkuri de genul private.someweb.com/..)\r\n someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nVa gãsi orice link ce conþine subºirul dat, de exemplu: www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc.\r\n www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nVa gãsi numai fiºierul 'www.test.com/test/someweb.html' .Observaþi cã trebuie sã introduceþi calea completã (URL + site path) All links will match Toate linkurile vor fi cãutate Add exclusion filter Adaugã filtru de excludere Add inclusion filter Adaugã un filtru de includere Existing filters Filtre existente Cancel changes Anulare schimbãri Save current preferences as default values Salveazã preferinþele curente ca valori implicite. Click to confirm Click pentru confirmare No log files in %s! Nu sunt fiºiere jurnal (*.log) în %s! No 'index.html' file in %s! Nu existã fiºier "index.html" în %s! Click to quit WinHTTrack Website Copier Click pentru ieºire din WinHTTrack Website Copier View log files Vezi fiºierul jurnal Browse HTML start page Rãsfoieºte pagina HTML de start End of mirror Copiere terminatã View log files Vezi fisierul jurnal (log) Browse Mirrored Website Rãsfoieºte situl copiat. New project... Proiect nou... View error and warning reports Vezi raportul cu erori ºi avertismente View report Vezi raportul Close the log file window Închide fereastra fiºierului jurnal Info type: Tipul informaþiei Errors Erori Infos Informaþii Find Cautã Find a word Cautã un cuvânt Info log file Raportul copierii Warning/Errors log file Fiºierul jurnal cu avertismente/erori Unable to initialize the OLE system Imposibil de iniþializat sistemul OLE WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack nu a putut gãsi nici un fiºier downloadat parþial, în folderul specificat ! Could not connect to provider Nu mã pot conecta la furnizor receive recepþie request cerere connect conectare search cãutare ready pregãtit error eroare Receiving files.. Recepþionez fiºiere Parsing HTML file.. Analizez link-urile din paginã Purging files.. Curãþire fiºiere Loading cache in progress.. Încarcare cache în desfãºurare... Parsing HTML file (testing links).. Testarea link-urilor de pe paginã Pause - Toggle [Mirror]/[Pause download] to resume operation Pauzã - selectati 'Suspendare download' din meniul 'Clonare' pentru a continua download-ul Finishing pending transfers - Select [Cancel] to stop now! Terminare transferuri curente - Selectaþi [Cancel] pentru a opri acum scanning scanare in progres Waiting for scheduled time.. Aºtept timpul programat pentru a continua... Connecting to provider Mã conectez la furnizor [%d seconds] to go before start of operation Mai sunt (%d seconds) înainte de începerea operaþiei Site mirroring in progress [%s, %s bytes] Clonare sit în desfãºurare [%s %s octeþi] Site mirroring finished! Clonare site terminatã! A problem occurred during the mirroring operation\n A survenit o eroare în timpul operaþiei de clonare \nDuring:\n \nDureazã:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nVezi jurnalul (log-ul) dacã este necesar. \n\nClick TERMINARE pentru a ieºi din WinHTTrack Website Copier.\n\nVã mulþumim cã folosiþi WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Operaþia de clonare terminatã. \nClick Ieºire pentru a pãrãsi WinHTTrack. \nVezi fiºierele jurnal dacã este necesar, pentru a vã asigura cã totul e OK. \n\nVã mulþumim cã folosiþi WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * *CLONARE ÎNTRERUPTÃ! * * \r\nCache-ul teporar este necesar pentru orice operaþie de actualizare ºi nu conþine decât datele descãrcate în timpul sesiunii curente întrerupte.\r\nCache-ul precedent poate conþine informaþia mai completã; dacã nu doriþi sã pierdeþi aceste date, trebuie sã restauraþi ºi sã ºtergeþi cache-ul curent\r\n(Notã: Aceastã operaþie poate fi fãcutã cu uºurinþã prin ºtergerea fiºierelor hts-cache/new.*)\r\n\r\n Credeºi cã vechiul cache poate conþine mai multe informaþii ºi doriþi sã le restauraþi? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * EROARE CLONARE! * *\r\nHTTrack a detectat cã, clona curentã este goalã. Dacã a fost o actualizare, clona precedentã a fost restauratã.\r\nMotivul: Fie prima(ele) paginã(i) nu pot(ate) fi gãsitã(e), fie a intervenit o problemã de conectare.\r\n=>Asiguraþi-vã cã situl existã ºi/sau verificaþi setãrile legate de proxy!<= \n\nTip: Click [View log file] to see warning or error messages \n\nSfat:Click [Vizualizeazã fiºierul jurnal] pentru a vedea mesajele de avertizare sau eroare. Error deleting a hts-cache/new.* file, please do it manually Eroare la ºtergerea fisierului hts-cache/new.* , vã rog ºtergeþi fiºierul manual. Do you really want to quit WinHTTrack Website Copier? Chiar doriþi sã pãrãsiþi WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Faza de clonare (copiere automatã) - \n\nIntroduceþi adresa(adresele) în caseta URL - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Mod interactiv de copiere a siteurilor -\n\nIntroduceþi adresa(adresele) în caseta URL - File Download Mode -\n\nEnter file address(es) in URL box - Modul de descãrcare a fiºierelor - \n\nIntroduceþi adresa (adresele) în caseta URL - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Modul de testare a link-urilor - \n\nIntroduceþi adresa (adresele) cu linkuri pentru testat. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modul de actualizare - \n\nVerificaþi adresa (adresele) în caseta URL, verificaþi opþiunile necesare, apoi daþi click pe "Next". - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modul de recuperare (operaþie întreruptã) - \n\nVerificaþi adresa (adresele) în caseta URL, verificaþi opþiunile necesare, apoi daþi click pe "Next". Log files Path Calea fiºierelor jurnal Path Calea - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Modul de copiere a site-urilor dupã linkuri - \n\nFolosiþi caseta URL pentru a introduce adresa (adresele) paginii(lor) ce conþin linkurile de copiat. New project / Import? Proiect nou / Import? Choose criterion Alegeþi tipul acþiunii. Maximum link scanning depth Adâncimea maximã de scanare a link-urilor. Enter address(es) here Introduceþi adresa (adresele) aici Define additional filtering rules Definire reguli de filtrare suplimentare Proxy Name (if needed) Nume server proxy (dacã e necesar) Proxy Port Portul serverului proxy Define proxy settings Definiþi parametrii serverului proxy Use standard HTTP proxy as FTP proxy Foloseºte proxy-ul standard HTTP ca proxy FTP Path Calea Select Path Selecteazã calea Path Calea Select Path Selecteazã calea Quit WinHTTrack Website Copier Pãrãseºte WinHTTrack Website Copier About WinHTTrack Despre WinHTTrack Save current preferences as default values Salveazã setãrile curente ca valori implicite. Click to continue Click pentru a continua Click to define options Click pentru a defini opþiunile Click to add a URL Click pentru a asãuga o adresã URL Load URL(s) from text file Încarcã adresã(e) URL din fiºierul text WinHTTrack preferences (*.opt)|*.opt|| Preferinþe WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Fiºier text cu lista de adrese (*.txt)|*.txt|| File not found! Nu s-a gãsit fiºierul! Do you really want to change the project name/path? Chiar doriþi sã schimbaºi numele/calea proiectului? Load user-default options? Încarc configuraþia personalizatã implicitã? Save user-default options? Salvez configuraþia personalizatã implicitã? Reset all default options? Reºetez toate opþiunile implicite? Welcome to WinHTTrack! Bine aþi venit în WinHTTrack! Action: Acþiune: Max Depth Adâncime maximã Maximum external depth: Adâncime externã maximã (link-uri externe) : Filters (refuse/accept links) : Filtre (refuzã/acceptã) linkuri: Paths Cãi Save prefs Salveazã preferinþele Define.. Defineºte... Set options.. Seteazã opþiuni... Preferences and mirror options: Preferinþe ºi opþiuni de clonare: Project name Numele proiectului Add a URL... Adaugã o adresã URL... Web Addresses: (URL) Adrese Web: (URL) Stop WinHTTrack? Opresc WinHTTrack? No log files in %s! Nici un fiºier jurnal în %s! Pause Download? Pauzã descãrcare? Stop the mirroring operation Opreºte operaþia de clonare Minimize to System Tray Minimizeazã în Sistem Tray Click to skip a link or stop parsing Click pentru salt peste un link sau oprirea copierii lui Click to skip a link Click pentru a sãri peste un link Bytes saved Octeþi salvaþi Links scanned Link- uri scanate Time: Timp: Connections: Conexiuni: Running: Ruleazã: Hide Ascunde Transfer rate Ratã de transfer SKIP SALT Information Informaþii Files written: Fiºiere scrise: Files updated: Fiºiere actualizate: Errors: Erori: In progress: În progres: Follow external links Recupereazã fiºierele pânã la linkurile externe Test all links in pages Testeazã toate link- urile care existã în pagini Try to ferret out all links Încearcã reperarea tuturor link - urilor Download HTML files first (faster) Downloadeazã fiºierele HTML înainte (mai rapid) Choose local site structure Alege structura localã de fiºiere a sitului Set user-defined structure on disk Defineºte parametrii structurii personalizate pe disk Use a cache for updates and retries Foloseºte un cache pentru actualizãri ºi reîncercãri Do not update zero size or user-erased files Nu actualiza fiºierele de mãrime 0 sau fiºierele ºterse de utilizator Create a Start Page Creazã o Paginã de Start Create a word database of all html pages Creeazã o bazã de date semanticã a tuturor paginilor html Create error logging and report files Creeazã fiºiere jurnal pentru mesajele de eroare ºi fiºiere raport Generate DOS 8-3 filenames ONLY Genereazã NUMAI nume de fiºier de format 8.3 (DOS) Generate ISO9660 filenames ONLY for CDROM medias Genereazã NUMAI nume de fiºier ISO9660 pentru mediile CDROM Do not create HTML error pages Nu genera fiºiere de eroare HTML Select file types to be saved to disk Selecteazã tipurile de fiºiere care vor fi salvate pe disk Select parsing direction Selectaþi modul de parcurgere a link-urilor pe site Select global parsing direction Limitele zonei globale de explorare Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Setaþi regulile de rescriere a adreselor URL pentru linkurile interne (cele descãrcate) ºi pentru linkurile externe (cele nedescãrcate) Max simultaneous connections Numãr maxim de conexiuni simultane File timeout Timp expirat (timeout) pentru fiºier Cancel all links from host if timeout occurs Anuleazã toate link-urile de la gazdã dacã intervin timpi morþi Minimum admissible transfer rate Ratã de transfer minimã admisibilã Cancel all links from host if too slow Anuleazã toate link- urile de la gazdã dacã transferul e prea lent Maximum number of retries on non-fatal errors Numãrul maxim de încercãri în cazul erorilor nefatale Maximum size for any single HTML file Mãrimea maximã pentru un orice fiºier HTML Maximum size for any single non-HTML file Mãrimea maximã pentru orice fiºier non HTML Maximum amount of bytes to retrieve from the Web Cantitatea maximã de octeþi de scos de pe site Make a pause after downloading this amount of bytes Fã o pauzã dupã descãrcarea acestei cantitãþi de octeþi Maximum duration time for the mirroring operation Durata maximã a operaþiei de copiere Maximum transfer rate Rata maximã de transfer Maximum connections/seconds (avoid server overload) Nr. maxim de conexiuni /secunde (evitã supraîncãrcarea serverului) Maximum number of links that can be tested (not saved!) Numãrul maxim de link-uri care pot fi testate (nu salvate!) Browser identity Identitatea browser-ului Comment to be placed in each HTML file Comentariu ce va fi plasat în fiecare fiºier HTML Back to starting page Înapoi la pagina de start Save current preferences as default values Salveazã preferinþele curente ca valori implicite Click to continue Click pentru continuare Click to cancel changes Click pentru anularea schimbãrilor Follow local robots rules on sites Urmeazã regulile locale a roboþilor de pe site Links to non-localised external pages will produce error pages Link-urile spre pagini externe nelocalizate vor produce pagini de erori Do not erase obsolete files after update Nu ºterge fiºierele vechi, dupã actualizare Accept cookies? Sã accept cookies-urile? Check document type when unknown? Verificaþi tipul documentului când acesta este necunoscut? Parse java applets to retrieve included files that must be downloaded? Analizez appleturile java pentru a recupera fiºierele incluse ce trebuie descãrcate? Store all files in cache instead of HTML only Stocheazã toate fiºierele în cache, nu numai în HTML Log file type (if generated) Tipul fisierului jurnal (dacã s-a generat) Maximum mirroring depth from root address Adâncime maximã de clonare, plecând de la adresa rãdãcinã Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Adresã maximã de clonare pentru adresele externe/interzise (0= nici una, implicit) Create a debugging file Creeazã un fiºier de depanare Use non-standard requests to get round some server bugs Încearcã evitarea bugurilor de pe unele servere, folosind cereri nestandard Use old HTTP/1.0 requests (limits engine power!) Foloseºte vechile cereri HTTP/1.0 (limiteazã puterea!) Attempt to limit retransfers through several tricks (file size test..) Încearcã sã limitezi retransferurile prin folosirea unor trucuri (file size test...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Scrie linkurile externe fãrã login/password Write internal links without query string Scrie link- urile interne fãrã sirul de interogare (query string) Get non-HTML files related to a link, eg external .ZIP or pictures Scoate fiºierele non-HTML apropiate (ºi din link- uri), ex arhive sau imagini. Test all links (even forbidden ones) Testeazã toate linkurile (chiar ºi cele interzise) Try to catch all URLs (even in unknown tags/code) Încearcã sã detectezi toate adresele URL (chiar ºi tagurile/codul necunoscut(e)) Get HTML files first! Descarcã întâi fiºierele HTML! Structure type (how links are saved) Tipul structurii (cum sunt salvate link-urile) Use a cache for updates Foloseºte un cache pentru actualizare Do not re-download locally erased files Nu redescãrca fiºierele ºterse local Make an index Construieºte un index Make a word database Construieºte o bazã de date semanticã Log files Fiºiere jurnal DOS names (8+3) Nume DOS (8.3) ISO9660 names (CDROM) Nume ISO9660 (CDROM) No error pages Fãrã pagini de eroare Primary Scan Rule Regulã de scanare principalã Travel mode Mod de parcurgere Global travel mode Mod de parcurgere globalã These options should be modified only exceptionally Aceste opþiuni nu se vor modifica decât în cazuri excepþionale. Activate Debugging Mode (winhttrack.log) Activeazã modul de depanare Rewrite links: internal / external Rescrie link - uri: interne/externe Flow control Controlul fluxului Limits Limite Identity Identitate HTML footer Subsol HTML N# connections Numãr de conexiuni Abandon host if error Abandoneazã gazdã în caz de eroare Minimum transfer rate (B/s) Ratã de transfer minimã (B/s) Abandon host if too slow Abandoneazã gazda dacã transferul este prea lent Configure Configureazã Use proxy for ftp transfers Foloseºte serverul proxy pentru transferurile FTP TimeOut(s) TimeOut(-uri) Persistent connections (Keep-Alive) Conexiuni persistente [menþine active] Reduce connection time and type lookup time using persistent connections Redu timpul de conectare ºi timpul de cãutare a tipului folosind conexiuni persistente. Retries Încercãri Size limit Limitã de dimensiune Max size of any HTML file (B) Dimensiune maximã a oricãrui fiºier HTML (B) Max size of any non-HTML file Dimensiunea maximã a oricãrui fiºier non-HTML Max site size Dimensiunea maximã a site-ului Max time Timp maxim Save prefs Salveazã preferinþele Max transfer rate Ratã maximã de transfer Follow robots.txt Urmeazã robots.txt No external pages Fãrã pagini externe Do not purge old files Nu elimina fiºierele vechi Accept cookies Acceptã cookies-uri Check document type Verificã tipul documentului Parse java files Analizeazã fiºierele java Store ALL files in cache Stocheazã toate fiºierele în cache Tolerant requests (for servers) Cereri tolerante (pentru servere) Update hack (limit re-transfers) Actualizare forþatã (limiteazã re-transferurile) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Forþeazã vechile cereri HTTP/1.0 (fãrã cereri HTTP/1.1) Max connections / seconds Numãrul maxim de conexiuni/secundã Maximum number of links Numãrul maxim de link-uri Pause after downloading.. Pauzã dupã descarcarea... Hide passwords Ascunde parole Hide query strings Ascunde 'query string'-urile Links Link-uri Build Structureazã Experts Only Pentru experþi Flow Control Controlul fluxului Limits Limite Browser ID Identificã HTTrack Web Copier ca: Scan Rules Reguli de scanare: Spider Pãianjen (spider) Log, Index, Cache Jurnal, Index, Cache Proxy Server proxy MIME Types Tipuri MIME Do you really want to quit WinHTTrack Website Copier? Chiar doriþi sã pãrãsiþi WinHTTrack Website Copier ? Do not connect to a provider (already connected) Nu conecta la un furnizor (deja conectat) Do not use remote access connection Nu folosi conexiune cu acces la distanþã Schedule the mirroring operation Programeazã operaþia de clonare (copiere) a site-ului Quit WinHTTrack Website Copier Ieºire din WinHTTrack Website Copier Back to starting page Înapoi la pagina de start Click to start! Click pentru pornire! No saved password for this connection! Nici o parolã salvatã pentru aceastã conexiune! Can not get remote connection settings Nu pot obþine ºetãrile conexiunii la distanþã Select a connection provider Alege un furnizor de conexiune Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Ajustaþi parametrii conexiunii dacã este necesar, \napoi apãsaþi FINISH pentru a începe clonarea sit-ului Save settings only, do not launch download now. Salveazã setãrile dar nu porni descãrcarea acum. On hold În aºteptare Transfer scheduled for: (hh/mm/ss) Transfer programat pentru:(hh/mm/ss) Start Start Connect to provider (RAS) Conecteazã la furnizorul de internet (RAS) Connect to this provider Conecteazã la acest furnizor de internet Disconnect when finished Deconecteazã ºa terminare Disconnect modem on completion Deconecteazã modemul la terminare \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) About WinHTTrack Website Copier Despre WinHTTrack Website Copier Please visit our Web page Vizitaþi pagina noastrã Web Wizard query Vrãjitor de interogare Your answer: Rãspunsul d-voastrã: Link detected.. S-a detectat un link. Choose a rule Alege o regulã Ignore this link Ignorã acest link Ignore directory Ignorã director Ignore domain Ignorã domeniu Catch this page only Captureazã doar aceastã paginã Mirror site Cloneazã site Mirror domain Cloneazã domeniu Ignore all Ignorã tot Wizard query Vrãjitor de interogare NO NU File Fiºier Options Opþiuni Log Jurnal Window Fereastrã Help Ajutor Pause transfer Suspendã transfer Exit Ieºire Modify options Modificã opþiuni View log Vezi fiºierul jurnal. View error log Vezi fiºierul jurnal cu erori View file transfers Vezi transferurile de fiºiere Hide Ascunde About WinHTTrack Website Copier Despre WinHTTrack Website Copier Check program updates... Verificã actualizãrile pentru WinHTTrack... &Toolbar &Bara de instrumente &Status Bar Bara de &Stare S&plit Îm&parte File Fiºier Preferences Preferinþe Mirror Clonare (copiere sit) Log Jurnal Window Fereastrã Help Ajutor Exit Ieºire Load default options Încarcã opþiunile implicite Save default options Salveazã optiunile implicite Reset to default options Reseteazã la opþiunile implicite Load options... Încarcã opþiunile... Save options as... Salveazã opþiunile ca... Language preference... Alegere Limbã Contents... Conþinut... About WinHTTrack... Despre WinHTTrack... New project\tCtrl+N Proiect nou\tCtrl+N &Open...\tCtrl+O &Deschide...\tCtrl+O &Save\tCtrl+S &Salveazã\tCtrl+S Save &As... Salveazã C&a... &Delete... ªt&erge... &Browse sites... &Rãsfoire situri... User-defined structure Structurã definitã de utilizator %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNumele fiºierului fãrã extensie (ex: image)\r\n%N\tNumele fiºierului cu extensie (ex: image.gif)\r\n%t\tNumai tipul fiºierului (extensia) (ex: gif)\r\n%p\tCalea [fãrã / la sfârºit] (ex: /someimages)\r\n%h\tNumele Gazdei (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tDenumire scurtã DOS (ex: %sN)\r\n Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Exemplu:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Setãri ale serverului proxy: Proxy address: Adresa serverului proxy: Proxy port: Portul serverului proxy: Authentication (only if needed) Autentificare (numai dacã este necesarã) Login Nume utilizator (Login) Password Parola Enter proxy address here Introduceþi aici adresa serverului proxy Enter proxy port here Introduceþi aici portul serverului proxy Enter proxy login Introduceþi numele utilizatorului (login) serverului proxy Enter proxy password Introduceþi parola de conectare la serverul proxy Enter project name here Introduceþi numele proiectului aici Enter saving path here Introduceþi calea pentru salvarea proiectului Select existing project to update Selecteazã un proiect existent pentru actualizare Click here to select path Click aici pentru a selecta calea Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... Vrãjitor proiect HTTrack... New project name: Nume proiect nou: Existing project name: Numele proiectului existent: Project name: Nume proiect: Base path: Calea de bazã: Project category: C:\\My Web Sites C:\\Siturile Mele Type a new project name, \r\nor select existing project to update/resume Introduceþi numele unui proiect nou,\r\nsau selectaþi un proiect existent pentru actiualizare/continuare New project Proiect nou Insert URL Introduceþi o adresã URL URL: URL: Authentication (only if needed) Autentificare (doar dacã e necesarã) Login Nume utilizator (Login) : Password Parola Forms or complex links: Formulare sau link- uri complexe Capture URL... Captureazã URL... Enter URL address(es) here Introduceþi adresa (adresele) URL aici Enter site login Introduceþi numele de utilizator pentru site Enter site password Introduceþi parola pentru site Use this capture tool for links that can only be accessed through forms or javascript code Foloseºte aceastã unealtã de capturã pentru link- uri care pot fi accesate numai prin formulare sau cod javascript Choose language according to preference Alege limba de aici... Catch URL! Captureazã aceastã adresã URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Setaþi proprietãþile temporar serverului proxy a browserului vostru cu urmãtoarele valori (Copy/Paste Adresa Proxy ºi Portul).\nApoi daþi click pe butonul Trimite din formular, sau faceþi click pe un link specific, pe care doriþi sa îl capturaþi. This will send the desired link from your browser to WinHTTrack. Aceasta va trimite link-ul dorit, din browser cãtre WinHTTrack. ABORT RENUNÞà Copy/Paste the temporary proxy parameters here Copiazã/Lipeºte parametrii temporari ai serverului proxy aici Cancel Anulare Unable to find Help files! Nu gãsesc fiºierele de Ajutor! Unable to save parameters! Nu pot sã salvez parametrii! Please drag only one folder at a time Vã rog trageþi numai un fiºier o datã Please drag only folders, not files Trageþi numai dosare, nu fiºiere Please drag folders only Trageþi numai dosare Select user-defined structure? Alegeþi o structurã definitã de utilizator pentru copierea sit-ului ? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Asiguraþi-vã cã ºirul definit de utilizator este corect,\n altfel numele fiºierelor vor fi eronate ! Do you really want to use a user-defined structure? Chiar doriþi sã folosiþi o structurã personalizatã (user-defined)? Too manu URLs, cannot handle so many links!! Prea multe adrese URL, nu pot manipula aºa multe link-uri Not enough memory, fatal internal error.. Memorie insuficientã, eroare internã fatalã... Unknown operation! Operaþie necunoscutã! Add this URL?\r\n Adaug aceastã adresã URL?\r\n Warning: main process is still not responding, cannot add URL(s).. ATENÞIE: Procesul principal tot nu rãspunde, nu pot adãuga adresa (adresele) URL.. Type/MIME associations Asocieri de tip/MIME File types: Tipuri de fiºiere: MIME identity: Identitate MIME: Select or modify your file type(s) here Alege sau modificã tip(urile) de fiºier(e) aici Select or modify your MIME type(s) here Alege sau modificã tipul (tipurile) MIME aici Go up Urcã Go down Coboarã File download information Informaþii despre fiºierele descãrcate Freeze Window Îngheaþã fereastra More information: Mai multe informaþii: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Bine aþi venit la WinHTTrack Website Copier!\n\nClick pe butonul Next pentru\n\n- a începe un proiect nou\n- sau a continua o descãrcare parþialã File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Nume de fiºier cu extensie:\nNume de fiºiere ce conþin:\nAcest nume de fiºier:\nNume de directoare ce conþin:\nAcest nume de director:\nLinkurile din acest domeniu:\nLinkurile din acest domeniu care conþin:\nLink-urile de la aceastã gazdã:\nLink-urile care conþin:\nAcest link:\nTOATE LINK-URILE Show all\nHide debug\nHide infos\nHide debug and infos Aratã tot\nAscunde informaþiile de depanare\nAscunde informaþiile generale\nAscunde ºi informaþiile de depanare ºi cele generale Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Structura site-ului (implicit)\nHtml în web/, imagini/alte fiºiere din web/imagini/\nHtml în web/html, imagini/altele în web/imagini\nHtml în web/, imagini/altele în web/\nHtml în web/, imagini/altele în web/xxx, unde xxx este extensia fiºierului\nHtml în web/html, imagini/altele în web/xxx\nStructura-site, fãrã www.domeniu.xxx/\nHtml în numele_site-ului/, imagini/alte fiºiere în numele_site-ului/imagini/\nHtml în numele_site-ului/html, imagini/altele în numele_site-ului/imagini\nHtml în site_name/, imagini/altele în numele_site-ului /\nHtml în numele_site-ului/, imagini/altele în numele_site-ului/xxx\nHtml în numele_site-ului/html, imagini/alte în numele_site-ului/xxx\nToate fiºierele în web/, cu nume aleatoare (gadget !)\nToate fiºierele în numele_site-ului/, cu nume aleatoare (gadget !)\nStructurã personalizatã (definitã de utilizator ).. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Doar scaneazã\nStocheazã fiºiere\nStocheazã fiºiere non HTML\nStocheazã toate fiºierele (implicit)\nStocheazã întâi fiºierele html Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Rãmâi în acelaºi director\nCoborâre permisã\nUrcare permisã\nUrcare ºi coborâre permisã Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Rãmâi la aceeaºi adresã (implicit)\nRãmâi pe acelaºi domeniu\nRãmâi la acelaºi domeniu de nivel superior\nMergi oriunde pe web Never\nIf unknown (except /)\nIf unknown Niciodatã\nDacã este necunoscut (excepþie /)\nDacã este necunoscut no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Fãrã regulile robots.txt\nrobots.txt exceptând filtrele\n urmeazã regulile din robots.txt normal\nextended\ndebug normal\nextins\ndepanare Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Descarcã site(-uri) web\nDescãrcare interactivã site(-uri) web\nDescarcã fiºiere individuale\nDescarcã toate ºite-urile din pagini (clonãri multiple)\nTesteazã linkurile din pagini (testeazã semnele de carte)\n* Continuã o descãrcare întreruptã \n* Actualizeazã o descãrcare existentã Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Adresã URI relativã / Adresã URL absolutã (implicit)\nAdresã URL absolutã / Adresã URL absolutã\nAdresã URI absolutã / Adresã URL absolutã \n Adresã URL originalã / Adresã URL originalã Open Source offline browser Browser offline open source. Website Copier/Offline Browser. Copy remote websites to your computer. Free. Copiator de situri web/Browser offline. Copiazã situri web pe calculatorul dumneavoastrã.Gratuit httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) Lista URL (.txt) Previous Anterior Next Urmãtor URLs URL- uri Warning Avertisment Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Browserul dumneavoastrã nu suportã javascript. Pentru rezultate mai bune, vã rugãm sa folosiþi un browser ce suportã javascript. Thank you Vã mulþumim You can now close this window Acum puteþi închide aceastã fereastrã. Server terminated Server terminat A fatal error has occurred during this mirror A survenit o eroare fatalã în timpul acestei clonãri. Proxy type: Tip proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protocol proxy. HTTP: proxy standard. HTTP (tunel CONNECT): trimite fiecare cerere printr-un tunel CONNECT, pentru proxy care accepta doar CONNECT precum HTTPTunnelPort al lui Tor. SOCKS5: port implicit 1080. Load cookies from file: Încarca cookies dintr-un fisier: Preload cookies from a Netscape cookies.txt file before crawling. Preîncarca cookies dintr-un fisier Netscape cookies.txt înainte de copiere. Pause between files: Pauza între fisiere: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Întârziere aleatoare între descarcari de fisiere, în secunde. Folositi MIN:MAX pentru un interval aleatoriu (de ex. 2:8). Keep the www. prefix (do not merge www.host with host) Pastreaza prefixul www. (nu combina www.host cu host) Do not treat www.host and host as the same site. Nu trata www.host si host ca fiind acelasi site. Keep double slashes in URLs Pastreaza barele duble din URL-uri Do not collapse duplicate slashes in URLs. Nu comprima barele duplicate din URL-uri. Keep the original query-string order Pastreaza ordinea originala din query string Do not reorder query-string parameters when deduplicating URLs. Nu reordona parametrii din query string la eliminarea URL-urilor duplicate. Strip query keys: Elimina cheile din query string: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Chei din query string, separate prin virgula, de eliminat din denumirea fisierelor salvate (de ex. sid,utm_source). Write a WARC archive of the crawl Scrie o arhiva WARC a parcurgerii Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Salveaza si fiecare raspuns descarcat intr-o arhiva WARC/1.1 ISO-28500, langa oglinda. WARC archive name: Numele arhivei WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Nume de baza optional pentru arhiva WARC; lasati gol pentru a-l denumi automat in directorul de iesire. httrack-3.49.14/lang/Portugues.txt0000644000175000017500000011160015230602340012466 LANGUAGE_NAME Português LANGUAGE_FILE Portugues LANGUAGE_ISO pt LANGUAGE_AUTHOR Rui Fernandes (CANTIC, ruiefe at mail.malhatlantica.pt) \r\nPedro T. Pinheiro (Universidade Nova de Lisboa-FCT, ptiago at mail.iupi.pt) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Portuguese (Portugal) OK OK Cancel Cancelar Exit Sair Close Fechar Cancel changes Cancelar alterações Click to confirm Clique para confirmar Click to get help! Clique para obter ajuda Click to return to previous screen Clique para retroceder Click to go to next screen Clique para avançar Hide password Ocultar palavra-chave Save project Guardar projecto Close current project? Fechar o projecto em curso? Delete this project? Apagar este projecto? Delete empty project %s? Apagar o projecto vazio %s? Action not yet implemented Função não disponível Error deleting this project Erro ao apagar o projecto Select a rule for the filter Escolha uma regra para o filtro Enter keywords for the filter Introduza uma palavra-chave para o filtro Cancel Cancelar Add this rule Adicionar esta regra Please enter one or several keyword(s) for the rule Escreva uma ou mais palavras-chave para esta regra Add Scan Rule Adicionar filtro Criterion Escolha uma regra String Palavra-chave: Add Adicionar Scan Rules Filtros Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Usar * ou ? para excluir ou incluir vários URL ou hiperligações.\n Pode usar vírgulas ou espaços entre os filtros.\n\n Exemplo: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Excluir hiperligações Include link(s) Incluir hiperligações Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Sugestão: Para incluir todos os ficheiros GIF, use algo como +www.pagina.com/*.gif. \nPara incluir/excluir TODOS os ficheiros GIF de todos os sites utilize +*.gif ou -*.gif Save prefs Guardar preferências Matching links will be excluded: As hiperligações correspondentes a esta regra serão excluídas Matching links will be included: As hiperligações correspondentes a esta regra serão incluídas Example: Exemplo: gif\r\nWill match all GIF files gif\r\ndetectará todos os ficheiros GIF blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\ndetectará todos os ficheiros contendo blue, tais como 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\ndetectará o ficheiro 'bigfile.mov' mas não 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\ndetectará hiperligações contendo 'cgi' tais como /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\ndetectará por exemplo hiperligações com nomes contendo 'cgi-bin' mas não 'cgi-bin-2' someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\ndetectará hiperligações como www.someweb.com, private.someweb.com, etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\ndetectará hiperligações como www.someweb.com, www.someweb.edu, private.someweb.otherweb.com, etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\ndetectará hiperligações como www.someweb.com/... (mas não hiperligações como private.someweb.com/...) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\ndetectará hiperligações como www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html, etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\napenas detectará hiperligações como www.test.com/test/someweb.html. Note que terá que digitar o endereço completo (URL + caminho do ficheiro) All links will match Todas as hiperligações serão detectadas Add exclusion filter Acrescentar filtro de exclusão Add inclusion filter Acrescentar filtro de inclusão Existing filters Filtros existentes Cancel changes Anular alterações Save current preferences as default values Guardar preferências como opções padrão Click to confirm Clique para confirmar No log files in %s! Não há relatórios em %s! No 'index.html' file in %s! Não existe index.html em %s Click to quit WinHTTrack Website Copier Clique para sair do WinHTTrack Website Copier View log files Ver relatórios Browse HTML start page Aceder à página inicial End of mirror Cópia terminada View log files Ver relatórios Browse Mirrored Website Aceder à Web New project... Novo projecto... View error and warning reports Ver relatórios de erros e avisos View report Ver informação do relatório Close the log file window Fechar a janela do relatório Info type: Tipo de informação: Errors Erros Infos Informações Find Localizar Find a word Localizar uma palavra Info log file Relatórios de cópia Warning/Errors log file Relatório de erros e avisos Unable to initialize the OLE system Impossível iniciar o sistema OLE WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack não encontra nenhuma cópia completa ou parcial na pasta indicada Could not connect to provider Impossível estabelecer a ligação receive recepção request pedido connect ligação search localizar ready pronto error erro Receiving files.. Recepção de ficheiros Parsing HTML file.. Análise das hiperligações da página Purging files.. Limpeza de ficheiros... Loading cache in progress.. Parsing HTML file (testing links).. Teste das hiperligações da página Pause - Toggle [Mirror]/[Pause download] to resume operation Pausa - Escolha [Ficheiro]/[Interromper transferência] para continuar Finishing pending transfers - Select [Cancel] to stop now! A concluir as transferências em curso - Seleccione [Cancelar] para terminar agora! scanning analisando Waiting for scheduled time.. Aguardando hora programada para começar Connecting to provider Ligação ao fornecedor de acesso [%d seconds] to go before start of operation Cópia em espera (%d segundos) Site mirroring in progress [%s, %s bytes] A copiar (%s, %s Bytes) Site mirroring finished! Cópia terminada A problem occurred during the mirroring operation\n Ocorreu um problema durante a cópia\n \nDuring:\n Durante:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Veja o relatório, se necessário.\n\nClique TERMINAR para sair do WinHTTrack.\n\nObrigado por usar o WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Cópia terminada.\nClique OK para sair.\nVeja o relatório para verificar se não há erros.\n\nObrigado por usar o WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * CÓPIA INTERROMPIDA! * *\r\nA cache temporária actual é necessária para actualização e só contém os dados carregados durante a sessão em curso.\r\nÉ possível que a cache anterior contenha dados mais completos; para não perder esses dados, deve restaurá-la e apagar a cache actual.\r\n[Nota: Esta operação pode ser facilmente executada aqui apagando os ficheiros hts-cache/new.*]\r\n\r\nPensa que a cache anterior pode conter informações mais completas e quer restaurá-la? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ERRO DE CÓPIA! * *\r\nHTTrack detectou que a cópia actual está vazia. Se fez uma actualização, a cópia anterior foi restaurada.\r\nRazão: a primeira página não foi encontrada ou ocorreu um problema na conexão.\r\n=> Certifique-se de que o site existe e confirme as configurações do proxy! <= \n\nTip: Click [View log file] to see warning or error messages \nSugestão:Clique [Ver relatório] para ver os avisos e as mensagens de erro Error deleting a hts-cache/new.* file, please do it manually Erro ao apagar hts-cache/new.*, apague manualmente Do you really want to quit WinHTTrack Website Copier? Quer realmente sair de WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Modo de cópia automática -\n\nIntroduza os endereços na caixa de diálogo. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Modo de cópia interactiva (perguntas) -\n\nIntroduza os endereços na caixa de diálogo. - File Download Mode -\n\nEnter file address(es) in URL box - Modo de download do ficheiro -\n\nIntroduza os endereços na caixa de diálogo. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Modo de teste de hiperligações -\n\nIntroduza os endereços das páginas com hiperligações para testar na caixa de diálogo. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modo de actualização de cópia -\n\nVerifique os endereços na lista, verifique as opções, depois clique SEGUINTE. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modo de continuação de cópia -\n\nVerifique os endereços na lista, verifique as opções, depois clique SEGUINTE. Log files Path Caminho para os ficheiros de relatório Path Caminho - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Modo de cópia de hiperligações -\n\nIntroduza os endereços a copiar na caixa de diálogo. New project / Import? Novo projecto / importar ? Choose criterion Escolha uma acção Maximum link scanning depth Profundidade máxima de análise de hiperligações Enter address(es) here Introduza os endereços aqui Define additional filtering rules Definir filtros adicionais Proxy Name (if needed) Nome do proxy (se necessário) Proxy Port Porta do proxy Define proxy settings Definir as opções do proxy Use standard HTTP proxy as FTP proxy Utilizar o proxy HTTP padrão como proxy FTP Path Caminho Select Path Escolha o caminho Path Caminho Select Path Escolha o caminho Quit WinHTTrack Website Copier Sair do WinHTTrack Website Copier About WinHTTrack Acerca do WinHTTrack Save current preferences as default values Guardar preferências como opções padrão Click to continue Clique para continuar Click to define options Clique para definir as opções Click to add a URL Clique para adicionar um endereço URL Load URL(s) from text file Importar endereços URL de um ficheiro de texto WinHTTrack preferences (*.opt)|*.opt|| Preferências do WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Ficheiro de texto com lista de endereços (*.txt)|*.txt|| File not found! Ficheiro não encontrado! Do you really want to change the project name/path? Deseja realmente alterar o nome/caminho do projecto? Load user-default options? Carregar as opções padrão (definidas pelo utilizador)? Save user-default options? Guardar as opções padrão do utilizador? Reset all default options? Apagar todas as opções padrão? Welcome to WinHTTrack! Bem-vindo ao WinHTTrack Website Copier Action: Acção: Max Depth Profundidade máxima: Maximum external depth: Profundidade externa máxima: Filters (refuse/accept links) : Filtros (incluir/excluir hiperligações) Paths Caminhos Save prefs Guardar preferências Define.. Definir... Set options.. Definir as opções... Preferences and mirror options: Parâmetros de cópia do site Project name Nome do projecto Add a URL... Adicionar... Web Addresses: (URL) Endereço (URL): Stop WinHTTrack? Parar o WinHTTrack? No log files in %s! Nenhum relatório em %s! Pause Download? Suspender a cópia do site? Stop the mirroring operation Parar a cópia do site? Minimize to System Tray Minimizar na barra de sistema Click to skip a link or stop parsing Clique para saltar uma ligação ou interromper a cópia Click to skip a link Clique para saltar a ligação Bytes saved Bytes guardados: Links scanned Hiperligações processadas: Time: Tempo: Connections: Ligações: Running: Em curso: Hide Minimizar Transfer rate Taxa de transferência: SKIP SALTAR Information Informações Files written: Ficheiros escritos: Files updated: Ficheiros actualizados: Errors: Erros: In progress: Em curso: Follow external links Copiar ficheiros mesmo em hiperligações externas Test all links in pages Testar todas as hiperligações nas páginas Try to ferret out all links A tentar detectar todas as hiperligações Download HTML files first (faster) Transferir primeiro os ficheiros HTML (mais rápido) Choose local site structure Escolher a estrutura local de ficheiros Set user-defined structure on disk Definir os parâmetros da estrutura personalizada Use a cache for updates and retries Utilizar chache para actualizações e novas tentativas Do not update zero size or user-erased files Não actualizar ficheiros com tamanho zero ou apagados pelo utilizador Create a Start Page Criar uma página inicial Create a word database of all html pages Criar base de dados de palavras de todas as páginas html Create error logging and report files Criar ficheiros para as mensagens de erro e avisos Generate DOS 8-3 filenames ONLY Gerar APENAS nomes de ficheiros DOS (8+3 caracteres) Generate ISO9660 filenames ONLY for CDROM medias Do not create HTML error pages Não escrever ficheiros de erro HTML Select file types to be saved to disk Selecção dos tipos de ficheiros a guardar Select parsing direction Modo de percurso de hiperligações no site Select global parsing direction Limites da zona global de exploração Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Max simultaneous connections Numero máximo de conexões File timeout Tempo máximo de espera para um ficheiro Cancel all links from host if timeout occurs Cancelar todas as hiperligações num domínio em caso de espera excessiva Minimum admissible transfer rate Taxa de transferência mínima tolerada Cancel all links from host if too slow Cancelar todas as hiperligações num domínio em caso de transferência muito lenta Maximum number of retries on non-fatal errors Número máximo de tentativas em caso de erro não fatal Maximum size for any single HTML file Tamanho máximo para uma página HTML Maximum size for any single non-HTML file Tamanho máximo para cada ficheiro não HTML Maximum amount of bytes to retrieve from the Web Tamanho total máximo para cópia Make a pause after downloading this amount of bytes Fazer uma pausa depois de transferir esta quantidade de bytes Maximum duration time for the mirroring operation Tempo total máximo para cópia Maximum transfer rate Taxa de transferência máxima Maximum connections/seconds (avoid server overload) Número máximo de conexões/segundos (limita sobrecarga dos servidores) Maximum number of links that can be tested (not saved!) Número máximo de hiperligações que podem ser testadas (não gravadas!) Browser identity Identidade do browser Comment to be placed in each HTML file Nota de rodapé em cada ficheiro HTML Back to starting page Voltar à página inicial Save current preferences as default values Guardar as preferências actuais como opções padrão Click to continue Clique para continuar Click to cancel changes Clique para cancelar Follow local robots rules on sites Seguir as regras locais dos robots nos sites Links to non-localised external pages will produce error pages As hiperligações fora do domínio de exploração geram mensagens de erro Do not erase obsolete files after update Não apagar os ficheiros antigos depois da actualização Accept cookies? Aceitar cookies? Check document type when unknown? Verificar o tipo de documento se desconhecido? Parse java applets to retrieve included files that must be downloaded? Analisar os applets Java para transferir os ficheiros incluídos? Store all files in cache instead of HTML only Armazenamento de TODOS os ficheiros em cache (em vez de só HTML) Log file type (if generated) Tipo de relatório (se gerado) Maximum mirroring depth from root address Profundidade máxima da cópia desde o endereço inicial Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximum mirroring depth for external/fodbidden addresses (0, that is, none, is the default) Create a debugging file Criar um ficheiro de debug Use non-standard requests to get round some server bugs Tentar evitar os bugs dos servidores usando chamadas não-standard Use old HTTP/1.0 requests (limits engine power!) A utilização de chamadas antigas HTTP/1.0 limita as capacidades do motor de captura! Attempt to limit retransfers through several tricks (file size test..) Tentativa de limitar a retransferência através de vários métodos (teste do tamanho do ficheiro...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Guardar hiperligações externas sem login/palavra-chave Write internal links without query string Guardar hiperligações internas sem 'query string' Get non-HTML files related to a link, eg external .ZIP or pictures Capturar ficheiros não-HTML próximos (ex: ficheiros .ZIP situados no exterior) Test all links (even forbidden ones) Testar todas as hiperligações (mesmo as excluídas) Try to catch all URLs (even in unknown tags/code) Tentar detectar todas as hiperligações (mesmo tag desconhecidos/código javascript) Get HTML files first! Transferir ficheiros HTML primeiro! Structure type (how links are saved) Tipo de estrutura (modo como as hiperligações são guardadas) Use a cache for updates Utilizar a cache para actulizações Do not re-download locally erased files Não voltar a transferir ficheiros apagados localmente Make an index Construir um índice Make a word database Criar base de dados de palavras Log files Relatórios DOS names (8+3) Nomes DOS (8+3) ISO9660 names (CDROM) No error pages Sem páginas de erros Primary Scan Rule Filtro primário Travel mode Modo de percurso Global travel mode Modo de percurso global These options should be modified only exceptionally Opções a modificar apenas excepcionalmente Activate Debugging Mode (winhttrack.log) Activar o modo de debug (winhttrack.log) Rewrite links: internal / external Flow control Controlo de fluxo Limits Limites Identity Identificação HTML footer Rodapé HTML N# connections Número de conexões Abandon host if error Abandonar servidor em caso de erro Minimum transfer rate (B/s) Taxa de transferência mínima (Bps) Abandon host if too slow Abandonar em caso de transferência muito lenta Configure Configurar Use proxy for ftp transfers Utilizar o proxy para transferências FTP TimeOut(s) Tempo excessivo Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Tentativas Size limit Tamanho limite Max size of any HTML file (B) Tamanho máximo dos ficheiros HTML Max size of any non-HTML file Tamanho máximo dos outros ficheiros Max site size Tamanho máximo do site Max time Tempo máximo Save prefs Guardar as opções actuais Max transfer rate Taxa de transferência máxima Follow robots.txt Seguir as regras no ficheiro robots.txt No external pages Sem páginas externas Do not purge old files Não eliminar ficheiros antigos Accept cookies Aceitar cookies Check document type Verificar os tipos de documento Parse java files Analizar os ficheiros Java Store ALL files in cache Guardar TODOS os ficheiros na cache Tolerant requests (for servers) Chamadas tolerantes (para servidores) Update hack (limit re-transfers) Actualização forçada (limita retransferências) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Chamadas antigas HTTP/1.0 (não 1.1) Max connections / seconds Número máximo de conexões/segundos Maximum number of links Número máximo de hiperligações Pause after downloading.. Suspender após a cópia de... Hide passwords Ocultar palavra-chave Hide query strings Ocultar 'query strings' Links Hiperligações Build Estrutura Experts Only Só especialistas Flow Control Controlo de fluxo Limits Limites Browser ID Identidade do browser Scan Rules Filtros Spider Indexador Log, Index, Cache Relatório, Indice, Cache Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Deseja realmente sair do WinHTTrack Website Copier? Do not connect to a provider (already connected) Não ligar a um fornecedor de acesso (ligação já estabelecida) Do not use remote access connection Não utilizar acesso remoto Schedule the mirroring operation Programar cópia do site Quit WinHTTrack Website Copier Sair do WinHTTrack Website Copier Back to starting page Voltar à página inicial Click to start! Clique para começar! No saved password for this connection! Não existem palavras-chave para esta conexão! Can not get remote connection settings Impossível obter os parâmetros de conexão Select a connection provider Seleccione o ISP Start Iniciar... Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Defina as OPÇÕES de conexão se necessário,\nem seguida clique Avançar para começar a cópia do site Save settings only, do not launch download now. Registar só as configurações, não iniciar a transferência. On hold Temporização Transfer scheduled for: (hh/mm/ss) Esperar até às: (hh/mm/ss) Start INICIAR! Connect to provider (RAS) Fornecedor de acesso Connect to this provider Ligar a este fornecedor de acesso Disconnect when finished Desligar no fim da operação Disconnect modem on completion Desconectar o modem no final \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Por favor avise-nos acerca de erros ou problemas)\r\n\r\nDesenvolvimento:\r\nInterface (Windows): Xavier Roche\r\nMotor: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nAgradecimentos pela tradução para o Português para:\r\nRui Fernandes (CANTIC, ruiefe@mail.malhatlantica.pt) About WinHTTrack Website Copier Acerca do WinHTTrack Website Copier Please visit our Web page Visite a nossa página Web! Wizard query Pergunta do Assistente Your answer: A sua resposta: Link detected.. Foi detectada uma hiperligação Choose a rule Escolha uma regra: Ignore this link Ignorar esta hiperligação Ignore directory Ignorar esta pasta Ignore domain Ignorar este domínio Catch this page only Transferir APENAS esta página Mirror site Cópia do site Mirror domain Transferir todo o domínio Ignore all Ignorar tudo Wizard query Questão do Assistente NO NÃO File Ficheiro Options Opções Log Relatório Window Janelas Help Ajuda Pause transfer Suspender a transferência Exit Sair Modify options Modificar as opções View log Ver relatório View error log Ver relatório de erros View file transfers Ver ficheiros transferidos Hide Minimizar About WinHTTrack Website Copier Acerca do WINHTTrack Check program updates... Procurar actualizações do WINHTTrack... &Toolbar Barra de ferramentas &Status Bar Barra de estado S&plit Dividir File Ficheiro Preferences Opções Mirror Cópia do site Log Relatório Window Janelas Help Ajuda Exit Sair Load default options Carregar opções padrão Save default options Guardar opções padrão Reset to default options Apagar opções padrão Load options... Carregar opções Save options as... Guardar opções como... Language preference... Preferências de linguagem Contents... Índice... About WinHTTrack... Acerca do WinHTTrack Website Copier New project\tCtrl+N Novo projecto\tCtrl+N &Open...\tCtrl+O &Abrir...\tCtrl+O &Save\tCtrl+S &Guardar\tCtrl+S Save &As... Guardar &como... &Delete... A&pagar... &Browse sites... &Ver sites... User-defined structure Estrutura local de ficheiros %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNome do ficheiro sem extensão (ex: image)\r\n%N\tNome do ficheiro incluindo extensão (ex: image.gif)\r\n%t\tExtensão (ex: gif)\r\n%p\tCaminho (sem / final) (ex: /someimages)\r\n%h\tNome do servidor (ex: www.someweb.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tVersão curta DOS (ex: %sN ) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Exemplo:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Configuração do proxy Proxy address: Endereço do proxy Proxy port: Porta do proxy Authentication (only if needed) Identificação (se necessária) Login Login Password Palavra-chave Enter proxy address here Introduza o endereço do proxy Enter proxy port here Introduza a porta do proxy Enter proxy login Introduza o login do proxy Enter proxy password Introduza a palavra-chave do proxy Enter project name here Introduza o nome do projecto Enter saving path here Digite o caminho onde quer guardar o projecto Select existing project to update Selecione um projecto existente para actualização Click here to select path Clique aqui para seleccionar o caminho Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... Assistente de projectos do WinHTTrack New project name: Nome do novo projecto: Existing project name: Nome do projecto existente: Project name: Nome do projecto: Base path: Caminho base: Project category: C:\\My Web Sites C:\\Os meus Sites Type a new project name, \r\nor select existing project to update/resume Introduza o nome para um novo projecto,\nou escolha um projecto para continuar ou actualizar New project Novo projecto Insert URL Introduza endereço URL URL: Endereço URL Authentication (only if needed) Identificação (se necessária) Login Login Password Palavra-chave Forms or complex links: Formulários ou hiperligações complexos: Capture URL... Capturar URL... Enter URL address(es) here Introduza aqui o endereço URL Enter site login Digite o login do site Enter site password Digite a palavra-chave do site Use this capture tool for links that can only be accessed through forms or javascript code Use esta ferramenta para capturar as hiperligações que apenas podem ser acedidas através de um formulário ou script de Java Choose language according to preference Selecione o seu idioma aqui Catch URL! Capturar URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Queira definir temporariamente as opções do proxy no seu browser para os valores abaixo (cortar/colar o endereço proxy e a porta).\n Depois, no browser, clique no botão SUBMIT do formulário, ou clique na hiperligação específica que quer capturar. This will send the desired link from your browser to WinHTTrack. Isto enviará a hiperligação pretendida do seu browser para o WinHTTrack. ABORT CANCELAR Copy/Paste the temporary proxy parameters here Copiar/colar as preferências temporárias do proxy aqui Cancel Cancelar Unable to find Help files! Impossível encontrar os ficheiros de ajuda! Unable to save parameters! Impossível guardar os parâmetros! Please drag only one folder at a time Arraste apenas uma pasta de cada vez Please drag only folders, not files Arraste apenas pastas, não ficheiros Please drag folders only Arraste apenas pastas Select user-defined structure? Seleccionar uma estrutura personalizada? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Assegure-se que a cadeia personalizada está correctat\nSe não, os nomes dos ficheiros serão incorrectos! Do you really want to use a user-defined structure? Quer realmente utilizar uma estrutura personalizada? Too manu URLs, cannot handle so many links!! Demasiados URL, impossível manusear tantas hiperligações !! Not enough memory, fatal internal error.. Memória insuficiente, erro fatal interno... Unknown operation! Operação desconhecida!! Add this URL?\r\n Adicionar este endereço URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Aviso: o processo principal ainda não responde, impossível adicionar URL. Type/MIME associations Correspondências tipo/MIME File types: Tipos de ficheiros: MIME identity: MIME identity Select or modify your file type(s) here Seleccione ou modifique os tipos de ficheiros aqui Select or modify your MIME type(s) here Seleccione ou altere os tipos MIME aqui Go up Para cima Go down Para baixo File download information Informações sobre os ficheiros transferidos Freeze Window Fixar a janela More information: Mais informações: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Benvindo ao WinHTTrack Website Copier!\n\nClique no botão Seguinte para\n\n- iniciar um novo projecto ou\n- retomar um projecto existente. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Ficheiros de tipo:\nFicheiros contendo:\nEste ficheiro:\nNomes de pastas contendo:\nEsta pasta:\nHiperligações neste domínio:\nHiperligações num domínio contendo:\nHiperligações deste servidor:\nHiperligações contendo:\nEsta hiperligação:\nTODAS AS HIPERLIGAÇÕES\r\n Show all\nHide debug\nHide infos\nHide debug and infos Mostrar tudo\nOcultar erros\nOcultar informações\nOcultar erros e informações Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Estrutura do site (padrão)\nHtml na web/, imagens/outros na web/imagens/\nHtml na web/html, imagens/outros na web/imagens\nHtml na web/, imagens/outros na web/\nHtml na web/, imagens/outros na web/xxx, quando xxx é a extensão do ficheiro\nHtml na web/html, imagens/outros na web/xxx\nEstrutura do site, sem www.domínio.xxx/\nHtml no nome_do_site/, imagens/outros no nome_do_site/imagens/\nHtml no nome_do_site/html, imagens/outros no nome_do_site/imagens\nHtml no nome_do_site/, imagens/outros no nome_do_site/\nHtml no nome_do_site/, imagens/outros no nome_do_site/xxx\nHtml no nome_do_site/html, imagens/outros no nome_do_site/xxx\nTodos os ficheiros na web/, com nomes aleatórios (gadget !)\nTodos os arquivos no nome_do_site/, com nomes aleatórios (gadget !)\nEstrutura definida pelo utilizador.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Só análise de hiperligações\nGuardar ficheiros HTML\nGuardar ficheiros não HTML\nGuardar todos os ficheiros (padrão)\nGuardar ficheiros HTML primeiro Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Manter no mesmo directório\nPode ir para baixo (padrão)\nPode ir para acima\nPode ir para baixo & para cima Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Manter no mesmo endereço (padrão)\nManter no mesmo domínio\nManter no mesmo domínio de nível superior\nPercurso livre na Web Never\nIf unknown (except /)\nIf unknown Nunca\nSe desconhecido (excepto /)\nSe desconhecido no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules sem regras robots.txt\regras robots.txt excepto filtros\nseguir as regras robots.txt normal\nextended\ndebug normal\nestendido\ncorrigir Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Cópia automática de sites Web\nCópia interactiva de sites Web (questões)\nTransferir ficheiros específicos\nTransferir todos os sites nas páginas (cópias múltiplas)\nTestar as hiperligações nas páginas (testar indicador)\n* Retomar cópia interrompida\n* Actualizar uma cópia existente Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Tipo de proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protocolo do proxy. HTTP: proxy padrão. HTTP (túnel CONNECT): envia cada pedido através de um túnel CONNECT, para proxies que só suportam CONNECT como o HTTPTunnelPort do Tor. SOCKS5: porta predefinida 1080. Load cookies from file: Carregar cookies de um ficheiro: Preload cookies from a Netscape cookies.txt file before crawling. Pré-carregar cookies de um ficheiro Netscape cookies.txt antes de iniciar a cópia. Pause between files: Pausa entre ficheiros: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Atraso aleatório entre transferências de ficheiros, em segundos. Utilize MIN:MAX para um intervalo aleatório (por ex. 2:8). Keep the www. prefix (do not merge www.host with host) Manter o prefixo www. (não combinar www.host com host) Do not treat www.host and host as the same site. Não tratar www.host e host como o mesmo site. Keep double slashes in URLs Manter as barras duplas nos URL Do not collapse duplicate slashes in URLs. Não reduzir as barras duplicadas nos URL. Keep the original query-string order Manter a ordem original da query string Do not reorder query-string parameters when deduplicating URLs. Não reordenar os parâmetros da query string ao eliminar URL duplicados. Strip query keys: Remover chaves da query string: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Chaves da query string, separadas por vírgulas, a remover da nomeação dos ficheiros guardados (por ex. sid,utm_source). Write a WARC archive of the crawl Escrever um arquivo WARC do rastreio Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Guardar também cada resposta transferida num arquivo WARC/1.1 ISO-28500, ao lado do espelho. WARC archive name: Nome do arquivo WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Nome base opcional para o arquivo WARC; deixe em branco para o nomear automaticamente no diretório de saída. httrack-3.49.14/lang/Portugues-Brasil.txt0000644000175000017500000012011415230602340013700 LANGUAGE_NAME Português-Brasil LANGUAGE_FILE Portugues-Brasil LANGUAGE_ISO pt_BR LANGUAGE_AUTHOR Paulo Neto (layoutbr at lexxa.com.br) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Portuguese (Brazil) OK OK Cancel Cancelar Exit Sair Close Fechar Cancel changes Cancelar alterações Click to confirm Clique para confirmar Click to get help! Clique para obter ajuda Click to return to previous screen Clique para voltar Click to go to next screen Clique para prosseguir Hide password Ocultar senha Save project Salvar projeto Close current project? Fechar o projeto atual? Delete this project? Excluir este projeto? Delete empty project %s? Excluir o projeto vazio %s? Action not yet implemented Ação ainda não implementada Error deleting this project Erro ao excluir este projeto Select a rule for the filter Escolha uma regra para o filtro Enter keywords for the filter Digite aqui as palavras para filtrar Cancel Cancelar Add this rule Adicionar esta regra Please enter one or several keyword(s) for the rule Digite uma ou mais palavras para esta regra Add Scan Rule Adicionar filtro Criterion Escolha uma regra String Escolha uma senha Add Adicionar Scan Rules Regras de filtragem Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Pode-se excluir ou aceitar várias URL's ou links, usando (*) ou (?)\n Pode-se usar vírgulas (,) ou espaços entre os filtros.\n\n Por Exemplo: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Excluir links Include link(s) Incluir links Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Dica: Se você quiser incluir todos os gif's da web, usar algo como +www.algumacoisa.com/*.gif. \n(+*.gif / -*.gif irá incluir/excluir TODOS os gif's de todos os sites) Save prefs Salvar preferências Matching links will be excluded: Estes links serão proibidos Matching links will be included: Estas regras serão incluidas Example: Exemplo: gif\r\nWill match all GIF files gif\r\nDetectará todos os arquivos gif (ou arquivos GIF) blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' verde\r\nDetectará todos os arquivos contendo verde, tais como 'verdepiscina.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' grande.mov\r\nDetectará o arquivo 'grande.mov', porém não 'grande2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nDetectará links em diretórios contendo 'cgi' tais como /cgi-bin/algumacoisa.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nDetectará links (diretórios) com nomes 'cgi-bin (porém não cgi-bin-2, por exemplo) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. algumacoisa.com\r\nDetectará todos os links como www.algumacosia.com, privado.algumacoisa.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. algumsite\r\nDetectará links como www.algumsite.com, www.algumsite.edu, private.algumsite.outrosite.com, etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) ww.algumsite.com\r\nDetectará todos os links como ww.algumsite.com/... (porém não links como private.algumsite.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. algumsite\r\nDetectará todos os links como www.algumsite.com/.., www.teste.abc/dealgumsite/index.html, www.teste.abc/teste/algumsite.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.teste.com/teste/algumsite.html\r\nApenas detectará links como www.teste.com/teste/algumsite.html. Note que você terá que digitar ambos os endereços (www.xxx.yyy) e caminhos (/teste/algumsite.html) All links will match Todos os links serão detectados Add exclusion filter Adicionar filtro de exclusão Add inclusion filter Adicionar filtro de inclusão Existing filters Filtros existentes Cancel changes Cancelar alterações Save current preferences as default values Salvar preferências atuais como valores padrão Click to confirm Clique para confirmar No log files in %s! Não há relatórios em %s! No 'index.html' file in %s! Não existe o arquivo index.html em %s! Click to quit WinHTTrack Website Copier Click para sair do Website WinHTTrack Copier View log files Visualizar relatórios Browse HTML start page Navegar para a página inicial End of mirror Cópia finalizada View log files Visualizar relatórios Browse Mirrored Website Explorar a cópia do site New project... Novo projeto... View error and warning reports Visualizar relatórios de erros e avisos View report Visualizar informações do relatório Close the log file window Fechar janela do relatório Info type: Tipo de informação: Errors Erros Infos Informações Find Localizar Find a word Localizar uma palavra Info log file Arquivo de registro de informações Warning/Errors log file Aviso/Arquivo de registro de erros Unable to initialize the OLE system Não foi possível iniciar o sistema OLE WinHTTrack could not find any interrupted download file cache in the specified folder! O WinHTTrack não pode encontar nenhuma cópia finalizada na pasta especificada! Could not connect to provider Não foi possível conectar ao provedor receive receber request Solicitar connect Conectar search Localizar ready preparado error erro Receiving files.. Recebendo arquivos... Parsing HTML file.. Analisando arquivo HTML... Purging files.. Limpando arquivos... Loading cache in progress.. Carregando cache... Parsing HTML file (testing links).. Analizando arquivo HTML (testando links)... Pause - Toggle [Mirror]/[Pause download] to resume operation Pausa - Escolher [Cópia do site]/[Suspender download] para prosseguir operação Finishing pending transfers - Select [Cancel] to stop now! Finalizando transferências pendentes - Selecione [Cancelar] para parar agora! scanning analisando Waiting for scheduled time.. Aguardando horário agendado... Transferring data.. Transferindo dados.. Connecting to provider Conectando ao provedor [%d seconds] to go before start of operation [%d segundos] antes de iniciar a operação Site mirroring in progress [%s, %s bytes] Processo de recebimento [%s, %s bytes] Site mirroring finished! Cópia do site finalizada! A problem occurred during the mirroring operation\n Ocorreu um problema durante a operação de recebimento\n \nDuring:\n Durante:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Veja o relatório se necessário.\n\nClique OK para sair do WinHTTrack.\n\nObrigado por usar o WinHTTrack Website Copier! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Cópia finalizada.\nClique OK para sair.\nVeja o relatório para verificar se está tudo OK.\n\nObrigado por utilizar o WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * CÓPIA INTERROMPIDA! * *\r\nO cache temporário atual é necessário para qualquer operação de atualização e somente contém dados carregados durante a presente sessão.\r\nÉ possível que o cache anterior contenha dados mais completas; se você não quiser perder esses dados, você deve restaurá-lo e excluir o cache atual.\r\n[Nota: Esta operação pode ser facilmente executada aqui excluindo os arquivos hts-cache/novo.*]\r\n\r\nVocê acredita que o cache anterior pode conter informações mais completas, e você deseja restaurá-lo? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ERRO DE CÓPIA! * *\r\nO HTTrack detectou que a cópia atual está vazia. Se ela fosse uma atualização, a cópia anterior teria sido restaurada.\r\nCausa: a primeira página não foi encontrada, ou um problema de conexão ocorreu.\r\n=> Assegure-se de que o website existe, e/ou verifique suas configurações proxy! <= \n\nTip: Click [View log file] to see warning or error messages Dica: Clique [Ver relatório] para visualizar avisos e as mensagens de erro Error deleting a hts-cache/new.* file, please do it manually Erro ao excluir o arquivo hts-cache/novo.*, por favor faça isto manualmente Do you really want to quit WinHTTrack Website Copier? Você quer realmente sair do WinHTTrack Website? - Mirroring Mode -\n\nEnter address(es) in URL box - Método da cópia automática -\n\nIntroduza o(s) endereço(s) na caixa de URL's - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Método de cópia com assistente (faz perguntas) -\n\nDigite o(s) endereço(s) na caixa de URL's - File Download Mode -\n\nEnter file address(es) in URL box - Método de download do arquivo -\n\nIntroduza o(s) endereço(s) do(s) arquivo(s) na caixa de URL. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Método de teste dos Links -\n\nIntroduza o(s) endreço(s) da(s) página(s) contendo os links para testar na caixa de URL. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Método de atualização -\n\nVerifique o(s) endereço(s) na caixa de URL's, verifique os parâmetros se necessário e então clique o botão 'AVANÇAR'. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Método de continuação (Operação Interrompida) -\n\nVerifique o(s) endereço(s) na caixa de URL's, verifique os parâmetros se necessário e então clique o botão 'AVANÇAR'. Log files Path Caminho do arquivo de relatório Path Caminho - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Método da lista de links -\n\nUtilize a caixa URL's para digitar o(s) endereço(s) da(s) página(s) contendo links para recebimento. New project / Import? Novo projeto / Importar? Choose criterion Escolher uma ação Maximum link scanning depth Profundidade máxima de rastreamento Enter address(es) here Digite o(s) endereço(s) aqui Define additional filtering rules Definir filtros adicionais Proxy Name (if needed) Nome do Proxy (se necessário) Proxy Port Porta do servidor proxy Define proxy settings Definir configurações do servidor proxy Use standard HTTP proxy as FTP proxy Utilizar proxy HTTP padrão como proxy FTP Path Caminho Select Path Selecionar caminho Path Caminho Select Path Selecionar caminho Quit WinHTTrack Website Copier Sair do WinHTTrack Website Copier About WinHTTrack Sobre o WinHTTrack Save current preferences as default values Salvar preferências atuais como valor padrão Click to continue Clique para continuar Click to define options Clique para definir opções Click to add a URL Clique para adicionar uma URL Load URL(s) from text file Carregar URL's de um arquivo texto WinHTTrack preferences (*.opt)|*.opt|| Preferências do WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Arquivo de texto da lista de endereços (*.txt)|*.txt|| File not found! Arquivo não encontrado! Do you really want to change the project name/path? Você deseja realmente alterar o nome/caminho do projeto? Load user-default options? Carregar opções padrão do usuário? Save user-default options? Salvar opções padrão do usuário? Reset all default options? Refazer todas as opções padrão? Welcome to WinHTTrack! Bem-vindo ao WinHTTrack Website Copier! Action: Ação: Max Depth Profundidade máxima: Maximum external depth: Máximo de profundidade externa: Filters (refuse/accept links) : Filtros (incluir/excluir links) Paths Caminhos Save prefs Salvar preferências Define.. Definir... Set options.. Definir as opções... Preferences and mirror options: Parâmetros e opções de cópia do site Project name Nome do projeto Add a URL... Adicionar URL... Web Addresses: (URL) Endereço Web: (URL) Stop WinHTTrack? Suspender o WinHTTrack? No log files in %s! Nenhum relatório em %s! Pause Download? Suspender a cópia do site? Stop the mirroring operation Parar recebimento Minimize to System Tray Minimizar para barra de sistema Click to skip a link or stop parsing Clique para ignorar um link ou interromper a cópia Click to skip a link Clique para ignorar um link Bytes saved Bytes gravados: Links scanned Link(s) processado(s) Time: Tempo: Connections: Conexões: Running: Em execução: Hide Minimizar Transfer rate Taxa de transferência: SKIP IGNORAR Information Informações Files written: Arquivos gravados: Files updated: Arquivos atualizados: Errors: Erros: In progress: Em progresso: Follow external links Copiar arquivos mesmo em links externos Test all links in pages Testar todos os links da página Try to ferret out all links Tentar detectar todos os links Download HTML files first (faster) Transferir primeiro os arquivos HTML (mais rápido) Choose local site structure Escolher estrutura local dos arquivos Set user-defined structure on disk Configurar estrutura definida pelo usuário no disco Use a cache for updates and retries Usar cache para atualizações e novas tentativas Do not update zero size or user-erased files Não atualizar arquivos presentes, com tamanho zero ou excluídos pelo usuário Create a Start Page Criar uma página inicial Create a word database of all html pages Criar uma base de dados da palavra de todas páginas HTML Build a complete RFC822 mail (MHT/EML) archive of the mirror Criar arquivo de e-mail RFC822 completo (MHT/EML) do espelho Create error logging and report files Criar relatórios de erros e informações Generate DOS 8-3 filenames ONLY Gerar SOMENTE nomes de arquivos DOS (8+3 caracteres) Generate ISO9660 filenames ONLY for CDROM medias Gerar nomes de arquivo ISO9660 SOMENTE para mídias de CDROM Do not create HTML error pages Não criar páginas de erro HTML Select file types to be saved to disk Selecionar tipos de arquivos para salvar Select parsing direction Selecionar direção de navegação no site Select global parsing direction Selecionar direção geral do site Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Configurar regras de substituição de URL para links internos (já recebidos) e links externos (ainda não recebidos) Max simultaneous connections Máximo de conexões simultâneas File timeout Tempo limite de espera por um arquivo Cancel all links from host if timeout occurs Cancelar todos os links de um servidor se ocorrer 'excesso de tempo' Minimum admissible transfer rate Taxa mínima de transferência Cancel all links from host if too slow Cancelar todos os links de um servidor se ele for demasiadamente lento Maximum number of retries on non-fatal errors Número máximo de tentativas se um erro não fatal ocorrer Maximum size for any single HTML file Tamanho máximo de cada página HTML Maximum size for any single non-HTML file Tamanho máximo de cada arquivo Maximum amount of bytes to retrieve from the Web Número máximo de bytes para copiar da Web Make a pause after downloading this amount of bytes Pausar após fazer o download desta quantidade de bytes Maximum duration time for the mirroring operation Tempo máximo para efetuar a cópia Maximum transfer rate Taxa de transferência máxima Maximum connections/seconds (avoid server overload) Máximo de conexões/segundos (para evitar sobrecarga dos servidores) Maximum number of links that can be tested (not saved!) Número de máximo de links que pode ser testado (não armazenado!) Browser identity Indentidade do navegador Comment to be placed in each HTML file Notas de rodapé em cada arquivo HTML Languages accepted by the browser Idiomas aceitos pelo navegador Additional HTTP headers to be sent in each requests Cabeçalhos HTTP adicionais para serem enviados em cada solicitação HTTP referer to be sent for initial URLs Referenciador HTTP a ser enviado para URLs iniciais Back to starting page Voltar à página inicial Save current preferences as default values Salvar preferências atuais como valor padrão Click to continue Clique para continuar Click to cancel changes Clique para cancelar alterações Follow local robots rules on sites Seguir as regras de mecanismo local para o site Links to non-localised external pages will produce error pages Links para páginas externas não localizadas produzirão páginas de erro Do not erase obsolete files after update Não excluir arquivos obsoletos após atualização Accept cookies? Aceitar cookies? Check document type when unknown? Verificar tipo do documento se for desconhecido? Parse java applets to retrieve included files that must be downloaded? Analisar applets JAVA para incluir arquivos recuperados que deverão ser recebidos? Store all files in cache instead of HTML only Armazenar todos os arquivos no cache em vez de somente HTML Log file type (if generated) Tipo de relatório (se gerado) Maximum mirroring depth from root address Profundidade máxima de recebimento do endereço raiz Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Máximo de profundidade de espelhamento externo/endereços proibidos (0, isto é, nenhum, é o padrão) Create a debugging file Criar um arquivo de debug Use non-standard requests to get round some server bugs Tentar evitar alguns erros do servidor usando chamadas não padrão Use old HTTP/1.0 requests (limits engine power!) Utilizar chamadas antigas HTTP/1.0 limita a capacidade de captura! Attempt to limit retransfers through several tricks (file size test..) Tentativa de limitar a retransferência através de várias maneiras (teste do tamanho do arquivo...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Tentativas para limitar o número de links ignorando URLs similares (www.foo.com==foo.com, http=https ...) Write external links without login/password Gravar links externos sem login/senha Write internal links without query string Gravar links internos sem perguntar Get non-HTML files related to a link, eg external .ZIP or pictures Capturar arquivos não HTML próximo de um link (ex: arquivos .ZIP localizados no exterior) Test all links (even forbidden ones) Testar todos os links (mesmo os proibidos) Try to catch all URLs (even in unknown tags/code) Tentar detectar todas as URL's (mesmo que os códigos sejam desconhecidos) Get HTML files first! Receber arquivos HTML primeiro! Structure type (how links are saved) Tipo de estrutura (como os links são gravados) Use a cache for updates Utilizar cache para atulizações Do not re-download locally erased files Não receber novamente arquivos excluídos localmente Make an index Criar um índice Make a word database Criar um banco de dados de palavras Build a mail archive Criar um arquivo de mensagens Log files Relatórios DOS names (8+3) Nomes DOS (8+3) ISO9660 names (CDROM) Nomes ISO9660 (CDROM) No error pages Sem página de erros Primary Scan Rule Filtro primário Travel mode Método de percurso Global travel mode Método de percurso global These options should be modified only exceptionally Normalmente estas configurações não devem ser alteradas! Activate Debugging Mode (winhttrack.log) Ativar método de debug (winhttrack.log) Rewrite links: internal / external Links substituídos: interno / externo Flow control Controle de fluxo Limits Limites Identity Identificação HTML footer Rodapé do HTML Languages Idiomas Additional HTTP Headers Cabeçalhos HTTP adicionais Default referer URL URL de referência padrão N# connections Número de conexões Abandon host if error Abandonar servidor em caso de erro Minimum transfer rate (B/s) Taxa de transferência mínima (bps) Abandon host if too slow Abandonar site se for lento demais Configure Configurar Use proxy for ftp transfers usar servidor proxy para transferências FTP TimeOut(s) Limite de tempo Persistent connections (Keep-Alive) Conexões persistentes (Manter Ativo) Reduce connection time and type lookup time using persistent connections Reduza o tempo de conexão e o tempo do tipo de pesquisa usando conexões persistentes Retries Tentativas Size limit Limite de tamanho Max size of any HTML file (B) Tamanho máximo dos arquivos html: Max size of any non-HTML file Tamanho máximo de outros arquivos: Max site size Tamanho máximo do site Max time Tempo máximo de captura Save prefs Salvar preferências Max transfer rate Taxa de transferência máxima Follow robots.txt Seguir regras do arquivo robots.txt No external pages Sem páginas externas Do not purge old files Não excluir arquivos antigos Accept cookies Aceitar cookies Check document type Verificar tipos de documento Parse java files Analizar arquivos JAVA Store ALL files in cache Armazenar todos os arquivos no cache Tolerant requests (for servers) Requisição de tolerância (para servidores) Update hack (limit re-transfers) Corte de atualização (limite da retransferência) URL hacks (join similar URLs) URL hacks (unir URLs similares) Force old HTTP/1.0 requests (no 1.1) Forçar requisição HTTP/1.0 anterior (não 1.1) Max connections / seconds Número máximo de conexões/segundos Maximum number of links Número máximo de links Pause after downloading.. Suspender após copiar... Hide passwords Ocultar senha Hide query strings Ocultar seqüencia de perguntas Links Links Build Estrutura Experts Only Somente especialistas Flow Control Controle de fluxo Limits Limites Browser ID Identidade do navegador Scan Rules Filtros Spider Indexador Log, Index, Cache Relatório, Índice, Cache Proxy Servidor proxy MIME Types Tipos MIME Do you really want to quit WinHTTrack Website Copier? Você deseja realmente sair do WinHTTrack Website Copier? Do not connect to a provider (already connected) Não conectar ao provedor (se já estabelecida) Do not use remote access connection Não usar acesso remoto de conexão Schedule the mirroring operation Programar uma operação alternativa Quit WinHTTrack Website Copier Sair do WinHTTrack Website Copier Back to starting page Voltar à página inicial Click to start! Clique para iniciar No saved password for this connection! Não salvar senha para esta conexão! Can not get remote connection settings Não foi possível obter parâmetros de conexão Select a connection provider Selecionar uma conexão ao provedor de acesso Start Iniciar Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Favor ajustar os parâmetros de conexão se necessário,\nentão pressione INICIAR para carregar a operação alternativa Save settings only, do not launch download now. Somente salvar configurações, não carregar agora. On hold Espera Transfer scheduled for: (hh/mm/ss) Aguardar até às: (hh/mm/ss) Start Iniciar Connect to provider (RAS) Provedor de acesso (RAS) Connect to this provider Conectar a este provedor Disconnect when finished Desconectar ao finalizar Disconnect modem on completion Desconectar o modem ao finalizar \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(por favor nos comunique sobre erros ou problemas)\r\n\r\nDesenvolvimento:\r\nInterface (Windows): Xavier Roche\r\nMotor: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche e outros colaboradores\r\nTraduzido para o Português-Brasil por :\r\nPaulo Neto (layoutbr@lexxa.com.br) About WinHTTrack Website Copier Sobre o WinHTTrack Website Copier Please visit our Web page Por favor visite nossa página da Web Wizard query Assistente de dúvidas Your answer: Sua resposta: Link detected.. Um link foi detectado Choose a rule Escolha uma regra Ignore this link Ignorar este link Ignore directory Ignorar diretório Ignore domain Ignorar domínio Catch this page only Capturar somente esta página Mirror site Cópia do site Mirror domain Cópia do domínio Ignore all Ignorar tudo Wizard query Dúvida do assistente NO Não File Arquivo Options Opções Log Relatório Window Janelas Help Ajuda Pause transfer Suspender transferência Exit Sair Modify options Alterar opções View log Visualizar relatório View error log Visualizar relatórios de erros View file transfers Visualizar transferência dos arquivos Hide Ocultar About WinHTTrack Website Copier Sobre o WinHTTrack Website Copier Check program updates... Verificar atualizações do programa &Toolbar Barra de ferramentas &Status Bar Barra de status S&plit Dividir File Arquivo Preferences Opções Mirror Cópia do site Log Relatório Window Janelas Help Ajuda Exit Sair Load default options Carregar opções padrão Save default options Salvar opções padrão Reset to default options Excluir opções padrão Load options... Carregar opções Save options as... Salvar opções como... Language preference... Preferências do idioma... Contents... Conteúdo... About WinHTTrack... Sobre o WiHTTrack Website Copier New project\tCtrl+N Novo projeto\tCtrl+N &Open...\tCtrl+O &Abrir...\tCtrl+O &Save\tCtrl+S &Salvar\tCtrl+S Save &As... Salvar &como... &Delete... &Excluir... &Browse sites... &Procurar sites... User-defined structure Estrutura definida pelo usuário %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNome do arquivo sem extensão (ex.: imagem)\r\n%N\tNome do arquivo com extensão (ex.: imagem.gif)\r\n%t\tExtensão (ex.: gif)\r\n%p\tCaminho (sem o / final) (ex.: /imagens)\r\n%h\tNome do servidor (ex.: www.algumsite.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tsequência de pesquisa MD5 (128 bits, 32 ascii bytes)\r\n%q\tpequena sequência de pesquisa MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tNome curto (ex.: %sN ) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Exemplo:\t%h%p/%n%q.%t\n->\t\tc:\\alternativo\\www.algumsite.com\\algumasimagens\\imagem.gif Proxy settings Configuração do servidor proxy Proxy address: Endereço do servidor proxy: Proxy port: Porta do servidor proxy: Authentication (only if needed) Identificação (se necessário) Login Nome do usuário (Login) Password Senha Enter proxy address here Digite o endereço proxy Enter proxy port here Digite a porta do proxy aqui Enter proxy login Digite o login do proxy Enter proxy password Digite a senha do proxy Enter project name here Digite o nome do projeto aqui Enter saving path here Digite o caminho para salvar o projeto aqui Select existing project to update Selecionar um projeto existente para atualizar Click here to select path Clique aqui para selecionar o caminho Select or create a new category name, to sort your mirrors in categories Selecionar ou criar uma nova categoria, para classificar seus espelhos nas categorias HTTrack Project Wizard... Assistente de projetos HTTrack... New project name: Nome do novo projeto: Existing project name: Nome do projeto existente: Project name: Nome do projeto: Base path: Caminho base: Project category: Categoria do projeto: C:\\My Web Sites C:\\Meus Sites Type a new project name, \r\nor select existing project to update/resume Digite um nome para o novo projeto, \r\nou escolha um projeto existente para continuar/atualizar. New project Novo projeto Insert URL Inserir URL URL: URL: Authentication (only if needed) Identificação (se necessária) Login Login: Password Senha: Forms or complex links: Formulários ou links complexos: Capture URL... Capturar URL... Enter URL address(es) here Digite aqui o(s) endereço(s) URL Enter site login Digite o login do site Enter site password Digite a senha do site Use this capture tool for links that can only be accessed through forms or javascript code Use esta ferramenta para capturar os links que podem ser acessados através de um formulário ou código javascript Choose language according to preference Selecione o seu Idioma aqui Catch URL! Capturar URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Favor configurar uma navegação proxy temporária no seu Navegador para os seguintes valores (Copiar/Colar Endereço Proxy e Porta).\n Então clique no botão ENVIAR do formulário em sua página do navegador, ou clique no link específico que você deseja capturar. This will send the desired link from your browser to WinHTTrack. Isto enviará o link pretendido do seu navegador para o WinHTTrack. ABORT ABORTAR Copy/Paste the temporary proxy parameters here Copiar/Colar os parâmetros temporárias do proxy aqui Cancel Cancelar Unable to find Help files! Não foi possível encontrar os arquivos de ajuda! Unable to save parameters! Não foi possível salvar os parâmetros! Please drag only one folder at a time Por favor arraste apenas uma pasta de cada vez Please drag only folders, not files Por favor arraste somente pastas, não arquivos Please drag folders only Por favor arraste somente pastas Select user-defined structure? Selecionar estrutura definida pelo usuário? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Assegure-se que a sequência definida pelo usuário está correta.\nDe outro modo, o nome dos arquivos serão incorretos! Do you really want to use a user-defined structure? Você deseja realmente selecionar uma estrutura definida pelo usuário? Too manu URLs, cannot handle so many links!! Muitas URLs, não é possivel manejar tantos links!! Not enough memory, fatal internal error.. Memória insuficiente, erro fatal interno... Unknown operation! Operação desconhecida! Add this URL?\r\n Adicionar esta URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Atenção: o processo principal não está respondendo, não foi possivel adicionar URL(s). Type/MIME associations Associações tipo/MIME File types: Tipos de arquivo: MIME identity: MIME identity Select or modify your file type(s) here Selecionar ou modificar seu(s) tipo(s) de arquivo(s) aqui Select or modify your MIME type(s) here Selecionar ou modificar seu(s) tipo(s) de arquivo(s) MIME aqui Go up Ir para cima Go down Ir para baixo File download information Informações do(s) arquivo(s) recebido(s) Freeze Window Fixar janela More information: Mais informações: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Bem-vindo ao WinHTTrack Website Copier!\n\nFavor clicar o botão AVANÇAR para\n\niniciar um novo projeto ou retomar o download parcial. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Tipos de arquivo:\nNomes de arquivo contendo:\nNome deste arquivo:\nNomes de pasta contendo:\nNome desta pasta:\nLinks deste domínio:\nLinks no domínio contendo:\nLinks deste servidor:\nLinks contendo:\nEste link:\nTODOS OS LINKS Show all\nHide debug\nHide infos\nHide debug and infos Exibir tudo\nOcultar erros\nOcultar informações\nOcultar erros e informações Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Estrutura do site (padrão)\nHtml na web/, imagens/outros arquivos na web/imagens/\nHtml na web/html, imagens/outros na web/imagens\nHtml na web/, imagens/outros na web/\nHtml na web/, imagens/outros na web/xxx, quando xxx é a extensão do arquivo\nHtml na web/html, imagens/outros na web/xxx\nEstrutura do site, sem www.dominio.xxx/\nHtml no nome_do_site/, imagens/outros no nome_do_site/imagens/\nHtml no nome_do_site/html, imagens/outros no nome_do_site/imagens\nHtml no nome_do_site/, imagens/outros no nome_do_site/\nHtml no nome_do_site/, imagens/outros no nome_do_site/xxx\nHtml no nome_do_site/html, imagens/outros no nome_do_site/xxx\nTodos os arquivos na web/, com nomes aleatórios (gadget !)\nTodos os arquivos no nome_do_site/, com nomes aleatórios (gadget !)\nEstrutura definida pelo usuário.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Somente analisar\nArmazenar arquivos html\nArmazenar arquivos não html\nAmazenar todos os arquivos (padrão)\nArmazenar arquivos html primeiro Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Permanecer no mesmo diretório\nPermite ir para abaixo (padrão)\nPermite ir para cima\nPermite ir para cima & para baixo Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Permanecer no mesmo endereço (padrão)\nPermanecer no mesmo domínio\nPermanecer no mesmo domínio do nível acima\nIr para todos os lugares da Web Never\nIf unknown (except /)\nIf unknown Nunca\nSe desconhecido (exceto /)\nSe desconhecido no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules nenhuma regra para robots.txt\nregras robots.txt exceto assistente\nseguir regras robots.txt normal\nextended\ndebug normal\nextendido\ncorrigir Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Copiar site(s) da Web\nCopiar site(s) interativos da Web (perguntas)\nReceber arquivos específicos\nCopiar todas as páginas do site (alternação múltipla)\nTestar links nas páginas (testar indicador)\n* Retomar download interrompido\n* Atualizar download existente Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL URI Relativa / URL Absoluta (padrão)\nURL Absoluta / URL Absoluta\nURI Absoluta / URL Absoluta\nURL Original / URL Original Open Source offline browser Abrir origem offline no navegador Website Copier/Offline Browser. Copy remote websites to your computer. Free. Copiador de website/Navegador Offline. Copia sites remotos para seu computador. Gratuito. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, navegador offline URL list (.txt) Lista de URL (.txt) Previous Anterior Next Próximo URLs URLs Warning Atenção Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Seu Navegador atualmente não suporta javascript. Para melhores resultados, favor usar um navegador com javascript-aware. Thank you Obrigado You can now close this window Você pode fechar esta janela agora Server terminated Servidor finalizado A fatal error has occurred during this mirror Um erro fatal ocorreu durante este espelho View Documentation Exibir documentação Go To HTTrack Website Ir Para o Site do HTTrack Go To HTTrack Forum Ir Para o Fórum do HTTrack View License Exibir Licença Beware: you local browser might be unable to browse files with embedded filenames Cuidado: seu navegador local pode não conseguir procurar arquivos com nomes de arquivos incorporados Recreated HTTrack internal cached resources Recursos em cache internos do HTTrack recriados Could not create internal cached resources Não foi possível criar recursos em cache internos Could not get the system external storage directory Não foi possível obter o diretório de armazenamento externo do sistema Could not write to: Não foi possível gravar em: Read-only media (SDCARD) Mídia somente leitura (SDCARD) No storage media (SDCARD) Nenhuma mídia de armazenamento (SDCARD) HTTrack may not be able to download websites until this problem is fixed O HTTrack pode não conseguir baixar sites até que esse problema seja corrigido HTTrack: mirror '%s' stopped! HTTrack: espelho '%s' interrompido! Click on this notification to restart the interrupted mirror Clique nesta notificação para reiniciar o espelho interrompido HTTrack: could not save profile for '%s'! HTTrack: não foi possível salvar o perfil para '%s'! Proxy type: Tipo de proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protocolo do proxy. HTTP: proxy padrão. HTTP (túnel CONNECT): envia cada requisição através de um túnel CONNECT, para proxies que só suportam CONNECT como o HTTPTunnelPort do Tor. SOCKS5: porta padrão 1080. Load cookies from file: Carregar cookies de um arquivo: Preload cookies from a Netscape cookies.txt file before crawling. Pré-carregar cookies de um arquivo Netscape cookies.txt antes de iniciar a cópia. Pause between files: Pausa entre arquivos: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Atraso aleatório entre downloads de arquivos, em segundos. Use MIN:MAX para um intervalo aleatório (ex.: 2:8). Keep the www. prefix (do not merge www.host with host) Manter o prefixo www. (não mesclar www.host com host) Do not treat www.host and host as the same site. Não tratar www.host e host como o mesmo site. Keep double slashes in URLs Manter as barras duplas nas URLs Do not collapse duplicate slashes in URLs. Não reduzir as barras duplicadas nas URLs. Keep the original query-string order Manter a ordem original da query string Do not reorder query-string parameters when deduplicating URLs. Não reordenar os parâmetros da query string ao remover URLs duplicadas. Strip query keys: Remover chaves da query string: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Chaves da query string, separadas por vírgulas, a serem removidas da nomeação dos arquivos salvos (ex.: sid,utm_source). Write a WARC archive of the crawl Gravar um arquivo WARC do rastreamento Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Salvar também cada resposta baixada em um arquivo WARC/1.1 ISO-28500, ao lado do espelho. WARC archive name: Nome do arquivo WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Nome base opcional para o arquivo WARC; deixe em branco para nomeá-lo automaticamente no diretório de saída. httrack-3.49.14/lang/Polski.txt0000644000175000017500000011340415230602340011736 LANGUAGE_NAME Polski LANGUAGE_FILE Polski LANGUAGE_ISO pl LANGUAGE_AUTHOR Lukasz Jokiel (Opole University of Technology, Lukasz.Jokiel at po.opole.pl) \r\n LANGUAGE_CHARSET ISO-8859-2 LANGUAGE_WINDOWSID Polish OK OK Cancel Anuluj Exit Wyjœcie Close Zamknij Cancel changes Cofnij zmiany Click to confirm Kliknij aby potwierdziæ Click to get help! Kliknij aby uzyskaæ pomoc Click to return to previous screen Kliknij aby wróciæ Click to go to next screen Kliknij aby kontynuowaæ Hide password Ukryj has³o Save project Zachowaj projekt Close current project? Czy zamkn¹æ ten projekt ? Delete this project? Czy usun¹æ ten projekt ? Delete empty project %s? Czy usun¹æ pusty projekt %s? Action not yet implemented Funcja jeszcze nie zaimplementowana. Error deleting this project Wyst¹pi³ b³¹d podczas usuwania tego projektu. Select a rule for the filter Wybierz regu³ê dla tego filtra Enter keywords for the filter Podaj s³owa kluczowe dla filtra Cancel Anuluj Add this rule Dodaj ten filter Please enter one or several keyword(s) for the rule Proszê podaæ jedno lub wiele s³ów kluczowych dla tej regu³y Add Scan Rule Dodaj filtr Criterion Wybierz regu³ê String Podaj s³owo kluczowe Add Dodaj Scan Rules Filtry Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Mo¿esz teraz wykluczyæ lub zaakceptowaæ klika URLi lub ³aczy, dzieki u¿yciu wildcards.\nMo¿esz u¿yæ tak¿e spacji pomiêdzy filtrami.\nPrzyk³ad: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Wyklucz ³¹cza Include link(s) Zaakceptuj ³¹cza Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tip: Je¿eli chcesz zaakceptowaæ wszystkie gify na stronie(nach) u¿yj czegoœ w rodzaju +www.pewnastrona.com/*.gif.\n(+*.gif / -*.gif zaakceptuje/odrzuci WSZYSTKIE gify na WSZYSTKICH stornach) Save prefs Zapisz ustawienia Matching links will be excluded: £¹cza objête t¹ regu³¹ zostan¹ zignorowane (odrzucone): Matching links will be included: £¹cza objête t¹ regu³¹ zostan¹ zaakceptowane: Example: Przyk³ad: gif\r\nWill match all GIF files gif\r\nZnajdzie wszystkie gify blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' niebieskie\r\nZnajdzie wszystkie pliki zawieraj¹ce cz³on 'niebieskie', takie jak 'niebieskieniebo-maly.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' duzyplik.mov\r\nZnajdzie plik 'duzyplik.mov', ale nie 'duzyplik.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nZnajdzie ³¹cza z katalogiem zawieraj¹cym 'cgi' takie jak '/cgi-bin/pewnecgi.cgi' cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nZnajdzie ³¹cza z katalogiem zawieraj¹cym 'cgi-bin', ale na przyk³ad nie 'cgi-bin-2' someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. pewnastrona.com\r\nZnajdzie wszystkie ³¹cza takie jak www.pewnastrona.com, members.pewnastrona.com itd. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. pewnastrona\r\nZnajdzie wszystkie ³¹cza takie jak www.pewnastrona.com, www.pewnastrona.pl, www.pewnastrona.innastrona.edu itd. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.pewnastrona.com\r\nZnajdzie wszystkie ³¹cza takie jak www.pewnastrona.com/ ... (lecz nie takie jak members.pewnastrona.com/...) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. pewnastrona\r\nZnajdzie wszystkie ³acza takie jak www.pewnastrona.com/.., www.test.abc/mojapewnastrona/index.html, www.test.abc/test/pewnastrona.html itd. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/pewnastrona.html\r\nZnajdzie tylko ³¹cza typu www.test.com/test/pewnastrona.html. Zauwa¿, ¿e nale¿y wpisaæ zarówno adres (www.xxx.yyy), jak i œcie¿kê (/test/pewnastrona.html) All links will match Wszystkie ³acza bêd¹ akceptowane/ignorowane (odrzucone) Add exclusion filter Dodaj filtr, który bêdzie ignorowa³ (odrzuca³) Add inclusion filter Dodaj filtr, który bedzie akceptowa³. Existing filters Dodatkowe filtry Cancel changes Anuluj zmiany Save current preferences as default values Zapisz domyœlne ustawienia Click to confirm Kliknij aby potwierdziæ No log files in %s! Brak plików z logami w %s! No 'index.html' file in %s! Brak pliku index.html w %s! Click to quit WinHTTrack Website Copier Kliknij aby opuœciæ WinHTTrack Website Copier View log files Poka¿ pliki z logami Browse HTML start page Poka¿ stronê startow¹ html End of mirror Koniec tworzenia lustra (mirroru) View log files Poka¿ logi Browse Mirrored Website Otwórz kopiê strony Web New project... Nowy projekt View error and warning reports Poka¿ raport o b³êdach i ostrze¿eniach View report Poka¿ raport informacyjny Close the log file window Zamkinj okno z raportami Info type: Typ informacji Errors B³êdy Infos Informacje Find Szukaj Find a word ZnajdŸ s³owo Info log file Raport informacyjny Warning/Errors log file Raport o b³êdach i ost¿erzeniach Unable to initialize the OLE system Nie moge zainicjalizowac OLE WinHTTrack could not find any interrupted download file cache in the specified folder! W tym katalogu nie ma cache\r\nWinHTTrack nie mo¿e znaleŸæ ¿adnego przerwanego lustra (mirroru) Could not connect to provider Po³¹czenie z us³ugodawc¹ by³o niemo¿liwe receive odbieram request ¿¹dam connect ³¹czenie search szukaæ ready gotów error b³¹d Receiving files.. Pobieram pliki... Parsing HTML file.. Parsowanie pliku HTML Purging files.. Czyszczê pliki... Loading cache in progress.. Trwa wczytywanie cache... Parsing HTML file (testing links).. Parsowanie pliku HTML (testowanie ³¹cz) Pause - Toggle [Mirror]/[Pause download] to resume operation Pauzujê (wybierz Lustro/Pauzuj transfer) aby kontunuowaæ) Finishing pending transfers - Select [Cancel] to stop now! Zatrzymywanie transferów w trakcie realizacji - Wybierz [Anuluj] aby zatrzymaæ teraz! scanning skanujê Waiting for scheduled time.. Czekam na okreœlon¹ godzinê aby wystartowaæ Connecting to provider £¹cze siê z us³ugodawc¹ [%d seconds] to go before start of operation Lustro czeka (%d sekund(ê)) aby wystartowaæ Site mirroring in progress [%s, %s bytes] Tworzenie lustra w toku (%s, %s bajtów) Site mirroring finished! Zakoñczono tworzenie lustra (mirroru) A problem occurred during the mirroring operation\n Poajwi³ siê problem podczas tworzenia lustra\r\n \nDuring:\n Podczas:\r\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Je¿eli jest to wymagane sprawdŸ logi.\r\nKliknij OK aby wyjœæ z WinHTTrack Website Copier.\r\nDziêkujemy za u¿ywanie HTTrack ! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Zakoñczono tworzenie lustra.\r\nKliknij OK aby wyjœæ z WinHTTrack.\r\nSprawdŸ logi, upewnij siê, czy wszystko przebieg³o dobrze.\r\nDziêkujemy za u¿ywanie HTTrack ! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * TWORZENIE LUSTRA PRZERWANE! * *\r\nObecnie wykorzystywany cache, wymagany dla jakichkolwiek operacji uaktualniaj¹cych zawiera jedynie dane z obecnej przerwanej sesji.\r\nPoprzedni cache mo¿e zawieraæ bardziej kompletne dane; jeœli nie chcesz ich straciæ, przywróæ je i usuñ obecny cache.\r\n[Uwaga: Mo¿esz to ³atwo zrobiæ tutaj poprzez skasowanie htscache/new.* pliki]\r\nCzy uwa¿asz, ¿e poprzedni cache mo¿e zawieraæ bardziej kompletne informacje i czy przywróciæ go ? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * B£¡D LUSTRA! * *\r\nHTtrack stwierdza ze obecne lustro jest puste. Je¶li by³o to uaktualnienie, to przywrócono poprzedni± wersjê lustra. Powód: Nie mo¿na by³o odczytaæ pierwszych stron lub wyst±pi³ b³±d po³±czenia.\r\n=> Upewnij siê czy strona ci±gle istnieje, lub te¿ sprawd¼ ustawienia proxy! <= \n\nTip: Click [View log file] to see warning or error messages Tip: Kliknij (Poka¿ logi) aby zobaczyæ informacje o b³êdach i ostrze¿eniach Error deleting a hts-cache/new.* file, please do it manually B³¹d podczas kasowania hts-cache/new.* plik/ów, proszê zrobiæ to rêcznie Do you really want to quit WinHTTrack Website Copier? Czy naprawdê chcesz wyjœæ z HTTrack ? - Mirroring Mode -\n\nEnter address(es) in URL box - Tryb tworzenia lustra -\n\nPodaj adres(y) w miejscu na URL. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Tryb tworzenia lustra z kreatorem (zadaje pytania) -\n\nPodaj adres(y) w miejscu na URL. - File Download Mode -\n\nEnter file address(es) in URL box - Tryb pobierania plików -\n\nPodaj adres(y) w miejscu na URL. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Tryb testowania ³¹cz -\n\nPodaj adres(y) stron zawieraj¹cy ³¹cza do testowania w miejscu na URL. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Uaktualnij/Kontunuuj tryb lustra -\n\nSprawdŸ adres(y) w miejscu na URL, a nastêpnie wciœnij przycisk Nastêpny' i sprawdŸ parametry. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Kontunuuj przerwany tryb lustra -\n\nSprawdŸ adres(y) w miejscu na URL, a nastêpnie wciœnij przycisk Nastêpny' i sprawdŸ parametry. Log files Path Œcie¿ka dla raportów Path Œcie¿ka - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Tryb listy lustra, podaj adres(y) stron zawieraj¹ce ³¹cza do lustra w miejscu na URL. New project / Import? Nowy projekt / importowaæ ? Choose criterion Wybierz dzia³anie Maximum link scanning depth Maksymalna g³êbokoœæ ³¹cz do skanowania Enter address(es) here Tutaj podaj adres Define additional filtering rules Zdefiniuj dodatkowe filtry Proxy Name (if needed) Proxy (je¿eli wymagane) Proxy Port Port proxy Define proxy settings Zdefiniuj ustawienia proxy Use standard HTTP proxy as FTP proxy U¿yj standardowego proxy HTTP jako proxy FTP Path Œcie¿ka Select Path Wybierz œcie¿kê Path Œcie¿ka Select Path Wybierz œcie¿kê Quit WinHTTrack Website Copier Wyjœcie z WinHTTrack Website Copier About WinHTTrack O... WinHTTrack Save current preferences as default values Zapisz domyœlne opcje Click to continue Kliknij, aby kontunowaæ Click to define options Kliknij, aby zdefiniowaæ opcjê Click to add a URL Kliknij, aby dodaæ URL Load URL(s) from text file Wczytaj URLe z pliku tekstowego WinHTTrack preferences (*.opt)|*.opt|| Opcje WinHTTrack (*.opt)|*.opt|\r\n Address List text file (*.txt)|*.txt|| Tekstowy plik z adresami (*.txt)|*.txt|| File not found! Nie odnaleziono pliku! Do you really want to change the project name/path? Czy naprawdê chesz zmieniæ nazwê projektu/œcie¿kê ? Load user-default options? Wczytaæ domyœlne opcje u¿ytkownika ? Save user-default options? Zapisaæ domyœlne opcje u¿ytkownika ? Reset all default options? Wyczyœciæ wszystkie domyœlne opcje ? Welcome to WinHTTrack! Witamy w WinHTTrack Website Copier! Action: Dzia³anie: Max Depth Maksymalna g³êbokoœæ Maximum external depth: Maksymalna g³êbokoœæ zewnêtrzna: Filters (refuse/accept links) : Filtry (odrzuæ/akceptuj ³acza): Paths Œcie¿ki Save prefs Zapisz opcje Define.. Definiuj Set options.. Ustaw opcje Preferences and mirror options: Preferencje i opcje lustra Project name Nazwa projektu Add a URL... Dodaj URL... Web Addresses: (URL) Adres strony w Sieci: (URL) Stop WinHTTrack? Zatrzymaæ WinHTTrack? No log files in %s! Brak raportów w %s! Pause Download? Pauzowaæ transfer? Stop the mirroring operation Zatrzymaj tworzenie lustra Minimize to System Tray Schowaj to okno do paseka systemowego Click to skip a link or stop parsing Kliknij aby pomin¹æ ³¹cze lub przerwaæ parsowanie Click to skip a link Kliknij aby pomin¹æ ³¹cze Bytes saved Zapisanych bajtów: Links scanned Zeskanowanych ³¹cz: Time: Czas: Connections: Po³¹czenia: Running: Uruchomione: Hide Schowaj Transfer rate Szybkoœæ transferu: SKIP POMIÑ Information Informacje Files written: Zapisane pliki: Files updated: Zaktualizowane pliki: Errors: B³êdy: In progress: Podczas: Follow external links Pobierz pliki nawet jeœli maj¹ obcy (zwenêtrzny) adres Test all links in pages Przetestuj wszystkie ³¹cza na stronach Try to ferret out all links Spróbuj znaleŸæ (wykryæ) wszystkie ³¹cza Download HTML files first (faster) Najpeirw pobierz pliki HTML (szybsze dzia³anie) Choose local site structure Wybierz strukturê lokalnego serwisu Set user-defined structure on disk Ustaw zdefiniowan¹ przez u¿ytkownika strukturê na dysku Use a cache for updates and retries U¿yj cache dla uaktualnieñ i ponowieñ Do not update zero size or user-erased files Nie pobieraj plików ju¿ obecnych lokalnie, z zerow¹ wielkoœci¹ albo wymazancyh przez u¿ytkownika Create a Start Page Utwórz stronê startow¹ Create a word database of all html pages Utwórz bazê s³ów wystêpuj±cych we wszystkich stronach HTML Create error logging and report files Utwórz pliki z raportem o b³êdach i informacjach Generate DOS 8-3 filenames ONLY Twórz TYLKO pliki z nazw¹ w formacie 8.3 Generate ISO9660 filenames ONLY for CDROM medias Stwórz nazyw plików ISO9660 TYLKO dla CDROM Do not create HTML error pages Nie zapisuj stron html z informacj¹ o b³êdzie Select file types to be saved to disk Wybierz typy plików, które zostan¹ zapisane na dysku Select parsing direction Wybierz katalog lustra w tym serwisie Select global parsing direction Wybierz globalny katalog lustra w tym serwisie Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Ustaw metody przepisywania URL'i dla l±czy dostêpnych lokalnie (pobranych) oraz ³±czy dostêpnych przez Internet (niepobranych) Max simultaneous connections Maksymalna liczba po³¹czeñ File timeout Maksymalna wartoœæ przekroczenia czasu oczekiwania dla pliku Cancel all links from host if timeout occurs Odwo³aj wszelkie ³¹cza z hosta je¿eli ma miejsce przekroczenie czasu oczekiwanie Minimum admissible transfer rate Maksymalna tolerowana prêdkoœæ transferu Cancel all links from host if too slow Odwo³aj wszelkie ³¹cza z hosta je¿eli jest za wolny Maximum number of retries on non-fatal errors Maksymalna liczba ponowieñ je¿eli wydarzy siê nie-fatalny b³¹d Maximum size for any single HTML file Maksymalny rozmiar strony html Maximum size for any single non-HTML file Maksymalna wielkoœæ pliku Maximum amount of bytes to retrieve from the Web Maksymalna iloœæ bajtów mo¿liwych do transferu z Sieci Web Make a pause after downloading this amount of bytes Zrób pauzê po sic¹gniêciu takiej iloœci bajtów Maximum duration time for the mirroring operation Maksymalny czas dla lustra Maximum transfer rate Maksymalna prêdkoœæ transferu Maximum connections/seconds (avoid server overload) Maksymalna iloœæ po³¹czeñ na sekundê (zapobiwga przec¹¿eniu serwera) Maximum number of links that can be tested (not saved!) Maksymalna liczba ³±cz jakie mog± byæ przetestowane (zapisanych mo¿e byæ wiêcej!) Browser identity Identyfikacja przegl¹darki Comment to be placed in each HTML file Stopka do umieszczenia w ka¿dym pliku HTML Back to starting page Z powortem do strony startowej Save current preferences as default values Zapisz domyœlne opcje Click to continue Kliknij, aby kontynuowaæ Click to cancel changes Kliknij, aby anulowaæ zmiany Follow local robots rules on sites Dostosuj siê do praw robotów (robots) na serwisie Links to non-localised external pages will produce error pages Strony zewnêtrzne (niepobrane) bêd¹ po³¹czone do stron z b³êdami Do not erase obsolete files after update Nie wymazuj starych plików po uaktualnieniu Accept cookies? Zaakceptowaæ wys³ane ciasteczka (cookies)? Check document type when unknown? Sprawdzaæ typy dokumentów je¿eli s¹ nieznane? Parse java applets to retrieve included files that must be downloaded? Parsowaæ aplety Javy aby odnaleŸæ zawarte w nich pliki do pobrania ? Store all files in cache instead of HTML only Zmuœ do zapisania plików w cache a nie tylko w plikach HTML Log file type (if generated) Raportujj typ plików je¿eli zosta³ wygenerowany Maximum mirroring depth from root address Maksymalna g³êbokoœæ lustra od pierwszych adresów Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maksymalna g³êbokoœæ tworzenia lustra dla zewnêtrznych/zakazanych adresów Create a debugging file Utwórz plik dla debuggera Use non-standard requests to get round some server bugs Spróbuj omin¹æ pewne b³êdy (bugs) serwera dziêki u¿yciu niestandardowych ¿¹dañ Use old HTTP/1.0 requests (limits engine power!) U¿yj trybu zgodnoœci z starszym standardem HTTP/1.0 (ogranicza moc silnika programu) Attempt to limit retransfers through several tricks (file size test..) Próba ograniczenia powtórnych transferów dziêki kilku trikom (test wielko¶ci pliku) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Spróbuj ogranicznyc ilosc lacz poprzez pomijanie podobnych URL'i (www.foo.com==foo.com, http=https ..) Write external links without login/password Zapisuj zewnêtrzne ³acza bez login/has³o Write internal links without query string Zapisuj wewnêtrzne ³¹cza bez paska wyszukiwania Get non-HTML files related to a link, eg external .ZIP or pictures Pobierz pliki nie-html w pobli¿u ³¹cza Test all links (even forbidden ones) Testuj wszystkie ³¹cza (nawet zabronione) Try to catch all URLs (even in unknown tags/code) Próbuj pozyskaæ wszystkie ³¹cza (nawet te w nieznaych tag'ach/kodzie) Get HTML files first! Pobierz najpierw pliki HTML Structure type (how links are saved) Typ struktury (sposób w jaki ³¹cza s¹ zapisywane) Use a cache for updates U¿yj cache dla uaktualnieñ Do not re-download locally erased files Nie pobieraj lokalnie usuniêtych plików Make an index Utwórz indeks Make a word database Utwórz bazê s³ów Log files Raportuj pobrane pliki DOS names (8+3) Nazwy DOSowe (8+3) ISO9660 names (CDROM) Nazwy ISO9660 (CDROM) No error pages Bez stron z b³êdami Primary Scan Rule G³ówny filtr Travel mode Tryb podó¿niczy (mirror) Global travel mode Globalny tryb podró¿niczy (mirror) These options should be modified only exceptionally Zwykle te opcje nie powinny byæ modyfikowane Activate Debugging Mode (winhttrack.log) Aktywacja trybu dla debuggera (winthhrack.log) Rewrite links: internal / external Przepisz ³±cza: na dostêpne lokalnie (pobierane i lokalne)/ na dostêpne przez Internet (zewnêtrzne i niepobierane) Flow control Kontrola przep³ywu Limits Ograniczenia Identity Identyfikacja HTML footer Stopka HTML N# connections N# po³¹czeñ Abandon host if error Gdy b³¹d, porzuæ hosta Minimum transfer rate (B/s) Minimalna szybkoœæ transferu (B/s) Abandon host if too slow Anuluj po³¹czenie gdy transfer zbyt wolny Configure Konfiguruj Use proxy for ftp transfers U¿yj proxy dla transferu przez FTP TimeOut(s) Przekroczenie(a) czasu oczekiwania Persistent connections (Keep-Alive) Podtrzymywane połączenia (Keep-Alive) Reduce connection time and type lookup time using persistent connections Zmniejsz czas połączenia i czas sprawdzania typu dziÄ™ki użyciu podtrzymywanych połączeÅ„ Retries Ponowienia Size limit Ograniczenia wielkoœci Max size of any HTML file (B) Maksymalna wielkoœæ html Max size of any non-HTML file Maksymalna wielkoœæ innych Max site size Maksymalna wielkoœæ serwisu Max time Maksymalny czas Save prefs Zapisz opcje Max transfer rate Maksymalna szybkoœæ transferu Follow robots.txt Akceptuj prawa robots.txt No external pages Bez stron zewnêtrznych Do not purge old files Nie wymazuj starych plików Accept cookies Akceptuj ciasteczka (cookies) Check document type SprawdŸ typ dokumentu Parse java files Parsuj pliki Javy Store ALL files in cache Zapisz wszystkie pliki w cache Tolerant requests (for servers) Toleruj¹ce ¿¹dania (dla serwerów) Update hack (limit re-transfers) Dostrajanie uaktualnienia (limitowanie retransferów) URL hacks (join similar URLs) Triki URL Force old HTTP/1.0 requests (no 1.1) U¿yj ¿¹dañ HTTP/1.0 (BEZ HTTP/1.1) Max connections / seconds Maksymalna iloœæ po³¹czeñ na sekundê Maximum number of links Maksymalna liczba ³±cz Pause after downloading.. Pauza po pobraniu Hide passwords Ukryj has³a Hide query strings Schowaj paski zapytañ Links £¹cza Build Struktura Experts Only Tryb eksperta Flow Control Kontrola przep³ywu Limits Ograniczenia Browser ID ID przegl¹darki Scan Rules Filtry Spider Poszukiwacz (Paj¹k) Log, Index, Cache Raport, indeks, cache Proxy Proxy MIME Types Typy MIME Do you really want to quit WinHTTrack Website Copier? Czy naprawdê chcesz wyjœæ z WinHTTrack Website Copier? Do not connect to a provider (already connected) Nie ³¹cz siê z us³ugodawc¹ (jestem ju¿ po³¹czony) Do not use remote access connection Nie u¿ywaj po³¹czenia zewnêtrznego Schedule the mirroring operation Zadania dla lustra (mirrora) Quit WinHTTrack Website Copier WyjdŸ z WinHTTrack Website Copier Back to starting page Z powrotem do strony startowej Click to start! Kliknij aby wystartowaæ! No saved password for this connection! Nie zapisuj hase³ dla tego po³¹czenia! Can not get remote connection settings Nie mog³em pobraæ zdalnego ustawienia po³¹czenia Select a connection provider Wybierz us³ugodawcê z którym chcesz siê po³¹czyæ Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Mo¿esz teraz uruchomniæ tworzenie lustra przez wciœniêcie przycisku FINISH lub te¿ zdefiniowaæ wiêcej opcji po³¹czenia Save settings only, do not launch download now. Zapisz jedynie wybrane opcje, nie pobieraj ¿adnych plików On hold OpóŸnienie Transfer scheduled for: (hh/mm/ss) Czekam do: (hh/mm/ss/) Start Start Connect to provider (RAS) £¹czê siê z us³ugodawc¹ Internetu Connect to this provider Po³¹cz siê z tym us³ugodawc¹ Disconnect when finished Zakoñcz po³¹czenie z us³ugodawc¹ po pobraniu Disconnect modem on completion Po pobraniu roz³¹cz modem \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(proszê poinformowaæ nas o jakichkolwiek b³êdach w dzia³aniu programu)\r\n\r\nTwórcy:\r\nInterfejs(Windows): Xavier Roche\r\nMotor: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nPolska wersja jêzykowa: £ukasz Jokiel (Opole University of Technology, Lukasz.Jokiel@po.opole.pl) About WinHTTrack Website Copier O... WinHTTrack Website Copier Please visit our Web page Prosimy o odwiedzenie naszej strony w Sieci Wizard query Pytania kreatora Your answer: Twoja odpowiedŸ: Link detected.. Wykry³em ³¹cze Choose a rule Wybierz regu³ê Ignore this link Ignoruj to ³¹cze Ignore directory Ignoruj katalog Ignore domain Ignoruj domenê Catch this page only Pobierz tylko tê stronê Mirror site Lustro serwisu (mirror) Mirror domain Lustro domeny (mirror) Ignore all Ignoruj wszystko Wizard query Pytanie kreatora NO NIE File Plik Options Opcje Log Raport Window Okno Help Pomoc Pause transfer Pauzuj transfer Exit Wyjœcie Modify options Modyfikacja opcji View log Poka¿ raport View error log Poka¿ raport b³êdów View file transfers Poka¿ transfer plików Hide Schowaj About WinHTTrack Website Copier O... WinHTTrack Website Copier Check program updates... ZnajdŸ nowsz¹ wersjê programu &Toolbar Pasek narzêdziowy &Status Bar Pasek statusu S&plit Podzia³ File Plik Preferences Opcje Mirror Lustro Log Raport Window Okno Help Pomoc Exit Wyjœcie Load default options Wczytaj domyœlne opcje Save default options Zapisz domyœlne opcje Reset to default options Wyczyœæ domyœlne opcje Load options... Wczytaj opcje Save options as... Zapisz opcje jako... Language preference... Wybór jêzyka Contents... Zawartoœæ About WinHTTrack... O... WinHTTrack Website Copier New project\tCtrl+N Nowy projekt\tCtrl+N &Open...\tCtrl+O &Otwórz... \tCtrl+O &Save\tCtrl+S Zapis&z\tCtrl+S Save &As... Zapisz j&ako... &Delete... &Usuñ &Browse sites... &Przegl±daj strony sieciowe... User-defined structure Struktura zdefiniowana przez u¿ytkownika %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\r\nNazwa pliku bez typu pliku (np: image)\r\n%N\r\nNazwa wraz z typem pliku (np: image.gif)\r\n%t\r\nTyp pliku (np: .gif)\r\n%p\r\nScie¿ka [bez koñcowego /] (np: /pewneobrazki)\r\n%h\r\nNazwa hosta (np: www.pewnyhost.com)\r\n%s?\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\nKrótka wersja dla DOS (np: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Przyk³ad:\r\n%h%p/%n%q.%t\r\n-> \t\tc:\\mirror\\www.pewienhost.com\\pewneobrazki\\obrazek.gif Proxy settings Ustawienia proxy Proxy address: Adres proxy Proxy port: Port proxy Authentication (only if needed) Autentykacja (je¿eli wymagana) Login Login Password Has³o (pass) Enter proxy address here Tutaj podaj adres proxy Enter proxy port here Tutaj podaj port proxy Enter proxy login Tutaj podaj login proxy Enter proxy password Tutaj podaj has³o (pass) dla proxy Enter project name here Tutaj podaj nazwê projektu Enter saving path here Tutaj podaj œcie¿kê pod któr¹ zostanie zapisany projekt Select existing project to update Tutaj wybierz istniej¹cy projekt przeznaczony do aktualizacji Click here to select path Kliknij tutaj aby wybraæ œcie¿kê Select or create a new category name, to sort your mirrors in categories Wybierz lub stwórz nowa kategorie, tak aby posortowac lustra w kategorie HTTrack Project Wizard... Kreator projektu HTTrack New project name: Nazwa nowego projektu: Existing project name: Nazwa istniej¹cego projektu: Project name: Nazwa projektu: Base path: Œcie¿ka bazowa Project category: Projekt - kategoria: C:\\My Web Sites C:\\Moje Strony Web Type a new project name, \r\nor select existing project to update/resume Wpisz nazwê nowego projektu,\r\nalbo wybierz istniej¹cy projekt, który chesz kontunuowaæ/uaktualniæ New project Nowy projekt Insert URL Wstaw URL URL: Adres URL: Authentication (only if needed) Autentykacja (je¿eli wymagana) Login Login Password Has³o (pass) Forms or complex links: Formularze lub skomplikowane ³¹cza: Capture URL... Pobierz (pochwyæ) URL Enter URL address(es) here Tutaj podaj adres URL Enter site login Podaj login serwisu Enter site password Podaj has³o (pass) serwisu Use this capture tool for links that can only be accessed through forms or javascript code U¿yj tego narzêdzia aby pobraæ ³¹cza, które s¹ dostêpne tylko przez formularze lub ³¹cza z javascript'u Choose language according to preference Wybierz jêzyk Catch URL! Pobierz URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Proszê tymczasowo ustawiæ proxy w Twojej przegl¹darce (lub Ustawieniach Internetowych) na nastêpuj¹ce: (wytnij/wstaw adres proxy oraz port).\r\nNastêpnie w przegl¹darce, kliknij na formularzu lub kliknij ³¹cze, które chcesz pobraæ. This will send the desired link from your browser to WinHTTrack. Ta operacja przechwyci ³¹cze z Twojej przegl¹darki do HTTrack'a ABORT ANULUJ Copy/Paste the temporary proxy parameters here Wytnij/wstaw tutaj tymczasowe ustawienia proxy Cancel Anuluj Unable to find Help files! Nie mo¿na znaleŸæ plików pomocy Unable to save parameters! Zapisanie opcji niemo¿liwe Please drag only one folder at a time Proszê przeci¹gn¹æ tylko jeden folder Please drag only folders, not files Proszê przeci¹gn¹æ folder, a nie plik Please drag folders only Proszê przeci¹gn¹æ folder Select user-defined structure? Wybraæ zdefiniowan¹ przez u¿ytkownika strukturê ? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Upewnij siê czy zdefiniowane przez u¿ytkownika ci¹gi (strings) s¹ poprawne\r\nJeœli tego nie zrobisz to nazwy plików bêd¹ wygl¹da³y bardzo dziwnie! Do you really want to use a user-defined structure? Czy naprawdê chcesz wybraæ zdefiniowan¹ przez u¿ytkownika strukturê? Too manu URLs, cannot handle so many links!! Zbyt du¿o URLi, nie mo¿na obs³u¿yæ tak wielu ³¹cz!! Not enough memory, fatal internal error.. Za ma³o pamiêci, fatalny b³¹d wewnêtrzny... Unknown operation! Nieznana operacja! Add this URL?\r\n Dodaæ ten URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Ostrze¿enie: g³ówny proces ci¹gle nie odpowiada, nie mo¿na dodaæ URLi.. Type/MIME associations Typ/MIME Skojarzenia File types: Typy plików: MIME identity: To¿samoœæ MIME Select or modify your file type(s) here Wybierz lub zmodyfikuj tutaj swoje plik(i) Select or modify your MIME type(s) here Wybierz lub zmodyfikuj tutaj swoje typy MIME Go up IdŸ w górê Go down IdŸ w dó³ File download information Informacje o transferze plików Freeze Window Zachowaj uk³ad okien More information: Dodatkowe informacje: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Witamy w WinHTTrack Website Copier!\n\nProszê wcisn¹ przycisk DALEJ aby\n\n- uruchomiæ nowy projekt\n- aby wznowiæ przerwany projekt File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Nazwy plików z rozszerzeniem:\nNazwy plików zawieraj¹ce:\nTa nazwa pliku:\nNazwy folderów zawieraj¹ce:\nTa nazwa folderu:\n£¹cza w tej domenie:\n£¹cza w domenie zawieraj¹ce:\n£¹cza z tego hosta:\n£¹cza zawieraj¹ce:\nTo ³¹cze:\nWSZYSTKIE £¥CZA Show all\nHide debug\nHide infos\nHide debug and infos Poka¿ wszystko\nUkryj debugowanie\nUkryj informacje\nUkryj debugowanie i informacje Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Struktura strony (domyœlnie))\nHtml w Web/, obrazki/inne pliki w Web/obrazki/\nHtml na web/html, obrazki/outros na web/imagens\nHtml na web/, imagens/outros na web/\nHtml na web/, imagens/outros na web/xxx, quando xxx é a extensão do arquivo\nHtml na web/html, imagens/outros na web/xxx\nEstrutura do site, sem www.dominio.xxx/\nHtml no nome_do_site/, imagens/outros no nome_do_site/imagens/\nHtml no nome_do_site/html, imagens/outros no nome_do_site/imagens\nHtml no nome_do_site/, imagens/outros no nome_do_site/\nHtml no nome_do_site/, imagens/outros no nome_do_site/xxx\nHtml no nome_do_site/html, imagens/outros no nome_do_site/xxx\nTodos os arquivos na web/, com nomes aleatórios (gadget !)\nTodos os arquivos no nome_do_site/, com nomes aleatórios (gadget !)\nEstrutura definida pelo usuário.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Skanuj\nZachowaj pliki html\nZachowaj pliki nie-html\nZachowaj wszystkie pliki (domyœlnie)\nNajpierw zachowaj pliki html Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Pozostañ w tym samym katalogu\nMo¿e iœæ w dó³ (domyœlnie)\nMo¿e iœæ w górê\nMo¿e iœæ w górê i w dó³ Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Pozostañ na tym samym adresie (domyœlnie)\nPozostañ na tej samej domenie\nPozostañ na domenie nadrzêdnej\nIdŸ po ca³ej sieci Web Never\nIf unknown (except /)\nIf unknown Nigdy\nJeœli nieznane (bez /)\nJeœli nieznane no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Ignoruj regu³y robots.txt\nrobots.txt oprócz kreatora\npod¹¿aj za regu³ami robots.txt normal\nextended\ndebug normalny\nrozszerzony\ntestowy Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Pobierz stronê(y) Web\nPobierz stronê(y) Web + pytania\npobierz oddzielne pliki\nPobierz strony Web w stronach (wiele luster)\nTestuj ³¹cza na stronach (test zak³adek)\n* Wznów tworzenie lustra\n* Uaktualnij lustro Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relatywne URI / Absolutne URI (domy¶lnie)\nAbsolutne RRL / Absolutne URL\nAbsolutne URI / Absolutne URL\nOriginalne URL / Oryginalne URL Open Source offline browser Przegladarka Offline Open Source Website Copier/Offline Browser. Copy remote websites to your computer. Free. Program kopiujacy strony/Przegladarka Offline. Kopiuje strony WWW z Internetu na Twoj komputer. Darmowy. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, przegladarka offline. URL list (.txt) Lista URL'i (.txt) Previous Poprzedni Next Nastepny URLs URL'e Warning Ostrzezenie Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Twoja przegladarka nie obsluguje jeszcze JavaScript. Aby lepiej wyswietlac strony uzyj przegladarki z obsluga JavaScript. Thank you Dziekuje You can now close this window Mozesz teraz zamknac to okno. Server terminated Serwer zakonczyl prace A fatal error has occurred during this mirror Podczas tworzenia lustra wydarzyl sie fatalny blad. Proxy type: Typ proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protokó³ proxy. HTTP: standardowe proxy. HTTP (tunel CONNECT): wysy³a ka¿de ¿±danie przez tunel CONNECT, dla proxy obs³uguj±cych tylko CONNECT, jak HTTPTunnelPort w Torze. SOCKS5: port domy¶lny 1080. Load cookies from file: Wczytaj ciasteczka z pliku: Preload cookies from a Netscape cookies.txt file before crawling. Wczytaj ciasteczka z pliku Netscape cookies.txt przed rozpoczêciem pobierania. Pause between files: Pauza miêdzy plikami: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Losowe opó¼nienie miêdzy pobieraniem plików, w sekundach. U¿yj MIN:MAX dla losowego zakresu (np. 2:8). Keep the www. prefix (do not merge www.host with host) Zachowaj przedrostek www. (nie ³±cz www.host z host) Do not treat www.host and host as the same site. Nie traktuj www.host i host jako tej samej witryny. Keep double slashes in URLs Zachowaj podwójne uko¶niki w adresach URL Do not collapse duplicate slashes in URLs. Nie scalaj powtórzonych uko¶ników w adresach URL. Keep the original query-string order Zachowaj oryginaln± kolejno¶æ ci±gu zapytania Do not reorder query-string parameters when deduplicating URLs. Nie zmieniaj kolejno¶ci parametrów zapytania podczas usuwania duplikatów adresów URL. Strip query keys: Usuñ klucze zapytania: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Rozdzielone przecinkami klucze zapytania pomijane przy nazywaniu zapisanych plików (np. sid,utm_source). Write a WARC archive of the crawl Zapisz archiwum WARC z indeksowania Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Zapisz te¿ ka¿d± pobran± odpowied¼ do archiwum WARC/1.1 ISO-28500, obok kopii lustrzanej. WARC archive name: Nazwa archiwum WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Opcjonalna nazwa bazowa archiwum WARC; pozostaw puste, aby nazwaæ je automatycznie w katalogu wyj¶ciowym. httrack-3.49.14/lang/Norsk.txt0000644000175000017500000011015315230602340011567 LANGUAGE_NAME Norsk LANGUAGE_FILE Norsk LANGUAGE_ISO no LANGUAGE_AUTHOR Tobias "Spug" Langhoff (Dark Spug at hazardlabs.com )\r\n[ spug_enigma@hotmail.com ] \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Norwegian (Nynorsk) OK OK Cancel Avbryt Exit Avslutt Close Lukk Cancel changes Angre endringer Click to confirm Klikk for å bekrefte Click to get help! Klikk her for å få hjelp! Click to return to previous screen Klikk for å gå tilbake til forrige skjerm Click to go to next screen Klikk for å gå til neste skjerm Hide password Skjul passord Save project Lagre prosjekt Close current project? Vil du lukke prosjektet? Delete this project? Vil du slette dette prosjektet? Delete empty project %s? Vil du slette det tomme prosjektet %s? Action not yet implemented Denne funksjonen er ikke utviklet enda Error deleting this project Kunne ikke slette prosjektet Select a rule for the filter Velg en regel for dette filteret Enter keywords for the filter Skriv inn nøkkelord for dette filteret Cancel Avbryt Add this rule Legg til regel Please enter one or several keyword(s) for the rule Skriv inn et eller flere nøkkelord for denne regelen Add Scan Rule Legg til søkeregel Criterion Kriterier String Streng Add Legg til Scan Rules Søkeregler Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Bruk jokertegn (* og ?) for å ekskludere eller inkludere URLer eller linker.\nDu kan sette inn flere søkeregler på samme linje.\nBruk mellomrom som separatortegn.\n\nEksempel: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Ekskluder link(er) Include link(s) Inkluder link(er) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tips: For å inkludere ALLE GIF-filer, skriv noe sånt som +www.someweb.com/*.gif. \n(+*.gif / -*.gif inkluderer/ekskluderer ALLE GIF-filer fra ALLE sider) Save prefs Lagre innstillinger Matching links will be excluded: Følgende matchende linker vil bli utelukket: Matching links will be included: Følgende matchende linker vil bli inkludert: Example: Eksempel: gif\r\nWill match all GIF files gif\r\nMatcher alle GIF-filer blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nFinner alle filer med matchende tekst. Skriver du f.eks. 'blue' lastes 'bluesky-small.jpeg' ned. bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nFinner filen 'bigfile.mov', men ikke 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nFinner linker med mappenavn som matcher tekststrengen 'cgi', f.eks. /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nFinner linker med mappenavn som matcher hele 'cgi-bin'-strengen (men ikke cgi-bin-2, for eksempel) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nFinner linker med matchende tekststreng, som f.eks www.someweb.com, private.someweb.com osv. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nFinner linker med mappenavn som matcher tekststrengen 'someweb', for eksempel www.someweb.com, www.someweb.no, private.someweb.otherweb.com osv. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nFinner linker som matcher hele 'www.someweb.com'-strengen (men ikke linker som f.eks private.someweb.com/.. osv.) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nFinner alle linker med matchende tekststreng, som for eksempel www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html osv. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nFinner bare filen 'www.test.com/test/someweb.html'. Legg merke til at du må skrive hele adressen (URL + mappenavn) All links will match Alle linker matcher Add exclusion filter Legg til ekskluderingsfilter Add inclusion filter Legg til inkluderingsfilter Existing filters Eksisterende filtre Cancel changes Angre endringer Save current preferences as default values Lagre nåværende innstillinger som standardinnstillinger Click to confirm Klikk for å bekrefte No log files in %s! Det finnes ingen logg-filer i %s! No 'index.html' file in %s! Det finnes ingen 'index.html'-fil i %s! Click to quit WinHTTrack Website Copier Klikk for å avslutte WinHTTrack Website Copier View log files Vis logg-filer Browse HTML start page Vis HTML-startside End of mirror Kopieringen er fullført View log files Vis logg-filer Browse Mirrored Website Vis den kopierte websiden New project... Nytt prosjekt... View error and warning reports Vis feil- og advarselsrapporter View report Vis rapport Close the log file window Lukk loggvinduet Info type: Informasjonstype: Errors Feil Infos Informasjon Find Søk Find a word Søk etter et ord Info log file Informasjonslogg Warning/Errors log file Advarsels- og feillogg Unable to initialize the OLE system Kan ikke starte OLE-systemet WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack kunne ikke finne noen avbrutte nedlastninger i den angitte mappen! Could not connect to provider Kunne ikke koble til leverandør receive mottar request tillatelse connect kobler til search søker ready klar error feil Receiving files.. Mottar filer... Parsing HTML file.. Overfører HTML-fil... Purging files.. Sletter filer... Loading cache in progress.. Parsing HTML file (testing links).. Overfører HTML-fil (tester linker)... Pause - Toggle [Mirror]/[Pause download] to resume operation Pause - Velg [Kopier]/[Pause nedlasting] for å fortsette nedlastingen Finishing pending transfers - Select [Cancel] to stop now! Avslutter aktive nedlastinger - velg [Avbryt] for å avslutte nå! scanning søker Waiting for scheduled time.. Venter på planlagt tidspunkt... Connecting to provider Kobler til leverandør [%d seconds] to go before start of operation [%d sekunder] til start Site mirroring in progress [%s, %s bytes] Kopiering pågår [%s, %s bytes] Site mirroring finished! Kopieringen er fullført! A problem occurred during the mirroring operation\n Et problem oppsto under kopieringen\n \nDuring:\n \nUnder:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nVis loggen hvis nødvendig.\n\nKlikk på AVSLUTT for å avslutte WinHTTrack Website Copier.\n\nTakk for at du brukte WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Kopieringen er fullført.\nKlikk AVSLUTT for å avslutte WinHTTrack.\nVis loggfil(er) vis det er nødvendig, for å sjekke at alt er OK.\n\nTakk for at du brukte WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * KOPIERINGEN ER AVBRUTT! * *\r\nDen nåværende midlertidige cachen er obligatorisk for alle oppdateringsoperasjoner, og inneholder bare data fra den siste avbrutte kopieringsprosessen.\r\nDen tidligere cachen kan inneholde fyldigere informasjon; hvis du ønsker å beholde den informasjonen må du gjenopprette den og slette den aktuelle cachen.\r\n[OBS: Dette kan lettest gjøres ved å slette alle 'hts-cache/new.*'-filer]\r\n\r\nTror du den tidligere cache-filen kanskje inneholder fyldigere informasjon, og vil du gjenopprette den? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * KOPIERINGSFEIL! * *\r\nHttrack har oppdaget at den gjeldende websiden er tom. Hvis du var i gang med å oppdatere enn kopi, vil det gamle innholdet bli gjenopprettet.\r\nMulig årsak: Den første siden kunne enten ikke finnes, eller det oppstod et problem med forbindelsen.\r\n=> Kontroller at websiden fremdeles finnes, og/eller sjekk proxy-innstillingene dine! <= \n\nTip: Click [View log file] to see warning or error messages \n\nTips: Klikk på [Vis loggfil] for å se advarsler og feilmeldinger Error deleting a hts-cache/new.* file, please do it manually Det oppstod en feil ved sletting av hts-cache/new.*-filen. Prøv å slett filen manuelt. Do you really want to quit WinHTTrack Website Copier? Vil du virkelig avslutte WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Kopiering av webside -\n\nSkriv adressen(e) i URL-feltet - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktiv guide (spørsmål) -\n\nSkriv inn adressen(e) i URL-feltet - File Download Mode -\n\nEnter file address(es) in URL box - Filnedlasting -\n\nSkriv inn filen(e)s adresse(r) i URL-feltet - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Linktest -\n\nSkriv inn webadressen(e) du vil teste i URL-feltet - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Oppdatering -\n\nBekreft adressen(e) i URL-feltet, sjekk eventuelt om innstillingene er riktige og trykk deretter på 'NESTE' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Fortsett kopiering (hvis kopieringen ble avbrutt) -\n\nBekreft adressen(e) i URL-feltet, sjekk eventuelt om innstillingene er riktige og trykk deretter på 'NESTE' Log files Path Plassering av loggfil Path Bane - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Linkliste -\n\nBruk URL-feltet til å angi adresse(r) på sider som inneholder linker som skal kopieres. New project / Import? Nytt prosjekt / importer prosjekt? Choose criterion Velg kriterier Maximum link scanning depth Maximum søkedybde på linker Enter address(es) here Skriv inn adressen(e) her Define additional filtering rules Velg ytterligere filtreringsregler Proxy Name (if needed) Proxy-navn (om nødvendig) Proxy Port Proxy-port Define proxy settings Velg proxy-innstillinger Use standard HTTP proxy as FTP proxy Bruk standard HTTP-proxy som FTP-proxy Path Bane Select Path Velg bane Path Bane Select Path Velg bane Quit WinHTTrack Website Copier Avslutt WinHTTrack Website Copier About WinHTTrack Om WinHTTrack Save current preferences as default values Lagre nåværende innstillinger som standardinnstillinger Click to continue Klikk for å fortsette Click to define options Klikk for å velge innstillinger Click to add a URL Klikk for å legge til en URL Load URL(s) from text file Hent URL(er) fra tekstfil WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack-innstillinger (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Adresseliste (tekstfil) (*.txt)|*.txt|| File not found! Finner ikke filen! Do you really want to change the project name/path? Vil du virkelig endre prosjektets navn / plassering? Load user-default options? Åpne egendefinerte innstillinger? Save user-default options? Lagre egendefinerte innstillinger? Reset all default options? Nullstill alle standardinnstillinger? Welcome to WinHTTrack! Velkommen til WinHTTrack! Action: Handling: Max Depth Maksimum dybde Maximum external depth: Maksimum ekstern dybde: Filters (refuse/accept links) : Filtre (ekskluder/inkluder linker): Paths Baner Save prefs Lagre innstillinger Define.. Definer... Set options.. Velg innstillinger... Preferences and mirror options: Instillinger og kopieringsvalg: Project name Prosjektnavn Add a URL... Legg til en URL... Web Addresses: (URL) Webadresser: (URL) Stop WinHTTrack? Stopp WinHTTrack? No log files in %s! %s inneholder ingen loggfiler! Pause Download? Pause kopieringen? Stop the mirroring operation Stopp kopieringsprosessen Minimize to System Tray Minimer til systemlinjen Click to skip a link or stop parsing Klikk for å hoppe over en link eller stoppe overføringen Click to skip a link Klikk for å hoppe over en link Bytes saved Bytes nedlastet Links scanned Gjennomsøkte linker Time: Tid: Connections: Tilkoblinger: Running: Kjører: Hide Minimer Transfer rate Overføringshastighet SKIP HOPP OVER Information Informasjon Files written: Kopierte filer: Files updated: Oppdaterte filer: Errors: Feil: In progress: Arbeider: Follow external links Følg eksterne linker Test all links in pages Test alle linker på siden Try to ferret out all links Prøv å utvide alle linker Download HTML files first (faster) Last ned HTML-filer først (raskere) Choose local site structure Velg lokal sidestruktur Set user-defined structure on disk Velg brukerdefinert sidestruktur på disken Use a cache for updates and retries Bruk cache til oppdateringer og oppdateringsforsøk Do not update zero size or user-erased files Ikke oppdater tomme filer eller filer slettet av bruker Create a Start Page Opprett en startside Create a word database of all html pages Opprett en ord-database over alle HTML-sider Create error logging and report files Opprett feillogging og rapporter Generate DOS 8-3 filenames ONLY Lag filnavn KUN i DOS 8-3-format Generate ISO9660 filenames ONLY for CDROM medias Lag filnavn i ISO9660-format KUN for CD-ROM Do not create HTML error pages Ikke opprett HTML-feilmeldinger Select file types to be saved to disk Velg filtyper som skal kopieres Select parsing direction Velg overføringsretning Select global parsing direction Velg global overføringsretning Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Velg regler for omskrivning av URL for interne linker (nedlastede linker) og eksterne linker (ikke nedlastede) Max simultaneous connections Maksimum antall samtidige forbindelser File timeout Fil time-out Cancel all links from host if timeout occurs Avbryt alle linker fra vert hvis time-out oppstår Minimum admissible transfer rate Minimum akseptabel overføringshastighet Cancel all links from host if too slow Avbryt alle linker fra vert hvis overføringen er for langsom Maximum number of retries on non-fatal errors Maksimalt antall forsøk på ikke-fatale feil Maximum size for any single HTML file Maksimum filstørrelse for en enkelt HTML-fil Maximum size for any single non-HTML file Maksimum filstørrelse for en enkelt ikke-HTML-fil Maximum amount of bytes to retrieve from the Web Maksimum antall bytes som hentes fra internett Make a pause after downloading this amount of bytes Pause kopieringen når så mange bytes har blitt lastet ned: Maximum duration time for the mirroring operation Maksimal overføringstid på kopieringsprosessen Maximum transfer rate Maksimum overføringshastighet Maximum connections/seconds (avoid server overload) Maksimum antall forbindelser/sekunder (for å unngå overbelastning av serveren) Maximum number of links that can be tested (not saved!) Maksimalt antall linker som kan testes (ikke lagret!) Browser identity Nettleser-identitet Comment to be placed in each HTML file Sett inn kommentar i alle HTML-filer Back to starting page Tilbake til startside Save current preferences as default values Lagre nåværende innstillinger som standardinnstillinger Click to continue Klikk for å fortsette Click to cancel changes Klikk for å angre endringer Follow local robots rules on sites Følg lokale robots-regler på websiden Links to non-localised external pages will produce error pages Linker til eksterne sider som ikke finnes vil opprette en feilside Do not erase obsolete files after update Ikke slett unødvendige filer etter oppdatering Accept cookies? Aksepter informasjonskapsler (cookies)? Check document type when unknown? Sjekk dokumenttypen hvis ukjent? Parse java applets to retrieve included files that must be downloaded? Overfør java-appleter sammen med inkluderte filer som skal lastes ned? Store all files in cache instead of HTML only Lagre alle filer i cache i stedet for bare HTML Log file type (if generated) Loggfiltype (hvis den opprettes) Maximum mirroring depth from root address Maksimum kopieringsdybde fra rotadressen (root) Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maksimum kopieringsdybde for eksterne/forbudte adresser (0, altså ingen, er standard) Create a debugging file Opprett en feilfinningsfil Use non-standard requests to get round some server bugs Bruk ikke-standarde forespørsler for å unngå serverfeil Use old HTTP/1.0 requests (limits engine power!) Bruk gamle HTTP/1.0-forespørsler (begrenser effektiviteten!) Attempt to limit retransfers through several tricks (file size test..) Prøv å begrense gjentakelser av samme overføring ved å bruke spesielle 'triks' (f.eks å teste filstørrelsen) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Skriv eksterne linker uten brukernavn/passord Write internal links without query string Skriv interne linker uten å spørre Get non-HTML files related to a link, eg external .ZIP or pictures Hent ikke-HTML-filer relatert til linker, f.eks eksterne .ZIP-filer eller bilder Test all links (even forbidden ones) Test alle linker (også forbudte linker) Try to catch all URLs (even in unknown tags/code) Prøv å kopiere alle URLer (selv i ukjente tags / ukjent kode) Get HTML files first! Kopier HTML-filer først! Structure type (how links are saved) Angi struktur (hvordan linker lagres) Use a cache for updates Bruk cache til oppdateringer Do not re-download locally erased files Ikke last ned filer som er slettet av bruker på nytt Make an index Opprett en forside Make a word database Opprett en ord-database Log files Loggfiler DOS names (8+3) DOS-filnavn (8+3) ISO9660 names (CDROM) ISO9660-filnavn (CD-ROM) No error pages Ingen feilsider Primary Scan Rule Primær søkeregel Travel mode Søkemetode Global travel mode Global reisemetode These options should be modified only exceptionally Disse innstillingene bør bare endres hvis noe ikke virker, og kun av eksperter :) Activate Debugging Mode (winhttrack.log) Aktiver feilsøking (winhttrack.log) Rewrite links: internal / external Skriv linker om igjen: internt / eksternt Flow control Flow-kontroll Limits Begrensninger Identity Identitet HTML footer HTML-fotnote N# connections Antall forbindelser Abandon host if error Forlat verten hvis det oppstår feil Minimum transfer rate (B/s) Minimum overføringshastighet (bytes per sekund) Abandon host if too slow Forlat verten hvis den er for langsom Configure Konfigurer Use proxy for ftp transfers Bruk proxy til FTP-overføringer TimeOut(s) Time-out(s) Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Forsøk Size limit Størrelsesbegrensning Max size of any HTML file (B) Maks. størrelse på hver HTML-fil (bytes) Max size of any non-HTML file Maks. størrelse på hver ikke-HTML-fil Max site size Maksimum websidestørrelse Max time Maksimum tid Save prefs Lagre innstillinger Max transfer rate Maksimum overføringshastighet Follow robots.txt Følg reglene i robots.txt No external pages Ingen eksterne websider Do not purge old files Ikke slett gamle filer Accept cookies Aksepter informasjonskapsler (cookies) Check document type Sjekk dokumenttype Parse java files Overfør java-filer Store ALL files in cache Lagre ALLE filer i cache Tolerant requests (for servers) Aksepter forespørsler (for servere) Update hack (limit re-transfers) Oppdater hack (begrens gjen-overføringer) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Gjennomtving gamle HTTP/1.0-forespørsler (ikke 1.1) Max connections / seconds Maksimum antall forbindelser / sekunder Maximum number of links Maksimum antall linker Pause after downloading.. Pause etter nedlastning... Hide passwords Skjul passord Hide query strings Skjul forespørsels-strenger Links Linker Build Struktur Experts Only Kun for eksperter Flow Control Flow-kontroll Limits Begrensninger Browser ID Nettleser-ID Scan Rules Søkeregler Spider Webrobot Log, Index, Cache Logg, forside, cache Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Vil du virkelig avslutte WinHTTrack Website Copier? Do not connect to a provider (already connected) Ikke opprett tilkobling til leverandør (er allerede tilkoblet) Do not use remote access connection Ikke bruk fjernoppringning Schedule the mirroring operation Planlegg kopieringen Quit WinHTTrack Website Copier Avslutt WinHTTrack Website Copier Back to starting page Tilbake til startside Click to start! Klikk for å starte! No saved password for this connection! Ingen lagrede passord for denne tilkoblingen! Can not get remote connection settings Kan ikke lese oppringningsinnstillinger Select a connection provider Velg en internettleverandør Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Vennligst endre tilkoblingsinnstillinger hvis det er nødvendig,\nog klikk på FULLFØR for å begynne kopieringsprosessen. Save settings only, do not launch download now. Bare lagre innstillingene, ikke begynn kopieringen. On hold Pause Transfer scheduled for: (hh/mm/ss) Kopiering planlagt på tidspunkt: (hh/mm/ss) Start Start Connect to provider (RAS) Koble til leverandør (RAS) Connect to this provider Koble til denne leverandøren Disconnect when finished Koble fra når fullført Disconnect modem on completion Koble fra modem når fullført \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Vennligst fortell oss om feil eller problemer med programmet)\r\n\r\nUtvikling (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche og andre bidragsytere\r\n\r\nNorwegian translation:\r\nTobias "Spug" Langhoff ( spug_enigma@hotmail.com ) About WinHTTrack Website Copier Om WinHTTrack Website Copier Please visit our Web page Vennligst besøk vår internettside Wizard query Guide-spørsmål Your answer: Ditt svar: Link detected.. Link oppdaget... Choose a rule Velg en regel Ignore this link Ignorer denne linken Ignore directory Ignorer denne mappen Ignore domain Ignorer dette domenet Catch this page only Kopier bare denne siden Mirror site Kopier side Mirror domain Kopier domene Ignore all Ignorer alle Wizard query Guide-spørsmål NO NEI File Fil Options Innstillinger Log Logg Window Vindu Help Hjelp Pause transfer Pause kopiering Exit Avslutt Modify options Endre innstillinger View log Vis logg View error log Vis feillogg View file transfers Vis filoverføringer Hide Minimer About WinHTTrack Website Copier Om WinHTTrack Website Copier Check program updates... Se etter programoppdateringer (krever internett-tilkobling)... &Toolbar &Verktøylinje &Status Bar &Statuslinje S&plit &Del File Fil Preferences Innstillinger Mirror Kopier webside Log Logg Window Vindu Help Hjelp Exit Avslutt Load default options Åpne standardinnstillinger Save default options Lagre standardinnstillinger Reset to default options Tilbakestill til standardinnstillinger Load options... Åpne innstillinger... Save options as... Lagre innstillinger som... Language preference... Språk... Contents... Hjelp (engelsk)... About WinHTTrack... Om WinHTTrack... New project\tCtrl+N &Nytt prosjekt\tCtrl+N &Open...\tCtrl+O Å&pne...\tCtrl+O &Save\tCtrl+S La&gre\tCtrl+S Save &As... Lagre &som... &Delete... Sl&ett... &Browse sites... Forhåndsvis webside... User-defined structure Brukerdefinert struktur %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tFilnavn uten filtype (f.eks bilde)\r\n%N\tFilnavn MED filtype (f.eks bilde.gif)\r\n%t\tBare filtype (f.eks gif)\r\n%p\tBane [uten slutt-/] (f.eks /bilder)\r\n%h\tVertsnavn (f.eks www.someweb.com)\r\n%M\tMD5-URL (128-biters, 32 ASCII-bytes)\r\n%Q\tMD5-forespørsels-streng (128-biters, 32 ASCII-bytes(\r\n%q\tKort MD5-forespørsels-streng (16-biters, 4 ASCII-bytes)\r\n\r\n%s?\tKort navn (f.eks %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Eksempel:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\bilder\\bilde.gif Proxy settings Proxyinnstillinger Proxy address: Proxyadresse: Proxy port: Proxyport: Authentication (only if needed) Identifikasjon (hvis nødvendig) Login Brukernavn Password Passord Enter proxy address here Skriv inn proxyadresse her Enter proxy port here Skriv inn proxyport her Enter proxy login Skriv inn proxybrukernavn Enter proxy password Skriv inn proxypassord Enter project name here Skriv inn prosjektnavn her Enter saving path here Skriv inn banen der filene skal lagres Select existing project to update Velg eksisterende prosjekt som skal oppdateres Click here to select path Klikk her for å velge bane Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack prosjektguide... New project name: Nytt prosjektnavn: Existing project name: Eksisterende prosjektnavn: Project name: Prosjektnavn: Base path: Lagringsbane: Project category: C:\\My Web Sites C:\\Mine websider Type a new project name, \r\nor select existing project to update/resume Skriv inn et nytt prosjektnavn, \r\neller velg et eksisterende prosjekt du vil oppdatere/fortsette på New project Nytt prosjekt Insert URL Skriv inn URL URL: URL: Authentication (only if needed) Godkjennelse (bare hvis det trengs) Login Brukernavn Password Passord Forms or complex links: For skjemaer eller komplekse linker: Capture URL... 'Fang' URL... Enter URL address(es) here Skriv inn URL-adresse(r) her Enter site login Skriv inn websidens brukernavn Enter site password Skriv inn websidens passord Use this capture tool for links that can only be accessed through forms or javascript code Bruk dette verktøyet for å 'fange' linker som bare kan nås via skjemaer eller JavaScript-koder Choose language according to preference Velg språket du vil bruke Catch URL! 'Fang' URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Vennligst sett nettleserens midlertidige proxy-innstillinger til følgende verdi (kopier/lim inn proxy-adresse og port).\nKlikk så på OK-knappen i nettleseren din, eller klikk på linken du vil 'fange'. This will send the desired link from your browser to WinHTTrack. Dette vil sende linken fra nettleseren din til WinHTTrack. ABORT AVBRYT Copy/Paste the temporary proxy parameters here Kopier/lim inn de midlertidige proxy-innstillingene her Cancel Avbryt Unable to find Help files! Finner ikke hjelpefiler! Unable to save parameters! Kan ikke lagre parameterne! Please drag only one folder at a time Bare dra én mappe om gangen! Please drag only folders, not files Bare dra mapper, ikke filer! Please drag folders only Bare dra mapper! Select user-defined structure? Velg bruker-definert struktur? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Pass på at den brukerdefinerte strengen stemmer,\nellers vil filnavnene være ugyldige! Do you really want to use a user-defined structure? Vil du bruke en brukerdefinert struktur? Too manu URLs, cannot handle so many links!! For mange URLer, kan ikke håndtere så mange! Not enough memory, fatal internal error.. Ikke nok minne, fatal intern feil... Unknown operation! Ukjent kommando! Add this URL?\r\n Legg til denne URLen?\r\n Warning: main process is still not responding, cannot add URL(s).. Advarsel: hovedprosessen svarer fremdeles ikke, URLen(e) kan ikke legges til... Type/MIME associations Type/MIME-tilknytninger File types: Filtyper: MIME identity: MIME-identitet: Select or modify your file type(s) here Velg eller endre filtypen(e) dine her Select or modify your MIME type(s) here Velg eller endre MIME-typen(e) dine her Go up Gå opp Go down Gå ned File download information Nedlastningsinformasjon om fil Freeze Window Frys vinduet More information: Mer informasjon: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Velkommen til WinHTTrack Website Copier!\n\nVennligst klikk på NESTE-knappen for å\n\n- starte et nytt prosjekt\n- eller fortsette en tidligere avbrutt kopiering File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Filnavn med etternavn:\nFilnavn som inneholder:\nDette filnavnet:\nMappenavn som inneholder:\nDette mappenavnet:\nLinker i dette domenet:\nLinker i domener som inneholder:\nLinker fra denne verten:\nLinker som inneholder:\nDenne linken:\nALLE LINKER Show all\nHide debug\nHide infos\nHide debug and infos Vis alle\nSkjul filsøking\nSkjul informasjon\nSkjul filsøking og informasjon Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Sidestruktur (standard)\nHTML i web/, bilder/andre filer i web/bilder/\nHTML i web/HTML, bilder/andre i web/bilder\nHTML i web/, bilder/andre i web/\nHTML i web/, bilder/andre i web/xxx, hvor xxx er filtypen\nHTML i web/HTML, bilder/andre i web/xxx\nSidestruktur, uten www.domene.xxx/\nHTML i side_navn/, bilder/andre filer i side_navn/bilder/\nHTML i side_navn/HTML, bilder/andre i side_navn/bilder\nHTML i side_navn/, bilder/andre i side_navn/\nHTML i side_navn/, bilder/andre i side_navn/xxx\nHTML i side_navn/HTML, bilder/andre i side_navn/xxx\mAlle filer på nettet/, med tilfeldige navn (gadget !)\nAlle filer i side_navn/, med tilfeldige navn (gadget !)\nBruker-definert struktur... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Bare søk\nLagre HTML-filer\nLagre ikke-HTML-filer\nLagre alle filer (standard)\nLagre HTML-filer først Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Bli i samme mappe\nKan gå ned (standard)\nKan gå opp\nKan gå både opp og ned Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Bli på samme adresse (standard)\nBli på samme domene\nBli på samme toppnivå-domene\nGå hvor som helst på internett Never\nIf unknown (except /)\nIf unknown Aldri\nHvis ukjent (bortsett fra /)\nHvis ukjent no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ingen robots.txt-regler\nrobots.txt bortsett fra guide\nfølg robots.txt-regler normal\nextended\ndebug normal\nutvidet\nfeilsøk Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Last ned webside(r)\nLast ned webside(r) (spør meg)\nHent individuelle filer\nLast ned alle sidene (multiple mirror)\nTest linkene på sidene (bookmark test)\n* Fortsett avbrutt kopiering\n* Oppdater eksisterende kopi Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relativ URL / Fullstendig URL (standard)\nFullstendig URL / Fullstendig URL\nFullstendig URL / Fullstendig URL\nOriginal URL / Original URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Proxytype: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxyprotokoll. HTTP: standard proxy. HTTP (CONNECT-tunnel): sender hver forespørsel gjennom en CONNECT-tunnel, for proxyer som bare støtter CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080. Load cookies from file: Last inn cookies fra fil: Preload cookies from a Netscape cookies.txt file before crawling. Last inn cookies fra en Netscape cookies.txt-fil før crawlingen starter. Pause between files: Pause mellom filer: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Tilfeldig forsinkelse mellom filnedlastinger, i sekunder. Bruk MIN:MAX for et tilfeldig intervall (f.eks. 2:8). Keep the www. prefix (do not merge www.host with host) Behold www.-prefikset (slå ikke sammen www.host med host) Do not treat www.host and host as the same site. Behandle ikke www.host og host som samme nettsted. Keep double slashes in URLs Behold doble skråstreker i URL-er Do not collapse duplicate slashes in URLs. Slå ikke sammen gjentatte skråstreker i URL-er. Keep the original query-string order Behold den opprinnelige rekkefølgen i spørrestrengen Do not reorder query-string parameters when deduplicating URLs. Endre ikke rekkefølgen på spørrestrengens parametere når dupliserte URL-er fjernes. Strip query keys: Fjern spørrenøkler: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Kommaseparerte spørrenøkler som utelates i navngivingen av lagrede filer (f.eks. sid,utm_source). Write a WARC archive of the crawl Skriv et WARC-arkiv av gjennomgangen Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Lagre også hvert nedlastet svar i et ISO-28500 WARC/1.1-arkiv ved siden av speilet. WARC archive name: Navn på WARC-arkiv: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Valgfritt basisnavn for WARC-arkivet; la feltet stå tomt for automatisk navngivning i utdatamappen. httrack-3.49.14/lang/Nederlands.txt0000644000175000017500000011255015230602340012555 LANGUAGE_NAME Nederlands LANGUAGE_FILE Nederlands LANGUAGE_ISO nl LANGUAGE_AUTHOR Rudi Ferrari (Wyando at netcologne.de) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Dutch (Netherlands) OK OK Cancel Annuleren Exit Beëindigen Close Sluiten Cancel changes Veranderingen annuleren Click to confirm Veranderingen bevestigen Click to get help! Klik hier voor help Click to return to previous screen Klik voor vorig scherm Click to go to next screen Klik voor volgend scherm Hide password Verberg wachtwoord Save project Project wegschrijven Close current project? Actueel project sluiten? Delete this project? Dit project wissen? Delete empty project %s? Leeg project %s wissen? Action not yet implemented Functie nog niet ter beschikking. Error deleting this project Fout bij het wissen van dit project. Select a rule for the filter Kies een regel voor de filter Enter keywords for the filter Geef hier de sleutelwoorden voor deze filter Cancel Annuleren Add this rule Deze regel toevoegen Please enter one or several keyword(s) for the rule Eén of meerdere sleutelwoord(en) voor deze regel in te geven Add Scan Rule Filter toevoegen Criterion Kies een regel: String Geef een sleutelwoord: Add Toevoegen Scan Rules Filter Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Je kunt verschillende URLs of links door gebruik van jokers uitsluiten of aanvaarden\nJe kunt ofwel een spatie tussen de filters gebruiken\n\nVoorbeeld: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Links uitsluiten: Include link(s) Links aanvaarden Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Raad: Indien je alle gif bestanden van een site wilt aanvaarden, probeer iets in de aard van +www.someweb.com/*.gif \n(+*.gif / -*.gif zal ALLE gifs aanvaarden/uitsluiten van ALLE sites) Save prefs Instellingen wegschrijven Matching links will be excluded: Links volgens deze regel worden uitgesloten: Matching links will be included: Links volgens deze regel worden aanvaard: Example: Voorbeeld: gif\r\nWill match all GIF files gif\r\nZal alle gif (of GIF) bestanden vinden blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nZal alle bestanden met blue vinden, zoals 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nZal het bestand 'bigfile.mov' vinden, maar niet 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nZal links vinden met directories die 'cgi' bevatten, zoals /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nZal links vinden met directory naam 'cgi-bin' (maar niet bevoorbeeld: cgi-bin-2) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nZal alle links vinden zoals www.someweb.com, private.someweb.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nZal alle links vinden zoals www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nZal alle links vinden zoals www.someweb.com/... (maar geen links zoals private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nZal alle links vinden zoals www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nZal enkel de link www.test.com/test/someweb.html vinden. Merk op dat je zowel het adres (www.xxx.yyy) alsook de pad (/test/someweb.html) All links will match Alle links zullen uitgesloten/aanvaard worden Add exclusion filter Toevoegen van een uitsluiten-filter Add inclusion filter Toevoegen van een aanvaarden-filter Existing filters Bijkomende filters Cancel changes Veranderingen annuleren Save current preferences as default values Instellingen als standaard wegschrijven Click to confirm Klik voor bevestiging No log files in %s! Geen protocolbestanden in %s! No 'index.html' file in %s! Geen index.html in %s! Click to quit WinHTTrack Website Copier Klik om WinHTTrack Website Copier te beëindigen View log files Toon protocolbestanden Browse HTML start page Toon de html startpagina End of mirror Einde van de spiegeling View log files Toon protocolbestand Browse Mirrored Website Toon web New project... Nieuw project... View error and warning reports Toon fouten en mededelingen View report Toon protocolverslag Close the log file window Sluit het protocolvenster Info type: Type van informatie: Errors Fouten Infos Informaties Find Zoek Find a word Zoek een woord Info log file Info-protocolbestand Warning/Errors log file Waarschuwingen/Fouten-protocolbestand Unable to initialize the OLE system Onmogelijk het OLE systeem te initialiseren WinHTTrack could not find any interrupted download file cache in the specified folder! Er geen cache in de aangegeven directory\nWinHTTrack kan geen afgebroken spiegelingen vinden! Could not connect to provider Geen verbindung met de provider receive ontvangen request verzoek connect verbinden search zoeken ready klaar error fout Receiving files.. Ontvang bestanden. Parsing HTML file.. Doorlopen van het HTML bestand... Purging files.. Verwijder bestanden... Loading cache in progress.. Cache wordt geladen... Parsing HTML file (testing links).. Doorlopen van het HTML bestand (test links)... Pause - Toggle [Mirror]/[Pause download] to resume operation Gepauzeerd (Kies [Spiegeling]/[Pauzeer transfer] om verder te gaan) Finishing pending transfers - Select [Cancel] to stop now! Beëindig lopende transfers - Kies [Cancel] om direkt te stoppen! scanning scanning Waiting for scheduled time.. Wacht op voorgegeven uur om te starten Connecting to provider Maak verbinding met de provider [%d seconds] to go before start of operation Spiegeling wachtend [%d seconden] Site mirroring in progress [%s, %s bytes] Spiegeling is bezig... [%s, %s bytes] Site mirroring finished! Spiegeling beëindigd! A problem occurred during the mirroring operation\n Een probleem is opgetreden tijdens de spiegeling\n \nDuring:\n \r\n\nTijdens:\n\r\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Indien noodzakelijk, zie in het protocolbestand.\n\nKlik OK om WinHTTrack Website Copier te beëindigen.\n\nAlvast bedankt voor het gebruik van WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! De spiegeling is uitgevoerd.\nKlik OK om WinHTTrack te beëindigen.\nIndien nodig, zie protocolbestand(en) om zeker te gaan dat alles OK is\n\nAlvast bedankt voor het gebruik van WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * SPIEGELING AFGEBROKEN! * *\r\nDe aktuele tijdelijke cache is noodzakelijk voor gelijkwelke update operatie en bevat enkel data gedownload gedurende de zoeven afgebroken sessie.\r\nDe eerste cache kan juistere informaties bevatten; indien je deze informatie niet wenst te verliezen, dan moet je deze restoren and de aktuele cache wissen.\r\n[Opmerking: Dit is het eenvoudigst door het wissen van de hts-cache/new.* bestanden]\r\n\r\nDenk je dat de eerste cache juistere informaties bevat, en wil je deze restoren? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * FOUT MET DE SPIEGELING * *\r\nHTTrack heeft vastgesteld dat de aktuele spiegeling leeg is. Indien het een update was, is de vorige copie terug actueel.\r\nReden: de eerste pagina(s) konden ofwel niet gevonden worden, of er was een probleem met de connectie.\r\n=> Verzeker je ervan, dat de website nog steeds bestaat en/of je proxy settings correct zijn! <= \n\nTip: Click [View log file] to see warning or error messages :\r\n\n\nTip: Klik [Toon protocolbestand] voor de fouten en mededelingen\r\n Error deleting a hts-cache/new.* file, please do it manually Het wissen van hts-cache/new.* bestanden is niet gelukt, gelieve dit manueel te doen Do you really want to quit WinHTTrack Website Copier? Wil je werkelijk WinHTTrack Website Copier beëindigen? - Mirroring Mode -\n\nEnter address(es) in URL box - Spiegelmodus -\n\nVul de adressen in het URL venster in - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Spielgelmodus met navraag -\n\nVul de adressen in het URL venster in - File Download Mode -\n\nEnter file address(es) in URL box - Haal-bestand-modus -\n\nVul de adressen in het URL venster in - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Test-links-modus -\n\nVul de adressen van de paginas met links in het URL venster in - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Herzien/voortzetten van de spiegelmodus -\n\nKontroleer de adressen in het URL venster. Daarna klik 'VERDER' en konrtrolleer de parameters. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Voortzetten van de spiegelmodus -\n\nKontroleer de adressen in het URL venster. Daarna klik 'VERDER' en konrtrolleer de parameters. Log files Path Protocoldirectory Path Pad - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Spiegellijst-modus, vul de adressen van de paginas met links om te spiegelen in het URL venster in New project / Import? Nieuw project / import? Choose criterion Kies een actie Maximum link scanning depth Maximale linkdiepte om te scannen Enter address(es) here Vul hier de adressen in Define additional filtering rules Definiëer bijkomende filters Proxy Name (if needed) Proxy indien nodig Proxy Port Proxy poort Define proxy settings Definiëer proxy instellingen Use standard HTTP proxy as FTP proxy Gebruik de standaard HTTP proxy voor FTP proxy Path Pad Select Path Kies een pad Path Pad Select Path Kies een pad Quit WinHTTrack Website Copier WinHTTrack Website Copier beëindigen About WinHTTrack Info's over WinHTTrack Save current preferences as default values Schrijf voorkeur weg als standaard waarden. Click to continue Klik om verder te gaan Click to define options Klik om instellingen te definiëeren. Click to add a URL Klik om een URL toetevoegen Load URL(s) from text file Lees URL(s) vanaf een tekstbestand WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack voorkeursinstellingen (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Tekstbestand met de lijst van adressen (*.txt)|*.txt|| File not found! Bestand niet gevonden! Do you really want to change the project name/path? Will je werkelijk de projectnaam/pad veranderen? Load user-default options? Standaard instellingen van de gebruiker laden? Save user-default options? Standaard instellingen van de gebruiker wegschrijven? Reset all default options? Alle standaard instellingen wissen? Welcome to WinHTTrack! Hartelijk welkom bij WinHTTrack Website Copier! Action: Acties: Max Depth Maximale diepte: Maximum external depth: Maximum externe diepte: Filters (refuse/accept links) : Filters (links uitsluiten/aanvaarden): Paths Paths Save prefs Instellingen wegschrijven Define.. Definiëren... Set options.. Instellingen definiëren... Preferences and mirror options: Voorkeur en instellingen van de spiegelingen: Project name Projectnaam Add a URL... Toevoegen van een URL... Web Addresses: (URL) Webadres: (URL) Stop WinHTTrack? Stoppen van WinHTTrack? No log files in %s! Geen protocolbestanden in %s! Pause Download? Transfer pauzeren? Stop the mirroring operation Stop de spiegeling. Minimize to System Tray Verberg dit venster onder de systeembalk Click to skip a link or stop parsing Klik om een link over te slaan of om de doorloop te onderbreken Click to skip a link Klik om een link over te slaan Bytes saved Bytes weggeschreven: Links scanned Links doorlopen: Time: Tijd: Connections: Verbindingen: Running: Lopende: Hide Verbergen Transfer rate Transfer snelheid: SKIP OVERSLAAN Information Informaties Files written: Geschreven bestanden: Files updated: Bijgewerkte bestanden: Errors: Fouten: In progress: Bezig: Follow external links Haal bestanden ook uit externe links Test all links in pages Test alle links in de paginas Try to ferret out all links Probeer alle links te vinden Download HTML files first (faster) Eerst HTML-bestanden downloaden (sneller) Choose local site structure Kies een struktuur voor de lokale bestanden Set user-defined structure on disk Definiëer de struktuur van een site op disk Use a cache for updates and retries Gebruik een cache voor updates en herhalingen Do not update zero size or user-erased files Geen bestanden herladen indien deze nul bytes groot of door de gebruiker gewist zijn Create a Start Page Startpagina aanmaken Create a word database of all html pages Kreëer een woorden-gegevensbank van alle HTML paginas Create error logging and report files Aanmaken van Protokolbestanden voor fouten en mededelingen. Generate DOS 8-3 filenames ONLY Genereer enkel 8+3 bestandsnamen Generate ISO9660 filenames ONLY for CDROM medias Genereer ISO9660 bestandsnamen ENKEL voor CDROMs Do not create HTML error pages Schrijf geen html foutenpaginas Select file types to be saved to disk Kies de bestandtypes om weg te schrijven Select parsing direction Kies de doorlooprichting van de spiegeling Select global parsing direction Kies de globale doorlooprichting in de site Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Instellingen voor het herschrijven van URLs voor interne (gedownloaded) en externe (niet gedownloaded) links Max simultaneous connections Maximum aantal connecties File timeout Maximum wachttijd voor een bestand Cancel all links from host if timeout occurs Annuleer alle links van een host bij een timeout Minimum admissible transfer rate Minimale transfer snelheid Cancel all links from host if too slow Annuleer alle links van een te langsame host Maximum number of retries on non-fatal errors Maximum aantal herhalingen indien een niet fatale fout gebeurt Maximum size for any single HTML file Maximale grootte voor een html pagina Maximum size for any single non-HTML file Maximale grootte voor een bestand Maximum amount of bytes to retrieve from the Web Maximaal aantal bytes voor de spiegeling Make a pause after downloading this amount of bytes Pauzeer na download van dit aantal bytes Maximum duration time for the mirroring operation Maximale tijd voor de spiegeling Maximum transfer rate Maximale transfer snelheid Maximum connections/seconds (avoid server overload) Maximale verbindingen/seconde (vermijd overbelasting van de server) Maximum number of links that can be tested (not saved!) Maximum aantal links dat kan getest worden (niet gesaved!) Browser identity Browser identiteit Comment to be placed in each HTML file Voetnoot in elk HTML bestand Back to starting page Terug naar de startpagina Save current preferences as default values Instellingen als standaard wegschrijven Click to continue Klick om verder te gaan Click to cancel changes Klik om veranderingen te annuleren Follow local robots rules on sites Volg de lokale robotregels van de site Links to non-localised external pages will produce error pages Externe paginas (niet opgenomen) linken naar foutenpaginas Do not erase obsolete files after update Geen oude bestanden wissen na update Accept cookies? Aangeboden cookies aanvaarden? Check document type when unknown? Onbekende document types testen? Parse java applets to retrieve included files that must be downloaded? Java applets doorzoeken naar inbegrepen bestanden Store all files in cache instead of HTML only Alle bestanden in cache wegschrijven in plaats van enkel de HTML bestanden Log file type (if generated) Type protocolbestand indien gegenereerd Maximum mirroring depth from root address Maximum diepte van de spiegeling vanaf het eerste adres Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximum spiegelingdiepte voor externe/verboden adressen (0 is geen [default]) Create a debugging file Debug bestand aanmaken Use non-standard requests to get round some server bugs Probeer somige server bugs te vermijden door gebruik van niet gestandaardiseerde aanvragen Use old HTTP/1.0 requests (limits engine power!) Gebruik de oude HTTP/1.0 aanvragen (beperkt de zoekfunctie) Attempt to limit retransfers through several tricks (file size test..) Probeer, met verschillende trukjes, het aantal 're-transfers' te beperken (test grootte van het bestand...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Schrijf externe links zonder login/wachtwoord Write internal links without query string Schrijf interne links zonder zoekaanvraag Get non-HTML files related to a link, eg external .ZIP or pictures Opnemen van niet HTML-bestanden dicht bij een link (bv. .ZIP of grafieken buitenuit geplaatst) Test all links (even forbidden ones) Test alle links (ook de niet toegelatenen) Try to catch all URLs (even in unknown tags/code) Probeer alle URLs te krijgen (ook in onbekende tags/code) Get HTML files first! Haalt eerst de HTML-bestanden! Structure type (how links are saved) Struktuurtype (hoe links weggeschreven worden) Use a cache for updates Gebruik een cache voor de updates Do not re-download locally erased files Lokaal gewiste bestanden niet nogmaals laden Make an index Maak een index Make a word database Kreëer een woorden-gegevensbank Log files Protocolbestanden DOS names (8+3) DOS namen (8+3) ISO9660 names (CDROM) ISO9660 namen (CDROM) No error pages Geen fouten paginas Primary Scan Rule Hoofdfilter Travel mode Doorloopmodus Global travel mode Globale doorloopmodus These options should be modified only exceptionally Normaalgezien moeten deze instellingen niet aangepast worden Activate Debugging Mode (winhttrack.log) Aktiveer de debug modus (winhttrack.log) Rewrite links: internal / external Herschrijf links: intern / extern Flow control Stroom controle Limits Begrenzingen Identity Identiteit HTML footer HTML voetnota N# connections N# verbindingen Abandon host if error Verbinding afbreken indien fout Minimum transfer rate (B/s) Minimum transfer snelheid (B/s) Abandon host if too slow Verbinding afbreken indien te langzaam Configure Instellen Use proxy for ftp transfers Gebruik de proxy voor ftp transfers TimeOut(s) TimeOut(s) Persistent connections (Keep-Alive) Aanhoudende verbindingen (Keep-Alive) Reduce connection time and type lookup time using persistent connections Verbindingstijd en nakijktijd verminderen door konstante verbindung met de server Retries Herhalingen Size limit Berperking in grootte Max size of any HTML file (B) Maimale HTML grootte Max size of any non-HTML file Andere maximale grootte Max site size Maximale site grootte Max time Maximale tijd Save prefs Instellingen wegschrijven Max transfer rate Maximale transfer snelheid Follow robots.txt Volg de regels in robot.txt No external pages Geen externe pagina's Do not purge old files Geen oude pagina's wissen Accept cookies Cookies aanvaarden Check document type Kontroleer document type Parse java files Analiseren van JAVA bestanden Store ALL files in cache Alle bestanden in cache wegschrijven Tolerant requests (for servers) Tolerante aanvragen (voor servers) Update hack (limit re-transfers) Update hack (limiteert de re-transfers) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Gebruik oude HTTP/1.0 verzoeken (geen 1.0) Max connections / seconds Max verbindingen / seconden Maximum number of links Maximum aantal links Pause after downloading.. Pauze na download... Hide passwords Wachtwoorden verbergen Hide query strings Verberg zoekaanvragen Links Links Build Struktuur Experts Only Expert Flow Control Stroomcontrole Limits Beperkingen Browser ID Browser ID Scan Rules Filters Spider Spider Log, Index, Cache Protocol, Index, Cache Proxy Proxy MIME Types MIME typen Do you really want to quit WinHTTrack Website Copier? Wil je werkelijk WinHTTrack Website Copier beëindigen? Do not connect to a provider (already connected) Geen verbinding met een provider (reeds verbonden) Do not use remote access connection Geen gebruik van een remote verbinding Schedule the mirroring operation Programeer de spiegeling Quit WinHTTrack Website Copier Beeindige WinHTTrack Website Copier Back to starting page Terug naar startpagina Click to start! Klik om te starten! No saved password for this connection! Geen weggeschreven wachtwoord voor deze verbinding Can not get remote connection settings Krijg geen instelling van der remote verbinding Select a connection provider Kies hier een provider voor de verbinding Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Je kan de spiegeling starten, als je de FINISH knop klikt of definiëer meer instellingen voor de verbinding Save settings only, do not launch download now. Enkel de instellingen wegschrijven, download nu niet lanceren On hold Vertragen Transfer scheduled for: (hh/mm/ss) Wachtend tot: (hh/mm/ss) Start START! Connect to provider (RAS) Verbind met de provider (RAS) Connect to this provider Verbind met deze provider Disconnect when finished Indien gedaan verbinding verbreken Disconnect modem on completion Indien gedaan modemverbinding verbreken \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Ons fouten en problemen mede te delen)\r\n\r\nOntwikkeling:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Dutch translations to:\r\nRudi Ferrari (Wyando@netcologne.de) About WinHTTrack Website Copier Over WinHTTrack Website Copier Please visit our Web page Bezoek onze webpagina Wizard query Wizard vraagstelling Your answer: Je antwoord: Link detected.. Een link werd gevonden Choose a rule Kies een regel: Ignore this link Deze link uitsluiten Ignore directory Deze directory uitsluiten Ignore domain Deze domain uitsluiten Catch this page only Haal enkel deze pagina Mirror site Site-spiegeling Mirror domain Domain-spiegeling Ignore all Sluit alles uit Wizard query Wizard vraagstelling NO NEEN File Bestand Options Instellingen Log Protocol Window Venster Help Help Pause transfer Pauzeer transfer Exit Beëindigen Modify options Instellingen veranderen View log Toon protocol View error log Toon foutenprotocol View file transfers Toon transfer van de bestanden Hide Verstoppen About WinHTTrack Website Copier Over WinHTTrack Website Copier Check program updates... Verifiëer programma updates... &Toolbar Toolmenu &Status Bar Statusmenu S&plit Verdeel File Bestand Preferences Instellingen Mirror Spiegeling Log Protocol Window Venster Help Help Exit Beëindigen Load default options Standaard opties laden Save default options Standaard opties wegschrijven Reset to default options Standaard opties wissen Load options... Opties laden Save options as... Opties wegschrijven als... Language preference... Taalopties... Contents... Inhoud... About WinHTTrack... Over WinHTTrack Website Copier... New project\tCtrl+N Nieuw project\tCtrl+N &Open...\tCtrl+O &Open...\tCtrl+O &Save\tCtrl+S Weg&Schrijven\tCtrl+S Save &As... Wegschrijven &als... &Delete... &Wissen &Browse sites... We&bpaginas aantonen... User-defined structure Struktuur door de gebruiker gedefiniëerd %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNaam van het bestand zonder extensie (bv: image)\r\n%N\tNaam van het bestand met extensie (bv: image.gif)\r\n%t\tBestandstype (bv: gif)\r\n%p\tPath [zonder / op het einde] (bv: /someimages)\r\n%h\tHost naam (ex: www.someweb.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tkorte naam versie (ex: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Voorbeeld:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proxy instellingen Proxy address: Proxy adres Proxy port: Proxy poort Authentication (only if needed) Identificatie (enkel indien nodig) Login Login Password Wachtwoord Enter proxy address here Hier een proxy adres ingeven Enter proxy port here Hier proxy poort ingeven Enter proxy login Proxy login ingeven Enter proxy password Proxy wachtwoord ingeven Enter project name here Hier de projectnaam ingeven Enter saving path here Hier een pad voor het wegschrijven van het project ingeven Select existing project to update Kies hier een bestaand project voor update Click here to select path Klik hier om een pad te kiezen Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack project wizard New project name: Nieuw projectnaam: Existing project name: Bestaand projectnaam: Project name: Projectnaam: Base path: Basis pad Project category: C:\\My Web Sites C:\\Mijn Web paginas Type a new project name, \r\nor select existing project to update/resume Geef een nieuw projectnaam, \r\nof kies een bestaand project voor update/voortzetting\r\n New project Nieuw project Insert URL Toevoegen van een URL URL: URL: Authentication (only if needed) Identificatie (enkel indien nodig) Login Login: Password Password: Forms or complex links: Ingaveschermen of complexe links: Capture URL... Haal URL... Enter URL address(es) here Hier URL adres ingeven Enter site login Site login ingeven Enter site password Site wachtwoord ingeven Use this capture tool for links that can only be accessed through forms or javascript code Gebruik deze tool om links te halen die enkel via ingaveschermen of javascripts te krijgen zijn Choose language according to preference Kies je taal hier Catch URL! Haal de URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Tijdelijk je proxyinstellingen in de browser op volgende waarden zetten: (knip/plak proxyadres en poort).\nDan, in de browser, klik op de verzendknop van het ingavescherm, of klik op de specifieke link die je wilt halen This will send the desired link from your browser to WinHTTrack. Dit haalt de gewenste link van je browser naar HTTrack. ABORT ANNULEREN Copy/Paste the temporary proxy parameters here Knip/plak hier de tijdelijke proxy-instellingen Cancel Annuleren Unable to find Help files! Hulpbestanden kunnen niet gevonden worden! Unable to save parameters! Onmogelijk de parameterers weg te schrijven! Please drag only one folder at a time Enkel 1 directory toevoegen Please drag only folders, not files Enkel een directory toe te voegen, geen bestanden Please drag folders only Enkel een directory toe te voegen Select user-defined structure? Gebruikersdefiniëeerde struktuur kiezen? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Verzeker je ervan, dat de gebruikersdefiniëeerde struktuur correct is.\nIndien niet, zullen de bestandsnamen verkeerd zijn.\r\n Do you really want to use a user-defined structure? Wil je werkelijk de gebruikersdefiniëerde struktuur kiezen? Too manu URLs, cannot handle so many links!! Veel te veel URLs, onmogelijk zoveel links te behandelen!! Not enough memory, fatal internal error.. Niet genoeg geheugen, fatale interne fout... Unknown operation! Onbekende operatie! Add this URL?\r\n Deze URL toevoegen?\r Warning: main process is still not responding, cannot add URL(s).. Waarschuwing: hoofd proces antwoord niet, kann geen URLs toevoegen Type/MIME associations Associaties type/MIME File types: Bestandtype(s): MIME identity: MIME identiteit Select or modify your file type(s) here Kies of verander je bestandtype(s) hier Select or modify your MIME type(s) here Kies of verander je MIME type(s) hier Go up Omhoog Go down Omlaag File download information Informaties over de bestanden gedownload Freeze Window Venster invriezen More information: Bijkomende informaties Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Welkom bij WinHTTrack Website Copier!\n\nGelieve NEXT te klikken om\n\n- een nieuw project te starten\n\n- of vervoledig een gedeeltelijke download File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Bestandsnamen met extentie:\nBestandsnamen bevattend:\nDit bestandsnaam:\nDirectory-namen bevattend:\nDeze directory:\nLinks op dit domein:\nLinks op domein:\nLinks van deze host:\nLinks bevattend:\nDeze link:\nALLE LINKS Show all\nHide debug\nHide infos\nHide debug and infos Toon alles\nVerstop debug\nverstop informaties\nVerstop debug en informaties Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Site-struktuur (default)\nHtml in web/, images/andere bestanden in web/images/\nHtml in web/html, images/andere in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, waarbij xxx de extentie is\nHtml in web/html, images/andere in web/xxx\nSite-struktuur, zonder www.domain.xxx/\nHtml in site_naam/, images/andere files in site_naam/images/\nHtml in site_naam/html, images/andere in site_naam/images\nHtml in site_naam, images/andere in site_name/\nHtml in site_naam/, images/andere in site_naam/xxx\nHtml in site_naam/html, images/andere in site_naam/xxx\nAlle bestenden in web/, met toevallige namen\nAlle bestanden in site_naam/, met toevallige namen\nGebruikers-gedefiniëerde struktuur... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Enkel scannen\nHtml-bestanden wegschrijven\nNiet-Html-bestanden wegschrijven\nAlle bestanden wegschrijven (default)\nEerst Html-bestanden wegschrijven Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down In dezelfde directory blijven\nKan dieper gaan (default)\nCan omhoog gaan\nKan zowel dieper als omhoog gaan Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Op hetzelfde adres blijven (default)\nOp dezelfde domain blijven\nOp dezelfde top level domain blijven\nNaar overal in de web gaan Never\nIf unknown (except /)\nIf unknown Nooit\nIndien onbekend (uitgezonderd /)\nIndien onbekend no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Geen robots.txt regels\nrobots.txt uitgezonderd wizard\nvolg robots.txt regels normal\nextended\ndebug normaal\nuitgebreid\ndebug Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Download web site(s)\nDownload web site(s) + vragen\nHaal losse bestanden\nDownload alle sites in paginas (veelvuldige spiegeling)\nTest links in paginas (bookmark test)\n* onderbroken download verder doen\n* update bestaande download Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relative URI / Absolute URL (default)\n Absolute URL / Absolute URL\nAbsolute URI / Absolute URL\nURL van oorsprong / URL van oorsprong Open Source offline browser Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. Website Copier/Offline Browser. Kopieer websites op je computer. Gratis. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) URL lijst (.txt) Previous Vorige Next Volgende URLs URLs Warning Opgelet Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Je browser support momenteel geen javascript. Voor betere resultaten, gelieve een browser met javascript mogelijkheid gebruiken. Thank you Dankjewel You can now close this window Je kunt dit verster nu sluiten Server terminated Server beeindigd A fatal error has occurred during this mirror Een fatale fout is opgetreden tijdens deze spiegeling Proxy type: Proxytype: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxyprotocol. HTTP: standaardproxy. HTTP (CONNECT-tunnel): stuurt elke aanvraag via een CONNECT-tunnel, voor proxy's die alleen CONNECT ondersteunen zoals Tors HTTPTunnelPort. SOCKS5: standaardpoort 1080. Load cookies from file: Cookies uit bestand laden: Preload cookies from a Netscape cookies.txt file before crawling. Cookies vooraf laden uit een Netscape cookies.txt-bestand voordat het crawlen begint. Pause between files: Pauze tussen bestanden: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Willekeurige vertraging tussen bestandsdownloads, in seconden. Gebruik MIN:MAX voor een willekeurig bereik (bijv. 2:8). Keep the www. prefix (do not merge www.host with host) www.-voorvoegsel behouden (www.host niet samenvoegen met host) Do not treat www.host and host as the same site. Behandel www.host en host niet als dezelfde site. Keep double slashes in URLs Dubbele schuine strepen in URL's behouden Do not collapse duplicate slashes in URLs. Dubbele schuine strepen in URL's niet samenvoegen. Keep the original query-string order Oorspronkelijke volgorde van de query string behouden Do not reorder query-string parameters when deduplicating URLs. Query string-parameters niet herordenen bij het ontdubbelen van URL's. Strip query keys: Query-sleutels verwijderen: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Door komma's gescheiden query-sleutels die bij het benoemen van opgeslagen bestanden worden weggelaten (bijv. sid,utm_source). Write a WARC archive of the crawl Schrijf een WARC-archief van de crawl Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Sla ook elke opgehaalde respons op in een ISO-28500 WARC/1.1-archief, naast de mirror. WARC archive name: Naam van WARC-archief: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Optionele basisnaam voor het WARC-archief; laat leeg om het automatisch een naam te geven in de uitvoermap. httrack-3.49.14/lang/Magyar.txt0000644000175000017500000011352415230602340011720 LANGUAGE_NAME Magyar LANGUAGE_FILE Magyar LANGUAGE_ISO hu LANGUAGE_AUTHOR Jozsef Tamas Herczeg (hdodi at freemail.hu) \r\n LANGUAGE_CHARSET ISO-8859-2 LANGUAGE_WINDOWSID Hungarian OK OK Cancel Mégse Exit Kilépés Close Bezárás Cancel changes Törli a módosításokat Click to confirm Kattintson rá a megerõsítéshez Click to get help! Kattintson rá segítségért! Click to return to previous screen Az elõzõ képernyõhöz visz vissza Click to go to next screen A következõ képernyõre visz Hide password Jelszó titkosítása Save project Projekt mentése Close current project? Bezárja az aktuális projektet? Delete this project? Törli ezt a projektet? Delete empty project %s? Törli a(z) %s üres projektet? Action not yet implemented A mûvelet még nem használható Error deleting this project Hiba a projekt törlésekor Select a rule for the filter Jelöljön ki szabályt a szûrõhöz Enter keywords for the filter Itt írja be a szûrõ kulcsszavait Cancel Mégse Add this rule Hozzáadja ezt a szabályt Please enter one or several keyword(s) for the rule Írjon be egy vagy több kulcsszót a szabályhoz Add Scan Rule Szûrõ hozzáadása Criterion Válasszon szabályt String Kulcsszó beírása Add Hozzáadás Scan Rules Szûrõk Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Karakterhelyettesítõk használatával kizárhat vagy elfogadhat URL-eket vagy hivatkozásokat.\nTegyen szóközt a szûrõk közé.\n\nPéldául: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Hivatkozás kizárása Include link(s) Hivatkozás elfogadása Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tipp: Ha a webrõl minden gif fájlt fogadni akar, használjon ilyet +www.someweb.com/*.gif. \n(+*.gif / -*.gif elfogad/letilt MINDEN gifet MINDEN webhelyen) Save prefs Beállítások mentése Matching links will be excluded: A megegyezõ hivatkozások kizárásra kerülnek: Matching links will be included: A megegyezõ hivatkozásokat tartalmazni fogja: Example: Például: gif\r\nWill match all GIF files gif\r\nKiszûr minden GIF fájlt blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nMegkeres minden olyan fájlt, ami tartalmazza a 'blue' szöveget, azaz 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nKiszûri a 'bigfile.mov' fájlt, viszont a 'bigfile2.mov' fájlt nem cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nMegkeres minden olyan mappanév hivatkozást, ami tartalmazza a 'cgi' szöveget, azaz /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nMegkeres minden olyan mappanév hivatkozást, ami tartalmazza a teljes 'cgi-bin' szöveget (de a cgi-bin-2 már nem) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nMegkeres minden olyan hivatkozást, ami tartalmazza a www.someweb.com, private.someweb.com stb. szöveget someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nMegkeres minden olyan hivatkozást, ami tartalmazza a www.someweb.com, www.someweb.edu, private.someweb.otherweb.com stb. mappanév szöveget. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nMegkeres minden olyan hivatkozást, ami tartalmazza a teljes 'www.someweb.com' szöveget (de nem olyan hivatkozásokat, mint a private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nMegkeres minden olyan hivatkozást, ami tartalmazza a www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html stb. szövegeket. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nCsak a www.test.com/test/someweb.html fájlt keresi meg. Jegyezze meg, hogy be kell írnia a teljes útvonalat (URL + elérési út) All links will match Minden hivatkozást egyeztet Add exclusion filter Kizárás szûrõ hozzáadása Add inclusion filter Belefoglalás szûrõ hozzáadása Existing filters Létezõ szûrõk Cancel changes Törli a módosításokat Save current preferences as default values Az aktuális beállítások mentése alapértelmezett értékekként Click to confirm Nyomja meg a megerõsítéshez No log files in %s! %s nem tartalmaz naplófájlt! No 'index.html' file in %s! %s nem tartalmaz index.html fájlt Click to quit WinHTTrack Website Copier Kattintson rá a WinHTTrack webhely másolóból való kilépéshez View log files Naplófájlok megjelenítése Browse HTML start page HTML kezdõlap böngészése End of mirror Tükrözés vége View log files Naplófájlok megtekintése Browse Mirrored Website Tükrözött weblap böngészõ New project... Új projekt... View error and warning reports Hiba- és figyelmeztetési jelentések megtekintése View report Jelentés megtekintése Close the log file window Naplófájl ablakának bezárása Info type: Adat típusa: Errors Hibák Infos Adatok Find Keresés Find a word Szó keresése Info log file Információs naplófájl Warning/Errors log file Figyelmeztetés/Hiba naplófájl Unable to initialize the OLE system Az OLE rendszer nem inicializálható WinHTTrack could not find any interrupted download file cache in the specified folder! A WinHTTrack nem talált megszakadt letöltési fájl gyorsítótárat a megadott mappában! Could not connect to provider Nem lehet csatlakozni a szolgáltatóhoz receive fogadás request kérés connect csatlakozás search keresés ready kész error hiba Receiving files.. Fájlok fogadása Parsing HTML file.. HTML fájl elemzése Purging files.. Fájlok kiürítése Loading cache in progress.. A gyorsítótár betöltése folyamatban.. Parsing HTML file (testing links).. HTML fájl elemzése (hivatkozások tesztelése) Pause - Toggle [Mirror]/[Pause download] to resume operation Szünet - Kattintson a [Tükrözés]/[Letöltés szüneteltetése] parancsra a mûvelet folytatásához Finishing pending transfers - Select [Cancel] to stop now! Függõben lévõ átvitelek befejezése - Leállítás a [Mégse] gombbal! scanning vizsgálat Waiting for scheduled time.. Várakozás az ütemezett idõpontra Connecting to provider Csatlakozás a szolgáltatóhoz [%d seconds] to go before start of operation [%d másodperc] van hátra a mûvelet megkezdéséhez Site mirroring in progress [%s, %s bytes] A tükrözés folyamatban [%s, %s bájt] Site mirroring finished! A webhely tükrözése befejezõdött A problem occurred during the mirroring operation\n A tükrözés közben hiba történt\n \nDuring:\n \nKözben:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nNézze meg a naplófájlt, ha szükséges.\n\nKattintson a BEFEJEZÉS gombra a WinHTTrack webhely másolóból való kilépéshez.\n\nKöszönet a WinHTTrack használatáért! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! A tükrözés befejezõdött.\nKattintson az OK gombra a WinHTTrack bezárásához.\nNézze meg a naplófájl(oka)t, ha szükséges, hogy meggyõzõdjön róla, minden rendben van-e.\n\nKöszönet a WinHTTrack használatáért! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * TÜKRÖZÉS MEGSZAKÍTVA! * *\r\nA frissítéshez az aktuális ideiglenes gyorsítótárra van szükség, és csak az imént megszakított mûvelettel letöltött adatokat tartalmazza.\r\nA régi gyorsítótár bizonyára több információt tartalmaz; ha nem akarja elveszíteni azt az információt, vissza kell állítania és törölnie a jelenlegi gyorsítótárat.\r\n[Megjegyzés: Ez könnyen elvégezhetõ itt a hts-cache/new fájlok* törlésével.]\r\n\r\nÚgy gondolja, hogy a régi gyorsítótár teljesebb információt tartalmazhat, és vissza kívánja állítani? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * TÜKRÖZÉSI HIBA! * *\r\nA HTTrack felismerte, hogy az aktuális tükrözés üres. Ha frissítés volt, vissza lett állítva az elõzõ tükrözés.\r\nOk: az elsõ oldal(ak) vagy nem találhatók, vagy csatlakozási probléma lépett föl.\r\n=> Nézze meg, hogy a webhely létezik-e még, és/vagy ellenõrizze a proxy beállításokat! <= \n\nTip: Click [View log file] to see warning or error messages \nTipp: Kattintson a [Naplófájl megjelenítése] menüpontra a figyelmeztetések vagy hibaüzenetek megtekintéséhez Error deleting a hts-cache/new.* file, please do it manually Hiba a hts-cache/new.* fájl törléskor, végezze el kézzel Do you really want to quit WinHTTrack Website Copier? Valóban ki kíván lépni a WinHTTrack webhely másolóból? - Mirroring Mode -\n\nEnter address(es) in URL box - Tükrözés mód -\n\nÍrja be a cím(ek)et az URL mezõbe - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktív Varázsló mód (kérdések) -\n\nÍrja be a cím(ek)et az URL mezõbe - File Download Mode -\n\nEnter file address(es) in URL box - Fájl letöltés mód -\n\nÍrja be a fájl(ok) címe(i)t az URL mezõbe - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Hivatkozás tesztelési mód -\n\nÍrja be a tesztelendõ hivatkozás(oka)t tartalmazó oldal(ak) címe(i)t az URL mezõbe - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Frissítés mód -\n\nEllenõrizze a cím(ek)et az URL mezõben, s szükség esetén a paramétereket, majd kattintson a 'TOVÁBB' gombra. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Folytatás mód (Megszakadt mûvelet) -\n\nEllenõrizze a címe(ke)t az URL mezõben, s szükség esetén a paramétereket, majd kattintson a 'TOVÁBB' gombra. Log files Path Naplófájlok útvonala Path Útvonal - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Hivatkozásjegyzék mód -\n\nÍrja be az URL mezõbe azon oldal(ak) címe(i)t, melyek tükrözendõ hivatkozásokat tartalmaznak New project / Import? Új projekt / importálás? Choose criterion Válassza ki a feltételt Maximum link scanning depth Maximális hivatkozási mélység Enter address(es) here Ide írja be a címe(ke)t Define additional filtering rules Kiegészítõ szûrési szabályok meghatározása Proxy Name (if needed) Proxy neve (ha szükséges) Proxy Port Proxy port Define proxy settings Proxy beállításainak meghatározása Use standard HTTP proxy as FTP proxy A szabványos HTTP proxy FTP proxyként való használata Path Útvonal Select Path Útvonal kijelölése Path Útvonal Select Path Útvonal kijelölése Quit WinHTTrack Website Copier Kilépés a WinHTTrack webhely másolóból About WinHTTrack WinHTTrack névjegye Save current preferences as default values Aktuális beállítások mentése alapértelemezett értékekként Click to continue Nyomja meg a folytatáshoz Click to define options Nyomja meg az opciók meghatározásához Click to add a URL Nyomja meg URL hozzáadásához Load URL(s) from text file URL(-ek) betöltése szövegfájlból WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack beállítások (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Címlista szövegfájl (*.txt)|*.txt|| File not found! A fájl nem található! Do you really want to change the project name/path? Valóban módosítani kívánja a projekt nevét/útvonalát? Load user-default options? Betölti a felhasználó-alapértelmezett opciókat? Save user-default options? Menti a felhasználó-alapértelmezett opciókat? Reset all default options? Visszaállít minden alapértelmezett opciót? Welcome to WinHTTrack! Üdvözli a WinHTTrack webhely másoló! Action: Mûvelet: Max Depth Max. mélység: Maximum external depth: Maximális külsõ mélység: Filters (refuse/accept links) : Szûrõk (hivatkozások kizárása/belefoglalása): Paths Útvonalak Save prefs Beállítások mentése Define.. Meghatározás... Set options.. Beállítások... Preferences and mirror options: Beállítások és tükrözési opciók: Project name Projekt neve Add a URL... URL hozzáadása... Web Addresses: (URL) Webcímek (URL): Stop WinHTTrack? Leállítja a programot? No log files in %s! A(z) %s nem tartalmaz naplófájlt! Pause Download? Szünetelteti a letöltést? Stop the mirroring operation Tükrözés leállítása Minimize to System Tray Kis méretre zárás a tálcára Click to skip a link or stop parsing Nyomja meg hivatkozás kihagyásához vagy az elemzés leállításához Click to skip a link Nyomja meg hivatkozás kihagyásához Bytes saved Mentett bájt: Links scanned Vizsgált hivatkozás: Time: Idõ: Connections: Csatlakozás: Running: Futtatás: Hide Elrejtés Transfer rate Átviteli sebesség SKIP KIHAGY Information Információ Files written: Írott fájl: Files updated: Frissített fájl: Errors: Hiba: In progress: Folyamatban: Follow external links Külsõ hivatkozások követése Test all links in pages Az oldal(ak) összes hivatkozásának tesztelése Try to ferret out all links Felismer minden hivatkozást Download HTML files first (faster) Elõbb a HTML-fájlokat tölti le (gyorsabb) Choose local site structure Weblap helyi szerkezetének kiválasztása Set user-defined structure on disk Felhasználói meghatározású szerkezet beállítása a lemezen Use a cache for updates and retries Gyorsítótár használata a frissítésekhez és próbákhoz Do not update zero size or user-erased files Nem frissíti a nulla méretû vagy a felhasználó által törölt fájlokat Create a Start Page Kezdõlap létrehozása Create a word database of all html pages Az összes HTML oldal szóadatbázisának létrehozása Create error logging and report files Hibanapló- és jelentásfájl létrehozása Generate DOS 8-3 filenames ONLY CSAK 8-3 formátumú DOS-fájlnév generálása Generate ISO9660 filenames ONLY for CDROM medias ISO9660 fájlnevek generálása CSAK CDROM adathordozóhoz Do not create HTML error pages Nem hoz létre HTML hibaoldalakat Select file types to be saved to disk Jelölje ki a lemezre mentendõ fájltípusokat Select parsing direction Jelölje ki az elemzés irányát Select global parsing direction Jelölje ki a globális elemzési irányt Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Szabályok alkotása a belsõ (letöltött) hivatkozások és a külsõ (nem letöltött) hivatkozások átírásához Max simultaneous connections Egyidejû kapcsolatok max. száma File timeout Fájl idõtúllépés Cancel all links from host if timeout occurs Minden hivatkozás törlése a kiszolgálóról idõtúllépés esetén Minimum admissible transfer rate Minimális engedélyezett átviteli szint Cancel all links from host if too slow Minden hivatkozás törlése a kiszolgálóról, ha az túl lassú Maximum number of retries on non-fatal errors Próbálkozások maximális száma nem végzetes hiba esetén Maximum size for any single HTML file Bármilyen egyszerû HTML fájl maximális mérete Maximum size for any single non-HTML file Bármilyen egyszerû nem HTML-fájl maximális mérete Maximum amount of bytes to retrieve from the Web A webrõl letöltendõ maximális bájt mennyiség Make a pause after downloading this amount of bytes Szüneteltetés ennyi mennyiségû bájt letöltése után Maximum duration time for the mirroring operation A tükrözés maximális idõtartama Maximum transfer rate Maximális átviteli szint Maximum connections/seconds (avoid server overload) Max. csatlakozás/másodperc (a kiszolgáló túlterheltségének csökkentésére) Maximum number of links that can be tested (not saved!) A tesztelhetõ hivatkozások max. száma (nincs mentve!) Browser identity Böngészõ beazonosítása Comment to be placed in each HTML file Mindegyik HTML fájlban elhelyezendõ megjegyzés Back to starting page Vissza a kezdõlaphoz Save current preferences as default values Aktuális beállítások mentése alapértékekként Click to continue Nyomja meg a folytatáshoz Click to cancel changes Nyomja meg a módosítások törléséhez Follow local robots rules on sites Helyi robotok szabályainak követése a webhelyeken Links to non-localised external pages will produce error pages Meghatározatlan helyû külsõ weblapokra mutató hivatkozások hibaoldalakat eredményeznek Do not erase obsolete files after update Aktualizálás után nem törli a régi fájlokat Accept cookies? Fogadja a sütiket? Check document type when unknown? Ellenõrzi a dokumentum típusát, ha ismeretlen? Parse java applets to retrieve included files that must be downloaded? Elemzi a Java appleteket a letöltendõ fájlok kikeresésének szempontjából? Store all files in cache instead of HTML only Minden fájlt csak a gyorsítótárban tárol a HTML helyett Log file type (if generated) Naplófájl típusa (generálás esetén) Maximum mirroring depth from root address Tükrözés maximális mélysége a gyökércímtõl Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximum mirroring depth for external/fodbidden addresses (0, that is, none, is the default) Create a debugging file Hibakeresõ fájl létrehozása Use non-standard requests to get round some server bugs Nem szabványos kérések használata bizonyos kiszolgáló hibák elkerüléséhez Use old HTTP/1.0 requests (limits engine power!) Régi HTTP/1.0 kérések használata (korlátozza a motor energiáját!) Attempt to limit retransfers through several tricks (file size test..) Ismételt átvitel korlátozása különféle trükkökkel (fájlméret teszt...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Külsõ hivatkozások felhasználónév/jelszó nélküli írása Write internal links without query string Belsõ hivatkozások írása lekérdezési szöveg nélkül Get non-HTML files related to a link, eg external .ZIP or pictures Hivatkozáshoz kapcsolódó nem HTML fájlok letöltése, pl. külsõ ZIP vagy képek Test all links (even forbidden ones) Minden hivatkozás tesztelése (a tiltottak is) Try to catch all URLs (even in unknown tags/code) Minden URL felfogása (ismeretlen tagekben/kódban is) Get HTML files first! Elõbb töltse le a HTML-fájlokat! Structure type (how links are saved) Szerkezet típusa (a hivatkozások mentésének módja) Use a cache for updates Gyorsítótár használata a frissítésekhez Do not re-download locally erased files Nem tölti le ismét a helyben törölt fájlokat Make an index Mutató készítése Make a word database Szóadatbázis létrehozása Log files Naplófájlok DOS names (8+3) DOS nevek (8+3) ISO9660 names (CDROM) ISO9660 nevek (CDROM) No error pages Nincs hibaoldal Primary Scan Rule Fõ keresési szabály Travel mode Közlekedési mód Global travel mode Globális közlekedési mód These options should be modified only exceptionally Csak kivételes esetben módosítsa ezeket az opciókat Activate Debugging Mode (winhttrack.log) Hibakeresõ mód aktiválása (winhttrack.log) Rewrite links: internal / external Hivatkozások átírása: belsõ / külsõ Flow control Forgalom szabályozás Limits Korlátozások Identity Azonosítás HTML footer HTML lábjegyzet N# connections Csatlakozások száma Abandon host if error Hiba esetén leválik a kiszolgálóról Minimum transfer rate (B/s) Minimális átviteli sebesség (B/s) Abandon host if too slow Leválik a kiszolgálóról, ha túl lassú Configure Beállítás Use proxy for ftp transfers Proxy használata FTP átvitelekhez TimeOut(s) Idõtúllépés Persistent connections (Keep-Alive) Folytonos kapcsolatok (Életben tartás) Reduce connection time and type lookup time using persistent connections A csatlakozási idõ és típus keresési idõ csökkentése folytonos kapcsolatokkal Retries Próbák száma Size limit Mérethatár Max size of any HTML file (B) Bármilyen HTML fájl (B) max. mérete Max size of any non-HTML file Bármilyen nem HTML-fájl max. mérete Max site size A webhely max. mérete Max time Max. idõtartam Save prefs Beállítások mentése Max transfer rate Max. átviteli sebesség Follow robots.txt Robots.txt követése No external pages Nincs külsõ oldal Do not purge old files Nem üríti ki a régi fájlokat Accept cookies Sütik fogadása Check document type Dokumentum típus ellenõrzése Parse java files Java fájlok elemzése Store ALL files in cache MINDEN fájl tárolása a gyorsítótárban Tolerant requests (for servers) Türelmes kérések (kiszolgálók részére) Update hack (limit re-transfers) Ismételt átvitelek korlátozása URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Régi HTTP/1.0 (1.1 nem) kérések alkalmazása Max connections / seconds Max. csatlakozás/másodperc Maximum number of links Hivatkozások max. száma Pause after downloading.. Szünet letöltés után Hide passwords Jelszavak elrejtése Hide query strings Lekérdezési szövegek elrejtése Links Hivatkozások Build Szerkezet Experts Only Csak szakembereknek Flow Control Forgalom szabályozás Limits Korlátozások Browser ID Böngészõ beazonosítás Scan Rules Keresési szabályok Spider Indexelés Log, Index, Cache Napló, mutató, gyorsítótár Proxy Proxy MIME Types MIME-típusok Do you really want to quit WinHTTrack Website Copier? Biztos, hogy bezárja a programot? Do not connect to a provider (already connected) nem csatlakozik szolgáltatóhoz (már csatlakozott) Do not use remote access connection Nem használ távoli elérésû kapcsolatot Schedule the mirroring operation Tükrözés ütemezése Quit WinHTTrack Website Copier Kilépés a WinHTTrack webhely másolóból Back to starting page Vissza a kezdõlaphoz Click to start! Nyomja meg az indításhoz! No saved password for this connection! Nem mentette el a jelszót ehhez a kapcsolathoz! Can not get remote connection settings A távoli kapcsolat beállításai nem hozzáférhetõk Select a connection provider Válassza ki a szolgáltatót Start Indítás Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Szükség esetén állítsa be a kapcsolat tulajdonságait,\nmajd nyomja meg a BEFEJEZÉS gombot a tükrözés megkezdéséhez. Save settings only, do not launch download now. Csak a beállításokat menti, nem indítja a letöltést. On hold Várakozás Transfer scheduled for: (hh/mm/ss) Átvitel ütemezése: (óó/pp/mm) Start Indítás Connect to provider (RAS) Csatlakozás a szolgáltatóhoz Connect to this provider Csatlakozás ehhez a szolgáltatóhoz Disconnect when finished Vonalbontás, ha kész Disconnect modem on completion Modem leválasztása, ha kész \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Kérjük, jelezzen nekünk bármilyen hibát vagy problémát)\r\n\r\nFejlesztés:\r\nKezelõfelület (Windows): Xavier Roche\r\nIndexelés: Xavier Roche\r\nJavaElemzõOsztályok: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nEZER KÖSZÖNET a magyar fordításért:\r\nHerczeg József Tamásnak (hdodi@freemail.hu) About WinHTTrack Website Copier WinHTTrack webhely másoló névjegye Please visit our Web page Keresse fel weblapunkat! Wizard query Varázsló kérdése Your answer: Az ön válasza: Link detected.. Hivatkozás található.. Choose a rule Válasszon ki egy szabályt Ignore this link Kihagyja ezt a hivatkozást Ignore directory Mappa kihagyása Ignore domain Tartomány kihagyása Catch this page only Csak ezt az oldalt tölti le Mirror site Webhely tükrözése Mirror domain Tartomány tükrözése Ignore all Mindet kihagyja Wizard query Varázsló kérdése NO NEM File Fájl Options Beállítások Log Napló Window Ablak Help Súgó Pause transfer Átvitel szüneteltetése Exit Kilépés Modify options Opciók módosítása View log Napló megjelenítése View error log Hibanapló megjelenítése View file transfers Fájlátvitelek megjelenítése Hide Elrejtés About WinHTTrack Website Copier Névjegy Check program updates... Új verzió keresése... &Toolbar &Eszköztár &Status Bar Állapot&sor S&plit &Felosztás File Fájl Preferences Beállítások Mirror Tükrözés Log Napló Window Ablak Help Súgó Exit Kilépés Load default options Alapértelmezett opciók betöltése Save default options Alapértelmezett opciók visszaállítása Reset to default options Alaértelmezett opciók visszaállítása Load options... Opciók betöltése... Save options as... Opciók mentése másként... Language preference... Nyelv átváltása... Contents... Tartalomjegyzék... About WinHTTrack... WinHTTrack névjegye... New project\tCtrl+N Új projekt\tCtrl+N &Open...\tCtrl+O M&egnyitás...\tCtrl+O &Save\tCtrl+S &Mentés\tCtrl+S Save &As... Menté&s másként... &Delete... &Törlés... &Browse sites... Webhelyek &böngészése... User-defined structure Felhasználói meghatározású szerkezet %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tFájlnév fájltípus nélkül (kiv: kép)\r\n%N\tFájlnév fájltípussal (kiv: kep.gif)\r\n%t\tCsak fájltípus (kiv: gif)\r\n%p\tÚtvonal [vég nélkül /] (kiv: /nehanykep)\r\n%h\tKiszolgáló neve (kiv: www.someweb.com)\r\n%M\tMD5 URL (128 bit, 32 ascii bájt)\r\n%Q\tMD5 keresendõ szöveg (128 bit, 32 ascii bájt)\r\n%q\tMD5 kis keresési szöveg (16 bit, 4 ascii bájt)\r\n\r\n%s?\tRövid név (kiv: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Példa:\t%h%p/%n%q.%t\n->\t\tc:\\tukor\\www.someweb.com\\nehanykep\\kep.gif Proxy settings Proxy beállítások Proxy address: Proxy címe: Proxy port: Proxy port: Authentication (only if needed) Hitelesítés (csakszükség esetén) Login Felhasználó Password Jelszó Enter proxy address here Ide írja be a proxy címét Enter proxy port here Ide írja be a proxy portot Enter proxy login Ide írja be a proxy felhasználóját Enter proxy password Ide írja be a proxy jelszavát Enter project name here Ide írja be a projekt nevét Enter saving path here Ide írja be a projekt mentési útvonalát Select existing project to update Jelöljön ki egy létezõ, frissítendõ projektet Click here to select path Nyomja meg az útvonal kijelöléséhez Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Projekt Varázsló... New project name: Az új projekt neve: Existing project name: A létezõ projekt neve: Project name: Projekt neve: Base path: Útvonal: Project category: C:\\My Web Sites C:\\Letoltott weblapok Type a new project name, \r\nor select existing project to update/resume Írja be az új projekt nevét, \r\nvagy jelöljön ki létezõ projektet a frissítéshez/folytatáshoz New project Új projekt Insert URL URL beszúrása URL: URL: Authentication (only if needed) Hitelesítés (csak szükség esetén) Login Felhasználó Password Jelszó Forms or complex links: Ûrlapok vagy összetett hivatkozások: Capture URL... URL átvétele... Enter URL address(es) here Ide írja be az URL-t Enter site login Írja be a webhely felhasználónevét Enter site password Írja be a webhely jelszavát Use this capture tool for links that can only be accessed through forms or javascript code Ezt az átvételt segítõ eszközt olyan hivatkozásokhoz vegye igénybe, melyek csak ûrlapokon vagy JavaScript kódon keresztül hozzáférhetõk Choose language according to preference Válassza ki az ön által beszélt nyelvet Catch URL! URL átvétele! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Módosítsa ideiglenesen a böngészõ proxy beállításait a következõ értékekre (a proxy cím és port másolásával/beillesztésével).\nEzután kattintson a böngészõben az ûrlap SUBMIT gombjára, vagy kattintson az átvenni kívánt hivatkozásra. This will send the desired link from your browser to WinHTTrack. Ez átküldi a böngészõbõl az óhajtott hivatkozást a WinHTTrack programhoz. ABORT MÉGSE Copy/Paste the temporary proxy parameters here Az ideiglenes proxy beállítások másolása/beillesztése itt Cancel Mégse Unable to find Help files! Nem található a Súgó! Unable to save parameters! A paraméterek nem menthetõk! Please drag only one folder at a time Egyszerre csak egy mappát húzzon át Please drag only folders, not files Csak mappát húzzon át, ne fájlt Please drag folders only Csak mappát húzzon át Select user-defined structure? Felhasználói meghatározású szerkezetet jelöl ki? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Ellenõrizze, hogy a felhasználó által meghatározott szöveg megfelelõ-e,\nmert különben a fájlnevek hamisak lesznek! Do you really want to use a user-defined structure? Valóban felhasználó által meghatározott szerkezetet kíván kijelölni? Too manu URLs, cannot handle so many links!! Túl sok URL, ilyen sok hivatkozást nem lehet kezelni!! Not enough memory, fatal internal error.. Nincs elég memória, végzetes belsõ hiba. Unknown operation! Ismeretlen mûvelet! Add this URL?\r\n Hozzáadja az URL-t?\r\n Warning: main process is still not responding, cannot add URL(s).. Figyelem! A fõ folyamat még nem válaszol, nem lehet URL-(eke)t hozzáadni.. Type/MIME associations Típus/MIME társítások File types: Fájltípusok: MIME identity: MIME azonosítás Select or modify your file type(s) here Itt jelölje ki vagy módosítsa a fájltípus(oka)t Select or modify your MIME type(s) here Itt jelölje ki vagy módosítsa a MIME típus(oka)t Go up Fel Go down Le File download information Fájl letöltési információk Freeze Window Ablak rögzítése More information: További információ: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Üdvözli a WinHTTrack webhely másoló!\n\nNyomja meg a TOVÁBB gombot\n\n- új projekt indításához\n- vagy megkezdett letöltés folytatásához. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Fájlnév kiterjesztéssel:\nFájlnév, tartalmazva:\nIlyen fájlnév:\nMappanév, tartalmazva:\nIlyen mappanév:\nHivatkozások tartományokon:\nHivatkozások tartományokon, tartalmazva:\nHivatkozások errõl a kiszolgálóról:\nHivatkozások, tartalmazva:\nIlyen hivatkozás:\nMINDEN HIVATKOZÁS Show all\nHide debug\nHide infos\nHide debug and infos Mind látszik\nHibakeresés elrejtése\nInfók elrejtése\nHibakeresés és infók elrejtése Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Hely-szerkezet (alapértelmezett)\nHtml a web/, képek/egyéb fájlok a web/kepek/\nHtml a web/html, képek/egyebek a web/kepek\nHtml a web/, képek/egyebek a web/\nHtml a web/, képek/egyebek a web/xxx, ahol xxx a fájlkiterjesztés\nHtml a web/html, képek/egyebek a web/xxx\nHely-szerkezet, www.tartomany.xxx nélkül/\nHtml a hely_nev/, képek/egyéb fájlok a hely_nev/kepek/\nHtml a hely_nev/html, képek/egyebek a hely_nev/kepek\nHtml a hely_nev/, képek/egyebek a hely_nev/\nHtml a hely_nev/, képek/egyebek a hely_nev/xxx\nHtml a hely_nev/html, képek/egyebek a hely_nev/xxx\nMinden fájl a web/, véletlen nevekkel (bonyolult !)\nMinden fájl a hely_nev/, véletlen nevekkel (bonyolult !)\nFelhasználó által meghatározott szerkezet... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Csak keresés\nHTML fájlok tárolása\nNem HTML-fájlok tárolása\nMinden fájl tárolása (alapértelmezett)\nElõbb a HTML-fájlokat tárolja Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Ugyanabban a mappában marad\nLemehet (alapértelmezett)\nFelmehet\nLe is, fel is mehet Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Ugyanazon a címen marad (alapértelm.)\nUgyanazon a tartományon marad\nUgyanazon a felsõszintû tartományon m.\nMindenhova megy a weben Never\nIf unknown (except /)\nIf unknown Soha\nHa ismeretlen (kivéve /)\nHa ismeretlen no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules nincs robot txt szabály\nrobots.txt a varázsló kivételével\nrobots.txt szabályok követése normal\nextended\ndebug normál\nkiterjesztett\nhibakeresés Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Webhely(ek) letöltése\nWebhely(ek) letöltése + kérdések\nÖnálló fájlok megszerzése\nMinden hely letöltése oldalakban (többszörös tükrözés)\nHivatkozások tesztelése az oldalakon (webcím teszt)\n* Megszakadt letöltés folytatása\n* Létezõ letöltés frissítrése Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relatív URL / Abszolút URL (alapértelmezett)\nAbszolút URL / Abszolút URL\nAbszolút URL / Abszolút URL\nEredeti URL / Eredeti URL Open Source offline browser Nyílt forráskódú kapcsolat nélküli böngészõ Website Copier/Offline Browser. Copy remote websites to your computer. Free. Weblapmásoló/Kapcsolat nélküli böngészõ. A távoli webhelyek saját számítógépre másolásához. Ingyenes. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, kapcsolat nélküli böngészõ URL list (.txt) URL-lista (.txt) Previous Elõzõ Next Következõ URLs URL-ek Warning Figyelmeztetés Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Az ön böngészõje jelenleg nem rendelkezik JavaScript támogatással. JavaScriptes böngészõ használatával jobb eredményt érhet el. Thank you Köszönjük You can now close this window Mostmár bezárhatja ezt az ablakot Server terminated A kiszolgáló befejezte a kapcsolatot A fatal error has occurred during this mirror Végzetes hiba történt a tükrözés közben Proxy type: Proxy típusa: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxy protokoll. HTTP: szabványos proxy. HTTP (CONNECT alagút): minden kérést CONNECT alagúton keresztül küld, a csak CONNECT-et támogató proxykhoz, mint a Tor HTTPTunnelPortja. SOCKS5: alapértelmezett port 1080. Load cookies from file: Sütik betöltése fájlból: Preload cookies from a Netscape cookies.txt file before crawling. Sütik elõzetes betöltése egy Netscape cookies.txt fájlból a tükrözés elõtt. Pause between files: Szünet a fájlok között: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Véletlenszerû késleltetés a fájlletöltések között, másodpercben. Véletlen tartományhoz használja a MIN:MAX formát (pl. 2:8). Keep the www. prefix (do not merge www.host with host) A www. elõtag megtartása (ne vonja össze a www.host és a host címet) Do not treat www.host and host as the same site. Ne kezelje a www.host és a host címet ugyanazon webhelyként. Keep double slashes in URLs Dupla perjelek megtartása az URL-ekben Do not collapse duplicate slashes in URLs. Ne vonja össze az ismétlõdõ perjeleket az URL-ekben. Keep the original query-string order Az eredeti lekérdezési szöveg sorrendjének megtartása Do not reorder query-string parameters when deduplicating URLs. Ne rendezze át a lekérdezési szöveg paramétereit az ismétlõdõ URL-ek kiszûrésekor. Strip query keys: Lekérdezési kulcsok eltávolítása: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Vesszõvel elválasztott lekérdezési kulcsok, amelyeket el kell hagyni a mentett fájl elnevezésébõl (pl. sid,utm_source). Write a WARC archive of the crawl A bejárás WARC archívumának írása Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Minden letöltött válasz mentése ISO-28500 WARC/1.1 archívumba is, a tükör mellé. WARC archive name: WARC archívum neve: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. A WARC archívum opcionális alapneve; hagyja üresen az automatikus elnevezéshez a kimeneti könyvtárban. httrack-3.49.14/lang/Macedonian.txt0000644000175000017500000011374615230602340012544 LANGUAGE_NAME Macedonian LANGUAGE_FILE Macedonian LANGUAGE_ISO mk LANGUAGE_AUTHOR Àëåêñàíäàð Ñàâè (aleks@macedonia.eu.org) \r \n LANGUAGE_CHARSET ISO-8859-5 LANGUAGE_WINDOWSID FYRO Macedonian OK Äîáðî Cancel Îòêàæè Exit Èçëåç Close Çàòâîðè Cancel changes Îòêàæè ãè ïðîìåíèòå Click to confirm Êëèêíè çà ïîòâðäà Click to get help! Êëèêíè çà ïîìîø Click to return to previous screen Êëèêíè çà âðààœå íà ïðåòõîäíèîò åêðàí Click to go to next screen Êëèêíè çà íàðåäåí åêðàí Hide password Ñîêðè¼ ¼à ëîçèíêàòà Save project Çà÷óâ༠ãî ïðîåêòîò Close current project? Çàòâîðè ãî ïðîåêòîò? Delete this project? Èçáðèøè ãî ïðîåêòîò? Delete empty project %s? Èçáðèøè ãî ïðàçíèîò ïðîåêò %s? Action not yet implemented Àêöè¼àòà ñåóøòå íå å èìïëåìåíòèðàíà Error deleting this project Ãðåøêà ïðè áðèøåœåòî íà ïðîåêòîò Select a rule for the filter Èçáåðåòå ïðàâèëî çà ôèëòåðîò Enter keywords for the filter Âíåñåòå êëó÷íè çáîðîâè çà ôèëòåðîò Cancel Îòêàæè Add this rule Äîäàäåòå ãî îâà ïðàâèëî Please enter one or several keyword(s) for the rule Âå ìîëèìå âíåñåòå êëó÷íè çáîðîâè çà ïðàâèëîòî Add Scan Rule Äîäàäåòå Scan Ïðàâèëî Criterion Êðèòåðèóì String Ñòðèíã Add Äîäàäè Scan Rules Scan ôèëòðè Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Êîðèñòåòå Ÿîêåðè çà äà äîäàäåòå/èçáðèøåòå URL èëè ëèíêîâè. Ìîæåòå äà ñòàâèòå ïîâåå scan ñòðèíãîâè íà èñòàòà ëèíè¼à. \nÊîðèñòåòå ïðàçè ìåñòà çà îäâî¼óâàœå.\n\nÏðèìåð: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi\r\n Exclude links Èçáðèøåòå ãè ëèíêîâèòå Include link(s) Äîäàäåòå ëèíêîâè Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Ñîâåò: Çà äà ãè èìàòå äîäàäåíî ñèòå GIF äàòîòåêè, êîðèñòåòå íåøòî êàêî +www.íåêî¼âåá.com/*.gif. \n(+*.gif / -*.gif å ãè äîäàäå/èçáðèøå ÑÈÒÅ GIF-îâè îä ÑÈÒÅ ñà¼òîâè) Save prefs Çà÷óâ༠ãè ïðåôåðåíöèòå Matching links will be excluded: Èñòèòå ëèíêîâè å áèäàò èçáðèøàíè: Matching links will be included: Èñòèòå ëèíêîâè å áèäàò äîäàäåíè: Example: Íà ïðèìåð: gif\r\nWill match all GIF files gif\r\nå ãè íà¼äå ñèòå GIF äàòîòåêè blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nå ãè íà¼äå ñèòå äàòîòåêè êîè ñîäðæàò 'blue'ñóá-ñòðèíã êàêî íà ïðèìåð 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nå ¼à íà¼äå äàòîòåêàòà 'bigfile.mov', íî íå è 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nå íà¼äå ëèíêîâè ñî ôîëäåð ÷èå èìå ãî ñîäðæè ñóá-ñòðèíãîò 'cgi' êàêî íà ïðèìåð /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\å íà¼äå ëèíêîâè ñî ôîëäåð ÷èå èìå ãî ñîäðæè öåëèîò 'cgi-bin' ñòðèíã (íî íå è cgi-bin-2, íà ïðèìåð) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nå íà¼äå ëèíêîâè êàêî www.someweb.com, private.someweb.com èòí. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nå íà¼äå ëèíêîâè îä òèïîò íà www.someweb.com, www.someweb.edu, private.someweb.otherweb.com èòí. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nå íà¼äå ëèíêîâè êàêî 'www.someweb.com' (íî íå è ëèíêîâè êàêî private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nå ãè íà¼äå ñèòå ëèíêîâè îä òèïîò íà www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html èòí. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nå ¼à íà¼äå ñàìî 'www.test.com/test/someweb.html äàòîòåêàòà. Çàïîìíåòå äåêà ìîðàòå äà ãî íàïèøåòå êîìïëåòíèîò path (URL + ñà¼ò path) All links will match Ñèòå ëèíêîâè ñå äîçâîëåíè Add exclusion filter Äîäàäè ôèëòåð çà èñêëó÷óâàœå Add inclusion filter Äîäàäè ôèëòåð çà âêëó÷óâàœå Existing filters Ïîñòîå÷êè ôèëòðè Cancel changes Îòêàæè ãè ïðîìåíèòå Save current preferences as default values Çà÷óâ༠ãè ñåãàøíèòå ïðåôåðåíöè êàêî default âðåäíîñòè Click to confirm Êëèêíè çà ïîòâðäà No log files in %s! Íåìà log äàòîòåêè âî %s! No 'index.html' file in %s! Íåìà 'index.html' äàòîòåêè âî %s! Click to quit WinHTTrack Website Copier Êëèêíè çà èçëåç îä WinHTTrack Website Copier View log files Âèäè ãè log äàòîòåêèòå Browse HTML start page Ïðåëèñòóâ༠¼à HTML start ñòðàíèöàòà End of mirror Êð༠íà êîïè¼àòà îä ñà¼òîò (mirror) View log files Âèäè ãè log äàòîòåêèòå Browse Mirrored Website Ïðåëèñò༠¼à êîïè¼àòà íà âåá ñà¼òîò New project... Íîâ ïðîåêò... View error and warning reports Âèäè ãè èçâåøòàèòå çà ãðåøêè è ïðåäóïðåäóâàœà View report Âèäè ãî èçâåøòà¼îò Close the log file window Çàòâîðè ãî ïðîçîðåöîò íà log äàòîòåêàòà Info type: Òèï íà èíôîðìàöè¼àòà Errors Ãðåøêè Infos Èíôîðìàöèè Find Íà¼äè Find a word Íà¼äè ãî çáîðîò Info log file Èíôîðìàöèè çà log äàòîòåêàòà Warning/Errors log file Log äàòîòåêà çà ïðåäóïðåäóâàœà è ãðåøêè Unable to initialize the OLE system Íå ìîæå äà ñå èíèöè¼àëèçèðà OLE ñèñòåìîò WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack íå ìîæå äà íà¼äå íèåäíà ïðåêèíàòà download keø äàòîòåêà âî áàðàíèîò ôîëäåð Could not connect to provider Íå ìîæå äà ñå ïîâðçå ñî ïðîâà¼äåðîò receive ïðèìà request ìîëáà connect ïîâðçóâà search áàð༠ready ïîäãîòâåí error ãðåøêà Receiving files.. Ïðèìàœå íà äàòîòåêè... Parsing HTML file.. Àíàëèçèðàœå íà HTML äàòîòåêàòà... Purging files.. Ïðå÷èñòóâàœå íà äàòîòåêèòå... Loading cache in progress.. Â÷èòóâàœå íà êåøîò âî òåê.. Parsing HTML file (testing links).. Àíàëèçèðàœå íà HTML äàòîòåêèòå (òåñòèðàœå íà ëèíêîâèòå).. Pause - Toggle [Mirror]/[Pause download] to resume operation Ïàóçà - Èçáåðåòå [Mirror]/[Ïàóçèðàœå íà ñèìíóâàœåòî] çà ïðîäîëæóâàœå íà îïåðàöè¼àòà Finishing pending transfers - Select [Cancel] to stop now! Çàâðøóâàœå íà òðàíñôåðè êîè ÷åêààò - Èçáåðåòå [Îòêàæè] çà ñòîïèðàœå! scanning ñêåíèðà Waiting for scheduled time.. Ãî ÷åêàì äàäåíîòî âðåìå... Connecting to provider Ïîâðçóâàœå ñî ïðîâà¼äåðîò [%d seconds] to go before start of operation Îñòàíóâààò óøòå [%d seconds] äî ñòàðòîò íà îïåðàöè¼àòà Site mirroring in progress [%s, %s bytes] Âî òåê å êîïèðàœå íà ñà¼òîò [%s, %s áà¼òè] Site mirroring finished! Êîïèðàœåòî íà ñà¼òîò å çàâðøåíî! A problem occurred during the mirroring operation\n Ñå ïî¼àâè ïðîáëåì ïðè êîïèðàœåòî íà ñà¼òîò\n \nDuring:\n \nÂî òåê:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nÂèäè ¼à log äàòîòåêàòà äîêîëêó å ïîòðåáíî.\n\nÊëèêíè ÄÎÁÐÎ çà èçëåç îä WinHTTrack Website Copier.\n\nÁëàãîäàðèìå çà êîðèñòåœåòî íà WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Êîïèðàœåòî íà ñà¼òîò çàâðøè.\nÊëèêíè Èçëåç çà èñêëó÷óâàœå íà WinHTTrack.\nÂèäè ãè log äàòîòåêèòå çà äà ïðîâåðèø äàëè ñå å â ðåä.\n\nÁëàãîäàðèìå çà êîðèñòåœåòî íà WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? ** ÊÎÏÈÐÀŒÅÒÎ Å ÏÐÅÊÈÍÀÒÎ!**\r\nÑåãàøíèîò temporary êåø å ïîòðåáåí çà ñåêî¼à update îïåðàöè¼à è ãè ñîäðæè ñàìî ïîäàòîöèòå ñèìíàòè ïðè ñåãàøíàòà ïðåêèíàòà ñåñè¼à.\r\nÁèâøèîò êåø ìîæå äà ñîäðæè êîìïëåòíè èíôîðìàöèè; àêî íå ñàêàòå äà ãè çèãóáèòå òèå èíôîðìàöèè, ìîðàòå äà ãè ïîâðàòèòå è äà ãî èçáðèøåòå ñåãàøíèîò êåø\r\n[Ñîâåò: Îâà ìîæå ëåñíî äà ñå íàïðàâè îâäå ïðåêó áðèøåœå íà hts-cache/new.* äàòîòåêèòå]\r\n\r\nÌèñëèòå ëè äåêà áèâøèîò êåø ìîæå äà ñîäðæè êîìïëåòíè èíôîðìàöèè, è äàëè ñàêàòå äà ãè ïîâðàòèòå? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= **ÃÐÅØÊÀ ÏÐÈ ÊÎÏÈÐÀŒÅÒÎ**\r\nHTTrack îòêðè äåêà ñåãàøíèîò êåø å ïðàçåí. Àêî áèë update, ïðåòõîäíàòà êîïè¼à å ïîâðàòåíà.\r\nÏðè÷èíà: ïðâèòå ñòðàíèöè èëè íå ìîæàò äà áèäàò ïðîíà¼äåíè, èëè ñå ñëó÷è¼ ïðîáëåì ñî êîíåêöè¼àòà.\r\n=> Îñèãóðåòå ñå äàëè âåá ñà¼òîò ñåóøòå ïîñòîè, è/èëè ïðîâåðåòå ãè âàøèòå proxy ñåòèíçè!<= \n\nTip: Click [View log file] to see warning or error messages n\nÑîâåò: Êëèêíè [Âèäè ¼à log äàòîòåêàòà] çà äà âèäèòå ïîðàêè çà ãðåøêè èëè ïðåäóïðåäóâàœå Error deleting a hts-cache/new.* file, please do it manually Ãðåøêà áðè áðèøåœåòî íà hts-cache/new.* äàòîòåêàòà, âå ìîëèìå íàïðàâåòå ãî òîà ðà÷íî. Do you really want to quit WinHTTrack Website Copier? Äàëè íàâèñòèíà ñàêàòå äà ãî èñêëó÷èòå WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Íà÷èíè çà êîïèðàœå íà ñà¼òîò -\n\nÂíåñåòå àäðåñè âî URL ïîëåòî - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Èíòåðàêòèâåí wizard íà÷èí (ïðàøàœà) -n\nÂíåñåòå àäðåñè âî URL ïîëåòî - File Download Mode -\n\nEnter file address(es) in URL box - Íà÷èí çà ñèìíóâàœå íà äàòîòåêè -n\nÂíåñåòå ãè àäðåñèòå íà äàòîòåêèòå âî URL ïîëåòî - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Íà÷èí çà òåñòèðàœå íà ëèíêîò -n\nÂíåñåòå Âåá àäðåñè ñî ëèíêîâè çà òåñòèðàœå âî URL ïîëåòî - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Íà÷èí çà íàäãðàäóâàœå -n\nÏîòâðäåòå ãè àäðåñèòå âî URL ïîëåòî, ïðîâåðåòå ãè ïàðàìåòðèòå äîêîëêó å ïîòðåáíî, ïîòîà êëèêíåòå íà 'ÏÎÍÀÒÀÌÓ' êîï÷åòî - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Íà÷èí çà ïðîäîëæóâàœå (Ïðåêèíàòà îïðàöè¼à) -n\nÏîòâðäåòå ãè àäðåñèòå âî URL ïîëåòî, ïðîâåðåòå ãè ïàðàìåòðèòå äîêîëêó å ïîòðåáíî, ïîòîà êëèêíåòå íà 'ÏÎÍÀÒÀÌÓ' êîï÷åòî Log files Path Path çà log äàòîòåêèòå Path Ïàòåêà - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Íà÷èí çà ëèñòàœå íà ëèíêîâèòå -n\nÊîðèñòåòå ãî URL ïîëåòî çà âíåñóâàœå íà àäðåñè èëè ñòðàíèöè êîè ñîäðæàò ëèíêîâè çà êîïè¼àòà. New project / Import? Íîâ ïðîåêò/ Èìïîðòèðà¼? Choose criterion Èçáåðåòå êðèòåðèóì Maximum link scanning depth Ìàêñèìàëíà äëàáî÷èíà çà ñêåíèðàœå íà ëèíêîò Enter address(es) here Âíåñåòå àäðåñè îâäå Define additional filtering rules Äåôèíèðà¼òå äîäàòíè ïðàâèëà çà ôèëòðèðàœå Proxy Name (if needed) Proxy èìå (äîêîëêó å ïîòðåáíî) Proxy Port Proxy ïîðòà Define proxy settings Äåôèíèðà¼òå ãè proxy ñåòèíçèòå Use standard HTTP proxy as FTP proxy Êîðèñòåòå ñòàíäàðäåí HTTP proxy êàêî FTP proxy Path Ïàòåêà Select Path Èçáåðåòå Path Path Ïàòåêà Select Path Èçáåðåòå Path Quit WinHTTrack Website Copier Èçëåçåòå îä WinHTTrack Website Copier About WinHTTrack Çà WinHTTrack Save current preferences as default values Çà÷óâà¼òå ãè ñåãàøíèòå ïðåôåðåíöè êàêî default âðåäíîñòè Click to continue Êëèêíåòå çà äà ïðîäîëæèòå Click to define options Êëèêíåòå çà äà ãè äåôèíèðàòå îïöèèòå Click to add a URL Êëèêíåòå çà äà äîäàäåòå URL Load URL(s) from text file Ïîâèêà¼òå ãî URL-òî îä òåêñò äàòîòåêà WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack ïðåôåðåíöè (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Òåêñò äàòîòåêà ñî ëèñòà íà àäðåñè (*.txt)|*.txt| File not found! Äàòîòåêàòà íå å ïðîíà¼äåíà! Do you really want to change the project name/path? Äàëè íàâèñòèíà ñàêàòå äà ãî ïðîìåíèòå èìåòî íà ïðîåêòîò/path-îò? Load user-default options? Ïîâèêà¼òå ãè user-default îïöèèòå? Save user-default options? Çà÷óâà¼òå ãè user-default îïöèèòå? Reset all default options? Ðåñåòèðà¼òå ãè ñèòå default îïöèè? Welcome to WinHTTrack! Äîáðîäî¼äîâòå âî WinHTTrack! Action: Àêöè¼à: Max Depth Ìàêñèìàëíà äëàáî÷èíà Maximum external depth: Ìàêñèìàëíà íàäâîðåøíà äëaáî÷èíà: Filters (refuse/accept links) : Ôèëòðè (îäáè¼/ïðèôàòè ãè ëèíêîâèòå) : Paths Path-îâè Save prefs Çà÷óâ༠ãè ïðåôåðåíöèèòå Define.. Äåôèíèðà¼... Set options.. Ñåòèð༠ãè îïöèèòå... Preferences and mirror options: Ïàðàìåòðè çà êîïè¼àòà íà ñà¼òîò Project name Èìå íà ïðîåêòîò Add a URL... Äîäàäåòå URL... Web Addresses: (URL) Âåá àäðåñè: (URL) Stop WinHTTrack? Ñòîïèðà¼òå ãî WinHTTrack? No log files in %s! Íåìà log äàòîòåêè âî %s! Pause Download? Ïàóçèð༠ãî ñèìíóâàœåòî? Stop the mirroring operation Ñòîïèð༠ãî êîïèðàœåòî íà ñà¼òîò? Minimize to System Tray Ìèíèìèçèð༠âî System Tray Click to skip a link or stop parsing Êëèêíåòå çà ïðåñêîêíóâàœå íà ëèíê èëè ñòîïèðàœå íà àíàëèçàòà Click to skip a link Êëèêíåòå çà ïðåñêîêíóâàœå íà ëèíêîò Bytes saved Çà÷óâàíè áà¼òè Links scanned Ñêåíèðàíè ëèíêîâè Time: Âðåìå: Connections: Êîíåêöèè: Running: Àêòèâíè: Hide Ñîêðè¼ Transfer rate Áðçèíà íà òðàíñôåð SKIP ÏÐÅÑÊÎÊÍÈ Information Èíôîðìàöèè Files written: Çàïèøàíè äàòîòåêè: Files updated: Update-èðàíè äàòîòåêè: Errors: Ãðåøêè: In progress: Âî òåê: Follow external links Ñëåäè ãè íàäâîðåøíèòå ëèíêîâè Test all links in pages Òåñòèð༠ãè ñèòå ëèíêîâè âî ñòðàíèöèòå Try to ferret out all links Îáèäè ñå äà ãè ïðîíà¼äåø ñèòå ëèíêîâè Download HTML files first (faster) Ïðâèí ñèìíåòå ãè HTML äàòîòåêèòå (ïîáðçî) Choose local site structure Èçáåðåòå ñòðóêòóðà íà ëîêàëíèîò ñà¼ò Set user-defined structure on disk Ñåòèðà¼òå user-äåôèíèðàíà ñòðóêòóðà íà äèñêîò Use a cache for updates and retries Êîðèñòåòå êåø çà update è retry Do not update zero size or user-erased files Íå ïðàâè update íà èçáðèøàíè äàòîòåêè èëè äàòîòåêè ñî ãîëåìèíà íóëà Create a Start Page Êðåèðà¼òå Ñòàðò ñòðàíèöà Create a word database of all html pages Êðåèðà¼òå word áàçà íà ïîäàòîöè íà ñèòå html ñòðàíèöè Create error logging and report files Êðåèðà¼òå error logging è äàòîòåêè ñî èçâåøòàè Generate DOS 8-3 filenames ONLY Ãåíåðèðà¼òå ÑÀÌÎ DOS 8-3 èìèœà íà äàòîòåêè Generate ISO9660 filenames ONLY for CDROM medias Ãåíåðèð༠ISO9660 èìèœà íà äàòîòåêè ÑÀÌÎ çà CDROM óðåäè Do not create HTML error pages Íå êðåèðà¼òå HTML ñòðàíèöè ñî ãðåøêè Select file types to be saved to disk Ñåëåêòèðà¼òå òèïîâè íà äàòîòåêè êîè å áèäàò çà÷óâàíè íà äèñêîò Select parsing direction Ñåëåêòèðà¼òå íàñîêà íà ïðåáàðóâàœå íà ñà¼òîò Select global parsing direction Ñåëåêòèðà¼òå ãëîáàëíà íàñîêà íà ïðåáàðóâàœå íà ñà¼òîò Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Max simultaneous connections Ìàêñèìàëíè ñèìóëòàíè êîíåêöèè File timeout Timeout íà äàòîòåêèòå Cancel all links from host if timeout occurs Îòêàæè ãè ñèòå ëèíêîâè îä host-îò àêî ñå ñëó÷è timeout Minimum admissible transfer rate Ìèíèìàëíà äîçâîëåíà áðçèíà íà òðàíñôåð Cancel all links from host if too slow Îòêàæè ãè ñèòå ëèíêîâè îä host-îò àêî å ïðåìíîãó áàâíî Maximum number of retries on non-fatal errors Ìàêñèìàëåí áðî¼ íà retry íà íå-ôàòàëíè ãðåøêè Maximum size for any single HTML file Ìàêñèìàëíà ãîëåìèíà çà áèëî êî¼à åäèíå÷íà HTML äàòîòåêà Maximum size for any single non-HTML file Ìàêñèìàëíà ãîëåìèíà çà áèëî êî¼ åäèíå÷íà íå-HTML äàòîòåêà Maximum amount of bytes to retrieve from the Web Ìàêñèìàëíî êîëè÷åñòâî íà áà¼òè çà ñèìíóâàœå îä Âåáîò Make a pause after downloading this amount of bytes Íàïðàâåòå ïàóçà ïî ñèìíóâàœåòî íà îâà êîëè÷åñòâî íà áà¼òè Maximum duration time for the mirroring operation Ìàêñèìàëíî âðåìå-òðàåœå çà êîïèðàœå íà ñà¼òîò Maximum transfer rate Ìàêñèìàëíà áðçèíà íà òðàíñôåð Maximum connections/seconds (avoid server overload) Ìàêñèìàëíè êîíåêöèè/ñåêóíäè (îäáåãíóâà¼è îïòåðåòóâàœå íà ñåðâåðîò) Maximum number of links that can be tested (not saved!) Ìàêñèìàëåí áðî¼ íà ëèíêîâè êîè ìîæàò äà áèäàò òåñòèðàíè (íå çà÷óâàíè!) Browser identity Èäåíòèôèêàöè¼à íà ïðåáàðóâà÷îò Comment to be placed in each HTML file Êîìåíòàð êî¼ òðåáà äà áèäå ñìåñòåí âî ñåêî¼à HTML äàòîòåêà Back to starting page Íàçàä äî ñòàðòíàòà ñòðàíèöà Save current preferences as default values Çà÷óâà¼òå ãè ñåãàøíèòå ïðåôåðåíöè êàêî default âðåäíîñòè Click to continue Êëèêíåòå çà äà ïðîäîëæèòå Click to cancel changes Êëèêíåòå çà äà ãè îòêàæåòå ïðîìåíèòå Follow local robots rules on sites Ñëåäåòå ãè ëîêàëíèòå ïðàâèëà íà ðîáîòèòå íà ñà¼òîâèòå Links to non-localised external pages will produce error pages Ëèíêîâèòå äî íå-ëîêàëèçèðàíè íàäâîðåøíè ñòðàíèöè å ïðåäèçâèêààò ñòðàíèöè ñî ãðåøêè Do not erase obsolete files after update Íå áðèøè ãè çàñòàðåíèòå äàòîòåêè ïî update-îò Accept cookies? Ïðèôàòè êîëà÷èœà (cookies)? Check document type when unknown? Ïðîâåðè ãî òèïîò íà äîêóìåíòîò êîãà å íåïîçíàò? Parse java applets to retrieve included files that must be downloaded? Àíàëèçèð༠ãè Java àïëåòèòå çà äà ãè ïîâðàòèø âêëó÷åíèòå äàòîòåêè êîè ìîðààò äà áèäàò ñèìíàòè? Store all files in cache instead of HTML only Ñìåñòè ãè ñèòå äàòîòåêè âî êåøîò íàìåñòî ñàìî HTML Log file type (if generated) Òèï íà log äàòîòåêàòà (àêî å ãåíåðèðàíà) Maximum mirroring depth from root address Ìàêñèìàëíà äëàáî÷èíà íà êîïè¼àòà íà ñà¼òîò îä root àäðåñàòà Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Ìàêñèìàëíà äëàáî÷èíà íà êîïè¼àòà íà ñà¼òîò çà íàäâîðåøíè/çàáðàíåòè àäðåñè (0, íåìà, è òîà å default) Create a debugging file Êðåèðà¼òå debugging äàòîòåêà Use non-standard requests to get round some server bugs Êîðèñòåòå íå-ñòàíäàðäíè ìîëáè çà äà çàîáèêîëèòå íåêîè ãðåøêè íà ñåðâåðîò Use old HTTP/1.0 requests (limits engine power!) Êîðèñòåòå ñòàðè HTML/1.0 ìîëáè (îãðàíè÷åíà å ìîæíîñòà íà ïðîãðàìàòà) Attempt to limit retransfers through several tricks (file size test..) Îáèäè ñå äà ñå îãðàíè÷àò ïîâòîðíèòå òðàíñôåðè ïðåêó íåêîè òðèêîâè (òåñò íà ãîëåìèíàòà íà äàòîòåêàòà...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Çàïèøè ãè íàäâîðåøíèòå ëèíêîâè áåç login/password Write internal links without query string Çàïèøè ãè âíàòðåøíèòå ëèíêîâè áåç 'query string' Get non-HTML files related to a link, eg external .ZIP or pictures Çåìåòå íå-HTML äàòîòåêè êîè ñå ïîâðçàíè ñî ëèíê, íà ïðèìåð, íàäâîðåøíè .ZIP èëè ñëèêè Test all links (even forbidden ones) Òåñòèðà¼òå ãè ñèòå ëèíêîâè (äóðè è çàáðàíåòèòå) Try to catch all URLs (even in unknown tags/code) Îáèäè ñå äà ñå ôàòàò ñèòå URL (äóðè è âî íåïîçíàòè òàãîâè/êîäîâè) Get HTML files first! Ïðâèí çåìè ãè HTML äàòîòåêèòå! Structure type (how links are saved) Òèï íà ëîêàëíàòà ñòðóêòóðà (êàêî ñå çà÷óâàíè ëèíêîâèòå) Use a cache for updates Êîðèñòåòå êåø çà update-è Do not re-download locally erased files Íåìî¼ ïîâòîðíî äà ãè ñèìíóâàø ëîêàëíî èçáðèøàíèòå äàòîòåêè Make an index Íàïðàâè èíäåêñ Make a word database Íàïðàâè word áàçà íà ïîäàòîöè Log files Log äàòîòåêè DOS names (8+3) DOS èìèœà (8+3)*/ ISO9660 names (CDROM) ISO 9660 èìèœà (CDROM) No error pages Áåç ñòðàíèöè ñî ãðåøêè Primary Scan Rule Ïðèìàðíè ôèëòðè Travel mode Íà÷èí íà ïðåáàðóâàœå Global travel mode Ãëîáàëåí íà÷èí íà ïðåáàðóâàœå These options should be modified only exceptionally Âîîáè÷àåíî, îâèå îïöèè íå òðåáà äà ñå ìåíóâààò Activate Debugging Mode (winhttrack.log) Àêòèâèð༠ãî íà÷èí íà debug (winhttrack.log) Rewrite links: internal / external Ïîâòîðíî íàïèøè ëèíêîâè: âíàòðåøíè / íàäâîðåøíè Flow control Flow êîíòðîëà Limits Îãðàíè÷óâàœà Identity Èäåíòèôèêàöè¼à HTML footer HTML ôóòåð N# connections Áðî¼ íà êîíåêöèè Abandon host if error Íàïóøòè ãî host-îò âî ñëó÷༠íà ãðåøêà Minimum transfer rate (B/s) Ìèíèìàëíà áðçèíà íà òðàíñôåð (áà¼òè/ñåêóíäà) Abandon host if too slow Íàïóøòè ãî host-îò àêî å ïðåìíîãó áàâåí Configure Êîíôèãóðèð༠Use proxy for ftp transfers Êîðèñòè proxy çà ftp òðàíñôåðè TimeOut(s) Òà¼ì àóò(è) Persistent connections (Keep-Alive) Ïîñòî¼àíè ïîâðçóâàœà (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Retry Size limit Îãðàíè÷óâàœå íà ãîëåìèíàòà Max size of any HTML file (B) Ìàêñèìàëíà ãîëåìèíà íà áèëî êî¼à HTML äàòîòåêà (B) Max size of any non-HTML file Ìàêñèìàëíà ãîëåìèíà íà áèëî êî¼à íå-HTML äàòîòåêà Max site size Ìàêñèìàëíà ãîëåìèíà íà ñà¼òîò Max time Ìàêñèìóì âðåìå Save prefs Çà÷óâ༠ãè ïðåôåðåíöèèòå Max transfer rate Ìàêñèìàëíà áðçèíà íà òðàíñôåð Follow robots.txt Ñëåäè ãè ïðàâèëàòà îä robots.txt No external pages Áåç íàäâîðåøíè ñòðàíèöè Do not purge old files Íå ãè áðèøè ñòàðèòå äàòîòåêè Accept cookies Ïðèôàòè êîëà÷èœà (cookies) Check document type Ïðîâåðè ãî òèïîò íà äîêóìåíòîò Parse java files Àíàëèçèð༠ãè Java àïëåòèòå Store ALL files in cache Ñìåñòè ãè ÑÈÒÅ äàòîòåêè âî êåøîò Tolerant requests (for servers) Òîëåðàíòè ìîëáè (çà ñåðâåðè) Update hack (limit re-transfers) Update hack (îãðàíè÷è ãè ïîâòîðíèòå òðàíñôåðè) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Èñêîðèñòè ãè ñòàðèòå HTTP/1.0 ìîëáè (íå 1.1) Max connections / seconds Ìàêñèìàëíè êîíåêöèè /ñåêóíäè Maximum number of links Ìàêñèìàëåí áðî¼ íà ëèíêîâè Pause after downloading.. Íàïðàâè ïàóçà ïî ñèìíóâàœåòî... Hide passwords Ñîêðè¼ ãè ëîçèíêèòå Hide query strings Ñîêðè¼ ãè query ñòðèíãîâèòå Links Ëèíêîâè Build Ñòðóêòóðà Experts Only Ñàìî çà åêñïåðòè Flow Control Flow êîíòðîëà Limits Îãðàíè÷óâàœà Browser ID Èäåíòèôèêàöè¼à íà ïðåáàðóâà÷îò Scan Rules Ôèëòðè Spider Spider Log, Index, Cache Log, èíäåêñ, êåø Proxy Ïðîêñè MIME Types MIME òèïîâè Do you really want to quit WinHTTrack Website Copier? Äàëè íàâèñòèíà ñàêàòå äà ãî èñêëó÷èòå WinHTTrack Website Copier? Do not connect to a provider (already connected) Íå ñå ïîâðçóâ༠íà ïðîâà¼äåðîò (êîíåêöè¼àòà âåå å âîñïîñòàâåíà) Do not use remote access connection Íå êîðèñòè remote access êîíåêöè¼à Schedule the mirroring operation Ïðîãðàìèð༠¼à êîïè¼àòà íà ñà¼òîò Quit WinHTTrack Website Copier Èñêëó÷è ñå îä WinHTTrack Website Copier Back to starting page Íàçàä äî ñòàðòíàòà ñòðàíèöà Click to start! Êëèêíè çà ñòàðò! No saved password for this connection! Íåìà ñíèìåíè ëîçèíêè çà îâàà êîíåêöè¼à! Can not get remote connection settings Íå ìîæå äà ñå äîáè¼àò remote ñåòèíçè çà êîíåêöè¼àòà Select a connection provider Ñåëåêòèð༠ïðîâà¼äåð çà ïîâðçóâàœå Start Ñòàðò Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Âå ìîëèìå ïîäåñåòå ãè ïàðàìåòðèòå çà êîíåêöè¼àòà äîêîëêó å ïîòðåáíî,\nïîòîà ñòèñíåòå ÄÎÁÐÎ çà ïî÷íóâàœå íà êîïèðàœåòî íà ñà¼òîò Save settings only, do not launch download now. Çà÷óâ༠ãè ñàìî ñåòèíçèòå, íå ïî÷íóâ༠ñî ñèìíóâàœå ñåãà. On hold Íà ÷åêàœå Transfer scheduled for: (hh/mm/ss) Òðàíñôåðîò å çàêàæàí çà: (hh\mm\ss) Start Ñòàðò Connect to provider (RAS) Ïîâðçè ñå ñî ïðîâà¼äåðîò (RAS) Connect to this provider Ïîâðçè ñå íà îâî¼ ïðîâà¼äåð Disconnect when finished Äèñêîíåêòèð༠ñå êîãà å çàâðøè Disconnect modem on completion Äèñêîíåêòèð༠ãî ìîäåìîò íà êð༠\r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\Âå ìîëèìå èçâåñòåòå íå çà áèëî êàêâà ãðåøêà èëè ïðîáëåì)\r\n\r\nDevelopment:\r\nÈíòåðôå¼ñ (Windows):Xavier Roche\r\nSpider:Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche è äðóãè\r\nÌÍÎÃÓ ÁËÀÃÎÄÀÐÍÎÑÒ çà ìàêåäîíñêèîò ïðåâîä íà:\r\nÀëåêñàíäàð Ñàâè (aleks@macedonia.eu.org) About WinHTTrack Website Copier Çà WinHTTrack Website Copier Please visit our Web page Âå ìîëèìå ïîñåòåòå ¼à íàøàòà Âåá ñòðàíèöà Wizard query Âîëøåáíèê ïðàøàëíèê Your answer: Âàøèîò îäãîâîð: Link detected.. Ïðîíà¼äåí å ëèíê... Choose a rule Èçáåðè ïðàâèëî Ignore this link Èãíîðèð༠ãî îâî¼ ëèíê Ignore directory Èãíîðèð༠ãî äèðåêòîðèóìîò Ignore domain Èãíîðèð༠ãî äîìåíîò Catch this page only Ôàòè ¼à ñàìî îâàà ñòðàíèöà Mirror site Êîïè¼à íà ñà¼òîò Mirror domain Êîïè¼à íà äîìåíîò Ignore all Èãíîðèð༠ñå Wizard query Âîëøåáíèê ïðàøàëíèê NO ÍÅ File Äàòîòåêà Options Îïöèè Log Ëîã Window Ïðîçîðåö Help Ïîìîø Pause transfer Ïàóçà íà òðàíñôåðîò Exit Èçëåç Modify options Ìîäèôèöèð༠ãè îïöèèòå View log Âèäè ãî log-îò View error log Âèäè ãî log-îò çà ãðåøêè View file transfers Âèäè ãî òðàíñôåðîò íà ïîäàòîöè Hide Ñîêðè¼ About WinHTTrack Website Copier Çà WinHTTrack Website Copier Check program updates... Ïðîâåðè äàëè èìà update çà ïðîãðàìàòà... &Toolbar Toolbar &Status Bar Statusbar S&plit Ðàçäåëè File Äàòîòåêà Preferences Ïîäåñóâàœà Mirror Êîïè¼à íà ñà¼òîò Log Ëîã Window Ïðîçîðåö Help Ïîìîø Exit Èçëåç Load default options Ïîâèê༠ãè default îïöèèòå Save default options Çà÷óâ༠ãè default îïöèèòå Reset to default options Ðåñåòèð༠äî default îïöèèòå Load options... Ïîâèê༠ãè îïöèèòå... Save options as... Çà÷óâ༠ãè îïöèèòå êàêî... Language preference... Ïîäåñóâàœà çà ¼àçèêîò... Contents... Ñîäðæèíà About WinHTTrack... Çà WinHTTrack... New project\tCtrl+N Íîâ ïðîåêò\tCtrl+N &Open...\tCtrl+O &Îòâîðè...\tCtrl+O &Save\tCtrl+S &Ñíèìè\tCtrl+S Save &As... Ñíèìè &êàêî... &Delete... &Èçáðèøè... &Browse sites... &Ñà¼òîâè çà ïðåáàðóâàœå... User-defined structure Ñòðóêòóðà äåôèíèðàíà îä êîðèñíèêîò %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tÈìå íà äàòîòåêàòà áåç åêñòåíçè¼àòà (ïðèìåð:image)\r\n%N\tÈìå íà äàòîòåêàòà ñî åêñòåíçè¼à (ïðèìåð: image.gif)\r\n%t\tÑàìî åêñòåíçè¼à (ïðèìåð: gif)\r\n%p\tPath [áåç çàâðøåòîêîò/] (ïðèìåð: /someimages)\r\n%h\tÈìå íà õîñòîò (ïðèìåð: www.someweb.com)\r\n%M\tMD5 URL (128 áèòà, 32 ascii áà¼òè)\r\n%Q\tMD5 query ñòðèíã (128 áèòà, 32 ascii áà¼òè)\r\n%q\tMD5 ìàë query ñòðèíã (16 áèòà, 4 ascii áà¼òè)\r\n\r\n%s?\tÊðàòêî èìå (ïðèìåð: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Ïðèìåð:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proxy ñåòèíçè Proxy address: Proxy àäðåñà: Proxy port: Proxy ïîðòà: Authentication (only if needed) Èäåíòèôèêàöè¼à (ñàìî àêî å ïîòðåáíà) Login Ëîãèí Password Ëîçèíêà Enter proxy address here Âíåñè ¼à proxy àäðåñàòà îâäå Enter proxy port here Âíåñè ¼à proxy ïîðòàòà îâäå Enter proxy login Âíåñè ãî proxy ëîãèíîò Enter proxy password Âíåñè ¼à proxy ëîçèíêàòà Enter project name here Âíåñè ãî èìåòî íà ïðåêòîò îâäå Enter saving path here Âíåñè ãî path-îò çà çà÷óâóâàœå îâäå Select existing project to update Îäáåðåòå ïîñòîå÷êè ïðîåêò çà update Click here to select path Êëèêíè îâäå çà èçáèðàœå íà path Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack ïðîåêò âîëøåáíèê... New project name: Èìå íà íîâèîò ïðîåêò: Existing project name: Èìå íà ïîñòîå÷êèîò ïðîåêò: Project name: Èìå íà ïðîåêòîò: Base path: Îñíîâåí path: Project category: C:\\My Web Sites C:\\Ìîè Âåá Ñà¼òîâè Type a new project name, \r\nor select existing project to update/resume Âíåñåòå íîâî èìå íà ïðîåêòîò, \r\nèëè îäáåðåòå ïîñòîå÷êè ïðîåêò çà update/resume New project Íîâ ïðîåêò Insert URL Âíåñåòå URL URL: URL: Authentication (only if needed) Èäåíòèôèêàöè¼à (ñàìî àêî å ïîòðåáíà) Login Ëîãèí Password Ëîçèíêà Forms or complex links: Ôîðìè èëè êîìïëåêñíè ëèíêîâè: Capture URL... Ôàòè URL... Enter URL address(es) here Âíåñè URL àäðåñè îâäå Enter site login Âíåñè ãî ëîãèíîò íà ñà¼òîò Enter site password Âíåñè ¼à ëîçèíêàòà íà ñà¼òîò Use this capture tool for links that can only be accessed through forms or javascript code Êîðèñòè ¼à îâàà capture àëàòêà çà ëèíêîâè êîè ìîæàò äà áèäàò ïðèñòàïåíè ñàìî ïðåêó ôîðìè èëè javascript êîäîâè Choose language according to preference Èçáåðè ¼àçèê Catch URL! Ôàòè ãî URL-to! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Âå ìîëèìå ïîäåñåòå ãè temporary browser proxy ñåòèíçèòå íà ñëåäíèâå âðåäíîñòè (Copy/Paste Proxy àäðåñàòà è ïîðòàòà).\nÏîòîà êëèêíåòå íà êîï÷åòî 'submit' âî âàøàòà ñòðàíèöà âî ïðåáàðóâà÷îò, èëè ïàê êëèêíåòå íà ëèíêîò êî¼ ñàêàòå äà ãî ôàòèòå. This will send the desired link from your browser to WinHTTrack. Îâà å ãî èñïðàòè ïîñàêóâàíèîò ëèíê îä âàøèîò ïðåáàðóâà÷ äî WinHTTrack. ABORT ÎÒÊÀÆÈ Copy/Paste the temporary proxy parameters here Îâäå íàïðàâåòå Copy/Paste íà temporary ïàðàìåòðèòå Cancel Îòêàæè Unable to find Help files! Íå ìîæå äà ñå íà¼äàò Help äàòîòåêèòå! Unable to save parameters! Íå ìîæå äà ñå ñíèìàò ïàðàìåòðèòå! Please drag only one folder at a time Âå ìîëèìå âëå÷åòå ñàìî åäåí ôîëäåð Please drag only folders, not files Âå ìîëèìå âëå÷åòå ñàìî ôîëäåðè, íå äàòîòåêè Please drag folders only Âå ìîëèìå âëå÷åòå ñàìî ôîëäåðè Select user-defined structure? Îäáåðè ¼à ñòðóêòóðàòà äåôèíèðàíà îä êîðèñíèêîò? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Âå ìîëèìå îñèãóðåòå ñå äåêà ñòðèíãîò äåôèíèðàí îä êîðèñíèêîò å òî÷åí,\nèíàêó èìèœàòà íà äàòîòåêèòå ìîæàò äà áèäàò íåòî÷íè! Do you really want to use a user-defined structure? Äàëè íàâèñòèíà ñàêàòå äà êîðèñòèòå ñòðóêòóðà äåôèíèðàíà îä êîðèñíèêîò? Too manu URLs, cannot handle so many links!! Ïðåìíîãó URL, íå ìîæå äà ñå ðàáîòè ñî òîëêó ìíîãó ëèíêîâè!! Not enough memory, fatal internal error.. Íåìà äîâîëíî ìåìîðè¼à, ôàòàëíà âíàòðåøíà ãðåøêà... Unknown operation! Íåïîçíàòà îïåðàöè¼à! Add this URL?\r\n Äîäàäè ãî îâî¼ URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Ïðåäóïðåäóâàœå:ãëàâíèîò ïðîöåñ ñåóøòå íå îäãîâàðà, íå ìîæå äà ñå äîäàäàò URL... Type/MIME associations Ñîîäâåòåí òèï íà äàòîòåêè (Type/MIME) File types: Òèïîâè íà äàòîòåêè: MIME identity: MIME èäåíòèòåò: Select or modify your file type(s) here Îäáåðè ãè èëè èçìåíè ãè òèïîâèòå íà äàòîòåêè îâäå Select or modify your MIME type(s) here Îäáåðè ãè èëè èçìåíè ãè MIME òèïîâèòå îâäå Go up Îäè íàãîðå Go down Îäè íàäîëó File download information Èíôîðìàöèè çà ñèìíóâàœåòî íà äàòîòåêèòå Freeze Window Çàìðçíè ãî ïðîçîðåöîò More information: Ïîâåå èíôîðìàöèè: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Äîáðîäî¼äîâòå âî WinHTTrack Webiste Copier!\n\nÂå ìîëèìå êëèêíåòå íà êîï÷åòî 'ÏÎÍÀÒÀÌÓ' çà äà\n\n- ïî÷íåòå íîâ ïðîåêò\n- èëè ïðîäîëæèòå ñî ïàðöè¼àëíî ñèìíóâàœå File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Èìèœà íà äàòîòåêè ñî åêñòåíçè¼à:\nÈìèœà íà äàòîòåêè êîè ñîäðæàò:\nÎâà èìå íà äàòîòåêàòà:\nÈìèœà íà ôîëäåðè êîè ñîäðæàò:\nÈìå íà îâî¼ ôîëäåð:\nËèíêîâè íà îâî¼ äîìåí:\nËèíîâè íà äîìåíè êîè ñîäðæàò:\nËèíêîâè îä îâî¼ õîñò:\nËèíêîâè êîè ñîäðæàò:\nÎâî¼ ëèíê:\nÑÈÒÅ ËÈÍÊÎÂÈ Show all\nHide debug\nHide infos\nHide debug and infos Ïîêàæè ãè ñèòå\nÑîêðè¼ debug\nÑîêðè¼ ãè èíôîðìàöèèòå\nÑîêðè¼ debug è èíôîðìàöèè Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Ñòðóêòóðà íà ñà¼òîò (ñòàíäàðäíî)\nHtml âî web/, ñëèêè/äð. äàòîòåêè âî web/ñëèêè/\nHtml âî web/html, ñëèêè/äðóãî âî web/ñëèêè\nHtml âî web/, ñëèêè/äðóãî âî web/\nHtml âî web/, ñëèêè/äðóãî âî web/xxx, êàäå xxx å íàñòàâêàòà íà äàòîòåêàòà\nHtml âî web/html, ñëèêè/äðóãî âî web/xxx\nÑòðóêòóðà íà ñà¼òîò, áåç www.domain.xxx/\nHtml âî site_name/, ñëèêè/äð. äàòîòåêè âî site_name/ñëèêè/\nHtml âî site_name/html, ñëèêè/äðóãî âî site_name/ñëèêè\nHtml âî site_name/, ñëèêè/äðóãî âî site_name/\nHtml âî site_name/, ñëèêè/äðóãî âî site_name/xxx\nHtml âî site_name/html, ñëèêè/äðóãî âî site_name/xxx\nÑèòå äàòîòåêè âî web/, ñî ïðîèçâîëíè èìèœà (gadget !)\nÑèòå äàòîòåêè âî site_name/, ñî ïðîèçâîëíè èìèœà (gadget !)\nÑòðóêòóðà äåôèíèðàíà îä êîðèñíèêîò.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Ñàìî ñêåíèðà¼\nÑìåñòè ãè HTML äàòîòåêèòå\nÑìåñòè ãè íå-HTML äàòîòåêèòå\nÑìåñòè ãè ñèòå äàòîòåêè (default)æíÑìåñòè ãè ïðâèí HTML äàòîòåêèòå Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Îñòàíè âî èñòèîò äèðåêòîðèóì\nÌîæå äà îäè íàäîëó (default)\nÌîæå äà îäè íàãîðå\nÌîæå äà îäè è íàãîðå è íàäîëó Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Îñòàíè íà èñòàòà àäðåñà (default)\nÎñòàíè íà èñòèîò äîìåí\nÎñòàíè íà èñòèîò top level äîìåí\nÎäè íàñåêàäå ïî âåá Never\nIf unknown (except /)\nIf unknown Íèêîãàø\níåïîçíàòî (îñâåí/)\níåïîçíàòî no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules áåç robots.txt ïðàâèëàòà\nrobots.txt îñâåí wizard\nñëåäè ãè robots.txt ïðàâèëàòà normal\nextended\ndebug íîðìàëíî\nïðîøèðåíî\ndebug Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Ñèìíè âåá ñà¼òîâè\nÑèìíè âåá ñà¼òîâè + ïðàøàœà\nÇåìè ïîñåáíè äàòîòåêè\nÑèìíè ãè ñèòå ñà¼òîâè âî ñòðàíèöè (ïîâååêðàòíà êîïè¼à)\nÒåñòèð༠ãè ëèíêîâèòå âî ñòðàíèöèòå (bookmark òåñò)\n*Ïðîäîëæè ãî ïðåêèíàòîòî ñèìíóâàœå\n*Íàïðàâè update na ïîñòîå÷êîòî ñèìíóâàœåEnglish Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Ðåëàòèâåí URI / Àïñîëóòåí URL (ñòàíäàðäåí)\nÀïñîëóòåí URL / Àïñîëóòåí URL\nÀïñîëóòåí URI / Àïñîëóòåí URL\nÎðèãèíàëåí URL / Îðèãèíàëåí URL Open Source offline browser Open Source offline ïðåáàðóâà÷ Website Copier/Offline Browser. Copy remote websites to your computer. Free. Êîïèðà÷ íà âåá ñà¼òîâè/Offline ïðåáàðóâà÷. Êîïèðà¼òå âåá ñà¼òîâè íà âàøèîò êîìï¼óòåð. Áåñïëàòíî. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline ïðåáàðóâà÷ URL list (.txt) URL ëèñòà (.txt) Previous Ïðåòõîäåí Next Ñëåäåí URLs URLs Warning Ïðåäóïðåäóâàœå Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Âàøèîò ïðåáàðóâà÷ íå ïîääðæóâà javascript. Çà ïîäîáðè ðåçóëòàòè, êîðèñòåòå ïðåáàðóâà÷ ñî javascript. Thank you Áëàãîäàðèìå You can now close this window Ìîæåòå äà ãî çàòâîðèòå îâî¼ ïðîçîðåö Server terminated Ñåðâåðîò å ïðåêèíàò A fatal error has occurred during this mirror Íàñòàíà ôàòàëíà ãðåøêà ïðè îâî¼ mirror Proxy type: ÂØß ÝÐ ßàÞÚáØ: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. ¿àÞâÞÚÞÛ ÝÐ ßàÞÚáØ. HTTP: áâÐÝÔÐàÔÕÝ ßàÞÚáØ. HTTP (âãÝÕÛ CONNECT): ÓÞ ØáßàÐüÐ áÕÚÞÕ ÑÐàÐúÕ ßàÕÚã âãÝÕÛ CONNECT, ×Ð ßàÞÚáØ èâÞ ßÞÔÔàÖãÒÐÐâ áÐÜÞ CONNECT ÚÐÚÞ HTTPTunnelPort ÝÐ Tor. SOCKS5: áâÐÝÔÐàÔÝÐ ßÞàâÐ 1080. Load cookies from file: ²çØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ: Preload cookies from a Netscape cookies.txt file before crawling. ¾ÔÝÐßàÕÔ ÒçØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ Netscape cookies.txt ßàÕÔ ßàÕ×ÕÜÐúÕâÞ. Pause between files: ¿Ðã×Ð ÜÕóã ÔÐâÞâÕÚØ: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). ÁÛãçÐøÝÞ ÔÞæÝÕúÕ ÜÕóã ßàÕ×ÕÜÐúÐâÐ ÝÐ ÔÐâÞâÕÚØ, ÒÞ áÕÚãÝÔØ. ºÞàØáâØ MIN:MAX ×Ð áÛãçÐÕÝ ÞßáÕÓ (ÝÐ ßàØÜÕà 2:8). Keep the www. prefix (do not merge www.host with host) ·ÐÔàÖØ ÓÞ ßàÕäØÚáÞâ www. (ÝÕ áßÞøãÒÐø www.host áÞ host) Do not treat www.host and host as the same site. ½Õ âàÕâØàÐø ÓØ www.host Ø host ÚÐÚÞ Øáâ áÐøâ. Keep double slashes in URLs ·ÐÔàÖØ ÓØ ÔÒÞøÝØâÕ ÚÞáØ æàâØ ÒÞ URL Do not collapse duplicate slashes in URLs. ½Õ ÞâáâàÐÝãÒÐø ÓØ ßÞÒâÞàÕÝØâÕ ÚÞáØ æàâØ ÒÞ URL. Keep the original query-string order ·ÐÔàÖØ ÓÞ Ø×ÒÞàÝØÞâ àÕÔÞáÛÕÔ ÝÐ ßÐàÐÜÕâàØâÕ ÒÞ ÑÐàÐúÕâÞ Do not reorder query-string parameters when deduplicating URLs. ½Õ ÜÕÝãÒÐø ÓÞ àÕÔÞáÛÕÔÞâ ÝÐ ßÐàÐÜÕâàØâÕ ÝÐ ÑÐàÐúÕâÞ ßàØ ÞâáâàÐÝãÒÐúÕ ÔãßÛØÚÐâØ URL. Strip query keys: ¾âáâàÐÝØ ÚÛãçÕÒØ ÞÔ ÑÐàÐúÕâÞ: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). ºÛãçÕÒØ ÞÔ ÑÐàÐúÕâÞ, ÞÔÔÕÛÕÝØ áÞ ×ÐߨàÚÐ, èâÞ áÕ ÞâáâàÐÝãÒÐÐâ ÞÔ ØÜÕâÞ ÝÐ ×ÐçãÒÐÝÐâÐ ÔÐâÞâÕÚÐ (ÝÐ ßàØÜÕà sid,utm_source). Write a WARC archive of the crawl ·ÐßØèØ WARC ÐàåØÒÐ ÝÐ ßàÕÑÐàãÒÐúÕâÞ Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. ·ÐçãÒÐø ÓÞ áÕÚÞø ßàÕ×ÕÜÕÝ ÞÔÓÞÒÞà Ø ÒÞ ISO-28500 WARC/1.1 ÐàåØÒÐ, ßÞÚàÐø ÞÓÛÕÔÐÛÞâÞ. WARC archive name: ¸ÜÕ ÝÐ WARC ÐàåØÒÐâÐ: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. ¸×ÑÞàÝÞ ÞáÝÞÒÝÞ ØÜÕ ×Ð WARC ÐàåØÒÐâÐ; ÞáâÐÒÕâÕ ßàÐ×ÝÞ ×Ð ÐÒâÞÜÐâáÚÞ ØÜÕÝãÒÐúÕ ÒÞ Ø×ÛÕ×ÝØÞâ ÔØàÕÚâÞàØãÜ. httrack-3.49.14/lang/Japanese.txt0000644000175000017500000010726115230602340012227 LANGUAGE_NAME Japanese LANGUAGE_FILE Japanese LANGUAGE_ISO ja LANGUAGE_AUTHOR TAPKAL\r\n LANGUAGE_CHARSET shift-jis LANGUAGE_WINDOWSID Japanese OK OK Cancel ƒLƒƒƒ“ƒZƒ‹ Exit I—¹ Close •‚¶‚é Cancel changes •ÏX‚ðƒLƒƒƒ“ƒZƒ‹ Click to confirm ƒNƒŠƒbƒN‚µ‚ÄŠm”F Click to get help! ƒNƒŠƒbƒN‚µ‚ăwƒ‹ƒv! Click to return to previous screen ƒNƒŠƒbƒN‚µ‚Ä‘O‚̉æ–ʂɖ߂é Click to go to next screen ƒNƒŠƒbƒN‚µ‚ÄŽŸ‚̉æ–Ê‚Öi‚Þ Hide password ƒpƒXƒ[ƒh‚ð‰B‚· Save project ƒvƒƒWƒFƒNƒg‚ð•Û‘¶ Close current project? Œ»Ý‚̃vƒƒWƒFƒNƒg‚ð•Û‘¶‚µ‚Ü‚·‚©? Delete this project? ‚±‚̃vƒƒWƒFƒNƒg‚ð휂µ‚Ü‚·‚©? Delete empty project %s? ‹ó”’‚̃vƒƒWƒFƒNƒg%s ‚ð휂µ‚Ü‚·‚©? Action not yet implemented ‹@”\‚͂܂½ŽÀ‘•‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ Error deleting this project ‚±‚̃vƒƒWƒFƒNƒg‚Ì휂Ɏ¸”s‚µ‚Ü‚µ‚½ Select a rule for the filter ƒtƒBƒ‹ƒ^‚̃‹[ƒ‹‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢ Enter keywords for the filter ƒtƒBƒ‹ƒ^‚ւ̃L[ƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ Cancel ƒLƒƒƒ“ƒZƒ‹ Add this rule ‚±‚̃‹[ƒ‹‚̒ljÁ Please enter one or several keyword(s) for the rule ‚±‚̃‹[ƒ‹‚̂ЂƂÂA‚Ü‚½‚Í‚¢‚­‚‚©‚̃L[ƒ[ƒh‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ Add Scan Rule ƒXƒLƒƒƒ“ƒ‹[ƒ‹‚̒ljÁ Criterion ƒtƒBƒ‹ƒ^‚̃‹[ƒ‹ String •¶Žš—ñ Add ’ljÁ Scan Rules ƒXƒLƒƒƒ“ƒ‹[ƒ‹ Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi URL‚ðŠÜ‚ß‚éA‚Ü‚½‚ÍœŠO‚·‚邽‚߂ɃƒCƒ‹ƒhƒJ[ƒh‚ðŽg—p‚µ‚Ü‚·B\n\n‚¢‚­‚‚©‚̃XƒLƒƒƒ“•¶Žš—ñ‚𓯂¶s‚É’u‚­‚±‚Æ‚ª‚Å‚«‚Ü‚·B\nƒXƒy[ƒXi‹ó”’j‚𕪊„‚Ì‚½‚߂Ɏg—p‚µ‚Ä‚­‚¾‚³‚¢B\n—á: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links ƒŠƒ“ƒN‚ÌœŠO Include link(s) ƒŠƒ“ƒN‚ðŠÜ‚ß‚é Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tipp: ‘S‚Ä‚ÌGIFƒtƒ@ƒCƒ‹‚ðŠÜ‚߂邽‚߂ɂÍA+www.someweb.com/*.gif‚̂悤‚É‘‚«‚Ü‚·B \n(+*.gif / -*.gif ‚Å‘S‚ẴTƒCƒg‚Ì‘S‚Ä‚ÌGIF‚ð ŠÜ‚Ý/”rœ‚µ ‚Ü‚·B) Save prefs Ý’è‚̕ۑ¶ Matching links will be excluded: ƒ}ƒbƒ`‚µ‚½ƒŠƒ“ƒN‚Í”rœ‚³‚ê‚é: Matching links will be included: ƒ}ƒbƒ`‚µ‚½ƒŠƒ“ƒN‚͊܂܂ê‚é: Example: —á: gif\r\nWill match all GIF files gif\r\n‘S‚Ä‚ÌGIFƒtƒ@ƒCƒ‹‚Ƀ}ƒbƒ` blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\n‘S‚Ä‚Ì'blue'‚ðŠÜ‚Þƒtƒ@ƒCƒ‹i'bluesky-small.jpeg'‚̂悤‚Èj‚Ƀ}ƒbƒ` bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\n ‚Í 'bigfile.mov' ‚Ƀ}ƒbƒ`‚µ‚Ü‚·‚ªA 'bigfile2.mov' ‚ɂ̓}ƒbƒ`‚µ‚Ü‚¹‚ñB cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\n ‚Í•”•ª•¶Žš—ñ 'cgi' ‚ðŽ‚Â /cgi-bin/somecgi.cgi ‚̂悤‚ȃtƒHƒ‹ƒ_‚Ƀ}ƒbƒ`‚·‚郊ƒ“ƒN‚ðŒ©‚Â‚¯‚Ü‚·B cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nFindet Links zu Ordnern namens 'cgi-bin'‚Æ‚¢‚¤Š®‘S‚È•¶Žš—ñ‚ð‚Ƀ}ƒbƒ`‚·‚éƒtƒHƒ‹ƒ_–¼‚ð‚à‚ÂƒŠƒ“ƒN‚ðŒ©‚Â‚¯‚Ü‚·(‚µ‚©‚µA'cgi-bin-2'‚̂悤‚È‚à‚̂͜‚­)B someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nwww.someweb.com‚âprivate.someweb.com‚Æ‚¢‚Á‚½•”•ª•¶Žš—ñ‚Ƀ}ƒbƒ`‚·‚郊ƒ“ƒN‚ðŒ©‚Â‚¯‚Ü‚·B someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nwww.someweb.com‚âwww.someweb.edu, private.someweb.otherweb.com‚Ȃǂ̂悤‚È•”•ª•¶Žš—ñ‚Ƀ}ƒbƒ`‚·‚éƒtƒHƒ‹ƒ_‚Ö‚ÌƒŠƒ“ƒN‚ðŒ©‚Â‚¯‚Ü‚·B www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nwww.someweb.com/...‚̂悤‚ÈŠ®‘S‚È•¶Žš—ñ‚Ƀ}ƒbƒ`‚·‚郊ƒ“ƒN‚ðŒ©‚Â‚¯‚Ü‚·(‚µ‚©‚µAprivate.someweb.com/...‚̂悤‚È‚à‚̂͜‚­) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nFindet Links wie www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\n 'www.test.com/test/someweb.html'‚Æ‚¢‚¤ƒtƒ@ƒCƒ‹‚Ì‚Ý‚ðŒ©‚Â‚¯‚Ü‚·B Š®‘S‚ȃpƒX (URL‚ƃTƒCƒg“àƒpƒX)‚Ì—¼•û‚ð“ü—Í‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢‚±‚ƂɒˆÓ‚µ‚Ä‚­‚¾‚³‚¢B All links will match ‘S‚Ä‚ÌƒŠƒ“ƒN‚Ƀ}ƒbƒ` Add exclusion filter ”rœƒtƒBƒ‹ƒ^‚ð’ljÁ Add inclusion filter ŠÜ‚߂邽‚߂̃tƒBƒ‹ƒ^‚ð’ljÁ Existing filters Šù‘¶‚̃tƒBƒ‹ƒ^ Cancel changes •ÏX‚̃Lƒƒƒ“ƒZƒ‹ Save current preferences as default values Œ»Ý‚ÌÝ’è‚ð‹K’è’l‚Æ‚µ‚ĕۑ¶ Click to confirm ƒNƒŠƒbƒN‚µ‚ÄŠm”F No log files in %s! %s ‚ɂ̓ƒOƒtƒ@ƒCƒ‹‚ª‚ ‚è‚Ü‚¹‚ñ! No 'index.html' file in %s! %s ‚É‚Íindex.html‚ª‚ ‚è‚Ü‚¹‚ñ! Click to quit WinHTTrack Website Copier WinHTTrack Website Copier ‚ðI‚í‚é‚ɂ͂±‚±‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢ View log files ƒƒOƒtƒ@ƒCƒ‹‚ðŒ©‚é Browse HTML start page HTML‚̃Xƒ^[ƒgƒy[ƒW‚ðƒuƒ‰ƒEƒY End of mirror ƒRƒs[iƒ~ƒ‰[j‚ÌI—¹ View log files ƒƒOƒtƒ@ƒCƒ‹‚ðŒ©‚é Browse Mirrored Website ƒ~ƒ‰[‚³‚ꂽƒTƒCƒg‚̃uƒ‰ƒEƒY New project... V‹KƒvƒƒWƒFƒNƒg... View error and warning reports ƒGƒ‰[‚ÆŒx‚̃ƒO‚ðŒ©‚é View report ƒƒO‚ðŒ©‚é Close the log file window ƒƒOƒtƒ@ƒCƒ‹‚ð•‚¶‚é Info type: î•ñ‚ÌŽí—Þ: Errors ƒGƒ‰[ Infos î•ñ Find ŒŸõ Find a word ’PŒê‚ÌŒŸõ Info log file ƒƒOƒtƒ@ƒCƒ‹î•ñ Warning/Errors log file Œx/ƒGƒ‰[ƒƒOƒtƒ@ƒCƒ‹ Unable to initialize the OLE system OLE ‚ð‰Šú‰»‚Å‚«‚Ü‚¹‚ñ WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack ‚ÍA“Á’肳‚ꂽƒtƒHƒ‹ƒ_‚ɂ͒†’f‚³‚ꂽƒ_ƒEƒ“ƒ[ƒhƒLƒƒƒbƒVƒ…‚ðŒ©‚Â‚¯‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½! Could not connect to provider ƒvƒƒoƒCƒ_‚ÆÚ‘±‚Å‚«‚Ü‚¹‚ñ receive ŽóM request ƒŠƒNƒGƒXƒg connect Ú‘± search ƒT[ƒ` ready Š®—¹ error ƒGƒ‰[ Receiving files.. ƒtƒ@ƒCƒ‹‚ðŽó‚¯Žæ‚Á‚Ä‚¢‚Ü‚·... Parsing HTML file.. HTML ƒtƒ@ƒCƒ‹‚̉ðÍ’†... Purging files.. ƒtƒ@ƒCƒ‹‚̉ðÍ’†... Loading cache in progress.. Parsing HTML file (testing links).. HTML ƒtƒ@ƒCƒ‹‚̉ðÍ’† (ƒŠƒ“ƒN‚̃eƒXƒg)... Pause - Toggle [Mirror]/[Pause download] to resume operation ’†’f - ƒƒjƒ…[‚Ì[ƒ~ƒ‰[]/[“]‘—‚ð’†’f]‚ðƒNƒŠƒbƒN‚·‚é‚ÆÄŠJ‚µ‚Ü‚· Finishing pending transfers - Select [Cancel] to stop now! ’†’f‚³‚ꂽ“]‘—‚ÌI—¹ - [ƒLƒƒƒ“ƒZƒ‹]‚Å‚·‚®‚É’âŽ~! scanning ƒXƒLƒƒƒ“’† Waiting for scheduled time.. ݒ肳‚ꂽŠJŽnŽžŠÔ‚ð‘Ò‚Á‚Ä‚¢‚Ü‚·.. Connecting to provider ƒvƒƒoƒCƒ_‚ÖÚ‘±’† [%d seconds] to go before start of operation ŠJŽn‚Ü‚Å[%d •b] Site mirroring in progress [%s, %s bytes] ƒTƒCƒg‚̃Rƒs[iƒ~ƒ‰[jis’† [%s, %s bytes] Site mirroring finished! ƒTƒCƒg‚̃Rƒs[iƒ~ƒ‰[jŠ®—¹ A problem occurred during the mirroring operation\n ƒRƒs[iƒ~ƒ‰[j‚ÌÛA–â‘肪”­¶‚µ‚Ü‚µ‚½\n \nDuring:\n \r\n\n”­¶‚µ‚½‰ÓŠ:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \r\n\n•K—v‚È‚ç‚΃ƒOƒtƒ@ƒCƒ‹‚ð‚²——‚ɂȂÁ‚Ä‚­‚¾‚³‚¢B\n\n'I—¹' ‚ðƒNƒŠƒbƒN‚·‚邯 WinHTTrack Website Copier ‚ðI—¹‚µ‚Ü‚·B\n\n WinHTTrack ‚ð‚²—˜—p‚¢‚½‚¾‚«‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! ƒRƒs[iƒ~ƒ‰[j‚ÍŠ®—¹‚µ‚Ü‚µ‚½B\nuI—¹v‚Å WinHTTrack‚ðI—¹‚µ‚Ü‚·B\n•K—v‚È‚ç‘S‚Ä‚ªOK‚Å‚ ‚邱‚Æ‚ðŠm”F‚·‚邽‚߂ɃƒOƒtƒ@ƒCƒ‹‚ð‚²——‚ɂȂÁ‚Ä‚­‚¾‚³‚¢B\n WinHTTrack ‚ð‚²—˜—p‚¢‚½‚¾‚«‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ƒRƒs[iƒ~ƒ‰[j‚ª’†’f‚³‚ê‚Ü‚µ‚½! * *\r\nŒ»Ý‚̈ꎞ“IƒLƒƒƒbƒVƒ…‚Í‚ ‚ç‚ä‚éXVì‹Æ‚É•K—v‚ÅA‚Ü‚½Œ»Ý‚Ì’†’f‚³‚ꂽƒZƒbƒVƒ‡ƒ“‚É‚¨‚¯‚éƒf[ƒ^‚µ‚©Ž‚Á‚Ä‚¢‚Ü‚¹‚ñB\r\nˆÈ‘O‚̃LƒƒƒbƒVƒ…‚Í‚à‚Á‚ÆŠ®‘S‚Èî•ñ‚ðŽ‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB; ‚à‚µA‚»‚Ìî•ñ‚ðŽ¸‚¢‚½‚­‚È‚¢ê‡‚ÍA‚»‚ê‚𕜌³iƒŠƒXƒgƒAj‚µ‚ÄŒ»Ý‚̃LƒƒƒbƒVƒ…‚ð휂·‚é•K—v‚ª‚ ‚è‚Ü‚·B\r\n[ƒƒ‚: ‚±‚ê‚Í hts-cache/new.* ‚Å‚ ‚ç‚킳‚ê‚éƒtƒ@ƒCƒ‹‚ð휂·‚邱‚ƂŊȒP‚És‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·]\r\n\r\nˆÈ‘O‚̃LƒƒƒbƒVƒ…‚ª‚æ‚葽‚¢î•ñ‚ðŽ‚Á‚Ä‚¢‚½‚Æl‚¦‚Ü‚·‚©?‚»‚µ‚Ä‚»‚ê‚𕜌³‚µ‚½‚¢‚ÆŽv‚¢‚Ü‚·‚©? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ƒRƒs[iƒ~ƒ‰[j‚̃Gƒ‰[! * *\r\nHTTrack‚ÍŒ»Ý‚̃Rƒs[iƒ~ƒ‰[j‚ª‹ó‚Å‚ ‚邯д’m‚µ‚Ü‚µ‚½B‚à‚µ‚±‚ꂪXV‚Å‚ ‚é‚È‚çAˆÈ‘O‚̃Rƒs[iƒ~ƒ‰[j‚ª•œŒ³‚³‚ê‚Ü‚·B\r\nŒ´ˆö:ʼn‚̃y[ƒW‚ªŒ©‚‚©‚ç‚È‚¢A‚Ü‚½‚ÍÚ‘±‚É–â‘肪”­¶‚µ‚Ü‚µ‚½B\r\n=> WebƒTƒCƒg‚ª‚Ü‚¾‘¶Ý‚·‚邱‚ÆA‚Ü‚½‚̓vƒƒLƒV‚ÌÝ’è‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B<= \n\nTip: Click [View log file] to see warning or error messages \r\n\n\nTipp: [ƒƒO‚ðŒ©‚é] ‚ðƒNƒŠƒbƒN‚·‚邯Œx‚ƃGƒ‰[‚ðŒ©‚é‚±‚Æ‚ª‚Å‚«‚Ü‚·B Error deleting a hts-cache/new.* file, please do it manually hts-cache/new.* ‚Ì’†‚̃tƒ@ƒCƒ‹íœ‚ÉŽ¸”s‚µ‚Ü‚µ‚½Bƒ}ƒjƒ…ƒAƒ‹‚Å‚Ìíœ‚ð‚¨Šè‚¢‚µ‚Ü‚·B Do you really want to quit WinHTTrack Website Copier? WinHTTrack Website Copier ‚ð–{“–‚ÉI—¹‚µ‚Ü‚·‚©? - Mirroring Mode -\n\nEnter address(es) in URL box - ƒRƒs[iƒ~ƒ‰[jƒ‚[ƒh -\n\nƒAƒhƒŒƒX ‚ð URL“ü—Í—“‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - ƒCƒ“ƒ^ƒ‰ƒNƒeƒBƒu‚ȃEƒBƒU[ƒhƒ‚[ƒh -\n\nƒAƒhƒŒƒX‚ð URL“ü—Í—“‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ - File Download Mode -\n\nEnter file address(es) in URL box - ƒtƒ@ƒCƒ‹ƒ_ƒEƒ“ƒ[ƒhƒ‚[ƒh -\n\nDatei-Adresse(n) in das URL-Feld eingeben - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - ƒŠƒ“ƒNƒeƒXƒgƒ‚[ƒh -\n\nƒŠƒ“ƒN‚Æ‹¤‚ÉWebƒAƒhƒŒƒX‚ðURL‹L“ü—“‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - XVƒ‚[ƒh -\n\n URL “ü—Í—“‚̃AƒhƒŒƒX‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B•K—v‚È‚ç‚΃pƒ‰ƒ[ƒ^‚ðƒ`ƒFƒbƒN‚µ‚ÄuŽŸ‚Övƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - ÄŠJiƒŒƒWƒ…[ƒ€jƒ‚[ƒh (’†’f‚³‚ꂽ‘€ì‚ÌÄŠJ) -\n\n URL“ü—Í—“‚̃AƒhƒŒƒX‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B•K—v‚È‚çƒpƒ‰ƒ[ƒ^‚ðƒ`ƒFƒbƒN‚µ‚ÄuŽŸ‚Övƒ{ƒ^ƒ“‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢B Log files Path ƒƒOƒtƒ@ƒCƒ‹‚̃pƒX Path ƒtƒ@ƒCƒ‹‚̃pƒX - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror -ƒŠƒ“ƒNƒŠƒXƒgƒ‚[ƒh -\n\nURL “ü—Í—“‚ɃRƒs[iƒ~ƒ‰[j‚·‚郊ƒ“ƒN‚ðŠÜ‚ÞƒTƒCƒg‚̃AƒhƒŒƒX‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢B New project / Import? V‹KƒvƒƒWƒFƒNƒg / “ǂݞ‚Ý? Choose criterion Šî€‚Ì‘I‘ð Maximum link scanning depth ƒXƒLƒƒƒ“‚·‚郊ƒ“ƒN‚ÌŠK‘w Enter address(es) here ƒAƒhƒŒƒX‚ð‚±‚±‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ Define additional filtering rules ’ljÁ‚·‚éƒtƒBƒ‹ƒ^ƒ‹[ƒ‹‚Ì’è‹` Proxy Name (if needed) ƒvƒƒLƒV–¼ (•K—v‚È‚ç‚Î) Proxy Port ƒvƒƒLƒV‚̃|[ƒg Define proxy settings ƒvƒƒLƒV‚ÌÝ’è Use standard HTTP proxy as FTP proxy •W€‚ÌHTTPƒvƒƒLƒV‚ðFTPƒvƒƒLƒV‚Æ‚µ‚ÄŽg‚¤ Path ƒpƒX Select Path ‘I‘ð‚³‚ê‚½ƒpƒX Path ƒpƒX Select Path ‘I‘ð‚³‚ê‚½ƒpƒX Quit WinHTTrack Website Copier WinHTTrack‚ðI—¹ About WinHTTrack WinHTTrack‚ɂ‚¢‚Ä Save current preferences as default values Œ»Ý‚̃IƒvƒVƒ‡ƒ“‚ðŠù’è‚Æ‚µ‚ĕۑ¶ Click to continue ƒNƒŠƒbƒN‚µ‚Ä‘±‚¯‚Ü‚· Click to define options ƒNƒŠƒbƒN‚µ‚ăIƒvƒVƒ‡ƒ“‚ðݒ肵‚Ü‚· Click to add a URL ƒNƒŠƒbƒN‚µ‚Ä URL ‚ð’ljÁ‚µ‚Ü‚· Load URL(s) from text file ƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚©‚çURL‚ð“ǂݞ‚݂܂· WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack Ý’è (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| ƒAƒhƒŒƒXƒŠƒXƒg‚̃eƒLƒXƒgƒtƒ@ƒCƒ‹ (*.txt)|*.txt|| File not found! ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ! Do you really want to change the project name/path? –{“–‚ɃvƒƒWƒFƒNƒg–¼/ƒpƒX‚ð•ÏX‚µ‚Ü‚·‚©? Load user-default options? Šù’è‚̃IƒvƒVƒ‡ƒ“‚ð“ǂݞ‚݂܂·‚©? Save user-default options? ƒ†[ƒU’è‹`‚̃IƒvƒVƒ‡ƒ“‚ð•Û‘¶‚µ‚Ü‚·‚©? Reset all default options? ‘S‚Ă̊ù’è‚̃IƒvƒVƒ‡ƒ“‚ðƒŠƒZƒbƒg‚µ‚Ü‚·‚©? Welcome to WinHTTrack! WinHTTrack‚ւ悤‚±‚»! Action: ƒAƒNƒVƒ‡ƒ“: Max Depth Å‘åŠK‘w: Maximum external depth: Å‘åŠO•”ŠK‘w: Filters (refuse/accept links) : ƒtƒBƒ‹ƒ^ƒ‹[ƒ‹ (ŠÜ‚Þ/”rœ‚·‚é ƒŠƒ“ƒN) : Paths ƒpƒX Save prefs •Û‘¶Ý’è Define.. ’è‹`... Set options.. ƒIƒvƒVƒ‡ƒ“Ý’è... Preferences and mirror options: ƒIƒvƒVƒ‡ƒ“‚ƃRƒs[iƒ~ƒ‰[jƒIƒvƒVƒ‡ƒ“: Project name ƒvƒƒWƒFƒNƒg–¼ Add a URL... URL‚̒ljÁ... Web Addresses: (URL) WebƒAƒhƒŒƒX (URL): Stop WinHTTrack? WinHTTrack‚ð’âŽ~‚µ‚Ü‚·‚©? No log files in %s! ƒƒOƒtƒ@ƒCƒ‹‚ª %s ‚ɂ͂ ‚è‚Ü‚¹‚ñ! Pause Download? ƒ_ƒEƒ“ƒ[ƒh‚ð’†’f‚µ‚Ü‚·‚©? Stop the mirroring operation ƒRƒs[iƒ~ƒ‰[j‚ð’âŽ~ Minimize to System Tray ƒVƒXƒeƒ€ƒgƒŒƒC‚ÉŬ‰» Click to skip a link or stop parsing ƒNƒŠƒbƒN‚µ‚ÄƒŠƒ“ƒN‚ð’âŽ~A‚Ü‚½‚͉ðÍ‚ð’âŽ~ Click to skip a link ƒNƒŠƒbƒN‚µ‚ÄƒŠƒ“ƒN‚ðƒXƒLƒbƒv Bytes saved •Û‘¶‚µ‚½ƒoƒCƒg”: Links scanned ƒXƒLƒƒƒ“‚³‚ꂽƒŠƒ“ƒN Time: Œo‰ßŽžŠÔ: Connections: Ú‘±: Running: “®ì’†: Hide Ŭ‰» Transfer rate Ú‘±ƒŒ[ƒg: SKIP ƒXƒLƒbƒv Information î•ñ Files written: ƒtƒ@ƒCƒ‹ì¬: Files updated: ƒtƒ@ƒCƒ‹XV: Errors: ƒGƒ‰[: In progress: is’†: Follow external links ŠO•”ƒŠƒ“ƒN‚Ì’ÇÕ Test all links in pages ƒy[ƒW‚Ì‘S‚Ä‚ÌƒŠƒ“ƒN‚̃eƒXƒg Try to ferret out all links ‘S‚Ä‚ÌƒŠƒ“ƒN‚ð’T‚µo‚»‚¤‚ÆŽŽ‚Ý‚é Download HTML files first (faster) HTMLƒtƒ@ƒCƒ‹‚ðʼn‚Ƀ_ƒEƒ“ƒ[ƒh‚·‚é (‚æ‚葬‚¢) Choose local site structure ƒ[ƒJƒ‹‚̕ۑ¶ƒtƒHƒ‹ƒ_‚Ì‘I‘ð Set user-defined structure on disk ƒfƒBƒXƒNã‚Ƀ†[ƒU[’è‹`‚̃tƒHƒ‹ƒ_‚ðÝ’è‚·‚é Use a cache for updates and retries XViƒAƒbƒvƒf[ƒgj‚ÆƒŠƒgƒ‰ƒC‚ɃLƒƒƒbƒVƒ…‚ðŽg—p‚·‚é Do not update zero size or user-erased files 0ƒTƒCƒY‚Ü‚½‚̓†[ƒU‚ªÁ‹Ž‚µ‚½ƒtƒ@ƒCƒ‹‚ÌXV‚ðs‚í‚È‚¢ Create a Start Page ƒXƒ^[ƒgƒy[ƒW‚Ìì¬ Create a word database of all html pages ‘S‚Ä‚ÌHTMLƒy[ƒW‚É’PŒêƒf[ƒ^ƒx[ƒX‚ð쬂·‚é Create error logging and report files ƒGƒ‰[ƒƒO‚ƃŒƒ|[ƒgƒtƒ@ƒCƒ‹‚ð쬂·‚é Generate DOS 8-3 filenames ONLY DOSƒtƒ@ƒCƒ‹ƒl[ƒ€(8+3)‚Ì‚Ýì¬ Generate ISO9660 filenames ONLY for CDROM medias Do not create HTML error pages HTMLƒGƒ‰[ƒy[ƒW‚ð쬂µ‚È‚¢ Select file types to be saved to disk •Û‘¶‚·‚éƒtƒ@ƒCƒ‹‚ÌŽí—Þ‚Ì‘I‘ð Select parsing direction ‰ð͂̕ûŒü‚Ì‘I‘ð Select global parsing direction ƒOƒ[ƒoƒ‹‚ȉð͂̕ûŒü‚Ì‘I‘ð Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) “à•”ƒŠƒ“ƒNiƒ_ƒEƒ“ƒ[ƒh‚³‚ꂽ‚à‚Ìj‚ÆŠO•”ƒŠƒ“ƒNiƒ_ƒEƒ“ƒ[ƒh‚³‚ê‚Ä‚¢‚È‚¢‚à‚Ìj‚ւ̃‹[ƒ‹‚ÌÄ‘‚«ž‚Ý‚ðÝ’è‚·‚éB Max simultaneous connections Å‘å“¯ŽžÚ‘±” File timeout ƒtƒ@ƒCƒ‹ƒ^ƒCƒ€ƒAƒEƒg Cancel all links from host if timeout occurs ƒ^ƒCƒ€ƒAƒEƒg‚µ‚½ê‡AƒzƒXƒg‚©‚ç‚Ì‘S‚Ä‚ÌƒŠƒ“ƒN‚ðƒLƒƒƒ“ƒZƒ‹ Minimum admissible transfer rate Ŭ‹–—e“]‘—ƒŒ[ƒg Cancel all links from host if too slow ‚ ‚Ü‚è‚É‚à’x‚¢ê‡AƒzƒXƒg‚©‚ç‚Ì‘S‚Ä‚ÌƒŠƒ“ƒN‚ðƒLƒƒƒ“ƒZƒ‹ Maximum number of retries on non-fatal errors ’v–½“IƒGƒ‰[‚łȂ¢ê‡‚ÌÅ‘åÄŽŽs” Maximum size for any single HTML file ’Pˆê‚ÌHTMLƒtƒ@ƒCƒ‹‚ÌÅ‘åƒTƒCƒY Maximum size for any single non-HTML file ’Pˆê‚Ì”ñHTMLƒtƒ@ƒCƒ‹‚ÌÅ‘åƒTƒCƒY Maximum amount of bytes to retrieve from the Web Web‚©‚ç‚ÌÅ‘åŽæ“¾ƒoƒCƒg” Make a pause after downloading this amount of bytes ƒ_ƒEƒ“ƒ[ƒh‚µ‚Ä‚±‚̃oƒCƒg”‚ɂȂÁ‚½‚Ȃ璆’f‚·‚é Maximum duration time for the mirroring operation ƒRƒs[iƒ~ƒ‰[j‚ÌÅ‘åŒo‰ßŽžŠÔ Maximum transfer rate Å‘å“]‘—ƒŒ[ƒg Maximum connections/seconds (avoid server overload) Å‘å‚ÌÚ‘±”/•b (ƒT[ƒo‚̉ߕ‰‰×‚̉ñ”ð) Maximum number of links that can be tested (not saved!) ƒeƒXƒg‚³‚ê‚éő僊ƒ“ƒN”i•Û‘¶‚³‚ê‚Ü‚¹‚ñ!) Browser identity ƒuƒ‰ƒEƒUID Comment to be placed in each HTML file ‚Ç‚ÌHTMLƒtƒ@ƒCƒ‹‚É‚à‘}“ü‚³‚ê‚éƒRƒƒ“ƒg Back to starting page ƒXƒ^[ƒgƒy[ƒW‚É–ß‚é Save current preferences as default values Œ»Ý‚ÌÝ’è‚ðŠù’è‚Æ‚µ‚ĕۑ¶ Click to continue ƒNƒŠƒbƒN‚µ‚Ä‘±‚¯‚Ü‚· Click to cancel changes ƒNƒŠƒbƒN‚µ‚Ä•ÏX‚ðƒLƒƒƒ“ƒZƒ‹ Follow local robots rules on sites ƒTƒCƒg‚̃ƒ{ƒbƒg‹K‘¥‚É]‚¤ Links to non-localised external pages will produce error pages ƒ[ƒJƒ‹ƒRƒ“ƒsƒ…[ƒ^‚ɕۑ¶‚³‚ê‚Ä‚¢‚È‚¢ŠO•”ƒy[ƒW‚Ö‚ÌƒŠƒ“ƒN‚̓Gƒ‰[ƒy[ƒW‚Æ‚·‚é Do not erase obsolete files after update XVŒãŒÃ‚­‚È‚Á‚½ƒtƒ@ƒCƒ‹‚ðÁ‹Ž‚µ‚È‚¢ Accept cookies? ƒNƒbƒL[‚ð‹–‰Â‚µ‚Ü‚·‚©? Check document type when unknown? •s–¾‚̃tƒ@ƒCƒ‹ƒ^ƒCƒv‚ðƒ`ƒFƒbƒN‚µ‚Ü‚·‚©? Parse java applets to retrieve included files that must be downloaded? ƒ_ƒEƒ“ƒ[ƒh‚·‚ׂ«ƒtƒ@ƒCƒ‹‚Ì‚½‚ß‚ÉJavaƒAƒvƒŒƒbƒg‚ð‰ðÍ‚µ‚Ü‚·‚©? Store all files in cache instead of HTML only HTMLƒtƒ@ƒCƒ‹‚¾‚¯‚ł͂Ȃ­A‘S‚ẴLƒƒƒbƒVƒ…“à‚̃tƒ@ƒCƒ‹‚ð•Û‘¶‚·‚é Log file type (if generated) ƒtƒ@ƒCƒ‹‚ÌŽí—ނ̃ƒO (V‹K쬂³‚ꂽê‡) Maximum mirroring depth from root address ƒ‹[ƒgƒAƒhƒŒƒX‚©‚ç‚ÌÅ‘å‚̃Rƒs[iƒ~ƒ‰[jŠK‘w Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) ŠO•”/‹ÖŽ~‚³‚ꂽƒAƒhƒŒƒX‚Ö‚ÌÅ‘åƒRƒs[iƒ~ƒ‰[jŠK‘w (Šù’è‚Í0, ƒRƒs[‚ð‚±‚±‚ë‚݂Ȃ¢) Create a debugging file ƒfƒoƒbƒOƒtƒ@ƒCƒ‹‚Ìì¬n Use non-standard requests to get round some server bugs ‚¢‚­‚‚©‚̃T[ƒo‚̃oƒO‚ð‰ñ”ð‚·‚é‚½‚߂ɕW€‚łȂ¢ƒŠƒNƒGƒXƒg‚ðŽg—p‚·‚é Use old HTTP/1.0 requests (limits engine power!) ˆÈ‘O‚Ì HTTP/1.0 ƒŠƒNƒGƒXƒg‚ðŽg—p‚·‚é (ì‹ÆƒXƒs[ƒh‚̧ŒÀ!) Attempt to limit retransfers through several tricks (file size test..) ‚¢‚­‚‚©‚̃gƒŠƒbƒNiƒtƒ@ƒCƒ‹ƒTƒCƒYƒeƒXƒg‚È‚Çj‚É‚æ‚éÄ“]‘—§ŒÀ‚ðs‚Á‚Ă݂é Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password ƒƒOƒCƒ“–¼/ƒpƒXƒ[ƒh‚È‚µ‚ÉŠO•”ƒŠƒ“ƒN‚ð‘‚«o‚· Write internal links without query string “à•”ƒŠƒ“ƒN‚ÍŒŸõ•¶Žš—ñ‚È‚µ‚É‘‚«o‚· Get non-HTML files related to a link, eg external .ZIP or pictures ”ñHTMLƒtƒ@ƒCƒ‹‚ÅƒŠƒ“ƒN‚ÉŠÖ˜A‚·‚éƒtƒ@ƒCƒ‹A‚·‚Ȃ킿ŠO•”‚ÌZIP‚â‰æ‘œƒtƒ@ƒCƒ‹‚ðŽæ“¾‚·‚é Test all links (even forbidden ones) ‘S‚Ä‚ÌƒŠƒ“ƒN‚̃eƒXƒg (‹ÖŽ~‚³‚ê‚Ä‚¢‚é‚à‚̂ɂ‚¢‚Ä‚à) Try to catch all URLs (even in unknown tags/code) ‘S‚Ä‚ÌURL‚ðŽæ“¾‚µ‚悤‚ÆŽŽ‚Ý‚é (•s–¾‚ȃ^ƒO‚ƃXƒNƒŠƒvƒg‚ɂ‚¢‚Ä‚à) Get HTML files first! HTMLƒtƒ@ƒCƒ‹‚ðæ‚Ɏ擾‚·‚é! Structure type (how links are saved) •Û‘¶ƒtƒHƒ‹ƒ_‚ÌÝ’è (ƒŠƒ“ƒN‚̕ۑ¶•û–@) Use a cache for updates XV‚ɃLƒƒƒbƒVƒ…‚ðŽg—p‚·‚é Do not re-download locally erased files ƒ[ƒJƒ‹‚Å휂³‚ꂽƒtƒ@ƒCƒ‹‚Íă_ƒEƒ“ƒ[ƒh‚µ‚È‚¢ Make an index ƒCƒ“ƒfƒbƒNƒX‚Ìì¬ Make a word database ’PŒêƒf[ƒ^ƒx[ƒX‚ð쬂·‚é Log files ƒƒOƒtƒ@ƒCƒ‹ DOS names (8+3) DOS–¼ (8+3) ISO9660 names (CDROM) No error pages ƒGƒ‰[ƒy[ƒW‚È‚µ Primary Scan Rule —D悳‚ê‚éƒXƒLƒƒƒ“ƒ‹[ƒ‹ Travel mode ’Tõ•û–@ Global travel mode ƒOƒ[ƒoƒ‹‚È’T¸•û–@ These options should be modified only exceptionally ‚±‚ê‚ç‚̃IƒvƒVƒ‡ƒ“‚Í•’Ê•ÏX‚³‚ê‚é‚ׂ«‚ł͂ ‚è‚Ü‚¹‚ñB Activate Debugging Mode (winhttrack.log) ƒfƒoƒbƒOƒ‚[ƒh‚ðŽg‚¤ (winhttrack.log) Rewrite links: internal / external ƒŠƒ“ƒN‚ðÄ‘‚«ž‚Ý‚·‚é “à•” / ŠO•” Flow control Ú‘±ƒRƒ“ƒgƒ[ƒ‹ Limits ƒŠƒ~ƒbƒg Identity ID HTML footer HTMLƒtƒbƒ^ N# connections Ú‘±” Abandon host if error ƒGƒ‰[‚Ìۂɂ̓zƒXƒg‚ð•úŠü Minimum transfer rate (B/s) Ŭ“]‘—ƒŒ[ƒg (B/s) Abandon host if too slow ‚ ‚Ü‚è‚É‚à’x‚¢ê‡‚ɂ̓zƒXƒg‚ð•úŠü Configure ƒRƒ“ƒtƒBƒO Use proxy for ftp transfers FTP“]‘—‚ɃvƒƒLƒV‚ðŽg—p‚·‚é TimeOut(s) ƒ^ƒCƒ€ƒAƒEƒg Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries ÄŽŽs” Size limit ƒTƒCƒY‚̧ŒÀ Max size of any HTML file (B) HTMLƒtƒ@ƒCƒ‹‚ÌÅ‘åƒoƒCƒg” Max size of any non-HTML file ”CˆÓ‚Ì”ñHTMLƒtƒ@ƒCƒ‹‚ÌÅ‘åƒoƒCƒg” Max site size Å‘åƒTƒCƒgƒTƒCƒY Max time ő厞ŠÔ Save prefs Ý’è‚̕ۑ¶ Max transfer rate Å‘å“]‘—ƒŒ[ƒg Follow robots.txt robots.txt ‚ð’ÇÕ‚·‚é No external pages ŠO•”ƒy[ƒW‚È‚µ Do not purge old files ‚Ó‚é‚¢ƒtƒ@ƒCƒ‹‚ðÁ‹Ž‚µ‚È‚¢ Accept cookies ƒNƒbƒL[‚ðŽó‚¯“ü‚ê‚é Check document type ƒhƒLƒ…ƒƒ“ƒg‚ÌŽí—Þ‚ðƒ`ƒFƒbƒN‚·‚é Parse java files JAVAƒtƒ@ƒCƒ‹‚ð‰ðÍ‚·‚é Store ALL files in cache ‘S‚Ẵtƒ@ƒCƒ‹‚ðƒLƒƒƒbƒVƒ…‚ɕۑ¶ Tolerant requests (for servers) ƒT[ƒo‚Ì‹–—eƒŠƒNƒGƒXƒg” Update hack (limit re-transfers) XV‚̃gƒŠƒbƒN (Ä“]‘—§ŒÀ) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) ˆÈ‘O‚Ì HTTP/1.0 ƒŠƒNƒGƒXƒg‚ð‹­—v‚·‚é (1.1‚ł͂Ȃ­) Max connections / seconds Å‘åÚ‘±” / •b Maximum number of links ƒŠƒ“ƒN‚ÌÅ‘å” Pause after downloading.. ƒ_ƒEƒ“ƒ[ƒh‚Ì‚ ‚Ƃɒ†’f‚·‚é... Hide passwords ƒpƒXƒ[ƒh‚ð‰B‚· Hide query strings ŒŸõ•¶Žš—ñ‚ð‰B‚· Links ƒŠƒ“ƒN Build ƒrƒ‹ƒh Experts Only ㋉ŽÒŒü‚¯ Flow Control Ú‘±ƒRƒ“ƒgƒ[ƒ‹ Limits Ú‘±§ŒÀ Browser ID ƒuƒ‰ƒEƒU ID Scan Rules ƒXƒLƒƒƒ“ƒ‹[ƒ‹ Spider ƒXƒpƒCƒ_[ Log, Index, Cache ƒƒOAƒCƒ“ƒfƒbƒNƒXAƒLƒƒƒbƒVƒ… Proxy ƒvƒƒLƒV MIME Types Do you really want to quit WinHTTrack Website Copier? WinHTTrack‚ð–{“–‚ÉI—¹‚µ‚Ü‚·‚©? Do not connect to a provider (already connected) ƒvƒƒoƒCƒ_‚ÆÚ‘±‚µ‚È‚¢ (‚·‚Å‚ÉÚ‘±) Do not use remote access connection ƒŠƒ‚[ƒgƒAƒNƒZƒX‚ðŽg‚í‚È‚¢ Schedule the mirroring operation ƒRƒs[iƒ~ƒ‰[j‚̃XƒPƒWƒ…[ƒ‹Ý’è Quit WinHTTrack Website Copier WinHTTrack‚ðI—¹‚µ‚Ü‚· Back to starting page ƒXƒ^[ƒgƒy[ƒW‚É–ß‚é Click to start! ƒNƒŠƒbƒN‚µ‚ÄŠJŽn‚µ‚Ü‚·! No saved password for this connection! ‚±‚ÌÚ‘±‚ɂ̓pƒXƒ[ƒh‚ª•Û‘¶‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ! Can not get remote connection settings ƒŠƒ‚[ƒgÚ‘±‚ÌÝ’è‚ðŽæ“¾‚Å‚«‚Ü‚¹‚ñ Select a connection provider Ú‘±ƒvƒƒoƒCƒ_‚Ì‘I‘ð Start ŠJŽn Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. •K—v‚È‚ç‚ÎÚ‘±ƒpƒ‰ƒ[ƒ^‚ð’²®‚µ‚Ä‚­‚¾‚³‚¢A\nuŠ®—¹v‚ð‰Ÿ‚·‚ƃRƒs[iƒ~ƒ‰[j‚ª‚Í‚¶‚Ü‚è‚Ü‚·B Save settings only, do not launch download now. Ý’è‚݂̂š‚̓_ƒEƒ“ƒ[ƒh‚ðŠJŽn‚µ‚È‚¢ On hold ’†’f’† Transfer scheduled for: (hh/mm/ss) “]‘—ƒXƒPƒWƒ…[ƒ‹: (hh/mm/ss) Start ŠJŽn Connect to provider (RAS) ƒvƒƒoƒCƒ_‚Ö‚ÌÚ‘± (RAS) Connect to this provider ‚±‚̃vƒƒoƒCƒ_‚Ö‚ÌÚ‘± Disconnect when finished I—¹‚µ‚½‚çÚ‘±‚ðØ’f‚·‚é Disconnect modem on completion Š®—¹‚µ‚½‚烂ƒfƒ€‚Æ‚ÌÚ‘±‚ðØ’f‚·‚é \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(ƒoƒO‚Ü‚½‚Í–â‘è‚ɂ‚¢‚Ä‚í‚ê‚í‚ê‚É’m‚点‚Ä‚­‚¾‚³‚¢)\r\n\r\nDevelopment:\r\nInterface(Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nJapanese translation :TAPKAL(nakataka@mars.dti.ne.jp) About WinHTTrack Website Copier WinHTTrack‚ɂ‚¢‚Ä Please visit our Web page ‚í‚ê‚í‚ê‚̃EƒFƒuƒy[ƒW‚É‚¢‚ç‚Á‚µ‚á‚Á‚Ä‚­‚¾‚³‚¢! Wizard query ƒEƒBƒU[ƒh Your answer: ‚ ‚È‚½‚Ì‚±‚½‚¦ Link detected.. ƒŠƒ“ƒN‚ªŒŸ’m‚³‚ê‚Ü‚µ‚½... Choose a rule ƒ‹[ƒ‹‚Ì‘I‘ð Ignore this link ‚±‚ÌƒŠƒ“ƒN‚Ì–³Ž‹ Ignore directory ƒfƒBƒŒƒNƒgƒŠ‚Ì–³Ž‹ Ignore domain ƒhƒƒCƒ“‚𖳎‹‚·‚é Catch this page only ‚±‚̃y[ƒW‚̂ݎ擾 Mirror site ƒTƒCƒg‚̃Rƒs[iƒ~ƒ‰[j Mirror domain ƒhƒƒCƒ“‚̃Rƒs[iƒ~ƒ‰[j Ignore all ‘S‚Ä–³Ž‹ Wizard query ƒEƒBƒU[ƒh NO ‚¢‚¢‚¦ File ƒtƒ@ƒCƒ‹ Options ƒIƒvƒVƒ‡ƒ“ Log ƒƒO Window ƒEƒBƒ“ƒhƒE Help ƒwƒ‹ƒv Pause transfer “]‘—‚ð’†’f Exit I—¹ Modify options ƒIƒvƒVƒ‡ƒ“‚ðC³‚·‚é View log ƒƒO‚ðŒ©‚é View error log ƒGƒ‰[ƒƒO‚ðŒ©‚é View file transfers ƒtƒ@ƒCƒ‹“]‘—‚ðŒ©‚é Hide Ŭ‰» About WinHTTrack Website Copier WinHTTrack Website Copier‚ɂ‚¢‚Ä Check program updates... ƒvƒƒOƒ‰ƒ€XV‚̃`ƒFƒbƒN... &Toolbar &ƒc[ƒ‹ƒo[ &Status Bar &ƒXƒe[ƒ^ƒXƒo[ S&plit &•ªŠ„ File ƒtƒ@ƒCƒ‹ Preferences Ý’è Mirror ƒ~ƒ‰[ Log ƒƒO Window ƒEƒBƒ“ƒhƒE Help ƒwƒ‹ƒv Exit I—¹ Load default options ‹K’è‚̃IƒvƒVƒ‡ƒ“‚̓ǂݞ‚Ý Save default options ‹K’è‚̃IƒvƒVƒ‡ƒ“‚̕ۑ¶ Reset to default options ‹K’è‚̃IƒvƒVƒ‡ƒ“‚ÉƒŠƒZƒbƒg Load options... ƒIƒvƒVƒ‡ƒ“‚̓ǂݞ‚Ý... Save options as... ƒIƒvƒVƒ‡ƒ“‚𖼑O‚ð•t‚¯‚ĕۑ¶... Language preference... Œ¾ŒêÝ’è... Contents... ƒwƒ‹ƒv‚̃Rƒ“ƒeƒ“ƒc... About WinHTTrack... WinHTTrack‚ɂ‚¢‚Ä... New project\tCtrl+N &V‹KƒvƒƒWƒFƒNƒg\tAlt+N &Open...\tCtrl+O &ŠJ‚­...\tAlt+O &Save\tCtrl+S &•Û‘¶\tAlt+S Save &As... –¼‘O‚ð•t‚¯‚ĕۑ¶ &–¼‘O... &Delete... &íœ... &Browse sites... &ƒTƒCƒg‚̃uƒ‰ƒEƒY... User-defined structure ƒ†[ƒU’è‹`‚̃tƒHƒ‹ƒ_ %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tƒtƒ@ƒCƒ‹‚ÌŽí—Þ‚È‚µ‚Ńtƒ@ƒCƒ‹–¼‚Ì‚Ý (—á: gazou)\r\n%N\tƒtƒ@ƒCƒ‹–¼‚ƃtƒ@ƒCƒ‹‚ÌŽí—Þ (—á: gazou.gif)\r\n%t\tƒtƒ@ƒCƒ‹‚ÌŽí—Þ (—á: gif)\r\n%p\tƒpƒX [ÅŒã‚Ì / ‚È‚µ] (—á: /gazofile)\r\n%h\tƒhƒƒCƒ“–¼ (—á: www.someweb.com)\r\n%M\tURL MD5 (128 Bits, 32 ASCII-Bytes)\r\n%Q\tMD5 ƒNƒGƒŠ[•¶Žš—ñ (128 Bits, 32 ASCII-Bytes)\r\n%q\tƒXƒ‚[ƒ‹MD5ƒNƒGƒŠ[•¶Žš—ñ (16 Bits, 4 ASCII-Bytes)\r\n\r\n%s?\tDOSƒtƒ@ƒCƒ‹–¼(—á: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif —á:\t%h%p/%n%q.%t\n->\t\tc:\\kagami\\www.someweb.com\\gazofile\\gazou.gif Proxy settings ƒvƒƒLƒV‚ÌÝ’è Proxy address: ƒvƒƒLƒV‚̃AƒhƒŒƒX Proxy port: ƒvƒƒLƒV‚̃|[ƒg Authentication (only if needed) Œ ŒÀÝ’è (•K—v‚ª‚ ‚ê‚Î) Login ƒƒOƒCƒ“–¼ Password ƒpƒXƒ[ƒh Enter proxy address here ƒvƒƒLƒV‚̃AƒhƒŒƒX‚ð‚±‚±‚É“ü—Í Enter proxy port here ƒvƒƒLƒV‚̃|[ƒg‚ð‚±‚±‚É“ü—Í Enter proxy login ƒvƒƒLƒV‚̃ƒOƒCƒ“–¼‚Ì“ü—Í Enter proxy password ƒvƒƒLƒV‚̃pƒXƒ[ƒh‚Ì“ü—Í Enter project name here ƒvƒƒWƒFƒNƒg–¼‚ð‚±‚±‚É‹L“ü‚µ‚Ä‚­‚¾‚³‚¢ Enter saving path here •Û‘¶‚·‚éƒpƒX‚ð‚±‚±‚É“ü—Í Select existing project to update XV‚·‚éŠù‘¶‚̃vƒƒWƒFƒNƒg‚ð‘I‘ð Click here to select path ‚±‚±‚ðƒNƒŠƒbƒN‚µ‚ăpƒX‚Ì‘I‘ð Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack ƒvƒƒWƒFƒNƒgƒEƒBƒU[ƒh New project name: V‹KƒvƒƒWƒFƒNƒg–¼ Existing project name: Šù‘¶‚̃vƒƒWƒFƒNƒg–¼ Project name: ƒvƒƒWƒFƒNƒg–¼ Base path: Šî€ƒpƒX Project category: C:\\My Web Sites C:\\My Web Sites Type a new project name, \r\nor select existing project to update/resume V‚µ‚¢ƒvƒƒWƒFƒNƒg–¼‚ð‹L“ü‚µ‚Ä‚­‚¾‚³‚¢B \r\nŠù‘¶‚̃vƒƒWƒFƒNƒg‚ðƒAƒbƒvƒf[ƒg/ÄŠJ‚·‚é‚É‚Íã‚ÌƒŠƒXƒg‚©‚ç‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B New project V‹KƒvƒƒWƒFƒNƒg Insert URL URL‚Ì‘}“ü URL: URL: Authentication (only if needed) Œ ŒÀÝ’è (•K—v‚ª‚ ‚ê‚Î) Login ƒƒOƒCƒ“–¼ Password ƒpƒXƒ[ƒh Forms or complex links: ƒtƒH[ƒ€‚Ü‚½‚Í•¡ŽG‚ÈƒŠƒ“ƒN: Capture URL... URL‚ðŽæ“¾‚µ‚Ä‚¢‚Ü‚·... Enter URL address(es) here URL‚ð‚±‚±‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ Enter site login ƒTƒCƒg‚̃ƒOƒCƒ“–¼‚Ì“ü—Í Enter site password ƒTƒCƒg‚̃pƒXƒ[ƒh“ü—Í Use this capture tool for links that can only be accessed through forms or javascript code ƒtƒH[ƒ€‚Ü‚½‚ÍJava-Script‚É‚æ‚Á‚Ă̂݃AƒNƒZƒX‰Â”\‚ÈƒŠƒ“ƒN‚ðA‚±‚̃c[ƒ‹‚ðŽg‚Á‚Ď擾‚·‚é Choose language according to preference Ý’è‚É‚µ‚½‚ª‚Á‚ÄŒ¾Œê‚ð‘I‘ð‚·‚é Catch URL! URL‚̎擾! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Œ»Ý‚̃uƒ‰ƒEƒU‚̃vƒƒLƒVÝ’è‚ðŽŸ‚Ì’l‚É“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ (ƒvƒƒLƒV‚̃AƒhƒŒƒX‚ƃ|[ƒg‚ðƒRƒs[/ƒy[ƒXƒg‚µ‚Ü‚·j\nŽŸ‚ÉKlicken Sie dann im Browser auf den Schalter Submit/Absenden o. . des Formulars oder auf die spezielle VerknEfung, die Sie laden wollen. This will send the desired link from your browser to WinHTTrack. ‚±‚ê‚É‚æ‚Á‚Ä–]‚Ü‚µ‚¢ƒŠƒ“ƒN‚ðƒuƒ‰ƒEƒU‚©‚ç WinHTTrack ‚É‘—‚è‚Ü‚·B ABORT ’†’f Copy/Paste the temporary proxy parameters here Œ»Ý‚̃vƒƒLƒV‚̃pƒ‰ƒ[ƒ^‚ðƒRƒs[/ƒy[ƒXƒg‚µi‚æ‚Ý‚±‚Ýj‚Ü‚· Cancel ƒLƒƒƒ“ƒZƒ‹ Unable to find Help files! ƒwƒ‹ƒvƒtƒ@ƒCƒ‹‚ðŒ©‚Â‚¯‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñ! Unable to save parameters! ƒpƒ‰ƒ[ƒ^‚ð•Û‘¶‚Å‚«‚Ü‚¹‚ñ! Please drag only one folder at a time ‚P‰ñ‚ɂ͂ЂƂ‚̃tƒHƒ‹ƒ_‚ðƒhƒ‰ƒbƒO‚µ‚Ä‚­‚¾‚³‚¢ Please drag only folders, not files ƒtƒ@ƒCƒ‹‚ł͂Ȃ­ƒtƒHƒ‹ƒ_‚݂̂ðƒhƒ‰ƒbƒO‚µ‚Ä‚­‚¾‚³‚¢B Please drag folders only ƒtƒHƒ‹ƒ_‚݂̂ðƒhƒ‰ƒbƒO‚µ‚Ä‚­‚¾‚³‚¢ Select user-defined structure? ƒ†[ƒU’è‹`‚̃tƒHƒ‹ƒ_‚ð‘I‘ð‚µ‚Ü‚·‚©? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! ƒ†[ƒU’è‹`‚Ì•¶Žš—ñ‚ª³‚µ‚¢‚±‚Æ‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢B \n ‚»‚¤‚łȂ¯‚ê‚΃tƒ@ƒCƒ‹–¼‚ª³‚µ‚­‚ ‚è‚Ü‚¹‚ñB Do you really want to use a user-defined structure? –{“–‚Ƀ†[ƒU’è‹`‚̃tƒHƒ‹ƒ_‚ðŽg—p‚µ‚Ü‚·‚©? Too manu URLs, cannot handle so many links!! URL‚ª‘½‚·‚¬‚Ü‚·! ‚±‚ê‚Ù‚Ç‘½‚­‚ÌƒŠƒ“ƒN‚͈—‚Å‚«‚Ü‚¹‚ñ! Not enough memory, fatal internal error.. \•ª‚ȃƒ‚ƒŠ‚ª‚ ‚è‚Ü‚¹‚ñB ’v–½“I“à•”ƒGƒ‰[... Unknown operation! •s–¾‚ȃIƒyƒŒ[ƒVƒ‡ƒ“! Add this URL?\r\n ‚±‚ÌURL‚ð’ljÁ‚µ‚Ü‚·‚©?\r\n Warning: main process is still not responding, cannot add URL(s).. Œx: ƒƒCƒ“ƒvƒƒZƒX‚ª‚Ü‚¾‰ž“š‚µ‚Ü‚¹‚ñBURL‚ð’ljÁ‚Å‚«‚Ü‚¹‚ñ.. Type/MIME associations ƒtƒ@ƒCƒ‹‚ÌŽí—Þ/MIMEŠÖ˜A File types: ƒtƒ@ƒCƒ‹‚ÌŽí—Þ MIME identity: MIMEޝ•Ê Select or modify your file type(s) here ‚±‚±‚Å‚ ‚È‚½‚̃tƒ@ƒCƒ‹‚ÌŽí—Þ‚ð‘I‘ð‚Ü‚½‚ÍC³‚µ‚Ä‚­‚¾‚³‚¢ Select or modify your MIME type(s) here ‚±‚±‚Å‚ ‚½‚È‚½‚ÌMIME‚ÌŽí—Þ‚ð‘I‘ð‚Ü‚½‚ÍC³‚µ‚Ä‚­‚¾‚³‚¢ Go up ã‚Ö Go down ‰º‚Ö File download information ƒtƒ@ƒCƒ‹ƒ_ƒEƒ“ƒ[ƒhî•ñ Freeze Window ƒEƒBƒ“ƒhƒE‚̌Œè More information: ‚æ‚è[‚¢î•ñ Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download WinHTTrack Website Copier‚ւ悤‚±‚»!\n\n V‚µ‚¢ƒvƒƒWƒFƒNƒg‚ðŠJŽn‚·‚é‚©\n ‚Ü‚½‚Í •”•ªƒ_ƒEƒ“ƒ[ƒh‚ðÄŠJ‚·‚é‚É‚Í\n u‚‚¬‚Öv‚ðƒNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢ File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Šg’£Žq•t‚«ƒtƒ@ƒCƒ‹–¼:\nŽŸ‚ðŠÜ‚Þƒtƒ@ƒCƒ‹–¼:\n‚±‚̃tƒ@ƒCƒ‹–¼:\nŽŸ‚ðŠÜ‚ÞƒtƒHƒ‹ƒ_–¼:\n‚±‚̃tƒHƒ‹ƒ_–¼:\n‚±‚̃hƒƒCƒ“‚ÌƒŠƒ“ƒN:\nŽŸ‚ðŠÜ‚ÞƒhƒƒCƒ“‚ÌƒŠƒ“ƒN:\n‚±‚̃zƒXƒg‚©‚ç‚ÌƒŠƒ“ƒN:\nŽŸ‚ðŠÜ‚ÞƒŠƒ“ƒN:\n‚±‚ÌƒŠƒ“ƒN:\n‘S‚Ä‚ÌƒŠƒ“ƒN Show all\nHide debug\nHide infos\nHide debug and infos ‘S‚Ä‚ð•\ަ\nƒfƒoƒbƒO‚ð‰B‚·\nî•ñ‚ð‰B‚·\nƒfƒoƒbƒO‚Æî•ñ‚ð‰B‚· Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. ƒTƒCƒg‚»‚̂܂܂ÌÄŒ»(Šù’è)\nHtmlƒtƒ@ƒCƒ‹‚ðƒtƒHƒ‹ƒ_web/, ‰æ‘œ‚Ù‚©‚̃tƒ@ƒCƒ‹‚ðweb/images/\nHtmlƒtƒ@ƒCƒ‹‚ðƒtƒHƒ‹ƒ_/html, ƒEƒFƒu‚̉摜‚Ù‚©‚̃tƒ@ƒCƒ‹‚ð/images\nHtmlƒtƒ@ƒCƒ‹‚ðƒ‹[ƒgƒtƒHƒ‹ƒ_/, ‰æ‘œ‚Ù‚©‚̃tƒ@ƒCƒ‹‚ðweb/\nHtmlƒtƒ@ƒCƒ‹‚ðweb/, ‰æ‘œ‚Ù‚©‚̃tƒ@ƒCƒ‹‚ðweb/xxx, xxx‚̓tƒ@ƒCƒ‹‚ÌŠg’£Žq‚²‚Æ\nHtmlƒtƒ@ƒCƒ‹‚ðweb/html, ‰æ‘œ‚Ù‚©‚̃tƒ@ƒCƒ‹‚ðweb/xxx\nwww.domain.xxx/‚È‚µ‚ŃTƒCƒg‚ÌÄŒ»\nHtmlƒtƒ@ƒCƒ‹‚ðsite_name/, ‰æ‘œ‚Ù‚©‚̃tƒ@ƒCƒ‹‚ðsite_name/images/\nHtmlƒtƒ@ƒCƒ‹‚ðsite_name/html, ‰æ‘œ‚Ù‚©‚ðsite_name/images\nHtmlƒtƒ@ƒCƒ‹‚ðsite_name/, ‰æ‘œ‚Ù‚©‚ðsite_name/\nHtmlƒtƒ@ƒCƒ‹‚ð site_name/‚É, f‰æ‘œ‚»‚̂ق©‚ð site_name/xxx‚É\nHtmlƒtƒ@ƒCƒ‹‚ð site_name/html‚É, ‰æ‘œ‚»‚Ì‘¼‚ð site_name/xxx‚É\n‘S‚Ẵtƒ@ƒCƒ‹‚ð web/‚Ƀ‰ƒ“ƒ_ƒ€‚È–¼‘O‚ð•t‚¯‚Ä(ƒKƒWƒFƒbƒg!)\n‘S‚Ẵtƒ@ƒCƒ‹‚ð ƒtƒHƒ‹ƒ_site_name/‚Ƀ‰ƒ“ƒ_ƒ€‚È–¼‘O‚ð•t‚¯‚Ä(ƒKƒWƒFƒbƒg!)\nƒ†[ƒU’è‹`‚̃tƒHƒ‹ƒ_... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first ƒXƒLƒƒƒ“‚Ì‚Ý\nHTMLƒtƒ@ƒCƒ‹‚̕ۑ¶\n”ñHTMLƒtƒ@ƒCƒ‹‚̕ۑ¶\n‘S‚Ẵtƒ@ƒCƒ‹‚̕ۑ¶ (Šù’è)\nʼn‚ÉHTMLƒtƒ@ƒCƒ‹‚ð•Û‘¶ Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down “¯ˆêƒfƒBƒŒƒNƒgƒŠ‚ɂƂǂ܂é\n‰º‚̃fƒBƒŒƒNƒgƒŠ‚ւ̈ړ®‚ð‹–‰Â (Šù’è)\nã‚̃fƒBƒŒƒNƒgƒŠ‚ւ̈ړ®‚ð‹–‰Â\n㉺‚̃fƒBƒŒƒNƒgƒŠ‚ւ̈ړ®‚ð‹–‰Â Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web “¯ˆêƒAƒhƒŒƒX‚ɂƂǂ܂é (Šù’è)\n“¯ˆêƒhƒƒCƒ“‚ɂƂǂ܂é\nƒgƒbƒvƒŒƒxƒ‹‚̃hƒƒCƒ“‚ɂƂǂ܂é\nWeb‚̂ǂ±‚Ö‚Å‚às‚­ Never\nIf unknown (except /)\nIf unknown ‹‘”Û\n–¢’m‚Ìê‡ (/‚𜂭)\n–¢’m‚Ìê‡ no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules robots.txt ‚ª–³Ž‹‚³‚ê‚éꇂ̃‹[ƒ‹\nƒEƒBƒU[ƒh‚𜂫Arobots.txt‚̃‹[ƒ‹‚É]‚¤\nrobots.txt‚̃‹[ƒ‹‚É]‚¤ normal\nextended\ndebug Šù’è\nŠg’£\nƒfƒoƒbƒO Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download ƒEƒFƒuƒTƒCƒg‚ÌŽ©“®ƒ_ƒEƒ“ƒ[ƒh\nƒEƒFƒuƒTƒCƒg‚ÌŽ¿–â•t‚«ƒ_ƒEƒ“ƒ[ƒh\n•ªŠ„ƒtƒ@ƒCƒ‹‚̎擾\nƒy[ƒW’†‘S‚ẴTƒCƒg‚̃_ƒEƒ“ƒ[ƒh (•¡”ƒTƒCƒg‚̃Rƒs[(ƒ~ƒ‰[))\nƒy[ƒW‚ÌƒŠƒ“ƒN‚̃eƒXƒg\n* ’†’f‚³‚ꂽƒ_ƒEƒ“ƒ[ƒh‚ÌŒp‘±\n* Šù‘¶‚̃_ƒEƒ“ƒ[ƒh‚ÌXV Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL ‘Š‘ÎURI(URIˆê•”‹Lq) / â‘ÎURL(URLƒtƒ‹‹Lq)(Šù’è)\nâ‘ÎURL / â‘ÎURL\nâ‘ÎURI / â‘ÎURL\nƒIƒŠƒWƒiƒ‹‚ÌURL / ƒIƒŠƒWƒiƒ‹‚ÌURL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: ƒvƒƒLƒV‚ÌŽí—Þ: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. ƒvƒƒLƒV‚̃vƒƒgƒRƒ‹BHTTP: •W€‚̃vƒƒLƒVBHTTP (CONNECT ƒgƒ“ƒlƒ‹): ‚·‚×‚Ä‚ÌƒŠƒNƒGƒXƒg‚ð CONNECT ƒgƒ“ƒlƒ‹Œo—R‚Å‘—M‚µ‚Ü‚·BTor ‚Ì HTTPTunnelPort ‚̂悤‚È CONNECT ‚݂̂̃vƒƒLƒV—p‚Å‚·BSOCKS5: Šù’èƒ|[ƒg 1080B Load cookies from file: ƒNƒbƒL[‚ðƒtƒ@ƒCƒ‹‚©‚ç“ǂݞ‚Þ: Preload cookies from a Netscape cookies.txt file before crawling. ƒNƒ[ƒ‹‚ðŠJŽn‚·‚é‘O‚É Netscape ‚Ì cookies.txt ƒtƒ@ƒCƒ‹‚©‚çƒNƒbƒL[‚ð“ǂݞ‚݂܂·B Pause between files: ƒtƒ@ƒCƒ‹ŠÔ‚̑ҋ@: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). ƒtƒ@ƒCƒ‹‚̃_ƒEƒ“ƒ[ƒhŠÔ‚̃‰ƒ“ƒ_ƒ€‚È’x‰„i•bjB”͈͂ðŽw’è‚·‚é‚É‚Í MIN:MAX ‚ðŽg—p‚µ‚Ü‚· (—á: 2:8)B Keep the www. prefix (do not merge www.host with host) www. ƒvƒŒƒtƒBƒbƒNƒX‚ð•ÛŽ‚·‚é (www.host ‚Æ host ‚𓇂µ‚È‚¢) Do not treat www.host and host as the same site. www.host ‚Æ host ‚𓯂¶ƒTƒCƒg‚Æ‚µ‚Ĉµ‚¢‚Ü‚¹‚ñB Keep double slashes in URLs URL “à‚Ì“ñdƒXƒ‰ƒbƒVƒ…‚ð•ÛŽ‚·‚é Do not collapse duplicate slashes in URLs. URL “à‚̘A‘±‚µ‚½ƒXƒ‰ƒbƒVƒ…‚ð‚܂Ƃ߂܂¹‚ñB Keep the original query-string order ƒNƒGƒŠ•¶Žš—ñ‚ÌŒ³‚̇˜‚ð•ÛŽ‚·‚é Do not reorder query-string parameters when deduplicating URLs. URL ‚Ìd•¡”rœŽž‚ɃNƒGƒŠ•¶Žš—ñ‚̃pƒ‰ƒ[ƒ^‚ð•À‚בւ¦‚Ü‚¹‚ñB Strip query keys: 휂·‚éƒNƒGƒŠƒL[: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). •Û‘¶ƒtƒ@ƒCƒ‹–¼‚̶¬‚©‚眊O‚·‚éƒNƒGƒŠƒL[‚ðƒJƒ“ƒ}‹æØ‚è‚ÅŽw’肵‚Ü‚· (—á: sid,utm_source)B Write a WARC archive of the crawl ƒNƒ[ƒ‹‚Ì WARC ƒA[ƒJƒCƒu‚ð‘‚«o‚· Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Žæ“¾‚µ‚½ŠeƒŒƒXƒ|ƒ“ƒX‚ð ISO-28500 WARC/1.1 ƒA[ƒJƒCƒu‚Æ‚µ‚ă~ƒ‰[‚ׂ̗ɂà•Û‘¶‚µ‚Ü‚·B WARC archive name: WARC ƒA[ƒJƒCƒu–¼: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. WARC ƒA[ƒJƒCƒu‚Ì”CˆÓ‚̃x[ƒX–¼B‹ó—“‚É‚·‚邯o—̓fƒBƒŒƒNƒgƒŠ“à‚ÅŽ©“®“I‚É–¼‘O‚ª•t‚¯‚ç‚ê‚Ü‚·B httrack-3.49.14/lang/Italiano.txt0000644000175000017500000011377315230602340012246 LANGUAGE_NAME Italiano LANGUAGE_FILE Italiano LANGUAGE_ISO it LANGUAGE_AUTHOR Witold Krakowski (wkrakowski at libero.it)\r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Italian (Standard) OK Ok Cancel Annulla Exit Esci Close Chiudi Cancel changes Annulla modifiche Click to confirm Clicca per confermare Click to get help! Clicca qui per aiuto Click to return to previous screen Clicca per tornare indietro Click to go to next screen Clicca per passare allo schermo successivo Hide password Nascondi password Save project Salva il progetto Close current project? Chiudere il progetto corrente? Delete this project? Eliminare questo progetto? Delete empty project %s? Eliminare il progetto vuoto %s? Action not yet implemented Azione non ancora possibile Error deleting this project C'è stato un errore durante l'eliminazione di questo progetto Select a rule for the filter Seleziona le regole per il filtro Enter keywords for the filter Inserisci le parole chiave per il filtro Cancel Annulla Add this rule Aggiungi questa regola Please enter one or several keyword(s) for the rule Inserisci una o più parola(e) chiave Add Scan Rule Aggiungi un filtro Criterion Scegli una regola String Inderisci una parola chiave Add Aggiungi Scan Rules Filtri Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Puoi escludere o accettare diversi URL o collegamenti usando wildcards\nPuoi usare spazi tra i filtri.\n\nEsempio: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Escludi i collegamenti Include link(s) Accetta i collegamenti Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Suggerimento: Se vuoi accettare tutti i file gif sulle pagine web, usa qualcosa come +www.pagina.com/*.gif \n((+*.gif accetterà/rifiuterà TUTTI i file gif su TUTTE le pagine) Save prefs Salva impostazioni Matching links will be excluded: I collegamenti soggetti a questa regola verranno esclusi Matching links will be included: I collegamenti soggetti a questa regola verranno accettati Example: Esempio: gif\r\nWill match all GIF files gif\r\nTroverà tutti i file gif blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nTroverà tutti i file contenenti 'blue', es. 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nTroverà il file 'bigfile.mov', ma non 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nTroverà i collegamenti con la cartella contenente 'cgi', es. /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nTroverà i collegamenti con la cartella contenente 'cgi-bin' (ma non cgi-bin-2, per esempio) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nTroverà tutti i collegamenti come www.someweb.com, private.someweb.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nTroverà tutti i collegamenti come www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nTroverà tutti i collegamenti come www.someweb.com/... (ma non collegamenti come private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nTroverà tutti i collegamenti come www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nTroverà soltanto il collegamenti www.test.com/test/someweb.html. Nota che bisogna inserire sia l'indirizo (www.xxx.yyy), che il percorso (/test/someweb.html) All links will match Tutti i collegamenti verranno rifiutati/accettati Add exclusion filter Aggiungi il filtro per escludere Add inclusion filter Aggiungi il filtro per accettare Existing filters Filtri aggiuntivi Cancel changes Annulla modifiche Save current preferences as default values Salva impostazioni come valori di default Click to confirm Clicca per confermare No log files in %s! Non creare file di log in %s! No 'index.html' file in %s! Non creare il file index.html in%s! Click to quit WinHTTrack Website Copier Clicca per uscire da WinHTTrack Website Copier View log files Visualizza i file di log Browse HTML start page Visualizza la pagina HTML iniziale End of mirror Fine del mirror View log files Visualizza file di log Browse Mirrored Website Visualizza il Web New project... Nuovo progetto View error and warning reports Visualizza gli errori View report Visualizza le informazioni Close the log file window Chiudi la finestra dei log Info type: Tipo di informazione Errors Errori Infos Informazioni Find Cerca Find a word Trova una parola Info log file File di log Warning/Errors log file File di log degli errori Unable to initialize the OLE system Impossibile inizializzare il sistema OLE WinHTTrack could not find any interrupted download file cache in the specified folder! Non c'è cache nella cartella indicata\nWinHTTracknon ha trovato nessun mirror interrotto! Could not connect to provider Impossibile stabilire la connessione con il provider receive ricezione request richiesta connect connessione search ricerca ready pronto error errore Receiving files.. Ricezione dei file.. Parsing HTML file.. Analisi file html.. Purging files.. Pulizia file.. Loading cache in progress.. Caricamento della cache in corso... Parsing HTML file (testing links).. Analisi file HTML (test dei collegamenti).. Pause - Toggle [Mirror]/[Pause download] to resume operation Pausa (seleziona [Aiuto]/[Pausa] per continuare) Finishing pending transfers - Select [Cancel] to stop now! Sto finendo i trasferimenti rimasti - Premi [Annulla] per terminare adesso! scanning Scansione Waiting for scheduled time.. Attesa dell'orario specificato per iniziare Connecting to provider Connesione al provider in corso [%d seconds] to go before start of operation Mirror in pausa [%d seconds] Site mirroring in progress [%s, %s bytes] Mirror in corso [%s, %s bytes] Site mirroring finished! Mirror del sito completato! A problem occurred during the mirroring operation\n C'è stato un problema durante il mirror\n \nDuring:\n Durante:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Verifica il log se necessario.\n\nClicca OK per uscire da WinHTTrack.\n\nGrazie per aver usato WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Il mirror è finito.\nClicca OK per uscire da WinHTTrack.\nGuarda i file log per assicurarti che tutto è andato a buon fine.\n\nGrazie per aver usato WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * MIRROR INTERROTTO! * *\r\nLa cache corrente è necessaria per le operazioni di aggiornamento e contiene solo i dati scaricati durante questa sessione interrotta.\r\nLa cache precedente potrebbe contenere informazioni più complete; se non vuoi perdere quelle informazioni, devi ripristinarla e cancellare la cache corrente.\r\n[Nota: per fare questo, cancella il contenuto della cartella hts-cache del mirror]\r\n\r\nPensi che la cache precedente possa contenere informazioni più complete e vuoi ripristinarla? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ERRORE NEL MIRROR! * *\r\nHTTrack ha stabilito che il mirror attuale è vuoto. Se questo è un aggiornamento, il mirror precedente è stato ripristinato.\r\nMotivo: la prima pagina(e) non è stata trovata oppure c'è stato un problema durante la connessione\r\n=> Assicurati che il sito esista ancora, e/o verificate le vostre impostazioni del proxy! <= \n\nTip: Click [View log file] to see warning or error messages \nSuggerimento: Clicca [Visualizza filr di log] per vedere i messaggi di avvertimento o di errore Error deleting a hts-cache/new.* file, please do it manually Errore durante la cancellazione del contenuto della cartella hts-cache, è necessario completare l'operazione manualmente Do you really want to quit WinHTTrack Website Copier? Vuoi veramente uscire da WinHTTrack? - Mirroring Mode -\n\nEnter address(es) in URL box - Modo mirror -\n\nInserisci l'indirizzo(i) URL nell'apposito spazio - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Modo mirror con il wizard (con domande) -\n\nInserisci l'indirizzo(i) URL nell'apposito spazio - File Download Mode -\n\nEnter file address(es) in URL box - Modo di download dei file -\n\nInserisci l'indirizzo(i) URL dei file nell'apposito spazio - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Modo di test dei collegamenti -\n\nInserisci l'indirizzo(i) URL delle pagine contenenti i collegamenti nell'apposito spazio - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modo di aggiornameto/continuazione del mirror -\n\nVerifica l'indirizzo(i) nell'apposito spazio, quindi clicca sul pulsante AVANTI e verifica i parametri. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Continuazione di un mirror interrotto -\n\nVerifica l'indirizzo(i) nell'apposito spazio, quindi clicca sul pulsante AVANTI e verifica i parametri. Log files Path Percorso dei file di log Path Percorso - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Modo di lista di mirror, inserisci l'indirizzo(i) delle pagine contenenti i collegamenti New project / Import? Nuovo progetto / importare? Choose criterion Scegli l'azione Maximum link scanning depth Massima profondità dei link Enter address(es) here Inserisci gli indirizzi qui Define additional filtering rules Definisci filtri aggiuntivi Proxy Name (if needed) Proxy se necessario Proxy Port Port del proxy Define proxy settings Inserisci le impostazioni del proxy Use standard HTTP proxy as FTP proxy Utilizza il proxy HTTP standard come proxy FTP Path Percorso Select Path Seleziona percorso Path Percorso Select Path Seleziona percorso Quit WinHTTrack Website Copier Esci da WinHTTrack Website Copier About WinHTTrack Informazioni su WinHTTrack Save current preferences as default values Salva le impostazioni come valori di default Click to continue Clicca per continuare Click to define options Clicca per definire le opzioni Click to add a URL Clicca per aggiungere un indirizzo URL Load URL(s) from text file Carica gli URL da un file di testo WinHTTrack preferences (*.opt)|*.opt|| Impostazioni di Win HTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| File di testo con gli indirizzi (*.txt)|*.txt|| File not found! File non trovato! Do you really want to change the project name/path? Sei sicuro di voler cambiare il nome e/o il percorso del progetto? Load user-default options? Caricare opzioni di default dell'utente? Save user-default options? Salvare opzioni di default dell'utente? Reset all default options? Azzerare tutte le opzioni di default? Welcome to WinHTTrack! Benvenuto in WinHTTrack! Action: Azione: Max Depth Massima profondità: Maximum external depth: Massima profondità esterna: Filters (refuse/accept links) : Filtri (rifiutare/accettare i collegamenti) : Paths Percorsi Save prefs Salva impostazioni Define.. Definisci.. Set options.. Definisci le opzioni.. Preferences and mirror options: Impostazioni e opzioni del mirror: Project name Nome del progetto: Add a URL... Aggiungi URL... Web Addresses: (URL) Indirizzi Web: (URL) Stop WinHTTrack? Fermare WinHTTrack? No log files in %s! Non ci sono log in %s! Pause Download? Trasferimento in pausa? Stop the mirroring operation Interrompi il mirror Minimize to System Tray Nascondi questa finestra nel system tray Click to skip a link or stop parsing Clicca per saltare un collegamento oppure interrompere l'analisi Click to skip a link Clicca per saltare un collegamento Bytes saved Byte salvati Links scanned Collegamenti analizzati Time: Tempo: Connections: Connessioni: Running: In esecuzione: Hide Nascondi Transfer rate Velocità di trasferimento SKIP SALTA Information Informazioni Files written: File salvati : Files updated: File aggiornati : Errors: Errori : In progress: In corso : Follow external links Scarica i file anche dai collegamenti esterni Test all links in pages Verifica tutti i collegamenti nelle pagine Try to ferret out all links Cerca di trovare tutti i collegamenti Download HTML files first (faster) Scarica prima i file HTML (più veloce) Choose local site structure Scegli la struttura del sito in locale Set user-defined structure on disk Definisci la struttura del sito sul disco Use a cache for updates and retries Usa la cache per aggiornamenti e per riprovare Do not update zero size or user-erased files Non scaricare nuovamente i file presenti localmente con dimensione nulla oppure cancellati dal utente Create a Start Page Crea la pagina iniziale Create a word database of all html pages Crea un database delle parole di tutte le pagine HTML Create error logging and report files Crea file di log per segnalare errori e informazioni Generate DOS 8-3 filenames ONLY Genera solo nomi di file in formato 8.3 Generate ISO9660 filenames ONLY for CDROM medias Genera nomi di file in formato ISO9660 per i CDROM Do not create HTML error pages Non generare pagine d'errore HTML Select file types to be saved to disk Seleziona i tipi di file da scrivere sul disco Select parsing direction Seleziona la direzione di spostamento nel sito Select global parsing direction Seleziona la direzione globale dello spostamento nel sito Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Regole per la riscrittura degli URL interni (collegamenti scaricati) ed esterni (collegamenti non scaricati) Max simultaneous connections Numero massimo di connessioni File timeout Massimo tempo d'attesa per un file Cancel all links from host if timeout occurs Annulla tutti i collegamenti dal host se c'è timeout Minimum admissible transfer rate Minimo transfer rate ammesso Cancel all links from host if too slow Annulla tutti i collegamenti dal host se è troppo lento Maximum number of retries on non-fatal errors Massimo numero di tentativi nel caso di un errore non fatale Maximum size for any single HTML file Massima dimensione per una pagina HTML Maximum size for any single non-HTML file La dimensione massima per un file Maximum amount of bytes to retrieve from the Web Massima dimensione del mirror Make a pause after downloading this amount of bytes Pausa dopo aver ricevuto questa quantità di byte Maximum duration time for the mirroring operation Tempo massimo del mirror Maximum transfer rate Transfer rate massimo Maximum connections/seconds (avoid server overload) Limite delle connessioni al secondo (per evitare il sovraccarico del server) Maximum number of links that can be tested (not saved!) Massimo numero di link che possono essere testati (non salvati!) Browser identity Identità del browser Comment to be placed in each HTML file Piè di pagina per ogni file HTML Back to starting page Torna alla pagina iniziale Save current preferences as default values Salva le impostazioni come valori di default Click to continue Clicca per continuare Click to cancel changes Clicca per annullare le modifiche Follow local robots rules on sites Segui le regole per i robot sui siti Links to non-localised external pages will produce error pages Pagine esterne (non prelevate) saranno collegate alle pagine d'errore Do not erase obsolete files after update Non cancellare i file vecchi dopo l'aggiornamento Accept cookies? Accettare i cookie spediti? Check document type when unknown? Verificare il tipo di documento se sconosciuto? Parse java applets to retrieve included files that must be downloaded? Analizzare gli applet java per ritrovare i file contenuti in essi? Store all files in cache instead of HTML only Tieni tutti i file nella cache, invece dei soli file HTML Log file type (if generated) Tieni il tipo di file nel log se generato Maximum mirroring depth from root address Massima profondità del mirror dai primi indirizzi Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Massima profondità del mirror per indirizzi esterni/vietati (0, è l'impostazione predefinita) Create a debugging file Crea un file di debug Use non-standard requests to get round some server bugs Cerca di evitare alcuni bug dei server usando richieste non standard Use old HTTP/1.0 requests (limits engine power!) Usa richieste HTTP/1.0, limita le capacità del motore! Attempt to limit retransfers through several tricks (file size test..) Tentativo di limitare il numero di ripetizioni dei trasferimenti, usando alcuni truchi (test della dimensione del file..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Tentativo di limitare il numero di link, saltando URL simili (www.foo.com==foo.com, http=https ..) Write external links without login/password Salva link esterni senza login e password Write internal links without query string Salva i link interni senza stringa query Get non-HTML files related to a link, eg external .ZIP or pictures Scarica file non-HTML vicino ai collegamenti (es. .ZIP o immagini presenti all'esterno) Test all links (even forbidden ones) Verifica tutti i collegamenti (anche quelli vietati) Try to catch all URLs (even in unknown tags/code) Cerca di trovare tutti gli URL (anche quelli con tag/codice sconosciuto) Get HTML files first! Scarica prima i file HTML! Structure type (how links are saved) Tipo di struttura (come sono salvati i collegamenti) Use a cache for updates Usa la cache per gli aggiornamenti Do not re-download locally erased files Non scaricare nuovamente i file cancellati dal disco Make an index Crea un indice Make a word database Crea un database delle parole Log files File di log DOS names (8+3) Nomi DOS (8+3) ISO9660 names (CDROM) Nomi ISO 9660 (CDROM) No error pages Senza pagine d'errore Primary Scan Rule Filtro primario Travel mode Modo di spostamento Global travel mode Modo di spostamento globale These options should be modified only exceptionally Normalmente queste opzioni non devono essere modificate Activate Debugging Mode (winhttrack.log) Attiva il modo di debug (winhttrack.log) Rewrite links: internal / external Riscrittura collegamenti: interni /esterni Flow control Controllo di flusso Limits Limiti Identity Identità HTML footer Piè di pagina HTML N# connections N° di connessioni Abandon host if error Abbandona il host nel caso di errore Minimum transfer rate (B/s) Transfer rate minimo (B/s) Abandon host if too slow Abbandona il host se è troppo lento Configure Configurazione Use proxy for ftp transfers Usa proxy per trasferimenti ftp TimeOut(s) TimeOut Persistent connections (Keep-Alive) Connessioni persistenti (keep-alive) Reduce connection time and type lookup time using persistent connections Riduci tempo di connessione e il tempo di verifica del tipo usando la connessione persistente Retries Tentativi Size limit Limite di dimensione Max size of any HTML file (B) Dimensione massima html: Max size of any non-HTML file Dimensione massima altri file: Max site size Dimensione massima del sito Max time Tempo massimo Save prefs Salva impostazioni Max transfer rate Velocità di trasferimento massima Follow robots.txt Segui robots.txt No external pages Senza pagine esterne Do not purge old files Non cancellare file vecchi Accept cookies Accetta i cookie Check document type Verifica il tipo di file Parse java files Analizza i file java Store ALL files in cache Memoriza tutti i file nella cache Tolerant requests (for servers) Richieste toleranti (per i server) Update hack (limit re-transfers) Aggiorna hack (limita i ritrasferimenti) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Forza richieste HTTP/1.0 (non 1.1) Max connections / seconds N° massimo di connessioni al secondo Maximum number of links Massimo numero di link Pause after downloading.. Pausa dopo il download.. Hide passwords Nascondi password Hide query strings Nascondi le stringhe query Links Collegamenti Build Struttura Experts Only Esperto Flow Control Controllo di flusso Limits Limiti Browser ID Identità del browser Scan Rules Filtri Spider Spider Log, Index, Cache Log, Indice, Cache Proxy Proxy MIME Types Tipi MIME Do you really want to quit WinHTTrack Website Copier? Vuoi veramente uscire da WinHTTrack? Do not connect to a provider (already connected) Non effettuare la connessione al provider (già connesso) Do not use remote access connection Non usare la connessione di accesso remoto Schedule the mirroring operation Programma il mirror Quit WinHTTrack Website Copier Esci da WinHTTrack Website Copier Back to starting page Torna alla pagina iniziale Click to start! Clicca per iniziare! No saved password for this connection! Non c'è nessuna password salvata per questa connessione Can not get remote connection settings Impossibile ottenere i parametri della connessione Select a connection provider Seleziona il provider a cui connettersi Start Inizio Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Puoi iniziare il mirror premendo il pulsante FINISH o definire altre opzioni per la connessione Save settings only, do not launch download now. Salva solo le impostazioni, non iniziare il download adesso. On hold Attesa Transfer scheduled for: (hh/mm/ss) Attesa fino a: (hh/mm/ss) Start Inizio Connect to provider (RAS) Connessione al provider (RAS) Connect to this provider Connessione a questo provider: Disconnect when finished Disconnetti alla fine Disconnect modem on completion Disconnetti il modem quando il mirror è finito \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(informateci degli errori o problemi)\r\n\rSviluppo:\r\nInterfacccia: Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Italian translations to:\r\nWitold Krakowski (wkrakowski@libero.it) About WinHTTrack Website Copier Informazioni su WinHTTrack Website Copier Please visit our Web page Visita la nostra pagina Web Wizard query La domanda del wizard Your answer: La vostra risposta: Link detected.. È stato trovato un collegamento Choose a rule Scegli una regola Ignore this link Ignora questo collegamento Ignore directory Ignora questa cartella Ignore domain Ignora questo dominio Catch this page only Scarica soltanto questa pagina Mirror site Mirror del sito Mirror domain Mirror del dominio Ignore all Ignora tutto Wizard query La domanda del wizard NO NO File File Options Opzioni Log Log Window Finestra Help Aiuto Pause transfer Pausa del trasferimento Exit Esci Modify options Modifica le opzioni View log Visualizza il log View error log Visualizza il log di errori View file transfers Visualizza trasferimenti dei file Hide Nascondi About WinHTTrack Website Copier Informazioni su WinHTTrack Website Copier Check program updates... Verifica gli aggiornamenti del programma... &Toolbar Toolbar &Status Bar Barra di stato S&plit Dividi File File Preferences Opzioni Mirror Aiuto Log Log Window Finestra Help Aiuto Exit Esci Load default options Carica le opzioni di default Save default options Salva le opzioni di default Reset to default options Azzera le opzioni di default Load options... Carica le opzioni... Save options as... Salva le opzioni come... Language preference... Preferenza di lingua... Contents... Indice... About WinHTTrack... Informazioni su WinHTTrack... New project\tCtrl+N Nuovo progetto\tCtrl+N &Open...\tCtrl+O &Apri...\tCtrl+O &Save\tCtrl+S &Salva\tCtrl+S Save &As... Salva &come... &Delete... &Elimina... &Browse sites... &Visita i siti... User-defined structure Struttura definita dall'utente %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNome del file senza il tipo (es.: immagine)\n%N\tNome del file, incluso il tipo (es.: immagine)\n%t\tTipo del file (es.: gif)\n%p\tPercorso [senza fine /] (es.: /immagini)\n%h\tIl nome del host (es.: www.someweb.com)\n\n%s?\tVersione corta per il DOS (es.: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Esempio:\t%h%p/%n.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Preferenze del proxy Proxy address: Indirizzo del proxy Proxy port: Port del proxy Authentication (only if needed) Autenticazione (solo se necessaria) Login Login Password Password Enter proxy address here Inserisci qui il nuovo indirizzo del proxy Enter proxy port here Inserisci qui il port del proxy Enter proxy login Inserisci il login del proxy Enter proxy password Inserisci la password del proxy Enter project name here Inserisci qui il nome del progetto Enter saving path here Inserisci qui il percorso per salvare il progetto Select existing project to update Seleziona da qui un progetto esistente da aggiornare Click here to select path Clicca qui per selezionare il percorso Select or create a new category name, to sort your mirrors in categories Seleziona o crea una nuova categoria HTTrack Project Wizard... Wizard per progetto HTTrack... New project name: Il nome del nuovo progetto: Existing project name: Il nome di un progetto esistente: Project name: Il nome del progetto: Base path: Il percorso base: Project category: Categoria del progetto: C:\\My Web Sites C:\\Mie pagine Web Type a new project name, \r\nor select existing project to update/resume Inserisci il nome del nuovo progetto, \r\no seleziona un progetto esistente per aggiornare/continuare New project Nuovo progetto Insert URL Inserisci l'indirizzo URL: URL: Indirizzo URL: Authentication (only if needed) Identificazione (solo se necessaria) Login Login Password Password Forms or complex links: Formule o collegamenti complessi Capture URL... Preleva l'URL Enter URL address(es) here Inserisci qui l'indirizzo URL Enter site login Inserisci il login del sito Enter site password Inserisci la password del sito Use this capture tool for links that can only be accessed through forms or javascript code Usa questo tool per prelevare i collegamenti ai quali si può accedere solo tramite formule o collegamenti javascript Choose language according to preference Seleziona la lingua Catch URL! Preleva l'URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Temporaneamente inserisci le seguenti impostazioni per il proxy (copia/incolla l'indirizzo e il port del proxy).\nQuindi, nella tua pagina del browser clicca sul pulsante ok della form, oppure clicca sul collegamento specifico che vuoi prelevare. This will send the desired link from your browser to WinHTTrack. Questo preleverà il coolegamento desiderato dal tuo browser a HTTrack. ABORT ANNULLA Copy/Paste the temporary proxy parameters here Copia/incolla qui le impostazioni temporanee del proxy Cancel Annulla Unable to find Help files! Impossibile trovare i file di aiuto Unable to save parameters! Impossibile salvare i parametri! Please drag only one folder at a time Trascina solo una cartella alla volta Please drag only folders, not files Trascina solo una cartella, non un file Please drag folders only Trascina solo una cartella Select user-defined structure? Selezionare la struttura definita dall'utente? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Assicurati che la stringa definita dall'utente è corretta\nSe non è corretta, i nomi dei file saranno errati! Do you really want to use a user-defined structure? Vuoi veramente selezionare la struttura definita dall'utente? Too manu URLs, cannot handle so many links!! Troppi URL, il programma non può servire così tanti collegamenti! Not enough memory, fatal internal error.. Troppa poca memoria, errore interno fatale... Unknown operation! Operazione sconosciuta! Add this URL?\r\n Aggiungere questo URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Attenzione: il processo principale non risponde, non è possibile aggiungere URL. Type/MIME associations Corrispondenze tipo/MIME File types: Tipi di file MIME identity: Identità MIME Select or modify your file type(s) here Seleziona o modifica i tuoi tipi di file qui Select or modify your MIME type(s) here Seleziona o modifica i tuoi tipi MIME qui Go up Vai su Go down Vai giù File download information Informazioni sullo scaricamento dei file Freeze Window Congela la finestra More information: Più informazioni: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Benvenuti nel WinHTTrack Website Copier!\n\nClicca sul pulsante NEXT per iniziare o continuare un progetto File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Tipi di file con l'estensione:\nNomi di file contenenti:\nQuesto nome di file:\nNomi di cartella contenenti:\nQuesto nome cartella:\nCollegamenti in questo dominio:\nCollegamenti nei domini contenenti:\nCollegamenti da questo host:\nCollegamenti contenenti:\nQuesto collegamento:\nTUTTI I COLLEGAMENTI Show all\nHide debug\nHide infos\nHide debug and infos Mostra tutto\nNascondi il debug\nNascondi le informazioni\nNascondi il debug e le informazioni Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Struttura del sito (default)\nHtml nel web, immagini/altri file nel web/immagini/\nHtml nel web/html, immagini/altro nel web/immagini\nHtml nel web/, immagini/altro nel web/\nHtml nel web/, immagini/altro nel web/xxx, dove xxx è l'estensione del file\nHtml nel web/html, immagini/altro nel web/xxx\nStruttura del sito, senza www.dominio.xxx/\nHtml nel nome_del_sito/,immagini/altri file nel nome_del_sito/immagini/\nHtml nel nome_del_sito/html,immagini/altro nel nome_del file/immagini\nHtml nel nome_del_sito/,immagini/altro nel nome_del_sito/\nHtml nel nome_del_sito/,immagini/altro nel nome_del_sito/xxx\nHtml nel nome_del_sito/html,immagini/altro nel nome_del_sito/xxx\nTutti i file nel web/,con nomi casuali\nTutti i file nel nome_del_sito/,con nomi casuali\nStruttura definita dall'utente.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Soltanto scanning\nSalva file html\nSalva file non-html\nSalva tutti i file (default)\nSalva prima i file HTML Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Non uscire dalla directory\nPuoi andare giù nella struttura (default)\nPuoi salire\nPuoi sia scendere che salire Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Rimani nell'indirizzo indicato (default)\nRimani nello stesso dominio\nRimani nello stesso dominio di livello superiore\nVai dovunque sia necessario nel web Never\nIf unknown (except /)\nIf unknown Mai\nSe sconosciuto (eccetto /)\nSe sconosciuto no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Non seguire robots.txt\nrobots.txt eccetto wizard\nsegui le regole di robots.txt normal\nextended\ndebug normale\navanzato\ndebug Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Scarica il sito(i) web\nScarica il sito(i) (con richieste)\nScarica file separati\nScarica tutti i siti nelle pagine (mirror multiplo)\nVerifica i collegamenti nelle pagine (test dei bookmark)\n* Continua un download interrotto\n* Aggiorna un download esistente Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL URL Relativo / URL Assoluto (default)\nURL Assoluto / URL Assoluto\nURL Assoluto / URL Assoluto\nURL Originale / URL Originale Open Source offline browser Browser offline open source Website Copier/Offline Browser. Copy remote websites to your computer. Free. Browser offline/programma per copiare i siti. Copia le pagine remote sul tuo computer. Free httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) lista degli URL (.txt) Previous Precedente Next Successivo URLs URLs Warning Attenzione Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Il tuo browser non supporta javascript. Per un risultato migliiore usa un browser con supporto javascript Thank you Grazie You can now close this window Puoi chiudere questa finestra adesso Server terminated Server disconnesso A fatal error has occurred during this mirror Si è verificato un errore fatale durante la copia Proxy type: Tipo di proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protocollo del proxy. HTTP: proxy standard. HTTP (tunnel CONNECT): invia ogni richiesta attraverso un tunnel CONNECT, per proxy che supportano solo CONNECT come l'HTTPTunnelPort di Tor. SOCKS5: porta predefinita 1080. Load cookies from file: Carica i cookie da un file: Preload cookies from a Netscape cookies.txt file before crawling. Precarica i cookie da un file Netscape cookies.txt prima della copia. Pause between files: Pausa tra i file: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Ritardo casuale tra i download dei file, in secondi. Usa MIN:MAX per un intervallo casuale (ad es. 2:8). Keep the www. prefix (do not merge www.host with host) Mantieni il prefisso www. (non unire www.host con host) Do not treat www.host and host as the same site. Non trattare www.host e host come lo stesso sito. Keep double slashes in URLs Mantieni le doppie barre negli URL Do not collapse duplicate slashes in URLs. Non ridurre le barre duplicate negli URL. Keep the original query-string order Mantieni l'ordine originale della query string Do not reorder query-string parameters when deduplicating URLs. Non riordinare i parametri della query string durante la deduplicazione degli URL. Strip query keys: Rimuovi chiavi della query string: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Chiavi della query string, separate da virgole, da rimuovere dai nomi dei file salvati (ad es. sid,utm_source). Write a WARC archive of the crawl Scrivi un archivio WARC della scansione Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Salva anche ogni risposta scaricata in un archivio WARC/1.1 ISO-28500, accanto al mirror. WARC archive name: Nome dell'archivio WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Nome di base facoltativo per l'archivio WARC; lascia vuoto per assegnarlo automaticamente nella directory di output. httrack-3.49.14/lang/Greek.txt0000644000175000017500000011634615230602340011542 LANGUAGE_NAME Greek LANGUAGE_FILE Greek LANGUAGE_ISO el LANGUAGE_AUTHOR Michael Papadakis (mikepap at freemail dot gr)\r\n LANGUAGE_CHARSET ISO-8859-7 LANGUAGE_WINDOWSID Greek OK ÅíôÜîåé Cancel ¢êõñï Exit ¸îïäïò Close Êëåßóéìï Cancel changes Áêýñùóç áëëáãþí Click to confirm Êëéê ãéá åðéâåâáßùóç Click to get help! Êëéê ãéá íá ðÜñåôå âïÞèåéá! Click to return to previous screen Êëéê ãéá íá åðéóôñÝøåôå óôçí ðñïçãïýìåíç ïèüíç Click to go to next screen Êëéê ãéá íá ðÜôå óôçí åðüìåíç ïèüíç Hide password Áðüêñõøç óõíèçìáôéêïý Save project ÁðïèÞêåõóç åñãáóßáò Close current project? Èá êëåßóåôå ôçí ðáñïýóá åñãáóßá; Delete this project? Èá óâÞóåôå ôçí ðáñïýóá åñãáóßá; Delete empty project %s? ÓâÞóéìï ôçò êåíÞò åñãáóßáò %s; Action not yet implemented Ç åíÝñãåéá áõôÞ äåí Ý÷åé õëïðïéçèåß áêüìá Error deleting this project Ðñüâëçìá êáôÜ ôï óâÞóéìï áõôÞò ôçò åñãáóßáò Select a rule for the filter ÅðéëÝîôå Ýíá êáíüíá ãéá ôï ößëôñï Enter keywords for the filter ÔïðïèåôÞóôå ëÝîåéò-êëåéäéÜ ãéá ôï ößëôñï Cancel ¢êõñï Add this rule Ðñüóèåóç áõôïý ôïõ êáíüíá Please enter one or several keyword(s) for the rule Ðáñáêáëþ ôïðïèåôÞóôå ìßá Þ ðåñéóóüôåñåò ëÝîåéò-êëåéäéÜ ãéá ôïí êáíüíá Add Scan Rule Ðñüóèåóç êáíüíá øáîßìáôïò Criterion ÊñéôÞñéï String ÖñÜóç Add Ðñüóèåóç Scan Rules Êáíüíåò ÁíáæÞôçóçò Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi ×ñÞóç ìðáëáíôÝñ ãéá ôïí áðïêëåéóìü Þ ôçí áðïäï÷Þ URLs Þ links.\nÌðïñåßôå íá âÜëåôå áñêåôÝò öñÜóåéò áíß÷íåõóçò óôçí ßäéá ãñáììÞ.\n×ñçóéìïðïéÞóôå êåíÜ ãéá äéá÷ùñéóìü.\n\nÐ÷: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Links ðïõ áðïêëåßïíôáé Include link(s) Ðåñéëáìâáíüìåíá links Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) ÓõìâïõëÞ: Ãéá íá óõìðåñéëÜâåôå üëá ôá áñ÷åßá GIF, ÷ñçóéìïðïéÞóôå êÜôé óáí +www.someweb.com/*.gif. \n(+*.gif / -*.gif èá óõìðåñéëÜâåé/áðïêëåßóåé üëá ôá GIFs áðü üëåò ôéò ôïðïèåóßåò) Save prefs ÁðïèÞêåõóç ðñïôéìÞóåùí Matching links will be excluded: Ôá links ðïõ ôáéñéÜæïõí èá áðïêëåéóôïýí Matching links will be included: Ôá links ðïõ ôáéñéÜæïõí èá óõìðåñéëçöèïýí Example: ÐáñÜäåéãìá: gif\r\nWill match all GIF files gif\r\nÈá ôáéñéÜîåé üëá ôá áñ÷åßá GIF blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nÈá âñåé üëá ôá áñ÷åßá ìå ôç öñÜóç 'blue' üðùò ôï 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nÈá ôáéñéÜîåé ôï áñ÷åßï 'bigfile.mov', áëëÜ ü÷é ôï 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nÈá âñåß links ìå üíïìá öáêÝëïõ ðïõ ðåñéÝ÷åé ôï 'cgi', üðùò /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nÈá âñåß links ìå üíïìá öáêÝëïõ ðïõ ôáéñéÜæåé ìå üëï ôï 'cgi-bin', áëëÜ ü÷é ôï 'cgi-bin-2' someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nÈá âñåß links ðïõ ðåñéÝ÷ïõí ôç öñÜóç, óáí ôá www.someweb.com, private.someweb.com êëð. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nÈá âñåß links óå öáêÝëïõò ðïõ ðåñéÝ÷ïõí ôç öñÜóç, óáí ôá www.someweb.com, www.someweb.edu, private.someweb.otherweb.com êëð. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nÈá âñåß links ðïõ ôáéñéÜæïõí ìå üëï ôï 'www.someweb.com', áëëÜ ü÷é ôï 'private.someweb.com'. someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nÈá âñåß links ðïõ ðåñéÝ÷ïõí ôç öñÜóç ïðïõäÞðïôå óôï URL, üðùò ôá www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html êëð. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nÈá âñåß ìüíï ôï áñ÷åßï 'www.test.com/test/someweb.html'. ÐñïóÝîôå üôé èá ðñÝðåé íá ãñÜøåôå üëç ôç äéáäñïìÞ. All links will match ¼ëá ôá links èá ôáéñéÜîïõí Add exclusion filter Ðñüóèåóç ößëôñïõ áðüññéøçò Add inclusion filter Ðñüóèåóç ößëôñïõ áðïäï÷Þò Existing filters ÕðÜñ÷ïíôá ößëôñá Cancel changes Áêýñùóç áëëáãþí Save current preferences as default values ÁðïèÞêåõóç ôùñéíþí ðñïôéìÞóåùí ùò ðñïåðéëïãÞ Click to confirm Êëéê ãéá åðéâåâáßùóç No log files in %s! Äåí õðÜñ÷åé áñ÷åßï ãåãïíüôùí óôï %s! No 'index.html' file in %s! Äåí õðÜñ÷åé áñ÷åßï 'index.html' óôï %s! Click to quit WinHTTrack Website Copier Êëéê ãéá íá åãêáôáëåßøåôå ôï WinHTTrack Website Copier View log files Áñ÷åßï ãåãïíüôùí Browse HTML start page ¢íïéãìá ôçò áñ÷éêÞò óåëßäáò End of mirror ÔÝëïò áíôéãñáöÞò View log files Áñ÷åßï ãåãïíüôùí Browse Mirrored Website ÁíôéãñáììÝíïò ôüðïò New project... ÍÝá åñãáóßá... View error and warning reports ÐñïâïëÞ áíáöïñÜò ðñïâëçìÜôùí êáé ðñïåéäïðïéÞóåùí View report ÐñïâïëÞ áíáöïñÜò Close the log file window Êëåßóéìï ôïõ ðáñáèýñïõ ôïõ áñ÷åßïõ ãåãïíüôùí Info type: Ôýðïò ðëçñïöïñéþí: Errors ËÜèç Infos Ðëçñïöïñßåò Find ÁíáæÞôçóç Find a word ÁíáæÞôçóç ëÝîçò Info log file Áñ÷åßï êáôáãñáöÞò ðëçñïöïñéþí Warning/Errors log file ÐñïåéäïðïéÞóåéò/ËÜèç Unable to initialize the OLE system Áäýíáôç ç áñ÷éêïðïßçóç ôïõ óõóôÞìáôïò OLE WinHTTrack could not find any interrupted download file cache in the specified folder! Ôï WinHTTrack äåí âñÞêå êáíÝíá ìéóïôåëåéùìÝíï áñ÷åßï cache óôïí êáèïñéóìÝíï öÜêåëï! Could not connect to provider Áäýíáôç ç äçìéïõñãßá óýíäåóçò receive ëÞøç request áßôçóç connect óýíäåóç search áíáæÞôçóç ready áíáìïíÞ error ëÜèïò Receiving files.. ËÞøç áñ÷åßùí.. Parsing HTML file.. ÐÜñóéìï áñ÷åßïõ HTML... Purging files.. ÓâÞóéìï áñ÷åßùí.. Loading cache in progress.. Öüñôùìá ôçò cache óå åîÝëéîç... Parsing HTML file (testing links).. ÐÜñóéìï áñ÷åßïõ HTML (Ýëåã÷ïò ôùí links)... Pause - Toggle [Mirror]/[Pause download] to resume operation Ðáýóç - ÅðéëÝîôå [Áíôßãñáöï]/[Ðáýóç êáôåâÜóìáôïò] ãéá óõíÝ÷åéá ôçò äéáäéêáóßáò Finishing pending transfers - Select [Cancel] to stop now! Ôåëåßùìá åíåñãþí ìåôáöïñþí - ÅðéëÝîôå [Áêýñùóç] ãéá íá Üìåóç äéáêïðÞ! scanning óÜñùóç Waiting for scheduled time.. ÁíáìïíÞ ðñïãñáììáôéóìÝíçò þñáò... Transferring data.. ÌåôáöïñÜ äåäïìÝíùí... Connecting to provider Åðé÷åéñåßôáé óýíäåóç [%d seconds] to go before start of operation Áêüìá [%d äåõôåñüëåðôá] ãéá ôçí åêêßíçóç ôçò äéáäéêáóßáò Site mirroring in progress [%s, %s bytes] ÁíôéãñáöÞ ôïðïèåóßáò óå åîÝëéîç [%s, %s bytes] Site mirroring finished! Ç áíôéãñáöÞ ôçò ôïðïèåóßáò ôåëåßùóå! A problem occurred during the mirroring operation\n ÄçìéïõñãÞèçêå Ýíá ðñüâëçìá êáôÜ ôçí äéáäéêáóßá áíôéãñáöÞò\n \nDuring:\n \nÊáôá ôç äéÜñêåéá:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nÄåßôå ôï áñ÷åßï ãåãïíüôùí áí åßíáé áðáñáßôçôï.\n\nÊëéê óôï ÔÅËÏÓ ãéá íá åãêáôáëåßøåôå ôï WinHTTrack Website Copier.\n\nÓáò åõ÷áñéóôþ ãéá ôçí ÷ñÞóç ôïõ WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Ç äéáäéêáóßá áíôéãñáöÞò ôÝëåéùóå.\nÊëéê óôï ¸îïäïò ãéá íá åãêáôáëåßøåôå ôï WinHTTrack.\nÄåßôå ôï áñ÷åßï ãåãïíüôùí áí åßíáé áðáñáßôçôï, Ýôóé þóôå íá åðéâåâáéþóåôå üôé üëá åßíáé åíôÜîåé.\n\nÓáò åõ÷áñéóôþ ãéá ôçí ÷ñÞóç ôïõ WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * Ç ÁÍÔÉÃÑÁÖÇ ÅÃÊÁÔÁËÅÉÖÈÇÊÅ! * *\r\nÇ ðáñïýóá ðñïóùñéíÞ cache åßíáé áðáñáßôçôç ãéá êÜèå ëåéôïõñãßá áíáíÝùóçò êáé ðåñéëáìâÜíåé ìüíï äåäïìÝíá ðïõ êáôÝâçêáí êáôÜ ôç äéÜñêåéá ôçò ôùñéíÞò åãêáôáëåëåéìÝíçò ðåñéüäïõ.\r\nÇ ðñïçãïýìåíç cache ßóùò ðåñéÝ÷åé ðéï ïëïêëçñùìÝíåò ðëçñïöïñßåò. Áí äåí èÝëåôå íá ÷Üóåôå áõôÝò ôéò ðëçñïöïñßåò, ðñÝðåé íá íá ôéò áíáêôÞóåôå êáé íá äéáãñÜøåôå ôçí ðáñïýóá cache.\r\n[Óçìåßùóç: Áõôü ìðïñåß íá ãßíåé åýêïëá óâÞíïíôáò ôá áñ÷åßá hts-cache/new.*]\r\n\r\nÍïìßæåôå ðùò ç ðñïçãïýìåíç cache ßóùò ðåñéÝ÷åé ðéï ïëïêëçñùìÝíåò ðëçñïöïñßåò êáé èÝëåôå íá ôçí áíáêôÞóåôå; * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ÓÖÁËÌÁ ÁÍÔÉÃÑÁÖÇÓ * *\r\nÔï WinHTTrack áíáêÜëõøå ðùò ôï ðáñüí áíôßãñáöï åßíáé Üäåéï. Áí Þôáí ìéá áíáíÝùóç, ôï ðñïçãïýìåíï áíôßãñáöï áíáêôÞèçêå.\r\nËüãïò: Ïé ðñþôç(åò) óåëßäá(åò) åßôå äåí âñÝèçêáí Þ õðÞñîå ðñüâëçìá êáôÜ ôçí óýíäåóç.\r\n=> Åðéâåâáéþóôå üôé ç ôïðïèåóßá õðÜñ÷åé áêüìá êáé/Þ åëÝãîôå ôéò ñõèìßóåéò ôïõ proxy óáò! <= \n\nTip: Click [View log file] to see warning or error messages \n\nÓõìâïõëÞ: Êëéê óôï [ÐñïâïëÞ áñ÷åßï ãåãïíüôùí] ãéá íá äåßôå ìçíýìáôá ðñïåéäïðïéÞóåùí Þ ëáèþí Error deleting a hts-cache/new.* file, please do it manually ÓöÜëìá êáôÜ ôï óâÞóéìï åíüò hts-cache/new.* áñ÷åßïõ, ðáñáêáëþ êÜíôå ôï ìüíïé óáò Do you really want to quit WinHTTrack Website Copier? ÈÝëåôå ðñÜãìáôé íá åãêáôáëåßøåôå ôï WinHTTrack Website Copier; - Mirroring Mode -\n\nEnter address(es) in URL box - ÊáôÜóôáóç áíôéãñáöÞò -\n\nÔïðïèåôåßóôå äéåýèõíóç(åéò) óôç èÝóç URL - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - ÊáôÜóôáóç âïçèïý ìå áëëçëåðßäñáóç (åñùôÞóåéò) --\n\nÔïðïèåôåßóôå äéåýèõíóç(åéò) óôç èÝóç URL - File Download Mode -\n\nEnter file address(es) in URL box - ÊáôÜóôáóç êáôåâÜóìáôïò áñ÷åßïõ -\n\nÔïðïèåôåßóôå äéåýèõíóç(åéò) áñ÷åßïõ óôç èÝóç URL - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - ÊáôÜóôáóç åëÝã÷ïõ link -\n\nÔïðïèåôåßóôå äéåýèõíóç(åéò) ìå link(s) ãéá Ýëåã÷ï óôç èÝóç URL - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - ÊáôÜóôáóç åíçìÝñùóçò -\n\nÅðéâåâáéþóôå ôçí(ôéò) äéåýèõíóç(åéò) óôç èÝóç URL, åëÝãîôå ôéò ðáñáìÝôñïõò áí åßíáé áðáñáßôçôï êáé ìåôÜ êëéê óôï 'Åðüìåíï' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - ÊáôÜóôáóç óõíÝ÷éóçò (Ç äéáäéêáóßá äéáêüðçêå) -\n\nÅðéâåâáéþóôå äéåýèõíóç(åéò) óôç èÝóç URL, åëÝãîôå ôéò ðáñáìÝôñïõò áí åßíáé áðáñáßôçôï êáé ìåôÜ êëéê óôï 'Åðüìåíï'. Log files Path ÄéáäñïìÞ áñ÷åßïõ ãåãïíüôùí Path ÄéáäñïìÞ - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - ÊáôÜóôáóç ëßóôáò ôùí links -\n\n×ñçóéìïðïéÞóôå ôç èÝóç URL ãéá íá âÜëåôå äéåýèõíóç(åéò) áðü óåëßäá(åò) ðïõ ðåñéÝ÷åé(ïõí) links ãéá áíôéãñáöÞ. New project / Import? ÍÝá åñãáóßá / ÅéóáãùãÞ; Choose criterion ÅðéëÝîôå êñéôÞñéï Maximum link scanning depth ÌÝãéóôï âÜèïò øáîßìáôïò link Enter address(es) here ÔïðïèåôÞóôå äéåýèõíóç(åéò) åäþ Define additional filtering rules Ïñßóôå ðñüóèåôïõò êáíüíåò öéëôñáñßóìáôïò Proxy Name (if needed) ¼íïìá Proxy (áí ÷ñåéÜæåôáé) Proxy Port Port ôïõ proxy Define proxy settings Ïñéóìüò ñõèìßóåùí proxy Use standard HTTP proxy as FTP proxy ×ñÞóç êáíïíéêïý HTTP proxy, óáí FTP proxy Path ÄéáäñïìÞ Select Path ÅðéëïãÞ äéáäñïìÞò Path ÄéáäñïìÞ Select Path ÅðéëïãÞ äéáäñïìÞò Quit WinHTTrack Website Copier ÅãêáôÜëåéøç ôïõ WinHTTrack Website Copier About WinHTTrack Ó÷åôéêÜ ìå ôï WinHTTrack Save current preferences as default values ÁðïèÞêåõóç ôùí ôùñéíþí ñõèìßóåùí ùò ðñïåðéëïãÞ Click to continue Êëéê ãéá óõíÝ÷åéá Click to define options Êëéê ãéá ïñéóìü ñõèìßóåùí Click to add a URL Êëéê ãéá ðñüóèåóç åíüò URL Load URL(s) from text file Öüñôùìá URL(s) áðü áñ÷åßï êåéìÝíïõ WinHTTrack preferences (*.opt)|*.opt|| ÐñïôéìÞóåéò WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Ëßóôá äéåõèýíóåùí (*.txt)|*.txt|| File not found! Ôï áñ÷åßï äåí âñÝèçêå! Do you really want to change the project name/path? ÈÝëåôå ðñÜãìáôé íá áëëÜîåôå üíïìá/äéáäñïìÞ ôçò åñãáóßáò; Load user-default options? Öüñôùìá ôùí ðñïñõèìéóìÝíùí åðéëïãþí ÷ñÞóôç; Save user-default options? ÁðïèÞêåõóç ôùí ðñïñõèìéóìÝíùí åðéëïãþí ÷ñÞóôç; Reset all default options? ÅðáíáôïðïèÝôçóç üëùí ôùí ðñïñõèìéóìÝíùí åðéëïãþí; Welcome to WinHTTrack! Êáëþò Þñèáôå óôï WinHTTrack! Action: ÅíÝñãåéá: Max Depth ÌÝãéóôï âÜèïò Maximum external depth: ÌÝãéóôï åîùôåñéêü âÜèïò Filters (refuse/accept links) : Ößëôñá (Üñíçóç/áðïäï÷Þ links) : Paths ÄéáäñïìÝò Save prefs ÁðïèÞêåõóç ðñïôéìÞóåùí Define.. Ïñéóìüò... Set options.. ÔïðïèÝôçóç ñõèìßóåùí... Preferences and mirror options: ÐñïôéìÞóåéò êáé åðéëïãÝò áíôéãñáöÞò Project name ¼íïìá åñãáóßáò Add a URL... Ðñüóèåóç åíüò URL... Web Addresses: (URL) Äéåõèýíóåéò Web: (URL) Stop WinHTTrack? ÓôáìÜôçìá ôïõ WinHTTrack; No log files in %s! Äåí õðÜñ÷åé áñ÷åßï ãåãïíüôùí óôï %s! Pause Download? Ðáýóç êáôåâÜóìáôïò; Stop the mirroring operation ÓôáìÜôçìá ôçò äéáäéêáóßáò áíôéãñáöÞò Minimize to System Tray Åëá÷éóôïðïßçóç óôçí ìðÜñá óõóôÞìáôïò Click to skip a link or stop parsing Êëéê ãéá ðáñÜêáìøç åíüò link Þ óôáìÜôçìá ðáñóßìáôïò Click to skip a link Êëéê ãéá ðáñÜêáìøç åíüò link Bytes saved ÓùóìÝíá bytes Links scanned ÓáñùìÝíá links Time: ×ñüíïò: Connections: ÓõíäÝóåéò: Running: ÌåôáöïñÝò Hide Áðüêñõøç Transfer rate Ôá÷ýôçôá SKIP ÐÁÑÁËÅÉØÇ Information Ðëçñïöïñßåò Files written: Óþèçêáí: Files updated: Åíçìåñþóåéò: Errors: ËÜèç: In progress: ÅíÝñãåéåò: Follow external links Áêïëïýèçóç åîùôåñéêþí links Test all links in pages ¸ëåã÷ïò üëùí ôùí links óôéò óåëßäåò Try to ferret out all links ÐñïóðÜèåéá áíáêÜëõøçò üëùí ôùí links Download HTML files first (faster) ÊáôÝâáóìá ôùí áñ÷åßùí HTML ðñþôá (ãñçãïñüôåñï) Choose local site structure ÅðéëÝîôå ôïðéêÞ äïìÞ ôïõ äéêôõáêïý ôüðïõ Set user-defined structure on disk ÅöáñìïãÞ äïìÞò óôïí äßóêï ðïõ ïñßóôçêå áðü ôï ÷ñÞóôç Use a cache for updates and retries ×ñÞóç ôçò cache ãéá åíçìåñþóåéò êáé åðáíáëÞøåéò Do not update zero size or user-erased files Íá ìçí åíçìåñùèïýí ôá áñ÷åßá ìçäåíéêïý ìåãÝèïõò Þ ôá óâçóìÝíá áðü ôïí ÷ñÞóôç Create a Start Page Äçìéïõñãßá áñ÷éêÞò óåëßäáò Create a word database of all html pages Äçìéïõñãßá ëßóôáò ëÝîåùí áðü üëåò ôéò óåëßäåò html Create error logging and report files Äçìéïõñãßá áñ÷åßïõ êáôáãñáöÞò ëáèþí êáé áíáöïñÜò Generate DOS 8-3 filenames ONLY Äçìéïõñãßá ÌÏÍÏ ïíïìÜôùí áñ÷åßùí DOS 8-3 Generate ISO9660 filenames ONLY for CDROM medias Äçìéïõñãßá ÌÏÍÏ ïíïìÜôùí áñ÷åßùí ISO9660, ãéá äßóêïõò CD Do not create HTML error pages Íá ìç äçìéïõñãçèïýí HTML óåëßäåò ëáèþí Select file types to be saved to disk ÅðéëÝîôå ôýðïõò áñ÷åßùí ðïõ èá óùèïýí óôï äßóêï Select parsing direction ÅðéëÝîôå êáôåýèõíóç ðáñóßìáôïò Select global parsing direction ÅðéëÝîôå ãåíéêÞ êáôåýèõíóç ðáñóßìáôïò Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Ñõèìßóôå ôïõò êáíüíåò îáíáãñáøßìáôïò ôùí URL ãéá ôá åóùôåñéêÜ links (ôá êáôåâáóìÝíá) êáé ôá åîùôåñéêÜ links (ôá ìç êáôåâáóìÝíá) Max simultaneous connections ÌÝãéóôåò ôáõôü÷ñïíåò óõíäÝóåéò File timeout ×ñïíéêü ðåñéèþñéï áñ÷åßïõ Cancel all links from host if timeout occurs Áêýñùóç üëùí ôùí links áðü ôçí ôïðïèåóßá áí îåðåñáóôåß ôï ÷ñïíéêü ðåñéèþñéï Minimum admissible transfer rate ÅëÜ÷éóôïò áðïäåêôüò ñõèìüò ìåôáöïñÜò Cancel all links from host if too slow Áêýñùóç üëùí ôùí links áðü ôçí ôïðïèåóßá áí åßíáé ðïëý áñãÞ Maximum number of retries on non-fatal errors ÌÝãéóôïò áñéèìüò åðáíáëÞøåùí óå ìç êáôáóôñïöéêÜ ëÜèç Maximum size for any single HTML file ÌÝãéóôï ìÝãåèïò ãéá êÜèå Ýíá áñ÷åßï HTML Maximum size for any single non-HTML file ÌÝãéóôï ìÝãåèïò ãéá êÜèå Ýíá áñ÷åßï ðïõ äåí åßíáé HTML Maximum amount of bytes to retrieve from the Web ÌÝãéóôïò üãêïò áðü bytes ðïõ èá óùèïýí áðü ôï Web Make a pause after downloading this amount of bytes Ðáýóç ìåôÜ ôï êáôÝâáóìá áõôïý ôïõ ðïóïý áðü bytes Maximum duration time for the mirroring operation ÌÝãéóôç äéÜñêåéá ãéá ôçí äéáäéêáóßá áíôéãñáöÞò Maximum transfer rate ÌÝãéóôïò ñõèìüò ìåôáöïñÜò Maximum connections/seconds (avoid server overload) ÌÝãéóôåò óõíäÝóåéò/äåõôåñüëåðôï (áðïöýãåôå õðåñöüñôùóç ôïõ åîõðçñåôçôÞ) Maximum number of links that can be tested (not saved!) ÌÝãéóôïò áñéèìüò áðü links ðïõ ìðïñïýí íá äïêéìáóôïýí (äåí óþæåôáé!) Browser identity Ôáõôüôçôá ðïõ èá äçëþíåé ï åîåñåõíçôÞò Comment to be placed in each HTML file Ó÷üëéá ðïõ èá ôïðïèåôçèïýí óå êÜèå áñ÷åßï HTML Back to starting page Ðßóù óôçí áñ÷éêÞ óåëßäá Save current preferences as default values ÁðïèÞêåõóç ôùí ôùñéíþí ðñïôéìÞóåùí ùò ðñïôïðïèåôçìÝíùí ôéìþí Click to continue Êëéê ãéá óõíÝ÷åéá Click to cancel changes Êëéê ãéá áêýñùóç áëëáãþí Follow local robots rules on sites Áêïëïýèçóç ôïðéêþí êáíüíùí ñïìðüô óôéò ôïðïèåóßåò Links to non-localised external pages will produce error pages Ôá links óå ìç ôïðéêÝò åîùôåñéêÝò óåëßäåò èá äçìéïõñãÞóïõí óåëßäåò óöáëìÜôùí Do not erase obsolete files after update Ôá ðáëéÜ áñ÷åßá íá ìçí óâÞíïíôáé ìåôÜ áðü åíçìÝñùóç Accept cookies? Áðïäï÷Þ ôùí cookies Check document type when unknown? ¸ëåã÷ïò ôýðïõ åããñÜöïõ üôáí åßíáé Üãíùóôï Parse java applets to retrieve included files that must be downloaded? ÐÜñóéìï åöáñìïãþí java ãéá íá áíáêôçèïýí ôá óõìðåñéëáìâáíüìåíá áñ÷åßá ðïõ ðñÝðåé íá êáôÝâïõí Store all files in cache instead of HTML only ÁðïèÞêåõóç üëùí ôùí áñ÷åßùí óôçí cache áíôß ãéá HTML ìüíï Log file type (if generated) Ôýðïò áñ÷åßïõ ãåãïíüôùí (áí èá äçìéïõñãçèåß) Maximum mirroring depth from root address ÌÝãéóôï âÜèïò áíôéãñáöÞò áðü ôçí ñéæéêÞ äéåýèõíóç Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) ÌÝãéóôï âÜèïò áíôéãñáöÞò ãéá åîùôåñéêÝò/áðáãïñåõìÝíåò äéåõèýíóåéò (0, äçëáäÞ ôßðïôá, åßíáé ç ðñïåðéëïãÞ) Create a debugging file Äçìéïõñãßá áñ÷åßïõ áðïóöáëìÜôùóçò Use non-standard requests to get round some server bugs ×ñÞóç ìç óõíçèéóìÝíùí áéôÞóåùí ãéá áðïöõãÞ ìåñéêþí ðñïâëçìÜôùí åîõðçñåôçôþí Use old HTTP/1.0 requests (limits engine power!) ×ñÞóç ðáëéþí HTTP/1.0 áéôÞóåùí (ðåñéïñßæåé ôçí éó÷ý ôçò ìç÷áíÞò!) Attempt to limit retransfers through several tricks (file size test..) ÐñïóðÜèåéá íá ðåñéïñéóôïýí ïé áíáíåþóåéò ìÝóù äéáöüñùí ôñéê (Ýëåã÷ïò ìåãÝèïõò áñ÷åßïõ...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) ÐñïóðÜèåéá ðåñéïñéóìïý ôïõ áñéèìïý ôùí links èåùñþíôáò ßäéá áõôÜ ðïõ ìïéÜæïõí áñêåôÜ (www.foo.com==foo.com, http=https ..) Write external links without login/password ÃñÜøéìï åîùôåñéêþí links ÷ùñßò ôï üíïìá ÷ñÞóôç/óõíèçìáôéêü Write internal links without query string ÃñÜøéìï åóùôåñéêþí links ÷ùñßò öñÜóç áíáæÞôçóçò Get non-HTML files related to a link, eg external .ZIP or pictures ÊáôÝâáóìá ìç-HTML áñ÷åßùí ó÷åôéêÜ ìå Ýíá link, ð÷: åîùôåñéêÜ .ZIP Þ öùôïãñáößåò Test all links (even forbidden ones) ¸ëåã÷ïò üëùí ôùí links (áêüìá êáé ôùí áðáãïñåõìÝíùí) Try to catch all URLs (even in unknown tags/code) ÐñïóðÜèåéá íá ðáñèïýí üëá ôá URLs (áêüìá êáé óå Üãíùóôá tags/êþäéêá) Get HTML files first! ÊáôÝâáóìá áñ÷éêÜ ôùí áñ÷åßùí HTML! Structure type (how links are saved) Ôýðïò äïìÞò (ðùò óþæïíôáé ôá links) Use a cache for updates ×ñÞóç ôçò cache ãéá åíçìåñþóåéò Do not re-download locally erased files Ôá ôïðéêÜ óâçóìÝíá áñ÷åßá íá ìçí îáíáêáôÝâïõí Make an index Äçìéïõñãßá åõñåôçñßïõ Make a word database Äçìéïõñãßá âÜóçò-äåäïìÝíùí ëÝîåùí Log files Áñ÷åßï ãåãïíüôùí DOS names (8+3) Ïíüìáôá DOS (8+3) ISO9660 names (CDROM) Ïíüìáôá ISO9660 (CDROM) No error pages ×ùñßò óåëßäåò óöáëìÜôùí Primary Scan Rule Âáóéêüò êáíüíáò øáîßìáôïò Travel mode Óôõë ôáîéäéïý Global travel mode Ãåíéêü óôõë ôáîéäéïý These options should be modified only exceptionally ÁõôÝò ïé åðéëïãÝò ðñÝðåé íá ôñïðïðïéïýíôáé óðÜíéá Activate Debugging Mode (winhttrack.log) Åíåñãïðïßçóç êáôÜóôáóçò áðïóöáëìÜôùóçò (winhttrack.log) Rewrite links: internal / external ÎáíáãñÜøéìï ôùí links: åóùôåñéêÜ/åîùôåñéêÜ Flow control ¸ëåã÷ïò ñïÞò Limits ¼ñéá Identity Ôáõôüôçôá HTML footer Óçìåßùóç HTML N# connections Áñéèìüò óõíäÝóåùí Abandon host if error ÅãêáôÜëåéøç ôïðïèåóßáò óå óöÜëìá Minimum transfer rate (B/s) ÅëÜ÷éóôïò ñõèìüò ìåôáöïñÜò Abandon host if too slow ÅãêáôÜëåéøç ôïðïèåóßáò áí åßíáé ðïëý áñãÞ Configure Ñýèìéóç Use proxy for ftp transfers ×ñÞóç proxy ãéá ftp ìåôáöïñÝò TimeOut(s) ×ñïíéêü ðåñéèþñéï Persistent connections (Keep-Alive) Óõíå÷åßò óõíäÝóåéò (äéáôÞñçóç) Reduce connection time and type lookup time using persistent connections Ìåßùóç ÷ñüíïõ óýíäåóçò êáé ôýðïõ áíáæÞôçóçò ôïðïèåóéþí, êÜíïíôáò ÷ñÞóç óõíå÷þí óõíäÝóåùí Retries ÐñïóðÜèåéåò Size limit ¼ñéï ìåãÝèïõò Max size of any HTML file (B) ÌÝãéóôï ìÝãåèïò ãéá êÜèå HTML Max size of any non-HTML file ÌÝãéóôï ìÝãåèïò ãéá êÜèå ìç HTML áñ÷åßï Max site size ÌÝãéóôï ìÝãåèïò äéêôõáêïý ôüðïõ Max time ÌÝãéóôïò ÷ñüíïò Save prefs ÁðïèÞêåõóç ðñïôéìÞóåùí Max transfer rate ÌÝãéóôïò ñõèìüò ìåôáöïñÜò Follow robots.txt Áêïëïýèçóå ôï robots.txt No external pages ×ùñßò åîùôåñéêÝò óåëßäåò Do not purge old files Ôá ðáëéÜ áñ÷åßá íá ìçí óâÞíïíôáé Accept cookies Áðïäï÷Þ ôùí cookies Check document type ¸ëåã÷ïò ôýðïõ åããñÜöïõ Parse java files ÐÜñóéìï áñ÷åßùí java Store ALL files in cache ÁðïèÞêåõóç ¼ËÙÍ ôùí áñ÷åßùí óôçí cache Tolerant requests (for servers) Áíåêôéêüôçôá óôéò áéôÞóåéò (ãéá åîõðçñåôçôÞ) Update hack (limit re-transfers) Ôñéê áíáíÝùóçò (ðåñéïñéóìüò áíáíåþóåùí) URL hacks (join similar URLs) Ôñéê ãéá ôá URLs (èåùñïýíôáé ßäéá ôá ðáñüìïéá) Force old HTTP/1.0 requests (no 1.1) Åîáíáãêáóìüò ðáëéþí HTTP/1.0 áéôÞóåùí (ü÷é 1.1) Max connections / seconds ÌÝãéóôåò óõíäÝóåéò / äåõôåñüëåðôï Maximum number of links ÌÝãéóôïò áñéèìüò áðü links Pause after downloading.. Ðáýóç ìåôÜ ôï êáôÝâáóìá... Hide passwords Áðüêñõøç ëÝîåùí-êëåéäéþí Hide query strings Áðüêñõøç ÷áñáêôÞñùí áíáæÞôçóçò Links Links Build Äçìéïõñãßá Experts Only Ìüíï ãéá Ýìðåéñïõò Flow Control ¸ëåã÷ïò ìåôáöïñþí Limits ¼ñéá Browser ID Ôáõôüôçôá åîåñåõíçôÞ Scan Rules Êáíüíåò øáîßìáôïò Spider Áíé÷íåõôÞò Log, Index, Cache Áñ÷åßï êáôáãñáöÞò, Ðåñéå÷üìåíá, Cache Proxy Proxy MIME Types Ôýðïé MIME Do you really want to quit WinHTTrack Website Copier? ÈÝëåôå ðñÜãìáôé íá åãêáôáëåßøåôå ôï WinHTTrack Website Copier; Do not connect to a provider (already connected) Íá ìçí ãßíåé óýíäåóç (õðÜñ÷åé Þäç) Do not use remote access connection Íá ìç ãßíåé ÷ñÞóç áðïìáêñõóìÝíçò óýíäåóçò Schedule the mirroring operation Ðñïãñáììáôéóìüò (÷ñïíéêÜ) ôçò äéáäéêáóßáò áíôéãñáöÞò Quit WinHTTrack Website Copier ÅãêáôÜëåéøç ôïõ WinHTTrack Website Copier Back to starting page Ðßóù óôçí áñ÷éêÞ óåëßäá Click to start! Êëéê ãéá Ýíáñîç! No saved password for this connection! Äåí õðÜñ÷åé áðïèçêåõìÝíï óõíèçìáôéêü ãéá áõôÞ ôç óýíäåóç! Can not get remote connection settings Áäýíáôç ç ëÞøç ôùí ñõèìßóåùí ôçò áðïìáêñõóìÝíçò óýíäåóçò Select a connection provider ÅðéëÝîôå óýíäåóç Start ¸íáñîç Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Ðáñáêáëþ ñõèìßóôå ôéò ðáñáìÝôñïõò ôçò óýíäåóçò áí åßíáé áðáñáßôçôï êáé ìåôÜ ðáôÞóôå ÔÅËÏÓ ãéá íá îåêéíÞóåé ç äéáäéêáóßá áíôéãñáöÞò. Save settings only, do not launch download now. ÁðïèÞêåõóç ôùí ñõèìßóåùí, ÷ùñßò Ýíáñîç ìåôáöïñÜò. On hold ÁíáìïíÞ Transfer scheduled for: (hh/mm/ss) Ç ìåôáöïñÜ ðñïãñáììáôßóôçêå ãéá: (hh/mm/ss) Start ¸íáñîç Connect to provider (RAS) Óýíäåóç ìå ôï Internet Connect to this provider ÅðéëïãÞ óýíäåóçò Disconnect when finished Áðïóýíäåóç óôï ôÝëïò Disconnect modem on completion Áðïóýíäåóç ôïõ modem óôï ôÝëïò \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Ðáñáêáëþ íá ìáò åíçìåñþóåôå ãéá êÜèå ðñüâëçìá Þ bug)\r\n\r\nÁíÜðôõîç:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Greek translations to:\r\nMichael Papadakis (mikepap at freemail dot gr) About WinHTTrack Website Copier Ó÷åôéêÜ ìå ôï WinHTTrack Website Copier Please visit our Web page Ðáñáêáëþ åðéóêåõèåßôå ôçí óåëßäá ìáò Wizard query ÁíáæÞôçóç ìå âïçèü Your answer: Ç áðÜíôçóÞ óáò: Link detected.. Áíáêáëýöèçêå link. Choose a rule ÅðéëÝîôå êáíüíá Ignore this link Áãíüçóç áõôïý ôïõ link Ignore directory Áãíüçóç öáêÝëïõ Ignore domain Áãíüçóç ôïõ domain Catch this page only ÐÜñóéìï ìüíï áõôÞò ôçò óåëßäáò Mirror site ÁíôéãñáöÞ ôïðïèåóßáò Mirror domain ÁíôéãñáöÞ ôïõ domain Ignore all Áãíüçóç üëùí Wizard query ÁíáæÞôçóç ìå âïçèü NO Ï×É File Áñ÷åßï Options ÅðéëïãÝò Log Áñ÷åßï ãåãïíüôùí Window ÐáñÜèõñï Help ÂïÞèåéá Pause transfer Ðáýóç ìåôáöïñÜò Exit ¸îïäïò Modify options Ôñïðïðïßçóç åðéëïãþí View log ÐñïâïëÞ áñ÷åßïõ ãåãïíüôùí View error log ÐñïâïëÞ ëáèþí View file transfers ÐñïâïëÞ ìåôáöïñþí áñ÷åßùí Hide Áðüêñõøç About WinHTTrack Website Copier Ó÷åôéêÜ ìå ôï WinHTTrack Website Copier Check program updates... ¸ëåã÷ïò ãéá íÝá Ýêäïóç ôïõ ðñïãñÜììáôïò... &Toolbar &ÌðÜñá åñãáëåßùí &Status Bar ÌðÜñá &êáôÜóôáóçò S&plit &×þñéóìá File Áñ÷åßï Preferences ÐñïôéìÞóåéò Mirror Áíôßãñáöï Log Áñ÷åßï ãåãïíüôùí Window ÐáñÜèõñï Help ÂïÞèåéá Exit ¸îïäïò Load default options Öüñôùìá ðñïåðéëåãìÝíùí ñõèìßóåùí Save default options ÁðïèÞêåõóç ðñïåðéëåãìÝíùí ñõèìßóåùí Reset to default options ÅðáíáöïñÜ óôéò ðñïåðéëåãìÝíåò ñõèìßóåéò Load options... Öüñôùìá ñõèìßóåùí... Save options as... ÁðïèÞêåõóç ñõèìßóåùí ùò... Language preference... Ðñïôßìçóç ãëþóóáò... Contents... Ðåñéå÷üìåíá... About WinHTTrack... Ó÷åôéêÜ ìå ôï WinHTTrack... New project\tCtrl+N ÍÝá åñãáóßá\tCtrl+N &Open...\tCtrl+O ¢&íïéãìá...\tCtrl+O &Save\tCtrl+S &ÁðïèÞêåõóç\tCtrl+S Save &As... ÁðïèÞêåõóç &ùò... &Delete... &ÄéáãñáöÞ... &Browse sites... &ÐëïÞãçóç ôïðïèåóéþí... User-defined structure ÄïìÞ ïñéóìÝíç áðü ôïí ÷ñÞóôç %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\t¼íïìá áñ÷åßïõ ÷ùñßò ôïí ôýðï ôïõ (ð÷: image)\r\n%N\t¼íïìá áñ÷åßïõ ìå ôïí ôýðï ôïõ (ð÷: image.gif)\r\n%t\tÔýðïò áñ÷åßïõ ìüíï (ð÷: gif)\r\n%p\tÄéáäñïìÞ [÷ùñßò / óôï ôÝëïò] (ð÷: /someimages)\r\n%h\t¼íïìá ôïðïèåóßáò (ð÷: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 öñÜóç áíáæÞôçóçò (128 bits, 32 ascii bytes)\r\n%q\tMD5 ìéêñÞ öñÜóç áíáæÞôçóçò (16 bits, 4 ascii bytes)\r\n\r\n%s?\tÌéêñü üíïìá üðùò óôï DOS (ð÷: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif ÐáñÜäåéãìá:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Ñõèìßóåéò proxy Proxy address: Äéåýèõíóç proxy: Proxy port: Port ôïõ proxy: Authentication (only if needed) Áõèåíôéêïðïßçóç (ìüíï áí ÷ñåéÜæåôáé) Login ¼íïìá ÷ñÞóôç Password Êùäéêüò Enter proxy address here Ôïðïèåôåßóôå ôçí äéåýèõíóç ôïõ proxy åäþ Enter proxy port here Ôïðïèåôåßóôå ôçí port ôïõ proxy åäþ Enter proxy login Ôïðïèåôåßóôå ôï üíïìá ÷ñÞóôç ôïõ proxy Enter proxy password Ôïðïèåôåßóôå ôï óõíèçìáôéêü ôïõ proxy Enter project name here Ôïðïèåôåßóôå ôï üíïìá ôçò åñãáóßáò åäþ Enter saving path here Ôïðïèåôåßóôå ôç äéáäñïìÞ áðïèÞêåõóçò åäþ Select existing project to update ÅðéëïãÞ åñãáóßáò ãéá áíáíÝùóç Click here to select path Êëéê åäþ ãéá åðéëïãÞ äéáäñïìÞò Select or create a new category name, to sort your mirrors in categories ÅðéëÝîôå Þ äçìéïõñãÞóôå Ýíá íÝï üíïìá êáôçãïñßá, ãéá íá êáôáôÜîåôå ôá áíôßãñáöÜ óáò óå êáôçãïñßåò HTTrack Project Wizard... Âïçèüò äçìéïõñãßáò åñãáóßáò HTTrack... New project name: ÍÝï üíïìá åñãáóßáò: Existing project name: ÕðÜñ÷ùí üíïìá åñãáóßáò: Project name: ¼íïìá åñãáóßáò: Base path: Áñ÷éêÞ äéáäñïìÞ: Project category: Êáôçãïñßá åñãáóßáò: C:\\My Web Sites C:\\Ïé Ôïðïèåóßåò ìïõ Type a new project name, \r\nor select existing project to update/resume Ôïðïèåôåßóôå Ýíá íÝï üíïìá åñãáóßáò, \r\nÞ åðéëÝîôå ìßá õðÜñ÷ïõóá åñãáóßá ãéá áíáíÝùóç/óõíÝ÷éóç New project ÍÝá åñãáóßá Insert URL ÔïðïèÝôçóç URL URL: URL: Authentication (only if needed) Áõèåíôéêïðïßçóç (ìüíï áí ÷ñåéÜæåôáé) Login ¼íïìá ÷ñÞóôç Password ÊùäéêÞ ëÝîç Forms or complex links: Öüñìåò Þ óýíèåôá links: Capture URL... Óýëëçøç URL... Enter URL address(es) here Ôïðïèåôåßóôå URL äéåýèõíóç(åéò) åäþ Enter site login Ôïðïèåôåßóôå üíïìá ÷ñÞóôç ãéá ôçí ôïðïèåóßá Enter site password Ôïðïèåôåßóôå óõíèçìáôéêü ãéá ôçí ôïðïèåóßá Use this capture tool for links that can only be accessed through forms or javascript code ×ñçóéìïðïéÞóôå áõôü ôï åñãáëåßï óýëëçøçò ãéá links ðïõ ìðïñïýí íá ðñïóðåëáóôïýí ìüíï ìÝóá áðü öüñìåò Þ êþäéêá javascript Choose language according to preference ÅðéëïãÞ ãëþóóáò óýìöùíá ìå ôçí ðñïôßìçóç Catch URL! Óýëëçøç URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Ðáñáêáëþ ôïðïèåôåßóôå ðñïóùñéíÜ ôéò ñõèìßóåéò proxy ôïõ browser óáò óôéò áêüëïõèåò ôéìÝò (ÁíôéãñÜøôå/ÅðéêïëëÞóôå äéåýèõíóç proxy êáé port).\nÌåôÜ êëéê óôï êïõìðß áðïóôïëÞò ôçò öüñìáò, óôçí óåëßäá ôïõ browser óáò Þ êëéê óôï óõãêåêñéìÝíï link ðïõ èÝëåôå íá óõëëçöèåß. This will send the desired link from your browser to WinHTTrack. Áõôü èá óôåßëåé ôï åðéèõìçôü link áðü ôïí browser óáò óôï WinHTTrack. ABORT ÌÁÔÁÉÙÓÇ Copy/Paste the temporary proxy parameters here ÁíôéãñáöÞ/Åðéêüëëçóç ôùí ðñïóùñéíþí ðáñáìÝôñùí ôïõ proxy åäþ Cancel Áêýñùóç Unable to find Help files! Áäýíáôç ç åýñåóç áñ÷åßùí âïçèåßáò! Unable to save parameters! Áäýíáôç ç áðïèÞêåõóç ôùí ðáñáìÝôñùí! Please drag only one folder at a time Óáò ðáñáêáëþ íá ôñáâÜôå ìüíï Ýíá öÜêåëï ôç öïñÜ Please drag only folders, not files Óáò ðáñáêáëþ íá ôñáâÜôå ìüíï öáêÝëïõò, ü÷é áñ÷åßá Please drag folders only Óáò ðáñáêáëþ íá ôñáâÜôå ìüíï öáêÝëïõò Select user-defined structure? ÅðéëïãÞ äïìÞò ïñéóìÝíçò áðü ôïí ÷ñÞóôç Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Ðáñáêáëþ åðéâåâáéþóôå ðùò ç ïñéóìÝíç öñÜóç áðü ôïí ÷ñÞóôç åßíáé óùóôÞ,\náëëéþò ôá ïíüìáôá áñ÷åßùí èá åßíáé ëáíèáóìÝíá! Do you really want to use a user-defined structure? ÈÝëåôå ðñÜãìáôé íá ÷ñçóéìïðïéÞóåôå ìßá äïìÞ ïñéóìÝíç áðü ôïí ÷ñÞóôç; Too manu URLs, cannot handle so many links!! ÐÜñá ðïëëÜ URLs, äåí åßíáé äõíáôÞ ç äéá÷åßñéóç ôüóùí ðïëëþí links! Not enough memory, fatal internal error.. Äåí õðÜñ÷åé áñêåôÞ ìíÞìç, åóùôåñéêü êáôáóôñïöéêü óöÜëìá... Unknown operation! ¢ãíùóôç ëåéôïõñãßá! Add this URL?\r\n Ðñüóèåóç áõôïý ôïõ URL;\r\n Warning: main process is still not responding, cannot add URL(s).. Ðñïåéäïðïßçóç: Ôï êõñßùò process áêüìá äåí áíôáðïêñßíåôáé, äåí ãßíåôáé íá ðñïóôåèïýí URL(s)... Type/MIME associations Ôýðïò/MIME äéáóõíäÝóåéò File types: Ôýðïé áñ÷åßùí: MIME identity: Ôáõôüôçôá MIME: Select or modify your file type(s) here ÅðéëïãÞ Þ ôñïðïðïßçóç ôïõ(ùí) áñ÷åßïõ(ùí) åäþ Select or modify your MIME type(s) here ÅðéëïãÞ Þ ôñïðïðïßçóç ôïõ(ùí) MIME ôýðïõ(ùí) åäþ Go up ÐÞãáéíå ðÜíù Go down ÐÞãáéíå êÜôù File download information Ðëçñïöïñßåò êáôåâÜóìáôïò áñ÷åßïõ Freeze Window ÐÜãùìá ðáñáèýñïõ More information: Ðåñéóóüôåñåò ðëçñïöïñßåò Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Êáëþò Þñèáôå óôï WinHTTrack Website Copier!\n\nÐáñáêáëþ êÜíôå êëéê óôï êïõìðß Åðüìåíï ãéá íá\n\n- îåêéíÞóåôå ìßá íÝá åñãáóßá\n- Þ íá óõíå÷ßóåôå ìßá ðñïçãïýìåíç åñãáóßá File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Áñ÷åßá ìå êáôÜëçîç:\nÁñ÷åßá ðïõ ðåñéëáìâÜíïõí:\n¼íïìá áñ÷åßïõ:\nÖÜêåëïé ðïõ ðåñéëáìâÜíïõí:\n¼íïìá öáêÝëïõ:\nLinks óå áõôü ôï domain:\nLinks óå domains ðïõ ðåñéëáìâÜíïõí:\nLinks áðü áõôÞí ôçí ôïðïèåóßá:\nLinks ðïõ ðåñéëáìâÜíïõí:\nÁõôü ôï link:\nÏËÁ ÔÁ LINKS Show all\nHide debug\nHide infos\nHide debug and infos ÐñïâïëÞ üëùí\nÁðüêñõøç áðïóöáëìÜôùóçò\nÁðüêñõøç ðëçñïöïñéþí\nÁðüêñõøç áðïóöáëì. êáé ðëçñïö. Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. ÄïìÞ ôïðïèåóßáò (ðñïåðéëïãÞ)\nHtml óôï web/, åéêüíåò/Üëëá óôï web/images/\nHtml óôï web/html, åéêüíåò/Üëëá óôï web/images/\nHtml óôï web/, åéêüíåò/Üëëá óôï web/\nHtml óôï web/, åéêüíåò/Üëëá óôï web/xxx/, üðïõ xxx ç êáôÜëçîç áñ÷åßïõ\nHtml óôï web/html/, åéêüíåò/Üëëá óôï web/xxx/\nÄïìÞ ôïðïèåóßáò, ÷ùñßò www.domain.xxx/\nHtml óôï üíïìá_ôüðïõ/, åéêüíåò/Üëëá óôï üíïìá_ôüðïõ/images/\nHtml óôï üíïìá_ôüðïõ/html/, åéêüíåò/Üëëá óôï üíïìá_ôüðïõ/images/\nHtml óôï üíïìá_ôüðïõ/, åéêüíåò/Üëëá óôï üíïìá_ôüðïõ/\nHtml óôï üíïìá_ôüðïõ/, åéêüíåò/Üëëá óôï üíïìá_ôüðïõ/xxx/\nHtml óôï üíïìá_ôüðïõ/html/, åéêüíåò/Üëëá óôï üíïìá_ôüðïõ/xxx/\n¼ëá ôá áñ÷åßá óôï web/, ìå ôõ÷áßá ïíüìáôá (gadget !)\n¼ëá ôá áñ÷åßá óôï üíïìá_ôüðïõ/, ìå ôõ÷áßá ïíüìáôá (gadget !)\nÄïìÞ êáèïñéóìÝíç áðü ôïí ÷ñÞóôç... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Ìüíï øÜîéìï\nÁðïèÞêåõóç áñ÷åßùí html\nÁðïèÞêåõóç áñ÷åßùí åêôüò áðü html\nÁðïèÞêåõóç üëùí (ðñïåðéëïãÞ)\nÁðïèÞêåõóç ðñþôá áñ÷åßùí html Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down ÐáñáìïíÞ óôïí ßäéï öÜêåëï\nÌðïñåß íá ðÜåé êÜôù (ðñïåðéëïãÞ)\nÌðïñåß íá ðÜåé ðÜíù\nÌðïñåß íá ðÜåé êáé ðÜíù êáé êÜôù Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web ÐáñáìïíÞ óôçí ßäéá äéåýèõíóç (ðñïåðéëïãÞ)\nÐáñáìïíÞ óôï ßäéï domain\nÐáñáìïíÞ óôï ßäéï domain 1ïõ åðéðÝäïõ\nÏðïõäÞðïôå óôï Web Never\nIf unknown (except /)\nIf unknown ÐïôÝ\nÓå Üãíùóôá (åêôüò /)\nÓå Üãíùóôá no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ÷ùñßò êáíüíåò robots.txt\nrobots.txt åêôüò âïçèïý\n÷ñÞóç êáíüíùí robots.txt normal\nextended\ndebug êáíïíéêü\nåêôåôáìÝíï\náðïóöáëìÜôùóçò Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download ÊáôÝâáóìá ôïðïèåóßáò(þí)\nÊáôÝâáóìá ôïðïèåóßáò(þí) + åñùôÞóåéò\nÊáôÝâáóìá îå÷ùñéóôþí áñ÷åßùí\nÊáôÝâáóìá üëùí ôùí ôüðùí óôéò óåëßäåò (ðïëëáðëÜ áíôßãñáöá)\n¸ëåã÷ïò links óôéò óåëßäåò (Ýëåã÷ïò áãáðçìÝíùí)\n* ÓõíÝ÷éóç ìéóïôåëåéùìÝíïõ êáôåâÜóìáôïò\n* ÁíáíÝùóç õðÜñ÷ïõóáò ôïðïèåóßáò Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Ó÷åôéêü URI / Áðüëõôï URL (ðñïåðéëïãÞ)\nÁðüëõôï URL / Áðüëõôï URL\nÁðüëõôï URI / Áðüëõôï URL\nÐñùôüôõðï URL / Ðñùôüôõðï URL Open Source offline browser ÅîåñåõíçôÞò áíïé÷ôïý êþäéêá ÷ùñßò áíÜãêç óýíäåóçò Website Copier/Offline Browser. Copy remote websites to your computer. Free. Website Copier/Offline Browser. ÁíôéãñÜøôå áðïìáêñõóìÝíåò ôïðïèåóßåò óôïí õðïëïãéóôÞ óáò. Åëåýèåñá-ÄùñåÜí. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) Ëßóôá URL (.txt) Previous Ðñïçãïýìåíï Next Åðüìåíï URLs URLs Warning Ðñïåéäïðïßçóç Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Ï åîåñåõíçôÞò óáò äåí (öáßíåôáé íá) õðïóôçñßæåé javascript. Ãéá êáëýôåñá áðïôåëÝóìáôá, ðáñáêáëþ ÷ñçóéìïðïéÞóôå Ýíáí javascript-åíåñãü åîåñåõíçôÞ. Thank you Óáò åõ÷áñéóôþ You can now close this window Ôþñá ìðïñåßôå íá êëåßóåôå áõôü ôï ðáñÜèõñï Server terminated Áêõñþèçêå áðü ôïí åîõðçñåôçôÞ A fatal error has occurred during this mirror ¸íá êáôáóôñïöéêü óöÜëìá ðñïêëÞèçêå êáôÜ ôçí áíôéãñáöÞ áõôïý ôïõ ôüðïõ Proxy type: Ôýðïò proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Ðñùôüêïëëï äéáìåóïëáâçôÞ. HTTP: ôõðéêüò äéáìåóïëáâçôÞò. HTTP (óÞñáããá CONNECT): óôÝëíåé êÜèå áßôçìá ìÝóù óÞñáããáò CONNECT, ãéá äéáìåóïëáâçôÝò ðïõ õðïóôçñßæïõí ìüíï CONNECT üðùò ôï HTTPTunnelPort ôïõ Tor. SOCKS5: ðñïåðéëåãìÝíç èýñá 1080. Load cookies from file: Öüñôùóç cookies áðü áñ÷åßï: Preload cookies from a Netscape cookies.txt file before crawling. Ðñïöüñôùóç ôùí cookies áðü Ýíá áñ÷åßï Netscape cookies.txt ðñéí ôçí áíß÷íåõóç. Pause between files: Ðáýóç ìåôáîý áñ÷åßùí: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Ôõ÷áßá êáèõóôÝñçóç ìåôáîý ôùí ëÞøåùí áñ÷åßùí, óå äåõôåñüëåðôá. ×ñçóéìïðïéÞóôå MIN:MAX ãéá ôõ÷áßï åýñïò (ð.÷. 2:8). Keep the www. prefix (do not merge www.host with host) ÄéáôÞñçóç ôïõ ðñïèÝìáôïò www. (÷ùñßò óõã÷þíåõóç ôïõ www.host ìå ôï host) Do not treat www.host and host as the same site. Íá ìçí èåùñïýíôáé ôá www.host êáé host ùò ï ßäéïò éóôüôïðïò. Keep double slashes in URLs ÄéáôÞñçóç ôùí äéðëþí êáèÝôùí óôá URL Do not collapse duplicate slashes in URLs. Íá ìçí óõìðôýóóïíôáé ïé äéðëÝò êÜèåôïé óôá URL. Keep the original query-string order ÄéáôÞñçóç ôçò áñ÷éêÞò óåéñÜò ôïõ åñùôÞìáôïò áíáæÞôçóçò Do not reorder query-string parameters when deduplicating URLs. Íá ìçí áíáäéáôÜóóïíôáé ïé ðáñÜìåôñïé ôïõ åñùôÞìáôïò áíáæÞôçóçò êáôÜ ôçí áöáßñåóç äéðëüôõðùí URL. Strip query keys: Áöáßñåóç êëåéäéþí åñùôÞìáôïò: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). ÊëåéäéÜ åñùôÞìáôïò ÷ùñéóìÝíá ìå êüììá, ðïõ èá áöáéñåèïýí áðü ôçí ïíïìáóßá ôùí áðïèçêåõìÝíùí áñ÷åßùí (ð.÷. sid,utm_source). Write a WARC archive of the crawl ÅããñáöÞ áñ÷åßïõ WARC ôçò áíß÷íåõóçò Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. ÁðïèÞêåõóç êÜèå ëçöèåßóáò áðüêñéóçò êáé óå áñ÷åßï WARC/1.1 ISO-28500, äßðëá óôï åßäùëï. WARC archive name: ¼íïìá áñ÷åßïõ WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Ðñïáéñåôéêü âáóéêü üíïìá ãéá ôï áñ÷åßï WARC. ÁöÞóôå ôï êåíü ãéá áõôüìáôç ïíïìáóßá óôïí êáôÜëïãï åîüäïõ. httrack-3.49.14/lang/Francais.txt0000644000175000017500000012344315230602340012227 LANGUAGE_NAME Français LANGUAGE_FILE Francais LANGUAGE_ISO fr LANGUAGE_AUTHOR Xavier Roche (roche at httrack.com)\r\nRobert Lagadec (rlagadec at yahoo.fr) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID French (Standard) OK Oui Cancel Annuler Exit Quitter Close Fermer Cancel changes Annuler les changements Click to confirm Cliquez pour confirmer Click to get help! Cliquez pour avoir de l'aide! Click to return to previous screen Pour revenir à la fenêtre précédente Click to go to next screen Pour passer à la fenêtre suivante Hide password Masquer le mot de passe Save project Enregistrer le projet Close current project? Fermer le projet courant? Delete this project? Supprimer ce projet? Delete empty project %s? Supprimer le projet vide %s? Action not yet implemented Cette fonction n'est pas encore disponible Error deleting this project Erreur lors de l'effacement de ce projet Select a rule for the filter Choisissez un critère pour le filtrage Enter keywords for the filter Entrez ici un mot-clé pour le filtrage Cancel Annuler Add this rule Ajouter cette règle de filtrage Please enter one or several keyword(s) for the rule Entrez un ou plusieurs mot(s)-clé(s) pour la règle de filtrage Add Scan Rule Ajouter une règle de filtrage Criterion Critère: String Mot-clé: Add Ajouter Scan Rules Règles de filtrage Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Utilisez les jokers pour définir des critères d'exclusion ou d'inclusion portant sur plusieurs URLs ou liens.\nVous pouvez regrouper les mots-clés sur une même ligne en les séparant par des espaces.\nExemple: +*.zip -www.*.com,-www.*.edu/cgi-bin/*.cgi Exclude links Liens à exclure.. Include link(s) Liens à inclure.. Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Pour inclure tous les fichiers GIF d'un seul site, utilisez par exemple +www.monweb.com/*.gif.\nPour inclure tous les GIFs de tous les sites visités, utilisez +*.gif.\nPour les exclure tous, utilisez -*.gif. Save prefs Enregistrer les options Matching links will be excluded: Les liens répondant à cette règle seront exclus Matching links will be included: Les liens répondant à cette règle seront inclus Example: Exemple: gif\r\nWill match all GIF files gif\r\ndétectera tous les fichiers GIF blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\ndétectera tous les fichiers contenant le mot blue, comme 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\ndétectera le fichier 'bigfile.mov', mais pas 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\ndétectera des liens contenant 'cgi', comme /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\ndétectera par exemple des liens contenant 'cgi-bin', mais pas 'cgi-bin-2' someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\ndétectera des liens comme www.someweb.com, private.someweb.com, etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\ndétectera des liens comme www.someweb.com, www.someweb.edu, private.someweb.otherweb.com, etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\ndétectera des liens comme www.someweb.com/... (mais pas ceux comme private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\ndétectera des liens comme www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\ndétectera uniquement www.test.com/test/someweb.html.\nNotez que vous avez à taper l'adresse complète (URL + Chemin du fichier) All links will match Tous les liens seront détectés Add exclusion filter Ajouter une règle d'exclusion Add inclusion filter Ajouter une règle d'inclusion Existing filters Règles de filtrage actuelles Cancel changes Annuler les changements Save current preferences as default values Enregistrer les réglages courants en tant que réglages par défaut Click to confirm Cliquez pour confirmer No log files in %s! Aucun fichier journal dans %s! No 'index.html' file in %s! Aucun fichier 'index.html' dans %s! Click to quit WinHTTrack Website Copier Cliquez pour quitter WinHTTrack Website Copier View log files Voir le fichier journal Browse HTML start page Ouvrir l'Index WinHTTrack des sites copiés End of mirror Fin de la copie du site View log files Voir le fichier journal Browse Mirrored Website Explorer la copie du site New project... Nouveau projet... View error and warning reports Voir messages d'erreur et d'avertissement View report Voir le rapport de copie Close the log file window Refermer le journal Info type: Entrées du journal: Errors Erreurs Infos Infos Find Rechercher Find a word Rechercher un mot Info log file Rapports de copie Warning/Errors log file Journal d'erreurs Unable to initialize the OLE system Impossible d'initialiser le système OLE WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack WebSite Copier n'a pu trouver aucune trace de copie complète ou partielle de site dans le dossier indiqué Could not connect to provider Impossible d'établir la connexion receive réception request requête connect connexion search recherche ready prêt error erreur Receiving files.. Réception des fichiers Parsing HTML file.. Analyse des liens de la page... Purging files.. Effacement des fichiers qui ne sont plus répertoriés... Loading cache in progress.. Chargement du cache enc cours.. Parsing HTML file (testing links).. Test des liens de la page Pause - Toggle [Mirror]/[Pause download] to resume operation Interruption - Désélectionnez la commande 'Suspendre les téléchargements' pour reprendre (menu 'Copie de site') Finishing pending transfers - Select [Cancel] to stop now! Fin des transferts en cours - Cliquez sur [Annuler] pour terminer immédiatement ! scanning parcours Waiting for scheduled time.. Attente de l'heure programmée pour démarrer Transferring data.. Transfert des données.. Connecting to provider Connexion au fournisseur d'accès [%d seconds] to go before start of operation Copie du site en attente (%d secondes) Site mirroring in progress [%s, %s bytes] Copie du site en cours (%s, %s octets) Site mirroring finished! Copie du site terminée! A problem occurred during the mirroring operation\n Incident durant la copie du site\n \nDuring:\n Durant:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Voyez le fichier journal au besoin\n\nCliquez sur TERMINER pour quitter WinHTTrack\n\nMerci d'utiliser WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! la copie du site est terminée\nCliquez sur OK pour quitter WinHTTrack\nConsultez au besoin les fichiers journaux pour vérifier que tout s'est bien passé\n\nMerci d'utiliser WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * COPIE INTERROMPUE! * *\r\nLe cache temporaire actuel est nécessaire pour toute mise à jour et ne contient que les données téléchargées durant la présente session interrompue.\r\nIl est possible que le cache précédent contienne des données plus complètes; si vous ne voulez pas perdre ces données, vous devez le restaurer et effacer le cache actuel.\r\n[Note: Cette opération peut être facilement effectuée ici en effacant les fichiers hts-cache/new.*]\r\n\r\nPensez-vous que le cache précédent pourrait contenir des informations plus complètes, et voulez-vous le restaurer? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ERREUR DE COPIE! * *\r\nHTTrack a détecté que la copie courante était vide. Si il s'agissait d'une mise à jour, l'ancienne copie a été restaurée.\r\nRaison: soit la (les) première(s) page(s) n'ont pu être téléchargées, soit un problème de connexion est survenu.\r\n=> Vérifiez que le site existe toujours, et/ou vérifiez les réglages du proxy! <= \n\nTip: Click [View log file] to see warning or error messages \nConseil: sélectionnez la commande 'Voir le fichier journal' pour visionner les messages d'erreur et d'avertissement Error deleting a hts-cache/new.* file, please do it manually Erreur lors de l'effacement d'un fichier hts-cache/new.*, veuillez l'effacer manuellement Do you really want to quit WinHTTrack Website Copier? Voulez-vous vraiment quitter WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Mode de copie de site automatique -\n\nUtilisez la boîte de dialogue pour entrer vos adresses URLs. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Mode de copie de site interactive (questions) -\n\nUtilisez la boîte de dialogue pour entrer vos adresses URLs. - File Download Mode -\n\nEnter file address(es) in URL box - Mode téléchargement de fichiers -\n\nUtilisez la boîte de dialogue pour entrer vos adresses de fichiers. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Mode test de liens -\n\nUtilisez la boîte de dialogue pour entrer les adresses des pages contenant les liens à tester. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Mode mise à jour d'une copie de site -\n\nVérifiez les adresses URLs dans la liste, vérifiez les options au besoin, puis cliquez sur 'SUIVANT'. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Mode reprise d'une copie de site interrompue -\n\nVérifiez les adresses URLs dans la liste, vérifiez les options au besoin, puis cliquez sur 'SUIVANT'. Log files Path Chemin des fichiers journaux Path Chemin - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Mode copie de sites depuis des liens -\n\nUtilisez la boîte de dialogue pour entrer les adresses des pages contenant les liens à aspirer. New project / Import? Nouveau projet / importer? Choose criterion Choisissez un type d'action Maximum link scanning depth Profondeur maximale pour l'analyse des liens Enter address(es) here Entrez les adresses ici Define additional filtering rules Définir des règles de filtrage supplémentaires Proxy Name (if needed) Nom du serveur proxy si nécessaire Proxy Port Port du serveur proxy Define proxy settings Préciser les paramètres du serveur proxy Use standard HTTP proxy as FTP proxy Utiliser le serveur proxy HTTP standard comme serveur proxy FTP Path Chemin Select Path Choisissez le chemin Path Chemin Select Path Choisissez le chemin Quit WinHTTrack Website Copier Quittter WinHTTrack Website Copier About WinHTTrack A propos de WinHTTrack Save current preferences as default values Enregistrer ces réglages comme réglages par défaut Click to continue Cliquez pour continuer Click to define options Cliquez pour définir les options Click to add a URL Cliquez pour ajouter une adresse URL Load URL(s) from text file Importer des adresses URL depuis un fichier texte WinHTTrack preferences (*.opt)|*.opt|| Options de réglage de WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Fichier texte avec liste d'adresses (*.txt)|*.txt|| File not found! Fichier introuvable! Do you really want to change the project name/path? Voulez-vous vraiment changer le nom/chemin du projet? Load user-default options? Charger la configuration personnalisée par défaut? Save user-default options? Enregistrer en tant que configuration personnalisée par défaut? Reset all default options? Effacer toutes les options par défaut? Welcome to WinHTTrack! Bienvenue dans WinHTTrack Website Copier! Action: Action: Max Depth Profondeur maximale: Maximum external depth: Profondeur exterieure: Filters (refuse/accept links) : Règles de filtrage (inclure/exclure des liens) : Paths Chemins Save prefs Enregistrer les options actuelles Define.. Définir... Set options.. Définir les options... Preferences and mirror options: Paramètres de la copie du site Project name Nom du projet Add a URL... Ajouter... Web Addresses: (URL) Adresse Web: (URL) Stop WinHTTrack? Stopper WinHTTrack? No log files in %s! Aucun fichier journal dans %s! Pause Download? Suspendre la copie du site? Stop the mirroring operation Arrêter la copie du site? Minimize to System Tray Minimiser en barre système Click to skip a link or stop parsing Cliquez pour sauter un lien ou interrompre sa copie Click to skip a link Cliquez pour sauter un lien Bytes saved Octets écrits: Links scanned Liens parcourus: Time: Temps: Connections: Connexions: Running: En cours: Hide Minimiser Transfer rate Taux transfert: SKIP PASSER Information Informations Files written: Fichiers écrits: Files updated: Fichiers mis à jour: Errors: Erreurs: In progress: En cours: Follow external links Récupérer les fichiers jusque sur les liens extérieurs Test all links in pages Tester tous les liens présents dans les pages Try to ferret out all links Essayer de repérer tous les liens Download HTML files first (faster) Télécharger d'abord les fichiers HTML (plus rapide) Choose local site structure Choisir la structure de site localisé Set user-defined structure on disk Définir les paramètres de la structure personnalisée Use a cache for updates and retries Utiliser un cache pour les mises à jour et reprises Do not update zero size or user-erased files Ne pas récupérer les fichiers déjà présents localement quand ils sont de taille nulle ou ont été effacés par l'utilisateur Create a Start Page Créer une page de démarrage Create a word database of all html pages Créer une base sémantique des pages html Create error logging and report files Créer des fichiers journaux pour les messages d'erreur et d'avertissement Generate DOS 8-3 filenames ONLY Ne créer QUE des noms de fichiers au format court 8-3 Generate ISO9660 filenames ONLY for CDROM medias Ne créer QUE des noms de fichiers au format ISO9660 poru les médias type CDROM Do not create HTML error pages Ne pas créer les fichiers journaux d'erreur HTML Select file types to be saved to disk Sélection des types de fichier à aspirer Select parsing direction Mode de parcours des liens sur le site Select global parsing direction Limites de la zone globale d'exploration Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Type de réécriture des URL pour les liens internes (ceux qui sont téléchargés) et les liens externes (ceux qui ne sont pas téléchargés) Max simultaneous connections Nombre maximal de connexions File timeout Attente maximale pour un fichier Cancel all links from host if timeout occurs Annuler tous les liens sur un domaine en cas d'attente excessive Minimum admissible transfer rate Taux de transfert minimal toléré Cancel all links from host if too slow Annuler tous les liens sur un domaine en cas de transfert trop lent Maximum number of retries on non-fatal errors Nombre maximum d'essais en cas d'erreur non fatale Maximum size for any single HTML file Taille maximale pour une page HTML Maximum size for any single non-HTML file Taille maximale pour un fichier non HTML Maximum amount of bytes to retrieve from the Web Taille totale maximale pour la copie locale du site Make a pause after downloading this amount of bytes Faire une pause après avoir téléchargé cette quantité de données Maximum duration time for the mirroring operation Temps total maximum pour une copie de site Maximum transfer rate Taux de transfert maximum Maximum connections/seconds (avoid server overload) Nombre max. de connexions/secondes (limite la surcharge des serveurs) Maximum number of links that can be tested (not saved!) Nombre maximum des liens qui peuvent être testés (pas sauvés!) Browser identity Identifiants du Navigateur Internet Comment to be placed in each HTML file Commentaire de page placé dans chaque fichier HTML Languages accepted by the browser Langues acceptée par le navigateur Additional HTTP headers to be sent in each requests En-têtes HTTP additionnels à envoyer dans chaque requête Back to starting page Retour à la page de démarrage Save current preferences as default values Enregistrer les réglages courants comme paramètres par défaut Click to continue Cliquez pour continuer Click to cancel changes Cliquez pour annuler Follow local robots rules on sites Suivi des règles locales des robots sur les sites Links to non-localised external pages will produce error pages Les liens vers des pages hors du domaine d'exploration engendreront des pages locales avec message d'erreur Do not erase obsolete files after update Ne pas effacer les fichiers obsolètes après une mise à jour Accept cookies? Accepter les cookies? Check document type when unknown? Vérifier le type du document quand il est inconnu? Parse java applets to retrieve included files that must be downloaded? Analyser les applets java pour récupérer les fichiers répondant aux critères de copie? Store all files in cache instead of HTML only Stockage de TOUS les fichiers en cache (et non pas uniquement les HTML) Log file type (if generated) Type du fichier journal (s'il est créé) Maximum mirroring depth from root address Profondeur maximale de la copie locale du site (mesurée à partir de l'adresse de départ) Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Profondeur maximale de la copie pour les adresse externes/interdites (0, soit aucune, par défaut) Create a debugging file Créer un fichier de débogage Use non-standard requests to get round some server bugs Essayer d'éviter les bugs de certains serveurs en utilisant des requêtes non standard Use old HTTP/1.0 requests (limits engine power!) L'utilisation des anciennes requêtes HTTP/1.0 limite les capacités du moteur de capture! Attempt to limit retransfers through several tricks (file size test..) Essayer de limiter les retransferts via certains trucs (test de taille de fichier..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Essayer de limiter le nombre de liens en ignorant les liens similaires (www.foo.com==foo.com, http=https ..) Write external links without login/password Ecrire les liens externes sans login/mot de passe Write internal links without query string Ecrire les liens internes sans 'query string' Get non-HTML files related to a link, eg external .ZIP or pictures Capturer les fichiers non HTML proches (ex: fichiers ZIP situés à l'extérieur) Test all links (even forbidden ones) Tester tous les liens (même ceux exclus par les règles) Try to catch all URLs (even in unknown tags/code) Essayer de détecter tous les liens (y compris tags inconnus/code javascript) Get HTML files first! Télécharger les HTML en premier! Structure type (how links are saved) Type de structure locale (manière dont les liens sont enregistrés) Use a cache for updates Utiliser un cache pour les mises à jour Do not re-download locally erased files Ne pas tenter de récupérer les fichiers effacés localement Make an index Constituer un Index Make a word database Faire une base sémantique Log files Fichiers journaux DOS names (8+3) Noms DOS (8+3) ISO9660 names (CDROM) Noms ISO9660 (CDROM) No error pages Pas de pages d'erreur Primary Scan Rule Règle de filtrage principale Travel mode Mode de parcours Global travel mode Mode de parcours global These options should be modified only exceptionally Options à ne modifier qu'exceptionnellement Activate Debugging Mode (winhttrack.log) Activer le mode de débogage (winhttrack.log) Rewrite links: internal / external Réécriture des liens: internes / externes Flow control Contrôle du flux Limits Limites Identity Identification HTML footer En-tête HTML Languages Langues Additional HTTP Headers En têtes HTTP additionnels N# connections Nombre de connexions Abandon host if error Abandon en cas d'erreur Minimum transfer rate (B/s) Taux de transfert minimum (octets/s) Abandon host if too slow Abandon en cas de transfert trop lent Configure Configurer Use proxy for ftp transfers Utiliser le serveur proxy pour les transferts FTP TimeOut(s) TimeOut(s) Persistent connections (Keep-Alive) Connexions persistantes (Keep-Alive) Reduce connection time and type lookup time using persistent connections Réduire les temps de connexion et de vérification de type en utilisant des connexions permanentes Retries Essais Size limit Limite en taille Max size of any HTML file (B) Taille maximale des fichiers HTML (B) Max size of any non-HTML file Taille maximale des autres fichiers Max site size Taille maximale du site Max time Temps de capture maximal Save prefs Enregistrer les options courantes Max transfer rate Taux maximal Follow robots.txt Suivre les règles présentes dans le fichier 'robots.txt' No external pages Pas de pages externes Do not purge old files Pas de purge des anciens fichiers Accept cookies Accepter les cookies Check document type Vérifier les types de document Parse java files Analyser les fichiers java Store ALL files in cache TOUT stocker en cache Tolerant requests (for servers) Requêtes tolérantes (pour serveurs) Update hack (limit re-transfers) Mise à jour forcée (limite les retransferts) URL hacks (join similar URLs) Fusion des liens (fusionner les liens similaires) Force old HTTP/1.0 requests (no 1.1) Anciennes requêtes HTTP/1.0 (PAS de requêtes HTTP/ 1.1) Max connections / seconds Nb. max connexions / secondes Maximum number of links Nombre max de liens Pause after downloading.. Suspendre après la copie de.. Hide passwords Masquer les mots de passe Hide query strings Cacher les 'query strings' Links Liens Build Structure Experts Only Pour Experts Flow Control Contrôle du flux Limits Limites Browser ID Navigateur Internet Scan Rules Règles de filtrage Spider Fouineur Log, Index, Cache Journal, Index, Cache Proxy Serveur proxy MIME Types Types MIME Do you really want to quit WinHTTrack Website Copier? Voulez-vous vraiment quitter WinHTTrack Website Copier? Do not connect to a provider (already connected) Pas de connexion à un fournisseur d'accès (déja connecté) Do not use remote access connection Ne pas utiliser l'accès à distance Schedule the mirroring operation Programmer une copie du site Quit WinHTTrack Website Copier Quitter WinHTTrack Website Copier Back to starting page Retour à la page de démarrage Click to start! Cliquez pour démarrer! No saved password for this connection! Pas de mot de passe enregistré pour cette connexion! Can not get remote connection settings Impossible d'obtenir les paramètres de connexion Select a connection provider Sélectionnez ici un fournisseur d'accès auquel vous connecter Start Démarrer... Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Précisez les OPTIONS de connexion si nécessaire,\npuis pressez TERMINER pour commencer la copie du site Save settings only, do not launch download now. Enregistrer uniquement les réglages, ne pas lancer le téléchargement maintenant. On hold Temporisation Transfer scheduled for: (hh/mm/ss) Attendre avant de commencer jusqu'à: (hh/mm/ss) Start DEMARRER! Connect to provider (RAS) Fournisseur d'accès Connect to this provider Se connecter à ce fournisseur d'accès Disconnect when finished Déconnecter à la fin de l'opération Disconnect modem on completion Déconnecter le modem lorsque l'opération sera finie \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(signalez-nous tout bug ou problème)\r\n\r\nDéveloppement:\r\nInterface (Windows): Xavier Roche\r\nMoteur: Xavier Roche\r\nParseurClassesJava: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMERCI pour la relecture à:\r\nRobert Lagadec About WinHTTrack Website Copier A propos de WinHTTrack Website Copier Please visit our Web page Visitez notre site Web! Wizard query Question du Compagnon WinHTTrack Your answer: Votre réponse: Link detected.. Un lien a été détecté Choose a rule Choisir une règle: Ignore this link Ignorer ce lien Ignore directory Ignorer ce dossier Ignore domain Ignorer ce domaine Catch this page only Ne capturer QUE cette page Mirror site Copie du site Mirror domain Copie du domaine entier Ignore all Tout ignorer Wizard query Question du Compagnon WinHTTrack NO NON File Fichier Options Options Log Fichier journal Window Fenêtres Help Aide Pause transfer Suspendre les téléchargements Exit Quitter Modify options Modifier les options View log Voir le fichier journal View error log Voir le fichier d'erreur View file transfers Voir les fichiers téléchargés Hide Minimiser About WinHTTrack Website Copier A propos... Check program updates... Rechercher les mises à jour de WinHTTrack... &Toolbar Barre d'outils &Status Bar Barre d'état S&plit Fractionner File Fichier Preferences Options Mirror Copie de site Log Journal Window Fenêtres Help Aide Exit Quitter Load default options Utiliser les options par défaut Save default options Enregistrer en tant qu'options par défaut Reset to default options Initialiser les options par défaut Load options... Charger les options Save options as... Enregistrer les options sous... Language preference... Choix de la langue Contents... Index... About WinHTTrack... A propos de WinHTTrack Website Copier New project\tCtrl+N Nouveau projet\tCtrl+N &Open...\tCtrl+O &Ouvrir...\tCtrl+O &Save\tCtrl+S En®istrer\tCtrl+S Save &As... Enregistrer &sous... &Delete... &Effacer... &Browse sites... &Explorer sites... User-defined structure Définir une structure personnalisée %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNom du fichier sans ext. (ex: image)\r\n%N\tNom du fichier avec extension (ex: image.gif)\r\n%t\tExtension (ex: gif)\r\n%p\tChemin [sans dernier /] (ex: /someimages)\r\n%h\tNom du serveur (ex: www.someweb.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tVersion courte DOS (ex: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Exemple:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Options du serveur proxy Proxy address: Adresse du serveur proxy Proxy port: Port du serveur proxy Authentication (only if needed) Identification (si nécessaire) Login Nom d'utilisateur (Login) Password Mot de passe Enter proxy address here Entrez ici l'adresse du serveur proxy Enter proxy port here Entrez ici le port du serveur proxy Enter proxy login Entrez le nom d'utilisateur du serveur proxy Enter proxy password Entrez le mot de passe du serveur proxy Enter project name here Entrez ici le nom du projet Enter saving path here Entrez ici le chemin où vous voulez enregistrer le projet Select existing project to update Sélectionnez ici le projet existant à mettre à jour Click here to select path Cliquez ici pour sélectionner le chemin directement dans l'arborescence de votre disque dur Select or create a new category name, to sort your mirrors in categories Sélectionnez ou créez une nouvelle catégorie, pour trier vos projets à l'aide de catégories HTTrack Project Wizard... Compagnon du projet WinHTTrack New project name: Nom du nouveau projet: Existing project name: Nom du projet existant: Project name: Nom du projet: Base path: Chemin de base: Project category: Catégorie du projet: C:\\My Web Sites C:\\Mes Sites Web Type a new project name, \r\nor select existing project to update/resume Entrez le nom d'un nouveau projet, \r\nou sélectionnez un projet existant pour le mettre à jour/le reprendre New project Nouveau projet Insert URL Insérez une adresse URL URL: Adresse URL Authentication (only if needed) Identification (si nécessaire) Login Nom d'utilisateur (Login) Password Mot de passe Forms or complex links: Formulaires ou liens complexes: Capture URL... Capturer l'URL... Enter URL address(es) here Entrez ici l'adresse URL Enter site login Entrez votre nom d'utilisateur pour le site Enter site password Entrez votre mot de passe pour le site Use this capture tool for links that can only be accessed through forms or javascript code Utilisez cet outil pour capturer des liens accessibles uniquement via formulaires ou liens javascript Choose language according to preference Sélectionnez votre langue ici Catch URL! Capturer cette adresse URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Veuillez fixer temporairement les réglages proxy de votre navigateur sur les réglages ci-dessous (copiez/collez l'adresse proxy et le port).\nEnsuite, dans votre navigateur, cliquez sur le bouton 'submit' du formulaire, ou cliquez sur le lien spécifique que vous voulez aspirer. This will send the desired link from your browser to WinHTTrack. Cela enverra le lien concerné de votre navigateur vers WinHTTrack ABORT ANNULER Copy/Paste the temporary proxy parameters here Copier/collez les réglages temporaires du proxy ici Cancel Annuler Unable to find Help files! Impossible de trouver les fichiers d'aide! Unable to save parameters! Impossible d'enregistrer les paramètres! Please drag only one folder at a time Veuillez ne déposer qu'un dossier à la fois Please drag only folders, not files Veuillez déposer un dossier, pas un fichier Please drag folders only Ne déposez que des dossiers Select user-defined structure? Choisir une structure personnalisée pour la copie du site? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Vérifiez que la chaîne personnalisée est correcte\nSi elle ne l'est pas, les noms de fichiers seront erronés! Do you really want to use a user-defined structure? Voulez-vous vraiment sélectionner une structure personnalisée? Too manu URLs, cannot handle so many links!! Trop d'adresses URLs, impossible de prendre en charge autant de liens!! Not enough memory, fatal internal error.. Pas assez de mémoire, erreur interne fatale... Unknown operation! Opération inconnue! Add this URL?\r\n Ajouter cette adresse URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Attention: le processus principal ne répond toujours pas, impossible d'ajouter ces URLs... Type/MIME associations Correspondances type/MIME File types: Types de fichiers: MIME identity: Correspondance MIME: Select or modify your file type(s) here Sélectionnez ou modifiez le(s) type(s) de fichiers ici Select or modify your MIME type(s) here Sélectionnez ou modifiez les type(s) MIME correspondant(s) ici Go up Monter Go down Descendre File download information Informations sur les fichiers téléchargés Freeze Window Figer la fenêtre More information: Plus d'informations: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Bienvenue dans WinHTTrack Website Copier!\n\nVeuillez cliquer sur le bouton SUIVANT\n\n- pour démarrer un nouveau projet\n- ou reprendre un projet existant File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Fichiers de type:\nFichiers contenant:\nCe fichier:\nNoms de dossiers contenant:\nCe dossier:\nLiens sur ce domaine:\nLiens sur un domaine contenant:\nLiens de ce serveur:\nLiens contenant:\nCe lien:\nTOUS LES LIENS Show all\nHide debug\nHide infos\nHide debug and infos Tout montrer\nCacher infos de débogage\nCacher infos générales\nCacher débogage et infos Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Structure du site (par défaut)\nHtml dans web/, images/autres dans web/images/\nHtml dans web/html, images/autres dans web/images\nHtml dans web/, images/autres dans web/\nHtml dans web/, images/autres dans web/xxx, où xxx est le type\nHtml dans web/html, images/autres dans web/xxx\nStructure du site, sans www.domaine.xxx/\nHtml dans site_name/, images/autres dans nom_site/images/\nHtml dans nom_site/html, images/autres dans nom_site/images\nHtml dans site_name/, images/autres dans nom_site/\nHtml dans nom_site/, images/autres dans nom_site/xxx\nHtml dans nom_site/html, images/autres dans nom_site/xxx\nTous les fichiers dans web/, avec des noms aléatoires (gadget !)\nTous les fichiers dans nom_site/, avec des noms aléatoires (gadget !)\nStructure définie par l'utilisateur.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Analyse des liens uniquement\nEnregistrer les fichiers HTML\nEnregistrer les fichiers non-HTML\nEnregistrer tous les fichiers (par défaut)\nEnregistrer d'abord les fichiers HTML Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Rester sur le même répertoire\nPeut descendre (défaut)\nPeut monter\nPeut descendre & monter Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Rester à la même adresse (par défaut)\nRester sur le même domaine\nRester sur le même TLD\nParcours libre sur tout le Web Never\nIf unknown (except /)\nIf unknown Jamais\nSi inconnu (sauf /)\nSi inconnu no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules pas de règles robots.txt\nrègles robots.txt sauf filtres\nsuivre les règles robots.txt normal\nextended\ndebug normal\nétendu\ndébogage Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Copie automatique de site(s) Web\nCopie interactive de site(s) Web (questions)\nTélécharger des fichiers spécifiques\nAspirer tous les sites dans les pages (miroirs multiples)\nTester les liens dans les pages (test de signet)\n* Reprendre une copie interrompue\n* Mettre à jour une copie existante Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL URI relative / URL absolue (par défaut)\nURL absolue / URL absolue\nURI absolue / URL absolue\nURL originale / URL originale Open Source offline browser Aspirateur de Sites Web Open Source Website Copier/Offline Browser. Copy remote websites to your computer. Free. Aspirateur de sites/Navigateur hors ligne. Copiez des sites web sur votre PC. Libre. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, aspirateur de sites web URL list (.txt) Liste d'URLs (.txt) Previous Précédent Next Suivant URLs URLs Warning Attention Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Votre navigateur ne comprend pas actuellement le javascript. Pour de meilleurs résultats, utilisez un navigateur compatible avec le javascript. Thank you Merci You can now close this window Vous pouvez maintenant fermer cette fenêtre Server terminated Serveur arrêté A fatal error has occurred during this mirror Une erreur critique est intervenue durant l'aspiration View Documentation Lire la documentation Go To HTTrack Website Visiter le site de HTTrack Go To HTTrack Forum Visiter le forum de HTTrack View License Lire la license Beware: you local browser might be unable to browse files with embedded filenames Attention: il se pourrait que votre navigateur soit incapable de lire les fichiers contenant des espaces Recreated HTTrack internal cached resources Cache des ressources interne recréé Could not create internal cached resources Impossible de créer le cache des ressources interne Could not get the system external storage directory Impossible de localuser le système de stockage externe Could not write to: Impossible d'écrire dans: Read-only media (SDCARD) Média en lecture seule (SDCARD) No storage media (SDCARD) Pas de média (SDCARD) HTTrack may not be able to download websites until this problem is fixed Il se peut que HTTrack soit incapable de télécharger des sites tant que ce problème n'est pas réglé HTTrack: mirror '%s' stopped! HTTrack: miroir '%s' stoppé! Click on this notification to restart the interrupted mirror Cliquez sur cette notification pour redémarrer la copie interrompue HTTrack: could not save profile for '%s'! HTTrack: impossible de sauver le profil pour '%s' Build a complete RFC822 mail (MHT/EML) archive of the mirror Construire une archive email complète (MHT/EML) au format RFC822 HTTP referer to be sent for initial URLs Champ HTTP referer a envoyer pour les URL initiales Build a mail archive Construire une archive mail Default referer URL Champ referer par défaut Proxy type: Type de proxy : Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protocole du proxy. HTTP : proxy standard. HTTP (tunnel CONNECT) : envoie chaque requête via un tunnel CONNECT, pour les proxys acceptant uniquement CONNECT comme le HTTPTunnelPort de Tor. SOCKS5 : port par défaut 1080. Load cookies from file: Charger les cookies depuis un fichier : Preload cookies from a Netscape cookies.txt file before crawling. Précharger les cookies depuis un fichier Netscape cookies.txt avant la copie du site. Pause between files: Pause entre les fichiers : Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Délai aléatoire entre les téléchargements de fichiers, en secondes. Utilisez MIN:MAX pour une plage aléatoire (par ex. 2:8). Keep the www. prefix (do not merge www.host with host) Conserver le préfixe www. (ne pas fusionner www.host avec host) Do not treat www.host and host as the same site. Ne pas traiter www.host et host comme le même site. Keep double slashes in URLs Conserver les doubles barres obliques dans les URL Do not collapse duplicate slashes in URLs. Ne pas réduire les barres obliques en double dans les URL. Keep the original query-string order Conserver l'ordre d'origine de la query string Do not reorder query-string parameters when deduplicating URLs. Ne pas réordonner les paramètres de la query string lors de la déduplication des URL. Strip query keys: Supprimer les clés de query string : Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Clés de query string à retirer du nommage des fichiers enregistrés, séparées par des virgules (par ex. sid,utm_source). Write a WARC archive of the crawl Écrire une archive WARC du crawl Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Enregistrer aussi chaque réponse téléchargée dans une archive WARC/1.1 (ISO-28500), à côté du miroir. WARC archive name: Nom de l'archive WARC : Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Nom de base optionnel pour l'archive WARC ; laissez vide pour le générer automatiquement dans le répertoire de sortie. httrack-3.49.14/lang/Finnish.txt0000644000175000017500000011113215230602340012067 LANGUAGE_NAME Finnish LANGUAGE_FILE Finnish LANGUAGE_ISO fi LANGUAGE_AUTHOR Mika Kähkönen (mika.kahkonen at mbnet.fi) LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Finnish OK OK Cancel Peruuta Exit Poistu Close Sulje Cancel changes Peruuta muutokset Click to confirm Hyväksy Click to get help! Apua! Click to return to previous screen Palaa edelliseen ruutuun Click to go to next screen Mene seuraavaan ruutuun Hide password Kätke salasana Save project Tallenna projekti Close current project? Sulje nykyinen projekti? Delete this project? Poista projekti? Delete empty project %s? Poista tyhjä projekti %s? Action not yet implemented Toimintoa ei toteutettu vielä Error deleting this project Virhe poistettaessa projektia Select a rule for the filter Valitse suodattimen sääntö Enter keywords for the filter Kirjoita suodattimen avainsanat Cancel Peruuta Add this rule Lisää sääntö Please enter one or several keyword(s) for the rule Valitse yksi tai useampi avainsana säännöksi Add Scan Rule Lisää lukusääntö Criterion Kriteeri String Teksti Add Lisää Scan Rules Lukusäännöt Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Käytä jokerimerkkejä sisällyttääksesi URL:iä tai linkkejä.\nVoit kirjoittaa useita lukujonoja samalle riville.\nKäytä välilyöntiä erottelijana.\n\nEsimerkki: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Hylkää linkkejä Include link(s) Sisällytä linkkejä Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Vinkki: Saadaksesi KAIKKI gif-tiedostot, kirjoita tähän tapaan: +www.jokin.fi/*.gif. \n(+*.gif / -*.gif sisällyttää/hylkää KAIKKi giffit kaikilta sivuilta) Save prefs Tallenna asetukset Matching links will be excluded: Sopivat linkit hylätään: Matching links will be included: Sopivat linkit sisällytetään: Example: Esimerkki: gif\r\nWill match all GIF files gif\r\nSopii kaikiin gif-tiedostoihin blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' sini\r\nLöytää kaikki tiedostot, joissa on 'sini', myös sanan keskeltä kuten 'sinitaivas_pieni.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' iso.mov\r\nSopii tiedostoon 'iso.mov', muttei tiedostoon 'iso2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nLöytää linkit, joiden kansion nimi sisältää tekstin 'cgi' kuten /cgi-bin/jokincgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nLöytää linkit, joiden kansion nimessä on vain teksti 'cgi-bin' (mutta ei cgi-bin-2, esimerkiksi) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. jokinnetti.fi\r\nLöytää linkit, jotka sisältävät tekstin 'jokinnetti.fi', esimerkiksi www.jokinnetti.fi, yksityinen.jokinnetti.fi jne. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. jokinnetti\r\nLöytää linkit, joka sisältää tämän tekstin, kuten www.jokinnetti.fi, www.jokinnetti.eu, yksityinen.jokinnetti.toinennetti.fi jne. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.jokinnetti.fi\r\nLöytää linkit, joissa on 'www.jokinnetti.fi' (mutta ei linkkejä yksityinen.jokinnetti.fi/...) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. jokinnetti\r\nLöytää kaikki linkit, jotka sisältävät tämän tekstin, kuten www.jokinnetti.fi/..., www.testi.abc/fromjokinnetti/index.html, www.testi.abc/test/jokinnetti.html jne. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.testi.com/test/jokinnetti.html\r\nLöytää vain tiedoston 'www.testi.com/test/jokinnetti.html'. Huomaa, että sinun pitää kirjoittaa koko polku (URL + paikan polku) All links will match Kaikki linkit sopii Add exclusion filter Lisää hylkäävä suodatin Add inclusion filter Lisää sisällyttävä suodatin Existing filters Suodattimet Cancel changes Peruuta muutokset Save current preferences as default values Tallenna nykyiset asetukset vakioarvoiksi Click to confirm Hyväksy No log files in %s! Ei lokitiedostoja: %s! No 'index.html' file in %s! Ei 'index.html'-tiedostoa: %s! Click to quit WinHTTrack Website Copier Poistu WinHTTrack Website Copierista View log files Näytä lokitiedostot Browse HTML start page Selaa HTML-alkusivua End of mirror Peilin loppu View log files Näytä lokitiedostot Browse Mirrored Website Selaa peilisivua New project... Uusi projekti... View error and warning reports Näytä virhe- ja varoitusraportit View report Näytä raportti Close the log file window Sulje lokitiedostoikkuna Info type: Infotyyppi: Errors Virheet Infos Infot Find Etsi Find a word Etsi sana Info log file Infolokitiedosto Warning/Errors log file Varoitukset/virheet -loki Unable to initialize the OLE system Ei voi alustaa OLE-järjestelmää WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack ei voi löytää keskeytettyä latausta määritetystä kansiosta! Could not connect to provider Ei voi yhdistää tarjoajaan receive vastaanota request kutsu connect yhdistä search etsi ready valmis error virhe Receiving files.. Vastaanottaa tiedostoja... Parsing HTML file.. Parsii HTML-tiedostoa... Purging files.. Puhdistaa tiedostoja... Loading cache in progress.. Välimuistin lataus käynnissä... Parsing HTML file (testing links).. Parsii HTML-tiedostoa (testaa linkkejä)... Pause - Toggle [Mirror]/[Pause download] to resume operation Pysäytys - Vaihda [Peili]/[Pysäytä lataus] jatkaaksesi operaatiota Finishing pending transfers - Select [Cancel] to stop now! Päättää avoimia siirtoja - Valitse [Peruuta] lopettaaksesi nyt! scanning lukee Waiting for scheduled time.. Odottaa ajoitettua hetkeä... Transferring data.. Siirtää tietoa... Connecting to provider Yhdistää tarjoajaan [%d seconds] to go before start of operation [%d sekuntia] operaation alkuun Site mirroring in progress [%s, %s bytes] Sivun peilaus käynnissä [%s, %s tavua] Site mirroring finished! Sivun peilaus valmis! A problem occurred during the mirroring operation\n Ongelma peilausoperaation aikana\n \nDuring:\n \nAikana:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nKatso lokitiedostoa tarvittaessa.\n\nPaina VALMIS poistuaksesi WinHTTrack Website Copierista.\n\nKiitoksia WinHTTrackin käytöstä! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Peilausoperaatio valmis.\nPaina poistu sulkeaksesi WinHTTrackin.\nKatso lokitiedosto(j)a varmistaaksesi, että kaikki on kunnossa.\n\nKiitoksia WinHTTrackin käytöstä! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * PEILI KESKEYTETTY! * *\r\nNykyistä välimuistia tarvitaan päivitysoperaatioihin ja se sisältää tietoa vain äsken keskeytetystä imuroinnista.\r\nAiempi välimuisti saattaa sisältää täydellisempää tietoa; jos et halua menettää tätä tietoa, sinun pitää palauttaa se ja poistaa nykyinen välimuisti.\r\n[Huomaa: Tämän voi helposti tehdä nyt poistamalla hts-cache/new.*-tiedostot]\r\n\r\nLuuletko, että edellinen välimuisti sisältäisi täydellisempää tietoa, ja että haluat palauttaa sen? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * PEILIVIRHE! * *\r\nHTTrack huomasi, että nykyinen peili on tyhjä. Jos se oli päivitys, edellinen peli on palautettu.\r\nSyy: ensimmäiset sivut eivät löytyneet tai tapahtui yhteysvirhe.\r\n=> Varmista että nettisivu on yhä olemassa ja tarkista välityspalvelinasetuksesi! <= \n\nTip: Click [View log file] to see warning or error messages \n\nVinkki: Paina [Näytä lokitiedosto] nähdäksesi varoitus- ja virheviestit Error deleting a hts-cache/new.* file, please do it manually Virhe hts-cache/new.* -tiedostojen poistamisessa, tee se itse. Do you really want to quit WinHTTrack Website Copier? Haluatko varmasti poistua WinHTTrack Website Copierista? - Mirroring Mode -\n\nEnter address(es) in URL box - Peilaustapa -\n\nKirjoita osoitteet URL-laatikkoon - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Vuorovaikutteisen velhon tapa (kysymyksiä) -\n\nKirjoita osoitteet URL-laatikkoon - File Download Mode -\n\nEnter file address(es) in URL box - Tiedoston lataus -tapa -\n\nKirjoita tiedostojen osoitteet URL-laatikkoon - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Linkkien testaus -tapa -\n\nKirjoita nettiosoitteet ja testattavat linkit URL-laatikkoon - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Päivitystapa -\n\nTarkista URL-laatikon osoitteet, tarkista määritteet tarvittaessa ja paina 'SEURAAVA' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Jatkamistapa (keskeytetyt operaatiot) -\n\nTarkista URL-laatikon osoitteet, tarkista määritteet tarvittaessa ja paina 'SEURAAVA' Log files Path Lokitiedostojen polku Path Polku - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Linkkilistatapa -\n\nKirjoita URL-laatikkoon sivujen osoitteet, joilla on linkkejä peileihin New project / Import? Uusi projekti / Tuonti? Choose criterion Valitse kriteeri Maximum link scanning depth Linkkien lukemisen enimmäissyvyys Enter address(es) here Kirjoita osoitteet tähän Define additional filtering rules Määritä lisäsuodatinsäännöt Proxy Name (if needed) Välityspalvelimen nimi (tarvittaessa) Proxy Port Välityspalvelimen portti Define proxy settings Määritä välityspalvelinasetukset Use standard HTTP proxy as FTP proxy Käytä standardia HTTP-välityspalvelinta FTP-välityspalvelimena Path Polku Select Path Valitse polku Path Polku Select Path Valitse polku Quit WinHTTrack Website Copier Poistu WinHTTrack Website Copierista About WinHTTrack Tietoja WinHTTrack Save current preferences as default values Tallenna nykyiset asetukset vakioarvoiksi Click to continue Jatka Click to define options Määritä asetukset Click to add a URL Lisää URL Load URL(s) from text file Lataa URL:t tekstitiedostosta WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack-asetukset (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Osoitelistaustekstitiedosto (*.txt)|*.txt|| File not found! Tiedostoa ei löydy! Do you really want to change the project name/path? Haluatko varmasti vaihtaa projektin nimeä tai polkua? Load user-default options? Ladataanko käyttäjän vakioasetukset? Save user-default options? Tallennetaanko käyttäjän vakioasetukset? Reset all default options? Palautetaanko kaikki vakioasetukset? Welcome to WinHTTrack! Tervetuloa WinHTTrackiin! Action: Toiminto: Max Depth Enimmäissyvyys Maximum external depth: Ulkoinen enimmäissyvyys: Filters (refuse/accept links) : Suodattimet (hylkää/hyväksy linkit) : Paths Polut Save prefs Tallenna asetukset Define.. Määritä... Set options.. Asetukset... Preferences and mirror options: Asetukset ja peilivalinnat: Project name Projektin nimi Add a URL... Lisää URL... Web Addresses: (URL) Nettiosoitteet: (URL) Stop WinHTTrack? Pysäytä WinHTTrack? No log files in %s! Ei lokitiedostoja %s! Pause Download? Pysäytä imurointi? Stop the mirroring operation Pysäytä peilausoperaatio Minimize to System Tray Pienennä tehtäväpalkkiin Click to skip a link or stop parsing Ohita linkki tai pysäytä parsinta Click to skip a link Ohita linkki Bytes saved Tavuja tallennettu Links scanned Linkkejä luettu Time: Aika: Connections: Yhteydet: Running: Menossa: Hide Piilota Transfer rate Siirtonopeus SKIP OHITA Information Tiedot Files written: Kirjoitetut tiedostot: Files updated: Päivitetyt tiedostot: Errors: Virheet: In progress: Käynnissä: Follow external links Seuraa ulkoisia linkkejä Test all links in pages Testaa kaikki sivujen linkit Try to ferret out all links Yritä nuuskia kaikki linkit Download HTML files first (faster) Lataa HTML-tiedostot ensin (nopeampi) Choose local site structure Valitse paikallisen sivun rakenne Set user-defined structure on disk Aseta käyttäjän määrittelemä rakenne levyllä Use a cache for updates and retries Käytä välimuistia päivityksiin ja uudelleenyrityksiin Do not update zero size or user-erased files Älä päivitä tyhjiä tai käyttäjän luomia tiedostoja Create a Start Page Luo aloitussivu Create a word database of all html pages Luo sanatietokanta kaikista html-sivuista Create error logging and report files Luo virheloki- ja raporttitiedostot Generate DOS 8-3 filenames ONLY Kehitä VAIN DOSin 8-3 tiedostonimet Generate ISO9660 filenames ONLY for CDROM medias Kehitä ISO9660-tiedostonimet VAIN cd-rom-medioille Do not create HTML error pages Älä luo HTML-virhesivuja Select file types to be saved to disk Valitse levylle tallennettavat tiedostotyypit Select parsing direction Valitse parsintasuunta Select global parsing direction Valitse yleinen parsintasuunta Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Aseta URL-uudelleenkirjoitusssäännöt sisäisille (ladatut) ja ulkoisille (ei ladattu) linkeille Max simultaneous connections Yhtäaikaisten yhteyksien enimmäismäärä File timeout Tiedoston aikakatkaisu Cancel all links from host if timeout occurs Peruuta kaikki linkit isännältä jos aikakatkaistaan Minimum admissible transfer rate Hyväksyttävä vähimmäissiirtonopeus Cancel all links from host if too slow Peruuta kaikki linkit isännältä jos liian hidasta Maximum number of retries on non-fatal errors Uudelleenyrittämisten enimmäismäärä vähemmän vakavissa virheissä Maximum size for any single HTML file Yksittäisen HTML-tiedoston enimmäiskoko Maximum size for any single non-HTML file Yksittäisen tiedoston enimmäiskoko (muu kuin HTML) Maximum amount of bytes to retrieve from the Web Netistä ladattavien tavujen enimmäismäärä Make a pause after downloading this amount of bytes Pysäytä, kun on ladattu tämän verran tavuja Maximum duration time for the mirroring operation Peilausoperaation enimmäiskesto Maximum transfer rate Enimmäissiirtonopeus Maximum connections/seconds (avoid server overload) Enimmillään yhteyksiä sekunnissa (välttää palvelimen ylikuormitusta) Maximum number of links that can be tested (not saved!) Testattavien linkkien enimmäismäärä (ei tallennettujen!) Browser identity Esittäydy selaimena Comment to be placed in each HTML file Jokaiseen HTML-tiedostoon pantava kommentti Back to starting page Palaa aloitussivulle Save current preferences as default values Tallenna nykyiset asetukset vakioarvoiksi Click to continue Paina jatkaaksesi Click to cancel changes Paina peruuttaaksesi muutokset Follow local robots rules on sites Noudata paikallisia robottisääntöjä sivuilla Links to non-localised external pages will produce error pages Linkit paikallisoimattoimiin ulkoisiin sivuihin antavat virhesivuja Do not erase obsolete files after update Älä poista vanhentuneita tiedostoja päivityksen jälkeen Accept cookies? Hyväksytäänkö evästeet? Check document type when unknown? Tarkistetaanko dokumentin tuntematon tyyppi? Parse java applets to retrieve included files that must be downloaded? Parsitaanko java-apletit saadaksesi ladattua myös tarvittavat sisällytetyt tiedostot? Store all files in cache instead of HTML only Tallenna kaikki tiedostot välimuistiin vain HTML-tiedostojen asemesta Log file type (if generated) Lokitiedoston tyyppi (jos luodaan) Maximum mirroring depth from root address Juuriosoitteesta peilauksen enimmäissyvyys Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Peilauksen enimmäissyvyys ulkoisiin/kielletyihin osoitteisiin (0 eli ei mitään on vakiona) Create a debugging file Luo debuggaustiedosto Use non-standard requests to get round some server bugs Käytä epästandardeja pyyntöjä kiertääksesi joitakin palvelinbugeja Use old HTTP/1.0 requests (limits engine power!) Käytä vanhoja HTTP/1.0-pyyntöjä (rajoittaa moottorin tehoa!) Attempt to limit retransfers through several tricks (file size test..) Yritä rajoittaa uudelleensiirtoja eri tempuilla (tiedostokoon testi, ...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Yritä rajoittaa linkkien määrää hylkäämällä samankaltaiset URL:t (www.foo.com==foo.com, http=https ...) Write external links without login/password Kirjoita ulkoiset linkit ilman tunnusta ja salasanaa Write internal links without query string Kirjoita sisäiset linkit ilman kyselytekstiä Get non-HTML files related to a link, eg external .ZIP or pictures Ota linkkiä koskevat muut kuin HTML-tiedostot, esimerkiksi ulkoiset zipit tai kuvat Test all links (even forbidden ones) Testaa kaikki linkit (kielletytkin) Try to catch all URLs (even in unknown tags/code) Yritä napata kaikki URL:t (jopa tuntemattomissa tageissa/koodeissa) Get HTML files first! Ota HTML-tiedostot ensin! Structure type (how links are saved) Rakenteen tyyppi (kuinka linkit tallennetaan) Use a cache for updates Käytä välimuistia päivitykseen Do not re-download locally erased files Älä imuroi uudelleen paikallisesti poistettuja tiedostoja Make an index Tee indeksi Make a word database Tee sanatietokanta Log files Lokitiedostot DOS names (8+3) DOS-nimet (8+3) ISO9660 names (CDROM) ISO9660-nimet (CDROM) No error pages Ei virhesivuja Primary Scan Rule Päälukusääntö Travel mode Kulkutapa Global travel mode Yleinen kulkutapa These options should be modified only exceptionally Nämä asetukset pitäisi muuttaa poikkeustapauksissa Activate Debugging Mode (winhttrack.log) Aktivoi debuggaustapa (winhttrack.log) Rewrite links: internal / external Kirjoita linkit uudelleen: sisäiset / ulkoiset Flow control Datavuon ohjaus Limits Rajoitukset Identity Esittäydy HTML footer HTML-alatunniste N# connections Yhteyksiä Abandon host if error Hylkää isäntä, jos virhe Minimum transfer rate (B/s) Vähimmäissiirtonopeus (t/s) Abandon host if too slow Hylkää isäntä, jos liian hidas Configure Säädä Use proxy for ftp transfers Käytä välityspalvelinta ftp-siirtoihin TimeOut(s) Aikakatkaisut Persistent connections (Keep-Alive) Pysyvät yhteydet (herkistele) Reduce connection time and type lookup time using persistent connections Vähennä yhteysaikaa ja tyypintarkastusaikaa käyttämällä pysyviä yhteyksiä Retries Uudelleenyritykset Size limit Kokorajoitus Max size of any HTML file (B) HTML-tiedostojen enimmäiskoko Max size of any non-HTML file Muiden kuin HTML:ien enimmäiskoko Max site size Sivuston enimmäiskoko Max time Enimmäisaika Save prefs Tallenna asetukset Max transfer rate Enimmäissiirtonopeus Follow robots.txt Noudata robots.txt:tä No external pages Ei ulkoisia sivuja Do not purge old files Älä puhdista vanhoja tiedostoja Accept cookies Hyväksy evästeet Check document type Valitse dokumentin tyyppi Parse java files Parsi java-tiedostot Store ALL files in cache Tallenna KAIKKI tiedostot välimuistiin Tolerant requests (for servers) Hyväksyvät pyynnöt (palvelimille) Update hack (limit re-transfers) Päivityspilkeet (rajoita uudelleensiirtoja) URL hacks (join similar URLs) URL-pilkkeet (liitä samanlaiset URL:t) Force old HTTP/1.0 requests (no 1.1) Pakota vanhat HTTP/1.0-pyynnöt (ei 1.1) Max connections / seconds Yhteyksien enimmäismäärä sekunnissa Maximum number of links Linkkien enimmäismäärä Pause after downloading.. Pysäytä, kun imuroitu... Hide passwords Kätke salasanat Hide query strings Kätke kyselytekstit Links Linkit Build Rakenna Experts Only Ammattilaisille Flow Control Datavuon ohjaus Limits Rajoitukset Browser ID Selaimen ID Scan Rules Lukusäännöt Spider Nettirobotti Log, Index, Cache Loki, indeksi, välimuisti Proxy Välityspalvelin MIME Types MIME-tyypit Do you really want to quit WinHTTrack Website Copier? Haluatko varmasti poistua WinHTTrack Website Copierista? Do not connect to a provider (already connected) Älä yhdistä tarjoajaan (on jo yhditetty) Do not use remote access connection Älä käytä etäyhteyttä Schedule the mirroring operation Ajoita peilausoperaatio Quit WinHTTrack Website Copier Poistu WinHTTrack Website Copierista Back to starting page Palaa aloitussivulle Click to start! Aloita! No saved password for this connection! Ei tallennettuja salasanoja tälle yhteydelle! Can not get remote connection settings Ei voi ottaa etäyhteyden asetuksia Select a connection provider Valitse puhelinverkkoyhteys Start Aloita Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Säädä yhteysasetukset tarvittaessa,\nsen jälkeen paina VALMIS peilioperaation aloittamiseksi. Save settings only, do not launch download now. Tallenna vain asetukset, älä aloita lataamista vielä On hold Odottele Transfer scheduled for: (hh/mm/ss) Siirtäminen ajastettu: (tt/mm/ss) Start Aloita Connect to provider (RAS) Yhdistä tarjoajaan (RAS) Connect to this provider Yhdistä tähän tarjoajaan Disconnect when finished Katkaise yhteys, kun on valmista Disconnect modem on completion Katkaise modeemiyhteys, kun on valmista \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Kerro meille bugeista ja ongelmista)\r\n\r\nKehitys:\r\nKäyttöliittymä (Windows): Xavier Roche\r\nNettirobotti: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C) 1998-2003 Xavier Roche ja muut avustajat\r\nSuomentanut Mika Kähkönen 22.-24.7.2005\r\nmika.kahkonen@mbnet.fi\r\nhttp://koti.mbnet.fi/kahoset About WinHTTrack Website Copier Tietoja WinHTTrack Website Copier Please visit our Web page Käy nettisivuillamme Wizard query Velhokysely Your answer: Vastauksesi: Link detected.. Linkki havaittu... Choose a rule Valitse sääntö Ignore this link Sivuuta tämä linkki Ignore directory Sivuuta hakemisto Ignore domain Sivuuta verkkotunnus Catch this page only Huomioi vain tämä sivu Mirror site Peilisivu Mirror domain Peiliverkkotunnus Ignore all Sivuuta kaikki Wizard query Velhokysely NO EI File &Tiedosto Options Valinnat Log &Loki Window &Ikkuna Help O&hje Pause transfer Pysäytä siirto Exit Poistu Modify options &Muokkaa valintoja View log &Näytä loki View error log Näytä &virheloki View file transfers Näytä tiedostosiirrot Hide P&iilota About WinHTTrack Website Copier &Tietoja WinHTTrack Website Copier Check program updates... Tarkista ohjelman &päivitykset... &Toolbar &Työkalupalkki &Status Bar T&ilapalkki S&plit J&ako File &Tiedosto Preferences &Asetukset Mirror P&eili Log &Loki Window &Ikkuna Help Ohje Exit Poistu Load default options &Lataa vakioasetukset Save default options &Tallenna vakioasetukset Reset to default options &Palaa vakioasetuksiin Load options... Lataa &valinnat... Save options as... Tallenna valinnat &nimellä... Language preference... &Kieliasetukset... Contents... &Ohjeen aiheet... About WinHTTrack... &Tietoja WinHTTrack... New project\tCtrl+N &Uusi projekti\tCtrl+N &Open...\tCtrl+O &Avaa...\tCtrl+O &Save\tCtrl+S &Tallenna\tCtrl+S Save &As... Tallenna &nimellä... &Delete... P&oista... &Browse sites... S&elaa sivuja... User-defined structure Käyttäjän määrittelemä rakenne %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tTiedostonimi ilman tyyppiä (esim: kuva)\r\n%N\tTiedostonimi ja tyyppi (esim: kuva.png)\r\n%t\tVain tiedostotyyppi (esim: png)\r\n%p\tPolku [loppuun ei /] (esim: /kuvia)\r\n%h\tIsäntänimi (esim: www.jokinnetti.fi)\r\n%M\tMD5-URL (128 bittiä, 32 ascii-tavua)\r\n%Q\tMD5-kyselyjono (128 bittiä, 32 ascii-tavua)\r\n%q\tPieni MD5-kyselyjono (16 bittiä, 4 ascii-tavua)\r\n\r\n%s?\tLyhyt nimi(esim: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Esimerkki:\t%h%p/%n%q.%t\n->\t\tc:\\peili\\www.jokinnetti.com\\jotainkuvia\\kuva.gif Proxy settings Välityspalvelinasetukset Proxy address: Välityspalvelimen osoite: Proxy port: Välityspalvelimen portti: Authentication (only if needed) Autentisointi (vain tarvittaessa) Login Kirjaudu Password Salasana Enter proxy address here Välityspalvelimen osoite Enter proxy port here Välityspalvelimen portti Enter proxy login Välityspalvelimen kirjautuminen Enter proxy password Välityspalvelimen salasana Enter project name here Projektin nimi Enter saving path here Tallennuspolku Select existing project to update Valitse päivitettävä projekti Click here to select path Valitse polku Select or create a new category name, to sort your mirrors in categories Valitse tai luo uusi luokka peilaustesi luokittelemiseen HTTrack Project Wizard... HTTrackin projektivelho... New project name: Uuden projektin nimi: Existing project name: Vanhan projektin nimi: Project name: Projektin nimi: Base path: Peruspolku: Project category: Projektin luokka: C:\\My Web Sites C:\\Nettisivuni Type a new project name, \r\nor select existing project to update/resume Kirjoita uuden projektin nimi, \r\tai valitse päivitettävä tai jatkettava projekti New project Uusi projekti Insert URL Lisää URL URL: URL: Authentication (only if needed) Autentisointi (vain tarvittaessa) Login Kirjaudu Password Salasana Forms or complex links: Lomakkeet tai monimutkaiset linkit: Capture URL... Kaappaa URL... Enter URL address(es) here Kirjoita URL-osoitteet tähän Enter site login Kirjoita sivun tunnus Enter site password Kirjoita sivun salasana Use this capture tool for links that can only be accessed through forms or javascript code Käytä tätä kaappaustyökalua linkkeihin, joihin voi päästä vain lomakkeiden tai javascript-koodien avulla Choose language according to preference Valitse asetettu kieli Catch URL! Nappaa URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Aseta väliaikaisesti selaimen välityspalvelinasetukset seuraavilla arvoilla (Kopioi osoite ja portti).\nSen jälkeen paina lomakkeen Lähetä-painiketta selaimesi sivulla tai paina linkkiä, jonka haluat kaapata. This will send the desired link from your browser to WinHTTrack. Tämä lähettää halutun linkit selaimeltasi WinHTTrackiin. ABORT KESKEYTÄ Copy/Paste the temporary proxy parameters here Kopioi ja liitä väliaikaiset välityspalvelinparametrit tähän Cancel Peruuta Unable to find Help files! Ohje-tiedostoja ei löydy! Unable to save parameters! Ei voi tallentaa parametrejä! Please drag only one folder at a time Raahaa vain yksi kansio kerrallaan Please drag only folders, not files Raahaa vain kansiot, ei tiedostoja Please drag folders only Raahaa vain kansiot Select user-defined structure? Valitse käyttäjän määrittelemä rakenne? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Varmista, että käyttäjän määrittelemä merkkijono on oikea,\nmuutoin tiedostonimistä tulee roskaa! Do you really want to use a user-defined structure? Haluatko varmasti käyttää käyttäjän määrittelemää rakennetta? Too manu URLs, cannot handle so many links!! Liian monta URL:ä, ei voi käsitellä niin monta!!! Not enough memory, fatal internal error.. Ei tarpeeksi muistia, vakava sisäinen virhe... Unknown operation! Tuntematon operaatio! Add this URL?\r\n Lisää URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Varoitus: pääprosessi ei vieläkään vastaa, ei voi lisätä URL:iä... Type/MIME associations Tyyppi/MIME-kytkennät File types: Tiedostotyypit: MIME identity: MIME-identiteetti: Select or modify your file type(s) here Valitse tai muokkaa tiedostotyyppejäsi Select or modify your MIME type(s) here Valitse tai muokkaa MIME-tyyppejäsi Go up Ylös Go down Alas File download information Tiedoston imuroinnin tiedot Freeze Window Jäädytä ikkuna More information: Lisätietoa: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Tervetuloa WinHTTrack Website Copieriin!\n\Paina seuraava\n\n- aloittaaksesi uuden projektin\n- tai jatkaaksesi keskeytynyttä latausta File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Tiedostonimet, joilla pääte:\nTiedostonimet, joissa on:\nTämä tiedostonimi:\nKansionimet, joissa on:\nTämä kansionimi:\nTämän verkkotunnuksen linkit:\nLinkit verkkotunnuksissa, joissa on:\nLinkit tältä isännältä:\nLinkit, joissa on:\nTämä linkki:\nKAIKKI LINKIT Show all\nHide debug\nHide infos\nHide debug and infos Näytä kaikki\nKätke debug\nKätke infot\nKätke debug and infot Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Sivuston rakenne (vakio)\nHtml:t kansioon web/, kuvat ja muut web/images/\nHtml:t kansioon web/html/, kuvat ja muut web/images/\nHtml:t kansioon web/, kuvat ja muut web/\nHtml:t kansioon web/, kuvat ja muut web/xxx/, missä xxx on tiedostopääte\nHtml:t kansioon web/html/, kuvat ja muut web/xxx/\nSivuston rakenne, ilman www.domain.xxx/\nHtml:t kansioon sivuston_nimi/, kuvat ja muut sivuston_nimi/images/\nHtml:t kansioon sivuston_nimi/html/, kuvat ja muut sivuston_nimi/images/\nHtml:t kansioon sivuston_nimi/, kuvat ja muut sivuston_nimi/\nHtml:t kansioon sivuston_nimi/, kuvat ja muut sivuston_nimi/xxx/\nHtml:t kansioon sivuston_nimi/html/, kuvat ja muut sivuston_nimi/xxx/\nKaikki kansioon web/, luo satunnaiset nimet (!)\nKaikki kansioon sivuston_nimi/, luo satunnaiset nimet (!)\nKäyttäjän määrittelemä rakenne... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Vain lue\nSäilö html-tiedostot\nSäilö muut kuin html-tiedostot\nSäilö kaikki tiedostot (vakio)\nSäilö html-tiedostot ensin Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Pysy samassa hakemistossa\nVoi mennä alas (vakio)\nVoi mennä ylös\nVoi mennä sekä ylös että alas Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Pysy samassa osoitteessa (vakio)\nPysy samalla verkkotunnuksella\nPysy samalla ylimmän tason verkkotunnuksella\nMene kaikkialle nettiin Never\nIf unknown (except /)\nIf unknown Ei koskaan\nJos tuntematon (paitsi /)\nJos tuntematon no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ei robots.txt-sääntöjä\nrobots.txt paitsi velhoa\nnoudata robots.txt-sääntöjä normal\nextended\ndebug normaali\nlaajennettu\ndebug Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Imuroi nettisivut\nImuroi nettisivut ja kysymykset\nOta yksittäiset tiedostot\nImuroi kaikki sivut sivustolla (useat peilit)\nTestaa sivujen linkit (kirjanmerkkitestaus)\n* Jatka keskeytynyttä latausta\n* Päivitä jo imuroitu Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Suhteellinen URI / tarkka URL (vakio)\nTarkka URL / tarkka URL\nTarkka URI / tarkka URL\nAlkuperäinen URL / alkuperäinen URL Open Source offline browser Avoimen lähdekoodin yhteydetön selain Website Copier/Offline Browser. Copy remote websites to your computer. Free. Nettisivun lataaja/Offline-selain. Kopioi nettisivut koneellesi. Ilmainen. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline-selain URL list (.txt) URL-luettelo (.txt) Previous Edellinen Next Seuraava URLs URL:t Warning Varoitus Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Selaimesi ei tue javascriptiä juuri nyt. Parempia tuloksia tulee javascriptiä käyttävällä selaimella. Thank you Kiitos You can now close this window Voit nyt sulkea tämän ikkunan Server terminated Palvelin lopetettu A fatal error has occurred during this mirror Tällä peilillä tapahtui vakava virhe Proxy type: Välityspalvelimen tyyppi: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Välityspalvelimen protokolla. HTTP: tavallinen välityspalvelin. HTTP (CONNECT-tunneli): lähettää jokaisen pyynnön CONNECT-tunnelin kautta, vain CONNECT-yhteyksiä tukeville välityspalvelimille kuten Torin HTTPTunnelPort. SOCKS5: oletusportti 1080. Load cookies from file: Lataa evästeet tiedostosta: Preload cookies from a Netscape cookies.txt file before crawling. Lataa evästeet Netscape cookies.txt -tiedostosta ennen sivuston läpikäyntiä. Pause between files: Tauko tiedostojen välillä: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Satunnainen viive tiedostolatausten välillä, sekunteina. Käytä muotoa MIN:MAX satunnaista väliä varten (esim. 2:8). Keep the www. prefix (do not merge www.host with host) Säilytä www.-etuliite (älä yhdistä www.host- ja host-osoitteita) Do not treat www.host and host as the same site. Älä käsittele www.host- ja host-osoitteita samana sivustona. Keep double slashes in URLs Säilytä kaksoiskenoviivat URL-osoitteissa Do not collapse duplicate slashes in URLs. Älä yhdistä toistuvia kenoviivoja URL-osoitteissa. Keep the original query-string order Säilytä kyselymerkkijonon alkuperäinen järjestys Do not reorder query-string parameters when deduplicating URLs. Älä järjestä kyselymerkkijonon parametreja uudelleen, kun URL-osoitteiden kaksoiskappaleet poistetaan. Strip query keys: Poista kyselyavaimet: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Pilkuin erotellut kyselyavaimet, jotka jätetään pois tallennettujen tiedostojen nimeämisestä (esim. sid,utm_source). Write a WARC archive of the crawl Kirjoita imuroinnin WARC-arkisto Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Tallenna myös jokainen noudettu vastaus ISO-28500 WARC/1.1 -arkistoon peilin viereen. WARC archive name: WARC-arkiston nimi: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Valinnainen WARC-arkiston perusnimi; jätä tyhjäksi, jotta se nimetään automaattisesti tulostehakemistoon. httrack-3.49.14/lang/English.txt0000644000175000017500000011166415230602340012074 LANGUAGE_NAME English LANGUAGE_FILE English LANGUAGE_ISO en LANGUAGE_AUTHOR Xavier Roche (roche at httrack.com)\r\nRobert Lagadec (rlagadec at yahoo.fr) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID English (United States) OK OK Cancel Cancel Exit Exit Close Close Cancel changes Cancel changes Click to confirm Click to confirm Click to get help! Click to get help! Click to return to previous screen Click to return to previous screen Click to go to next screen Click to go to next screen Hide password Hide password Save project Save project Close current project? Close current project? Delete this project? Delete this project? Delete empty project %s? Delete empty project %s? Action not yet implemented Action not yet implemented Error deleting this project Error deleting this project Select a rule for the filter Select a rule for the filter Enter keywords for the filter Enter keywords for the filter Cancel Cancel Add this rule Add this rule Please enter one or several keyword(s) for the rule Please enter one or several keyword(s) for the rule Add Scan Rule Add Scan Rule Criterion Criterion String String Add Add Scan Rules Scan Rules Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Exclude links Include link(s) Include link(s) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Save prefs Save prefs Matching links will be excluded: Matching links will be excluded: Matching links will be included: Matching links will be included: Example: Example: gif\r\nWill match all GIF files gif\r\nWill match all GIF files blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) All links will match All links will match Add exclusion filter Add exclusion filter Add inclusion filter Add inclusion filter Existing filters Existing filters Cancel changes Cancel changes Save current preferences as default values Save current preferences as default values Click to confirm Click to confirm No log files in %s! No log files in %s! No 'index.html' file in %s! No 'index.html' file in %s! Click to quit WinHTTrack Website Copier Click to quit WinHTTrack Website Copier View log files View log files Browse HTML start page Browse HTML start page End of mirror End of mirror View log files View log files Browse Mirrored Website Browse Mirrored Website New project... New project... View error and warning reports View error and warning reports View report View report Close the log file window Close the log file window Info type: Info type: Errors Errors Infos Infos Find Find Find a word Find a word Info log file Info log file Warning/Errors log file Warning/Errors log file Unable to initialize the OLE system Unable to initialize the OLE system WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack could not find any interrupted download file cache in the specified folder! Could not connect to provider Could not connect to provider receive receive request request connect connect search search ready ready error error Receiving files.. Receiving files.. Parsing HTML file.. Parsing HTML file.. Purging files.. Purging files.. Loading cache in progress.. Loading cache in progress.. Parsing HTML file (testing links).. Parsing HTML file (testing links).. Pause - Toggle [Mirror]/[Pause download] to resume operation Pause - Toggle [Mirror]/[Pause download] to resume operation Finishing pending transfers - Select [Cancel] to stop now! Finishing pending transfers - Select [Cancel] to stop now! scanning scanning Waiting for scheduled time.. Waiting for scheduled time.. Transferring data.. Transferring data.. Connecting to provider Connecting to provider [%d seconds] to go before start of operation [%d seconds] to go before start of operation Site mirroring in progress [%s, %s bytes] Site mirroring in progress [%s, %s bytes] Site mirroring finished! Site mirroring finished! A problem occurred during the mirroring operation\n A problem occurred during the mirroring operation\n \nDuring:\n \nDuring:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= \n\nTip: Click [View log file] to see warning or error messages \n\nTip: Click [View log file] to see warning or error messages Error deleting a hts-cache/new.* file, please do it manually Error deleting a hts-cache/new.* file, please do it manually Do you really want to quit WinHTTrack Website Copier? Do you really want to quit WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Mirroring Mode -\n\nEnter address(es) in URL box - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - File Download Mode -\n\nEnter file address(es) in URL box - File Download Mode -\n\nEnter file address(es) in URL box - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button Log files Path Log files Path Path Path - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror New project / Import? New project / Import? Choose criterion Choose criterion Maximum link scanning depth Maximum link scanning depth Enter address(es) here Enter address(es) here Define additional filtering rules Define additional filtering rules Proxy Name (if needed) Proxy Name (if needed) Proxy Port Proxy Port Define proxy settings Define proxy settings Use standard HTTP proxy as FTP proxy Use standard HTTP proxy as FTP proxy Path Path Select Path Select Path Path Path Select Path Select Path Quit WinHTTrack Website Copier Quit WinHTTrack Website Copier About WinHTTrack About WinHTTrack Save current preferences as default values Save current preferences as default values Click to continue Click to continue Click to define options Click to define options Click to add a URL Click to add a URL Load URL(s) from text file Load URL(s) from text file WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack preferences (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Address List text file (*.txt)|*.txt|| File not found! File not found! Do you really want to change the project name/path? Do you really want to change the project name/path? Load user-default options? Load user-default options? Save user-default options? Save user-default options? Reset all default options? Reset all default options? Welcome to WinHTTrack! Welcome to WinHTTrack! Action: Action: Max Depth Max Depth Maximum external depth: Maximum external depth: Filters (refuse/accept links) : Filters (refuse/accept links): Paths Paths Save prefs Save prefs Define.. Define.. Set options.. Set options.. Preferences and mirror options: Preferences and mirror options: Project name Project name Add a URL... Add a URL... Web Addresses: (URL) Web Addresses: (URL) Stop WinHTTrack? Stop WinHTTrack? No log files in %s! No log files in %s! Pause Download? Pause Download? Stop the mirroring operation Stop the mirroring operation Minimize to System Tray Minimize to System Tray Click to skip a link or stop parsing Click to skip a link or stop parsing Click to skip a link Click to skip a link Bytes saved Bytes saved Links scanned Links scanned Time: Time: Connections: Connections: Running: Running: Hide Hide Transfer rate Transfer rate SKIP SKIP Information Information Files written: Files written: Files updated: Files updated: Errors: Errors: In progress: In progress: Follow external links Follow external links Test all links in pages Test all links in pages Try to ferret out all links Try to ferret out all links Download HTML files first (faster) Download HTML files first (faster) Choose local site structure Choose local site structure Set user-defined structure on disk Set user-defined structure on disk Use a cache for updates and retries Use a cache for updates and retries Do not update zero size or user-erased files Do not update zero size or user-erased files Create a Start Page Create a Start Page Create a word database of all html pages Create a word database of all html pages Build a complete RFC822 mail (MHT/EML) archive of the mirror Build a complete RFC822 mail (MHT/EML) archive of the mirror Create error logging and report files Create error logging and report files Generate DOS 8-3 filenames ONLY Generate DOS 8-3 filenames ONLY Generate ISO9660 filenames ONLY for CDROM medias Generate ISO9660 filenames ONLY for CDROM medias Do not create HTML error pages Do not create HTML error pages Select file types to be saved to disk Select file types to be saved to disk Select parsing direction Select parsing direction Select global parsing direction Select global parsing direction Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Max simultaneous connections Max simultaneous connections File timeout File timeout Cancel all links from host if timeout occurs Cancel all links from host if timeout occurs Minimum admissible transfer rate Minimum admissible transfer rate Cancel all links from host if too slow Cancel all links from host if too slow Maximum number of retries on non-fatal errors Maximum number of retries on non-fatal errors Maximum size for any single HTML file Maximum size for any single HTML file Maximum size for any single non-HTML file Maximum size for any single non-HTML file Maximum amount of bytes to retrieve from the Web Maximum amount of bytes to retrieve from the Web Make a pause after downloading this amount of bytes Make a pause after downloading this amount of bytes Maximum duration time for the mirroring operation Maximum duration time for the mirroring operation Maximum transfer rate Maximum transfer rate Maximum connections/seconds (avoid server overload) Maximum connections/seconds (avoid server overload) Maximum number of links that can be tested (not saved!) Maximum number of links that can be tested (not saved!) Browser identity Browser identity Comment to be placed in each HTML file Comment to be placed in each HTML file Languages accepted by the browser Languages accepted by the browser Additional HTTP headers to be sent in each requests Additional HTTP headers to be sent in each requests HTTP referer to be sent for initial URLs HTTP referer to be sent for initial URLs Back to starting page Back to starting page Save current preferences as default values Save current preferences as default values Click to continue Click to continue Click to cancel changes Click to cancel changes Follow local robots rules on sites Follow local robots rules on sites Links to non-localised external pages will produce error pages Links to non-localised external pages will produce error pages Do not erase obsolete files after update Do not erase obsolete files after update Accept cookies? Accept cookies? Check document type when unknown? Check document type when unknown? Parse java applets to retrieve included files that must be downloaded? Parse java applets to retrieve included files that must be downloaded? Store all files in cache instead of HTML only Store all files in cache instead of HTML only Log file type (if generated) Log file type (if generated) Maximum mirroring depth from root address Maximum mirroring depth from root address Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Create a debugging file Create a debugging file Use non-standard requests to get round some server bugs Use non-standard requests to get round some server bugs Use old HTTP/1.0 requests (limits engine power!) Use old HTTP/1.0 requests (limits engine power!) Attempt to limit retransfers through several tricks (file size test..) Attempt to limit retransfers through several tricks (file size test..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Write external links without login/password Write internal links without query string Write internal links without query string Get non-HTML files related to a link, eg external .ZIP or pictures Get non-HTML files related to a link, eg external .ZIP or pictures Test all links (even forbidden ones) Test all links (even forbidden ones) Try to catch all URLs (even in unknown tags/code) Try to catch all URLs (even in unknown tags/code) Get HTML files first! Get HTML files first! Structure type (how links are saved) Structure type (how links are saved) Use a cache for updates Use a cache for updates Do not re-download locally erased files Do not re-download locally erased files Make an index Make an index Make a word database Make a word database Build a mail archive Build a mail archive Log files Log files DOS names (8+3) DOS names (8+3) ISO9660 names (CDROM) ISO9660 names (CDROM) No error pages No error pages Primary Scan Rule Primary Scan Rule Travel mode Travel mode Global travel mode Global travel mode These options should be modified only exceptionally These options should be modified only exceptionally Activate Debugging Mode (winhttrack.log) Activate Debugging Mode (winhttrack.log) Rewrite links: internal / external Rewrite links: internal / external Flow control Flow control Limits Limits Identity Identity HTML footer HTML footer Languages Languages Additional HTTP Headers Additional HTTP Headers Default referer URL Default referer URL N# connections N# connections Abandon host if error Abandon host if error Minimum transfer rate (B/s) Minimum transfer rate (B/s) Abandon host if too slow Abandon host if too slow Configure Configure Use proxy for ftp transfers Use proxy for ftp transfers TimeOut(s) TimeOut(s) Persistent connections (Keep-Alive) Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Reduce connection time and type lookup time using persistent connections Retries Retries Size limit Size limit Max size of any HTML file (B) Max size of any HTML file (B) Max size of any non-HTML file Max size of any non-HTML file Max site size Max site size Max time Max time Save prefs Save prefs Max transfer rate Max transfer rate Follow robots.txt Follow robots.txt No external pages No external pages Do not purge old files Do not purge old files Accept cookies Accept cookies Check document type Check document type Parse java files Parse java files Store ALL files in cache Store ALL files in cache Tolerant requests (for servers) Tolerant requests (for servers) Update hack (limit re-transfers) Update hack (limit re-transfers) URL hacks (join similar URLs) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Force old HTTP/1.0 requests (no 1.1) Max connections / seconds Max connections / seconds Maximum number of links Maximum number of links Pause after downloading.. Pause after downloading.. Hide passwords Hide passwords Hide query strings Hide query strings Links Links Build Build Experts Only Experts Only Flow Control Flow Control Limits Limits Browser ID Browser ID Scan Rules Scan Rules Spider Spider Log, Index, Cache Log, Index, Cache Proxy Proxy MIME Types MIME Types Do you really want to quit WinHTTrack Website Copier? Do you really want to quit WinHTTrack Website Copier? Do not connect to a provider (already connected) Do not connect to a provider (already connected) Do not use remote access connection Do not use remote access connection Schedule the mirroring operation Schedule the mirroring operation Quit WinHTTrack Website Copier Quit WinHTTrack Website Copier Back to starting page Back to starting page Click to start! Click to start! No saved password for this connection! No saved password for this connection! Can not get remote connection settings Can not get remote connection settings Select a connection provider Select a connection provider Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Save settings only, do not launch download now. Save settings only, do not launch download now. On hold On hold Transfer scheduled for: (hh/mm/ss) Transfer scheduled for: (hh/mm/ss) Start Start Connect to provider (RAS) Connect to provider (RAS) Connect to this provider Connect to this provider Disconnect when finished Disconnect when finished Disconnect modem on completion Disconnect modem on completion \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) About WinHTTrack Website Copier About WinHTTrack Website Copier Please visit our Web page Please visit our Web page Wizard query Wizard query Your answer: Your answer: Link detected.. Link detected.. Choose a rule Choose a rule Ignore this link Ignore this link Ignore directory Ignore directory Ignore domain Ignore domain Catch this page only Catch this page only Mirror site Mirror site Mirror domain Mirror domain Ignore all Ignore all Wizard query Wizard query NO NO File File Options Options Log Log Window Window Help Help Pause transfer Pause transfer Exit Exit Modify options Modify options View log View log View error log View error log View file transfers View file transfers Hide Hide About WinHTTrack Website Copier About WinHTTrack Website Copier Check program updates... Check program updates... &Toolbar &Toolbar &Status Bar &Status Bar S&plit S&plit File File Preferences Preferences Mirror Mirror Log Log Window Window Help Help Exit Exit Load default options Load default options Save default options Save default options Reset to default options Reset to default options Load options... Load options... Save options as... Save options as... Language preference... Language preference... Contents... Contents... About WinHTTrack... About WinHTTrack... New project\tCtrl+N New project\tCtrl+N &Open...\tCtrl+O &Open...\tCtrl+O &Save\tCtrl+S &Save\tCtrl+S Save &As... Save &As... &Delete... &Delete... &Browse sites... &Browse sites... User-defined structure User-defined structure %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proxy settings Proxy address: Proxy address: Proxy port: Proxy port: Authentication (only if needed) Authentication (only if needed) Login Login Password Password Enter proxy address here Enter proxy address here Enter proxy port here Enter proxy port here Enter proxy login Enter proxy login Enter proxy password Enter proxy password Enter project name here Enter project name here Enter saving path here Enter saving path here Select existing project to update Select existing project to update Click here to select path Click here to select path Select or create a new category name, to sort your mirrors in categories Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Project Wizard... New project name: New project name: Existing project name: Existing project name: Project name: Project name: Base path: Base path: Project category: Project category: C:\\My Web Sites C:\\My Web Sites Type a new project name, \r\nor select existing project to update/resume Type a new project name, \r\nor select existing project to update/resume New project New project Insert URL Insert URL URL: URL: Authentication (only if needed) Authentication (only if needed) Login Login Password Password Forms or complex links: Forms or complex links: Capture URL... Capture URL... Enter URL address(es) here Enter URL address(es) here Enter site login Enter site login Enter site password Enter site password Use this capture tool for links that can only be accessed through forms or javascript code Use this capture tool for links that can only be accessed through forms or javascript code Choose language according to preference Choose language according to preference Catch URL! Catch URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. This will send the desired link from your browser to WinHTTrack. This will send the desired link from your browser to WinHTTrack. ABORT ABORT Copy/Paste the temporary proxy parameters here Copy/Paste the temporary proxy parameters here Cancel Cancel Unable to find Help files! Unable to find Help files! Unable to save parameters! Unable to save parameters! Please drag only one folder at a time Please drag only one folder at a time Please drag only folders, not files Please drag only folders, not files Please drag folders only Please drag folders only Select user-defined structure? Select user-defined structure? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Do you really want to use a user-defined structure? Do you really want to use a user-defined structure? Too manu URLs, cannot handle so many links!! Too manu URLs, cannot handle so many links!! Not enough memory, fatal internal error.. Not enough memory, fatal internal error.. Unknown operation! Unknown operation! Add this URL?\r\n Add this URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Warning: main process is still not responding, cannot add URL(s).. Type/MIME associations Type/MIME associations File types: File types: MIME identity: MIME identity: Select or modify your file type(s) here Select or modify your file type(s) here Select or modify your MIME type(s) here Select or modify your MIME type(s) here Go up Go up Go down Go down File download information File download information Freeze Window Freeze Window More information: More information: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Show all\nHide debug\nHide infos\nHide debug and infos Show all\nHide debug\nHide infos\nHide debug and infos Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Never\nIf unknown (except /)\nIf unknown Never\nIf unknown (except /)\nIf unknown no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules normal\nextended\ndebug normal\nextended\ndebug Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Open Source offline browser Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) URL list (.txt) Previous Previous Next Next URLs URLs Warning Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you Thank you You can now close this window You can now close this window Server terminated Server terminated A fatal error has occurred during this mirror A fatal error has occurred during this mirror View Documentation View Documentation Go To HTTrack Website Go To HTTrack Website Go To HTTrack Forum Go To HTTrack Forum View License View License Beware: you local browser might be unable to browse files with embedded filenames Beware: you local browser might be unable to browse files with embedded filenames Recreated HTTrack internal cached resources Recreated HTTrack internal cached resources Could not create internal cached resources Could not create internal cached resources Could not get the system external storage directory Could not get the system external storage directory Could not write to: Could not write to: Read-only media (SDCARD) Read-only media (SDCARD) No storage media (SDCARD) No storage media (SDCARD) HTTrack may not be able to download websites until this problem is fixed HTTrack may not be able to download websites until this problem is fixed HTTrack: mirror '%s' stopped! HTTrack: mirror '%s' stopped! Click on this notification to restart the interrupted mirror Click on this notification to restart the interrupted mirror HTTrack: could not save profile for '%s'! HTTrack: could not save profile for '%s'! Proxy type: Proxy type: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Load cookies from file: Load cookies from file: Preload cookies from a Netscape cookies.txt file before crawling. Preload cookies from a Netscape cookies.txt file before crawling. Pause between files: Pause between files: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Keep the www. prefix (do not merge www.host with host) Keep the www. prefix (do not merge www.host with host) Do not treat www.host and host as the same site. Do not treat www.host and host as the same site. Keep double slashes in URLs Keep double slashes in URLs Do not collapse duplicate slashes in URLs. Do not collapse duplicate slashes in URLs. Keep the original query-string order Keep the original query-string order Do not reorder query-string parameters when deduplicating URLs. Do not reorder query-string parameters when deduplicating URLs. Strip query keys: Strip query keys: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Write a WARC archive of the crawl Write a WARC archive of the crawl Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. WARC archive name: WARC archive name: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Optional base name for the WARC archive; leave blank to auto-name it under the output directory. httrack-3.49.14/lang/Eesti.txt0000644000175000017500000010727515230602340011557 LANGUAGE_NAME Eesti LANGUAGE_FILE Eesti LANGUAGE_ISO et LANGUAGE_AUTHOR Tõnu Virma\r\n LANGUAGE_CHARSET ISO-8859-4 LANGUAGE_WINDOWSID Estonian OK OK Cancel Loobu Exit Välju Close Sulge Cancel changes Loobu muudatuste tegemisest Click to confirm Kliki kinnitamiseks Click to get help! Kliki abi saamiseks! Click to return to previous screen Tagasi eelmisele ekraanile Click to go to next screen Edasi järgmisele ekraanile Hide password Peida parool Save project Salvesta projekt Close current project? Kas sulgeda käesolev projekt? Delete this project? Kas kustutada see projekt? Delete empty project %s? Kas kustutada tühi projekt %s? Action not yet implemented Tegevus ei ole veel lõpetatud Error deleting this project Viga selle projekti kustutamisel Select a rule for the filter Vali filtreerimisreegel Enter keywords for the filter Sisesta märksõnad filtri jaoks Cancel Loobu Add this rule Lisa see reegel Please enter one or several keyword(s) for the rule Sisesta palun üks või mitu märksõna reegli jaoks Add Scan Rule Lisa filtreerimisreegel Criterion Kriteerium: String Märksõna: Add Lisa Scan Rules Filtrid Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Kasuta asendajaid URL-ide või linkide välja- või kaasaarvamiseks.\nÜhele reale võib panna mitu skaneerimisstringi.\nEraldajana kasuta tühikuid.\n\nNäiteks: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Välja arvata lingid Include link(s) Kaasa arvata lingid Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Vihje: Et saada KÕIK GIF-failid kaasa arvatud, kasuta midagi taolist +www.someweb.com/*.gif. \n(+*.gif / -*.gif arvab kaasa/välja KÕIK GIF-id KÕIKIDEST saitidest) Save prefs Salvesta häälestus Matching links will be excluded: Vastavad lingid tuleb välja arvata: Matching links will be included: Vastavad lingid tuleb kaasa arvata: Example: Näidis: gif\r\nWill match all GIF files gif\r\nleiab kõik GIF-failid blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nleiab kõik failid, mis sisaldavad alamstringi 'blue', nagu 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nleiab faili 'bigfile.mov', aga mitte 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nleiab lingid, mille kaustanimes sisaldub 'cgi' nagu /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nleiab lingid, mille kaustanimeks on terve 'cgi-bin' string (aga mitte cgi-bin-2, näiteks) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nleiab seda alamstringi sisaldavad lingid, nagu www.someweb.com, private.someweb.com jne. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nleiab seda alamstringi sisaldavad lingid, nagu www.someweb.com, www.someweb.edu, private.someweb.otherweb.com jne. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nleiab lingid, mis vastavad alamstringile 'www.someweb.com' (aga mitte linke, nagu private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nleiab kõik seda alamstringi sisaldavad lingid, nagu www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html jne. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nleiab ainult faili 'www.test.com/test/someweb.html'. Sisestada tuleb täielik asukoht (URL + faili asukoht) All links will match Kõik lingid leitakse Add exclusion filter Lisa väljaarvamisfilter Add inclusion filter Lisa kaasaarvamisfilter Existing filters Olemasolevad filtrid Cancel changes Loobu muudatustest Save current preferences as default values Salvesta praegune häälestus vaikeväärtusena Click to confirm Kliki kinnituseks No log files in %s! %s ei ole ühtegi logifaili! No 'index.html' file in %s! %s ei ole faili 'index.html'! Click to quit WinHTTrack Website Copier Kliki WinHTTrack Website Copier'i sulgemiseks View log files Vaata logifaile Browse HTML start page Vaata HTML alguslehekülge End of mirror Veebikopeerimine lõpetatud View log files Vaata logifaile Browse Mirrored Website Sirvi kopeeritud veebisaiti New project... Uus projekt... View error and warning reports Vaata vea- ja hoiatusteraportit View report Vaata raportit Close the log file window Sulge logifaili aken Info type: Informatsiooni tüüp: Errors Vead Infos Info Find Otsi Find a word Otsi sõna Info log file Info logifail Warning/Errors log file Hoiatuste ja vigade logifail Unable to initialize the OLE system OLE süsteemi ei saa käivitada WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack ei leidnud määratud kaustast ühtegi katkestatud tirimise cache-faili! Could not connect to provider Ei saa luua ühendust receive vastuvõtt request päring connect ühendus search otsimine ready valmis error viga Receiving files.. Failide vastuvõtmine... Parsing HTML file.. HTML faili analüüsimine... Purging files.. Failide hävitamine... Loading cache in progress.. Cache'i laadimine.. Parsing HTML file (testing links).. HTML faili analüüsimine (linkide testimine)... Pause - Toggle [Mirror]/[Pause download] to resume operation Paus - Jätkamiseks vali [Saidikopeerimine]/[Peata ülekanne] Finishing pending transfers - Select [Cancel] to stop now! Pooleliolevate ülekannete lõpetamine - Kliki [Cancel], et lõpetada kohe! scanning skaneerimine Waiting for scheduled time.. Etteantud aja ootamine... Connecting to provider Ühendusevõtmine [%d seconds] to go before start of operation [%d sekundit] jäänud operatsiooni alguseni Site mirroring in progress [%s, %s bytes] Saidi kopeerimine [%s, %s baiti] Site mirroring finished! Saidikopeerimine on lõpetatud! A problem occurred during the mirroring operation\n Saidikopeerimise käigus tekkis probleem\n \nDuring:\n \nOperatsioonil:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nVaata logifaili kui tarvis.\n\nKliki FINISH, et sulgeda WinHTTrack Website Copier.\n\nTänan WinHTTrack'i kasutamise eest! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Kopeerimisoperatsioon on lõpetatud.\nKliki Välju, et sulgeda WinHTTrack.\nVaata logifaili veendumaks, et kõik on korras.\n\nTänan WinHTTrack'i kasutamise eest! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * KOPEERIMINE KATKESTATUD! * *\r\nPraegune ajutine cache on vajalik igasuguse uuendamise jaoks ja sisaldab ainult käesoleva katkestatud seansi jooksul tiritud andmeid.\r\nEelmine cache võib sisaldada põhjalikumat informatsiooni; kui sa ei taha seda informatsiooni kaotada, tuleb see taastada ja kustutada praegune cache.\r\n[Märkus: Seda on siin lihtne teha, kustutades hts-cache/new.* failid]\r\n\r\nKas arvad, et eelmine cache võib sisaldada põhjalikumat informatsiooni, ja kas tahad seda taastada? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * KOPEERIMISE VIGA! * *\r\nHTTrack leidis, et praegune veebikoopia on tühi. Kui see on uuendus, taastatakse eelmine koopia.\r\nPõhjus: esimest lehekülge ei leitud, või on ühenduse probleemid.\r\n=> Veendu, et veebisait ikka alles on, ja/või kontrolli proxy seadistust! <= \n\nTip: Click [View log file] to see warning or error messages \n\nVihje: Hoiatuste ja veateadete nägemiseks kliki [Vaata logifaili] Error deleting a hts-cache/new.* file, please do it manually Viga hts-cache/new.* faili kustutamisel, palun tee seda käsitsi Do you really want to quit WinHTTrack Website Copier? Kas sa tõesti tahad lõpetada WinHTTrack Website Copier'i kasutamise? - Mirroring Mode -\n\nEnter address(es) in URL box - Kopeerimine -\n\nSisesta aadress(id) URL-i kasti - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktiivne nõustaja (küsimused) -\n\nSisesta aadress(id) URL-i kasti - File Download Mode -\n\nEnter file address(es) in URL box - Failide tirimine -\n\nSisesta faili(de) aadress(id) URL-i kasti - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Linkide testimine -\n\nSisesta testitavaid linke sisaldava(te) leh(ted)e aadress(id) URL-i kasti - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Uuendamine -\n\nKontrolli aadressi URL-i kastis ja parameetreid kui tarvis, seejärel kliki nuppu 'NEXT' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Jätkamine (katkestamise järel) -\n\nKontrolli aadressi URL-i kastis ja parameetreid kui tarvis, seejärel kliki nuppu 'NEXT' Log files Path Logifailide asukoht Path Asukoht - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Linkide listi järgi kopeerimine -\n\nSisesta URL-i kasti kopeeritavaid linke sisaldava(te) leh(ted)e aadress(id) New project / Import? Uus projekt / importida? Choose criterion Vali tegevus Maximum link scanning depth Linkide maksimaalne skaneerimissügavus Enter address(es) here Sisesta aadress(id) siia Define additional filtering rules Defineeri täiendavad filtreerimisreeglid Proxy Name (if needed) Proxy nimi (kui tarvis) Proxy Port Proxy port Define proxy settings Defineeri proxy seaded Use standard HTTP proxy as FTP proxy Kasuta standardset HTTP proxyt FTP proxyna Path Asukoht Select Path Vali asukoht Path Asukoht Select Path Vali asukoht Quit WinHTTrack Website Copier Lõpeta WinHTTrack Website Copier'i kasutamine About WinHTTrack Info WinHTTrack'i kohta Save current preferences as default values Salvesta praegune häälestus vaikeväärtusena Click to continue Kliki jätkamiseks Click to define options Kliki seadete defineerimiseks Click to add a URL Kliki URL-i lisamiseks Load URL(s) from text file Laadi URL(-id) tekstifailist WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack'i häälestus (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Addressinimekirja tekstifail (*.txt)|*.txt|| File not found! Faili ei leia! Do you really want to change the project name/path? Kas sa tõesti tahad muuta projekti nime/asukohta? Load user-default options? Kas laadida kasutaja vaikimisi seaded? Save user-default options? Kas salvestada kasutaja vaikimisi seaded? Reset all default options? Kas taastada kõik vaikimisi seaded? Welcome to WinHTTrack! Tere tulemast WinHTTrack'i! Action: Tegevus: Max Depth Maksimaalne sügavus: Maximum external depth: Maksimaalne väline sügavus: Filters (refuse/accept links) : Filtrid (linkide välja-/kaasaarvamiseks): Paths Asukohad Save prefs Salvesta seaded Define.. Defineeri... Set options.. Defineeri seaded... Preferences and mirror options: Kopeerimise häälestus: Project name Projekti nimi Add a URL... Lisa URL... Web Addresses: (URL) Veebiaadressid: (URL) Stop WinHTTrack? Kas peatada WinHTTrack? No log files in %s! %s ei ole ühtegi logifaili! Pause Download? Kas peatada tirimine? Stop the mirroring operation Peata kopeerimine Minimize to System Tray Minimeeri süsteemialasse Click to skip a link or stop parsing Kliki lingi vahelejätmiseks või kopeerimise peatamiseks Click to skip a link Kliki lingi vahelejätmiseks Bytes saved Salvestatud baite: Links scanned Skaneeritud linke: Time: Aeg: Connections: Ühendusi: Running: Käimas on: Hide Peida Transfer rate Ülekandekiirus: SKIP Jäta vahele Information Informatsioon Files written: Faile kirjutatud: Files updated: Faile uuendatud: Errors: Vigu: In progress: Tegevus: Follow external links Järgi välislinke Test all links in pages Testi kõik lingid lehekülgedel Try to ferret out all links Püüa välja nuhkida kõik lingid Download HTML files first (faster) Tiri HTML-failid kõigepealt (kiirem) Choose local site structure Vali kohaliku saidi struktuur Set user-defined structure on disk Defineeri oma saidistruktuur kettal Use a cache for updates and retries Kasuta cache'i uuenduste ja korduste tarvis Do not update zero size or user-erased files Ära uuenda nullsuurusega või kasutaja poolt kustutatud faile Create a Start Page Tee alguslehekülg Create a word database of all html pages Loo kõigi HTML-lehekülgede sõnade andmebaas Create error logging and report files Tee vealogi ja raporti failid Generate DOS 8-3 filenames ONLY Genereeri AINULT DOS-i 8-3 failinimed Generate ISO9660 filenames ONLY for CDROM medias Genereeri AINULT ISO9660 failinimed CDROM-i jaoks Do not create HTML error pages Ära genereeri HTML vealehekülgi Select file types to be saved to disk Vali kettale salvestatavad failitüübid Select parsing direction Vali linkide järgimise suund Select global parsing direction Vali globaalne linkide järgimise suund Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Määra URL-ide ümberkirjutamise reeglid siselinkidele (mida tiritakse) ja välislinkidele (mida ei tirita) Max simultaneous connections Maksimaalselt ühendusi üheaegselt File timeout Maksimaalne faili ooteaeg Cancel all links from host if timeout occurs Tühista kõik selle hosti lingid, kui ooteaeg läbi saab Minimum admissible transfer rate Minimaalne lubatav ülekandekiirus Cancel all links from host if too slow Tühista kõik selle hosti lingid, kui on liiga aeglane Maximum number of retries on non-fatal errors Maksimaalne korduste arv mittefataalse vea korral Maximum size for any single HTML file Ühe HTML-faili maksimaalne suurus Maximum size for any single non-HTML file Ühe mitte-HTML faili maksimaalne suurus Maximum amount of bytes to retrieve from the Web Maksimaalne veebist välja otsitav baitide kogus Make a pause after downloading this amount of bytes Tee paus pärast selle baidikoguse tirimist Maximum duration time for the mirroring operation Kopeerimisoperatsiooni maksimaalne kestus Maximum transfer rate Maksimaalne ülekandekiirus Maximum connections/seconds (avoid server overload) Maksimum ühendusi sekundis (vältimaks serveri ülekoormust) Maximum number of links that can be tested (not saved!) Maksimaalne testitavate (mitte salvestatavate!) linkide hulk Browser identity Brauseri identiteet Comment to be placed in each HTML file Kommentaar, mis lisatakse igale HTML-failile Back to starting page Tagasi alguslehele Save current preferences as default values Salvesta praegune häälestus vaikeväärtusena Click to continue Kliki jätkamiseks Click to cancel changes Kliki muudatustest loobumiseks Follow local robots rules on sites Järgi saitide kohalikke robotireegleid Links to non-localised external pages will produce error pages Lingid kopeerimata välislehekülgedele tekitavad vealehekülgi Do not erase obsolete files after update Ära kustuta vananenud faile peale uuendamist Accept cookies? Kas aktsepteerida küpsiseid? Check document type when unknown? Kas kontrollida dokumendi tüüpi, kui on tundmatu? Parse java applets to retrieve included files that must be downloaded? Kas analüüsida java aplette vajalike lisafailide väljaotsimiseks? Store all files in cache instead of HTML only Säilitada kõik failid cache'is, mitte ainult HTML-i kujul Log file type (if generated) Logifaili tüüp (kui on genereeritud) Maximum mirroring depth from root address Maksimaalne kopeerimissügavus algusaadressi suhtes Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Väliste/keelatud aadresside maksimaalne kopeerimissügavus (vaikimisi 0, s.t. üldse mitte) Create a debugging file Tee veakontrollifail Use non-standard requests to get round some server bugs Kasuta mittestandardset päringut mõnest serveri veast möödapääsemiseks Use old HTTP/1.0 requests (limits engine power!) Kasuta vana HTTP/1.0 päringut (piirab mootori võimalusi!) Attempt to limit retransfers through several tricks (file size test..) Püüa piirata korduvaid ülekandeid mitmesuguste trikkidega (failisuuruse test..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Kirjuta välislingid ilma sisselogimise/paroolita Write internal links without query string Kirjuta siselingid ilma päringustringita Get non-HTML files related to a link, eg external .ZIP or pictures Tiri mitte-HTML failid, nt välised ZIP-failid või pildid Test all links (even forbidden ones) Testi kõik lingid (ka keelatud) Try to catch all URLs (even in unknown tags/code) Püüa kätte saada kõik URL-id (ka tundmatud sildid/koodid) Get HTML files first! Tiri HTML-failid kõigepealt! Structure type (how links are saved) Struktuuritüüp (kuidas lingid salvestatakse) Use a cache for updates Kasuta cache'i uuenduste jaoks Do not re-download locally erased files Ära tiri uuesti kohalikke kustutatud faile Make an index Tee indeks Make a word database Tee sõnade andmebaas Log files Logifailid DOS names (8+3) DOS-i nimed (8+3) ISO9660 names (CDROM) ISO9660 nimed (CDROM) No error pages Ilma vealehekülgedeta Primary Scan Rule Peamine filter Travel mode Liikumisviis Global travel mode Globaalne liikumisviis These options should be modified only exceptionally Neid seadeid muuda ainult erandkorras Activate Debugging Mode (winhttrack.log) Aktiveeri veakontrolliolek (winhttrack.log) Rewrite links: internal / external Linkide muutmine: siselingid / välislingid Flow control Vookontroll Limits Piirangud Identity Identiteet HTML footer HTML-i jalus N# connections Ühenduste arv Abandon host if error Hülga host vea korral Minimum transfer rate (B/s) Minimaalne ülekandekiirus Abandon host if too slow Hülga host, kui on liiga aeglane Configure Konfigureeri Use proxy for ftp transfers Kasuta FTP ülekannete jaoks proxyt TimeOut(s) Ooteaeg Persistent connections (Keep-Alive) Püsivad ühendused Reduce connection time and type lookup time using persistent connections Vähenda ühenduse aega ja tüübiotsingu aega, kasutades püsivaid ühendusi Retries Kordusi Size limit Suuruse piirang Max size of any HTML file (B) HTML-faili maksimaalne suurus Max size of any non-HTML file Mitte-HTML faili maksimaalne suurus Max site size Saidi maksimaalne suurus Max time Maksimaalne aeg Save prefs Salvesta häälestus Max transfer rate Maksimaalne ülekandekiirus Follow robots.txt Järgi robots.txt reegleid No external pages Ilma välislehekülgedeta Do not purge old files Ära hävita vanu faile Accept cookies Aktsepteeri küpsiseid Check document type Kontrolli dokumenditüüpe Parse java files Analüüsi Java faile Store ALL files in cache Säilita KÕIK failid cache'is Tolerant requests (for servers) Tolerantsed päringud (serverite jaoks) Update hack (limit re-transfers) Update hack (piirab korduvaid ülekandeid) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Kasuta vana HTTP/1.0 päringut (mitte 1.1) Max connections / seconds Maksimaalselt ühendusi sekundis Maximum number of links Maksimaalne linkide arv Pause after downloading.. Paus peale ... tirimist Hide passwords Peida paroolid Hide query strings Peida päringustringid Links Lingid Build Struktuur Experts Only Ekspertidele Flow Control Vookontroll Limits Piirangud Browser ID Brauser Scan Rules Filtrid Spider Spider Log, Index, Cache Logi, indeks, cache Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Kas sa tõesti tahad lõpetada WinHTTrack Website Copier'i kasutamise? Do not connect to a provider (already connected) Ära ühenda ühendusepakkujaga (juba ühendatud) Do not use remote access connection Ära kasuta kaugjuurdepääsuga ühendust Schedule the mirroring operation Programmeeri kopeerimisoperatsioon Quit WinHTTrack Website Copier Lõpeta WinHTTrack Website Copier'i kasutamine Back to starting page Tagasi algusleheküljele Click to start! Kliki käivitamiseks! No saved password for this connection! Selle ühenduse jaoks pole salvestatud parooli! Can not get remote connection settings Kaugühenduse seadeid ei saa kätte Select a connection provider Vali ühendusepakkuja Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Palun täpsusta ühenduse parameetreid, kui tarvis,\nsiis vajuta FINISH kopeerimisoperatsiooni käivitamiseks. Save settings only, do not launch download now. Salvesta seaded ainult. Ära alusta tirimist praegu. On hold Ootel Transfer scheduled for: (hh/mm/ss) Ülekanne on programmeeritud: (hh/mm/ss) Start Start Connect to provider (RAS) Ühenda ühendusepakkujaga (RAS) Connect to this provider Ühenda selle ühendusepakkujaga Disconnect when finished Lahuta ühendus, kui on lõpetatud Disconnect modem on completion Lahuta modem lõpetamisel \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Palun teata meile igast veast või probleemist)\r\n\r\nArendajad:\r\nKasutajaliides (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nEestikeelne tõlge: Tõnu Virma About WinHTTrack Website Copier Info WinHTTrack Website Copier'i kohta Please visit our Web page Külasta palun meie veebilehekülge! Wizard query Nõustaja päring Your answer: Sinu vastus: Link detected.. Leitud link... Choose a rule Vali reegel Ignore this link Ignoreeri seda linki Ignore directory Ignoreeri kausta Ignore domain Ignoreeri domeeni Catch this page only Võta ainult see lehekülg Mirror site Saidi kopeerimine Mirror domain Domeeni kopeerimine Ignore all Ignoreeri kõiki Wizard query Nõustaja päring NO EI File Fail Options Seaded Log Logi Window Aken Help Abi Pause transfer Peata ülekanne Exit Välju Modify options Muuda seadeid View log Vaata logi View error log Vaata vealogi View file transfers Vaata failiülekandeid Hide Peida About WinHTTrack Website Copier &WinHTTrack Website Copier'i info Check program updates... Leia &uuemat versiooni... &Toolbar &Nupuriba &Status Bar &Staatuseriba S&plit &Jaota File &Fail Preferences &Häälestus Mirror &Saidikopeerimine Log &Logi Window A&ken Help Abi Exit Välju Load default options Laadi vaikimisi seaded Save default options Salvesta vaikimisi seaded Reset to default options Taasta vaikimisi seaded Load options... Laadi seaded... Save options as... Salvesta seaded faili... Language preference... Keele valik... Contents... Indeks About WinHTTrack... Info WinHTTrack'i kohta... New project\tCtrl+N &Uus projekt\tCtrl+N &Open...\tCtrl+O &Ava...\tCtrl+O &Save\tCtrl+S &Salvesta\tCtrl+S Save &As... Salvesta &failina... &Delete... &Kustuta... &Browse sites... Si&rvi saite... User-defined structure Kasutaja-defineeritud struktuur %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tFaili nimi ilma laiendita (nt: image)\r\n%N\tFaili nimi koos laiendiga (nt: image.gif)\r\n%t\tFaili laiend ainult (nt: gif)\r\n%p\tAsukoht [ilma /-ta lõpus] (nt: /someimages)\r\n%h\tHosti nimi (nt: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tDOS-i lühinimi (nt: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Näidis:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Proxy seaded Proxy address: Proxy aadress: Proxy port: Proxy port: Authentication (only if needed) Identifitseerimine (vajaduse korral) Login Kasutajanimi Password Parool Enter proxy address here Sisesta proxy aadress siia Enter proxy port here Sisesta proxy port siia Enter proxy login Sisesta proxy kasutajanimi Enter proxy password Sisesta proxy parool Enter project name here Sisesta siia projekti nimi Enter saving path here Sisesta siia asukoht projekti salvestamiseks Select existing project to update Vali olemasolev projekt uuendamiseks Click here to select path Kliki siin asukoha valimiseks Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack'i projektinõustaja New project name: Uue projekti nimi: Existing project name: Olemasoleva projekti nimi: Project name: Projekti nimi: Base path: Baas-asukoht: Project category: C:\\My Web Sites C:\\Minu veebisaidid Type a new project name, \r\nor select existing project to update/resume Sisesta uue projekti nimi, \r\nvõi vali olemasolev projekt uuendamiseks/jätkamiseks New project Uus projekt Insert URL Sisesta URL URL: URL: Authentication (only if needed) Identifitseerimine (vajaduse korral) Login Kasutajanimi Password Parool Forms or complex links: Vormid või keerulised lingid: Capture URL... Püüa URL... Enter URL address(es) here Sisesta URL aadress(id) siia Enter site login Sisesta saidi kasutajanimi Enter site password Sisesta saidi parool Use this capture tool for links that can only be accessed through forms or javascript code Kasuta seda püüdevahendit linkide korral, millele pääseb ligi ainult vormide või javascripti koodide kaudu Choose language according to preference Vali kasutuskeel Catch URL! Püüa URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Palun sea oma brauseri proxy häälestus ajutiselt järgmistele väärtustele (kopeeri/kleebi proxy aadress ja port).\nSiis kliki vormi SUBMIT-nuppu brauseri leheküljel, või kliki spetsiifilist linki, mida tahad püüda. This will send the desired link from your browser to WinHTTrack. See saadab soovitud lingi sinu brauserist WinHTTrack'ile. ABORT LOOBU Copy/Paste the temporary proxy parameters here Kopeeri/kleebi ajutised proxy parameetrid siit Cancel Loobu Unable to find Help files! Abiinfo faile ei leia! Unable to save parameters! Parameetreid ei saa salvestada! Please drag only one folder at a time Palun lohista ainult üks kaust korraga Please drag only folders, not files Palun lohista ainult kaustu, mitte faile Please drag folders only Palun lohista ainult kaustu Select user-defined structure? Kas valida kasutaja-defineeritud struktuur? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Palun veendu, et kasutaja defineeritud stringid on ikka korrektsed,\nvastasel juhul tulevad failinimed vigased! Do you really want to use a user-defined structure? Kas sa tõesti tahad valida kasutaja-defineeritud struktuuri? Too manu URLs, cannot handle so many links!! Liiga palju URL-e. Nii palju linke ei suuda käsitleda!! Not enough memory, fatal internal error.. Mälu ei ole piisavalt, fataalne sisemine viga... Unknown operation! Tundmatu operatsioon! Add this URL?\r\n Kas lisada see URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Hoiatus: põhiprotsess ei reageeri ikka veel, ei saa lisada URL-e... Type/MIME associations Tüüp/MIME seosed File types: Failitüübid: MIME identity: MIME identiteet: Select or modify your file type(s) here Vali või muuda oma failitüüpe siin Select or modify your MIME type(s) here Vali või muuda oma MIME-tüüpe siin Go up Mine üles Go down Mine alla File download information Failitirimise informatsioon Freeze Window Fikseeri aken More information: Täiendav informatsioon: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Tere tulemast WinHTTrack Website Copier'i!\n\nPalun kliki NEXT-nuppu, et\n\n- alustada uut projekti või\n- jätkata pooleliolevat tirimist File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Failinimed laiendiga:\nFailinimed, mis sisaldavad:\nSee failinimi:\nKaustanimed, mis sisaldavad:\nSee kaustanimi:\nLingid selles domeenis:\nLingid domeenides, mis sisaldavad:\nLingid sellest hostist:\nLingid, mis sisaldavad:\nSee link:\nKÕIK LINGID Show all\nHide debug\nHide infos\nHide debug and infos Näita kõik\nPeida veakontroll\nPeida info\nPeida veakontroll ja info Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Saidi struktuur (vaikimisi)\nHtml -> web/, pildid/teised failid -> web/images/\nHtml -> web/html/, pildid/teised -> web/images/\nHtml -> web/, pildid/teised -> web/\nHtml -> web/, pildid/teised -> web/xxx/ (kus xxx on faili laiend)\nHtml -> web/html/, pildid/teised -> web/xxx/\nSaidi struktuur, ilma www.domain.xxx/\nHtml -> saidi_nimi/, pildid/teised failid -> saidi_nimi/images/\nHtml -> saidi_nimi/html/, pildid/teised -> saidi_nimi/images/\nHtml -> saidi_nimi/, pildid/teised -> saidi_nimi/\nHtml -> saidi_nimi/, pildid/teised -> saidi_nimi/xxx/\nHtml -> saidi_nimi/html/, pildid/teised -> saidi_nimi/xxx/\nKõik failid -> web/ (juhuslike nimedega)\nKõik failid -> saidi_nimi/ (juhuslike nimedega)\nKasutaja defineeritud struktuur... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Skaneeri ainult\nSalvesta HTML-failid\nSalvesta mitte-HTML failid\nSalvesta kõik failid (vaikimisi)\nSalvesta HTML-failid kõigepealt Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Jää samasse kausta\nVõib minna alla (vaikimisi)\nVõib minna üles\nVõib minna nii üles kui alla Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Jää samale aadressile (vaikimisi)\nJää samasse domeeni\nJää samasse üladomeeni\n Mine igale poole veebis Never\nIf unknown (except /)\nIf unknown Mitte kunagi\nKui on tundmatu (v.a. /)\nKui on tundmatu no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ilma robots.txt reegliteta\nrobots.txt v.a. nõustaja\njärgi robots.txt reegleid normal\nextended\ndebug normaalne\nlaiendatud\nveakontrolliga Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Tiri veebisaidid\nTiri veebisaidid + küsimused\nTiri eraldi failid\nTiri kõik saidid lehtedel (hulgikopeerimine)\nTesti lingid lehtedel (järjehoidjate test)\n* Jätka katkestatud tirimist\n* Uuenda olemasolevat Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Suhteline URI / Absoluutne URL (vaikimisi)\nAbsoluutne URL / Absoluutne URL\nAbsoluutne URI / Absoluutne URL\nAlgne URL / Algne URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Proxy tüüp: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Puhverserveri protokoll. HTTP: tavaline puhverserver. HTTP (CONNECT-tunnel): saadab iga päringu läbi CONNECT-tunneli, ainult CONNECT-it toetavate puhverserverite jaoks nagu Tori HTTPTunnelPort. SOCKS5: vaikeport 1080. Load cookies from file: Lae küpsised failist: Preload cookies from a Netscape cookies.txt file before crawling. Lae küpsised eelnevalt Netscape cookies.txt failist enne kopeerimist. Pause between files: Paus failide vahel: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Juhuslik viivitus failide allalaadimiste vahel, sekundites. Juhusliku vahemiku jaoks kasuta MIN:MAX (nt 2:8). Keep the www. prefix (do not merge www.host with host) Säilita www. eesliide (ära ühenda www.host ja host) Do not treat www.host and host as the same site. Ära käsitle www.host ja host sama saidina. Keep double slashes in URLs Säilita topeltkaldkriipsud URL-ides Do not collapse duplicate slashes in URLs. Ära ühenda korduvaid kaldkriipse URL-ides. Keep the original query-string order Säilita päringustringi algne järjekord Do not reorder query-string parameters when deduplicating URLs. Ära järjesta päringustringi parameetreid ümber URL-ide korduste eemaldamisel. Strip query keys: Eemalda päringuvõtmed: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Komadega eraldatud päringuvõtmed, mis jäetakse salvestatud faili nimest välja (nt sid,utm_source). Write a WARC archive of the crawl Kirjuta läbimise WARC-arhiiv Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Salvesta iga alla laaditud vastus ka ISO-28500 WARC/1.1 arhiivi peegli kõrvale. WARC archive name: WARC-arhiivi nimi: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. WARC-arhiivi valikuline põhinimi; jäta tühjaks, et see väljundkataloogis automaatselt nimetada. httrack-3.49.14/lang/Deutsch.txt0000644000175000017500000011346515230602340012103 LANGUAGE_NAME Deutsch LANGUAGE_FILE Deutsch LANGUAGE_ISO de LANGUAGE_AUTHOR Rainer Klueting (rk-htt at centermail.net) \r\nBastian Gorke (bastiang at yahoo.com) \r\nRudi Ferrari (Wyando at netcologne.de) \r\nMarcus Gaza (MarcusGaza at t-online.de) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID German (Standard) OK OK Cancel Abbrechen Exit Beenden Close Schließen Cancel changes Änderungen verwerfen Click to confirm Änderungen übernehmen Click to get help! Hilfe aufrufen Click to return to previous screen Zurück zum letzten Schritt Click to go to next screen Weiter zum nächsten Schritt Hide password Passwort nicht anzeigen Save project Projekt speichern Close current project? Aktives Projekt schließen? Delete this project? Dieses Projekt löschen? Delete empty project %s? Leeres Projekt %s löschen? Action not yet implemented Funktion noch nicht verfügbar Error deleting this project Fehler beim Löschen des Projekts Select a rule for the filter Wählen Sie eine Regel für den Filter Enter keywords for the filter Schlüsselwörter für den Filter Cancel Abbrechen Add this rule Diese Regel hinzufügen Please enter one or several keyword(s) for the rule Ein oder mehrere Schlüsselwörter für die Regel eingeben Add Scan Rule Filterregel hinzufügen Criterion Filterregel: String Schlüsselwort eingeben: Add Hinzufügen Scan Rules Filterregeln Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Verwenden Sie Platzhalter, um URLs oder verknüpfte Seiten ein- oder auszuschließen.\n\nMehrere Filterregeln hintereinander \nmüssen durch Leerzeichen getrennt sein.\nBeispiel: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Link(s) ausschließen Include link(s) Link(s) einschließen Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tipp: Um ALLE GIF-Dateien einzuschließen, schreiben Sie z.B. +www.someweb.com/*.gif. \n(+*.gif / -*.gif schließt ALLE GIFs auf ALLEN Seiten ein/aus.) Save prefs Einstellungen speichern Matching links will be excluded: Auszuschließende Links: Matching links will be included: Einzuschließende Links: Example: Beispiel: gif\r\nWill match all GIF files gif\r\nFindet alle GIF-Dateien blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nFindet alle Dateien, die 'blue' enthalten, wie 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nFindet 'bigfile.mov', aber nicht 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nFindet alle Links zu Ordnern, deren Name 'cgi' enthält, wie /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nFindet Links zu Ordnern namens 'cgi-bin' (aber z.B. nicht zu 'cgi-bin-2') someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nFindet Links wie www.someweb.com, private.someweb.com etc. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nFindet Links wie www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nFindet Links wie www.someweb.com/... (aber nicht wie private.someweb.com/...) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nFindet Links wie www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nFindet nur die Datei 'www.test.com/test/someweb.html'. Bitte beachten: Der Pfad muss vollständig angegeben werden (URL und Pfadangabe). All links will match Alle Verknüpfungen sind eingeschlossen Add exclusion filter Ausschlussfilter hinzufügen Add inclusion filter Einschlussfilter hinzufügen Existing filters Aktuelle Filterregeln Cancel changes Änderungen verwerfen Save current preferences as default values Aktuelle Einstellungen als Standard speichern Click to confirm Zum Bestätigen klicken No log files in %s! Keine Protokolldateien in %s! No 'index.html' file in %s! Keine Datei 'index.html' in %s! Click to quit WinHTTrack Website Copier Hier klicken, um WinHTTrack Website Copier zu beenden View log files Protokolldateien anzeigen Browse HTML start page HTML-Startseite anzeigen End of mirror Kopie der Web-Site abgeschlossen View log files Protokolldateien anzeigen Browse Mirrored Website Kopierte Seiten anzeigen New project... Neues Projekt... View error and warning reports Fehler- und Hinweisprotokoll zeigen View report Protokoll zeigen Close the log file window Protokollfenster schließen Info type: Informationskategorie: Errors Fehler Infos Informationen Find Suchen Find a word Wort suchen Info log file Hinweisprotokoll Warning/Errors log file Fehler/Hinweise Unable to initialize the OLE system OLE System kann nicht gestartet werden WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack kann im angegebenen Ordner keine unterbrochene Site-Kopie finden! Could not connect to provider Keine Verbindung zum Provider receive empfangen request anfordern connect verbinden search suchen ready fertig error Fehler Receiving files.. Empfang der Dateien... Parsing HTML file.. Analysieren der HTML Datei... Purging files.. Dateien löschen... Loading cache in progress.. Zwischenspeicher wird geladen... Parsing HTML file (testing links).. Analysieren der HTML Datei (Links testen)... Pause - Toggle [Mirror]/[Pause download] to resume operation Pause - fortfahren mit Menübefehl [Site-Kopie]/[Übertragung anhalten] Finishing pending transfers - Select [Cancel] to stop now! Laufende Ubertragungen werden abgeschlossen - Sofortiger Stopp mit [Abbrechen] scanning scannen Waiting for scheduled time.. Eingestellte Startzeit abwarten Connecting to provider Verbindung aufbauen [%d seconds] to go before start of operation [%d Sekunden] bis zum Start Site mirroring in progress [%s, %s bytes] Spiegelung der Website läuft [%s, %s Byte] Site mirroring finished! Kopiervorgang beendet A problem occurred during the mirroring operation\n Beim Kopieren der Webseiten ist ein Problem aufgetreten\n \nDuring:\n \r\n\nWährend:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \r\n\nNäheres bei Bedarf im Protokoll.\n\n'Beenden' beendet WinHTTrack Website Copier.\n\nDanke, dass Sie WinHTTrack benutzt haben! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Kopiervorgang abgeschlossen.\n'Beenden' beendet WinHTTrack.\nIn den Protokolldateien können Sie prüfen, ob Probleme auftraten.\n\nDanke, dass Sie WinHTTrack benutzt haben! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * KOPIERVORGANG ABGEBROCHEN! * *\r\nDer aktuelle temporäre Cache wird für eine künftige Aktualisierung gebraucht. Er enthält nur Daten, die während der soeben abgebrochenen Sitzung heruntergeladen wurden.\r\nEin früher angelegter Cache enthält unter Umständen vollständigere Informationen; wenn Sie diese nicht verlieren wollen, müssen Sie sie wiederherstellen und den aktuellen Cache löschen.\r\n[Hinweis: Dazu werden einfach die Dateien hts-cache/new.* gelöscht]\r\n\r\nWollen Sie den vor dieser Sitzung erzeugten Cache wiederherstellen? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * FEHLER BEIM KOPIEREN! * *\r\nDie aktuelle Webseitenkopie ist leer. Wenn es sich um eine Aktualisierung gehandelt hat, ist die letzte Kopie wiederhergestellt worden.\r\nMögliche Ursachen: Entweder wurde(n) die erste(n) Seite(n) nicht gefunden, oder es gab ein Problem mit der Verbindung.\r\n=> Vergewissern Sie sich, dass die Website noch existiert, und/oder überprüfen Sie die Einstellungen für den Proxy! <= \n\nTip: Click [View log file] to see warning or error messages \r\n\n\nTipp: Ein Klick auf [Protokoll zeigen] zeigt Warnungen und Fehlermeldungen an Error deleting a hts-cache/new.* file, please do it manually Fehler beim Löschen einer Datei hts-cache/new.*. Bitte löschen Sie von Hand. Do you really want to quit WinHTTrack Website Copier? WinHTTrack Website Copier beenden? - Mirroring Mode -\n\nEnter address(es) in URL box - Webseiten-Kopiermodus -\n\nAdresse(n) in das URL-Feld eingeben - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Webseiten-Kopiermodus mit Rückfrage -\n\nAdresse(n) in das URL-Feld eingeben - File Download Mode -\n\nEnter file address(es) in URL box - Datei-Download-Modus -\n\nDatei-Adresse(n) in das URL-Feld eingeben - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Link-Prüfmodus -\n\nZu prüfende Adresse(n) in das URL-Feld eingeben - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Aktualisierungs-Modus -\n\nBitte Adresse(n) im URL-Feld kontrollieren, bei Bedarf Parameter prüfen, dann auf 'Weiter' klicken - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Fortsetzungs-Modus (nach Abbruch) -\n\nBitte Adresse(n) im URL-Feld kontrollieren, bei Bedarf Parameter prüfen, dann auf 'Weiter' klicken Log files Path Protokollordner Path Pfad - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Link-Listen-Modus -\n\nBitte in das URL-Feld die Adressen der Seiten eintragen, deren Verknüpfungen aufgelistet werden sollen. New project / Import? Neues Projekt / Importieren? Choose criterion Aktion auswählen Maximum link scanning depth Maximale Verzweigungstiefe Enter address(es) here Adresse(n) hier eintragen Define additional filtering rules Weitere Filterregeln definieren Proxy Name (if needed) Proxy (wenn nötig) Proxy Port Proxy-Port Define proxy settings Proxy-Einstellungen festlegen Use standard HTTP proxy as FTP proxy Standard HTTP-Proxy als FTP-Proxy verwenden Path Pfad Select Path Pfad wählen Path Pfad Select Path Pfad wählen Quit WinHTTrack Website Copier WinHTTrack Website Copier beenden About WinHTTrack Über WinHTTrack Save current preferences as default values Aktuelle Einstellungen als Standard speichern Click to continue Hier klicken zum Weitermachen Click to define options Hier klicken, um Einstellungen vorzunehmen Click to add a URL Hier klicken, um URL hinzuzufügen Load URL(s) from text file URL(s) aus Textdatei laden WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack Einstellungen (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Textdatei mit Adressenliste (*.txt)|*.txt|| File not found! Datei nicht gefunden! Do you really want to change the project name/path? Wollen Sie Namen und Pfad des Projektes ändern? Load user-default options? Benutzer-Standardeinstellungen laden? Save user-default options? Benutzer-Standardeinstellungen speichern? Reset all default options? Alle Standardeinstellungen zurücksetzen? Welcome to WinHTTrack! Willkommen beim WinHTTrack Website Copier! Action: Aktion: Max Depth Maximale Tiefe: Maximum external depth: Maximale externe Tiefe: Filters (refuse/accept links) : Filterregel (Links ein-/ausschließen) : Paths Pfade Save prefs Einstellungen speichern Define.. Festlegen... Set options.. Einstellungen... Preferences and mirror options: Einstellungen und Kopieroptionen: Project name Projektname Add a URL... URL hinzufügen... Web Addresses: (URL) Web-Adressen (URLs): Stop WinHTTrack? WinHTTrack beenden? No log files in %s! Keine Protokolldateien in %s! Pause Download? Übertragung unterbrechen? Stop the mirroring operation Kopiervorgang stoppen Minimize to System Tray Ausblenden (Symbol in Taskleiste) Click to skip a link or stop parsing Anklicken überspringt Verknüpfung oder stoppt den Vorgang Click to skip a link Anklicken überspringt Verknüpfung Bytes saved Gespeicherte Bytes: Links scanned Bearbeitete Verknüpfungen: Time: Zeit: Connections: Verbindungen: Running: Aktiv: Hide Minimieren Transfer rate Übertragungsrate: SKIP AUSLASSEN Information Information Files written: Geschriebene Dateien: Files updated: Aktualisierte Dateien: Errors: Fehler: In progress: In Bearbeitung: Follow external links Externe Verknüpfungen durchsuchen Test all links in pages Alle Verknüpfungen prüfen Try to ferret out all links Allen Verknüpfungen zu folgen versuchen Download HTML files first (faster) HTML-Dateien zuerst laden (schneller) Choose local site structure Lokale Seitenstruktur wählen Set user-defined structure on disk Lokale Seitenstruktur selbst definieren Use a cache for updates and retries Zwischenspeicher für Aktualisierungen und Wiederaufnahme nutzen Do not update zero size or user-erased files Vom Benutzer gelöschte oder leere Dateien nicht aktualisieren Create a Start Page Startseite erstellen Create a word database of all html pages Liste mit allen Wörtern in den HTML-Seiten anlegen Create error logging and report files Fehlerprotokoll und Ablaufbericht erstellen Generate DOS 8-3 filenames ONLY NUR Namen im Format DOS 8+3 generieren Generate ISO9660 filenames ONLY for CDROM medias ISO9660-Dateinamen NUR für CDROMs erzeugen Do not create HTML error pages Keine HTML-Fehlerseiten erstellen Select file types to be saved to disk Dateitypen wählen, die gespeichert werden sollen Select parsing direction Suchreihenfolge wählen Select global parsing direction Allgemeine Suchreihenfolge wählen Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Einstellen der Regeln zum Anpassen von URLs für interne (heruntergeladene) und externe (nicht heruntergeladene) Verknüpfungen Max simultaneous connections Maximale Zahl der Verbindungen File timeout Maximale Wartezeit für Dateien Cancel all links from host if timeout occurs Bei Überschreiten der Wartezeit alle Verknüpfungen zu diesem Host abbrechen Minimum admissible transfer rate Niedrigste geduldete Übertragungsrate Cancel all links from host if too slow Alle Verknüpfungen zu einem Host abbrechen, der zu langsam ist Maximum number of retries on non-fatal errors Maximale Zahl der Wiederholungsversuche bei nicht fatalem Fehler Maximum size for any single HTML file Maximale Größe einer HTML-Datei Maximum size for any single non-HTML file Maximale Größe einer Nicht-HTML-Datei Maximum amount of bytes to retrieve from the Web Maximalzahl der Bytes, die geholt werden sollen Make a pause after downloading this amount of bytes Pause einlegen, wenn die Anzahl heruntergeladener Bytes größer wird als Maximum duration time for the mirroring operation Höchstdauer des gesamten Kopiervorgangs Maximum transfer rate Maximale Übertragungsrate Maximum connections/seconds (avoid server overload) Maximalzahl der Verbindungen pro Sek. (verhindert Server-Überlastung) Maximum number of links that can be tested (not saved!) Wie viele Links sollen maximal geprüft werden? (Kein Limit für Speicherung!) Browser identity Browser-Kennung Comment to be placed in each HTML file Kommentar, einzufügen in jede HTML-Datei Back to starting page Zurück zur Startseite Save current preferences as default values Aktuelle Einstellungen als Standard speichern Click to continue Klicken, um fortzufahren Click to cancel changes Klicken, um Änderungen rückgängig zu machen Follow local robots rules on sites Lokalen Robot-Regeln auf den Seiten Folge leisten Links to non-localised external pages will produce error pages Verknüpfungen zu nicht kopierten externen Seiten führen zu Fehlerseiten Do not erase obsolete files after update Nach Aktualisierung überflüssige Dateien nicht löschen Accept cookies? Cookies annehmen? Check document type when unknown? Dokumenttyp prüfen, wenn unbekannt? Parse java applets to retrieve included files that must be downloaded? Java-Applets nach Verknüpfungen zu Dateien durchsuchen, die geladen werden müssen? Store all files in cache instead of HTML only Alle Dateien in Zwischenspeicher schreiben, nicht nur HTML-Dateien Log file type (if generated) Dateityp des Protokolls (falls generiert) Maximum mirroring depth from root address Maximale Suchtiefe ab der erste Adresse Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximale Suchtiefe für externe/verbotene Adressen. (Standard ist 0, also keine externe Suche.) Create a debugging file Datei für Fehlersuche erstellen Use non-standard requests to get round some server bugs Nicht-standardisierte Anfragen erzeugen (umschifft einzelne Server-Fehler) Use old HTTP/1.0 requests (limits engine power!) Alten Standard HTTP/1.0 benutzen (begrenzt das Arbeitstempo!) Attempt to limit retransfers through several tricks (file size test..) Versuche, mit verschiedenen Tricks die Zahl der Re-Transfers zu begrenzen (Prüfung der Dateigröße...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Externe Verknüpfungen ohne Benutzername/Passwort eintragen Write internal links without query string Interne Verknüpfungen ohne Abfragetext schreiben Get non-HTML files related to a link, eg external .ZIP or pictures Verknüpfte Nicht-HTML-Dateien laden (Bsp: .ZIP oder Bilder von außerhalb) Test all links (even forbidden ones) Alle Verknüpfungen testen (auch verbotene) Try to catch all URLs (even in unknown tags/code) Alle URLs zu finden versuchen (auch in unbekannten Tags und Scripts) Get HTML files first! HTML-Dateien zuerst laden! Structure type (how links are saved) Strukturtyp (Wie Verknüpfungen gespeichert werden) Use a cache for updates Zwischenspeicher für Aktualisierungen benutzen Do not re-download locally erased files Dateien nicht erneut laden, die lokal gelöscht wurden Make an index Index erstellen Make a word database Wortliste anlegen Log files Protokolldateien DOS names (8+3) DOS-Namen (8+3) ISO9660 names (CDROM) ISO9660-Namen (CDROM) No error pages Keine Fehlerseiten Primary Scan Rule Haupt-Filterregel Travel mode Suchmethode Global travel mode Globale Suchmethode These options should be modified only exceptionally Normalerweise solten diese Einstellungen nicht geändert werden. Activate Debugging Mode (winhttrack.log) Fehlersuch-Modus aktivieren (winhttrack.log) Rewrite links: internal / external Adressbezüge anpassen: intern / extern Flow control Flusskontrolle Limits Begrenzungen Identity Identität HTML footer HTML-Fußzeile N# connections Anzahl Verbindungen Abandon host if error Host bei Fehler aufgeben Minimum transfer rate (B/s) Minimale Übertragungsrate (B/s) Abandon host if too slow Host aufgeben, wenn zu langsam Configure Konfigurieren Use proxy for ftp transfers Proxy für FTP-Übertragungen nutzen TimeOut(s) Timeout(s) Persistent connections (Keep-Alive) Verbindungen halten (Keep-alive) Reduce connection time and type lookup time using persistent connections Offen gehaltene Verbindungen reduzieren Verbindungszeit und Zeit für Typsuche Retries Wiederholungen Size limit Größenbegrenzung Max size of any HTML file (B) Max. Anzahl Bytes von HTML-Dateien Max size of any non-HTML file Max. Größe einer Nicht-HTML-Datei Max site size Max. Größe der Website Max time Maximale Zeit Save prefs Einstellungen speichern Max transfer rate Maximale Übertragungsrate Follow robots.txt Regeln in robots.txt folgen No external pages Keine externen Seiten Do not purge old files Alte Dateien nicht löschen Accept cookies Cookies annehmen Check document type Dokumenttyp prüfen Parse java files JAVA-Dateien analysieren Store ALL files in cache ALLE Dateien zwischenspeichern Tolerant requests (for servers) Tolerante Anfragen (für Server) Update hack (limit re-transfers) Aktualisierungstrick (Re-Transfers begrenzen) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Alte HTTP/1.0-Anfragen erzwingen (nicht 1.1) Max connections / seconds Max. Anzahl Verbindungen pro Sek. Maximum number of links Höchstzahl der Links Pause after downloading.. Nach dem Download warten... Hide passwords Passwörter verbergen Hide query strings Abfragetext nicht anzeigen Links Verknüpfungen Build Struktur Experts Only Experten Flow Control Flusskontrolle Limits Grenzwerte Browser ID Browser ID Scan Rules Filterregeln Spider Spider Log, Index, Cache Protokoll, Index, Cache Proxy Proxy MIME Types MIME-Typen Do you really want to quit WinHTTrack Website Copier? WinHTTrack Website Copier beenden? Do not connect to a provider (already connected) Nicht mit Provider verbinden (schon verbunden) Do not use remote access connection Keine Remote-Access-Verbindung benutzen Schedule the mirroring operation Kopierzeitpunkt festlegen Quit WinHTTrack Website Copier WinHTTrack Website Copier beenden Back to starting page Zurück zur Startseite Click to start! Zum Starten klicken! No saved password for this connection! Kein gespeichertes Passwort für diese Verbindung! Can not get remote connection settings Verbindungseinstellungen können nicht ermittelt werden Select a connection provider Verbindungsprovider auswählen Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Bitte korrigieren Sie die Verbindungseinstellungen, wenn nötig,\nund klicken Sie auf 'Fertig stellen', um den Kopiervorgang zu starten. Save settings only, do not launch download now. Nur Einstellungen speichern; Download jetzt nicht starten On hold Angehalten Transfer scheduled for: (hh/mm/ss) Übertragung geplant für: (hh/mm/ss) Start START Connect to provider (RAS) Mit Provider verbinden (RAS) Connect to this provider Mit diesem Provider verbinden Disconnect when finished Nach der Aktion Verbindung trennen Disconnect modem on completion Modemverbindung trennen, wenn fertig \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Bitte benachrichtigen Sie uns über Fehler und Probleme)\r\n\r\nEntwicklung:\r\nOberfläche (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for German translations to:\r\nRainer Klueting (rainer@klueting.de) About WinHTTrack Website Copier Über WinHTTrack Website Copier Please visit our Web page Besuchen Sie unsere Webseite! Wizard query Assistenten-Abfrage Your answer: Ihre Antwort: Link detected.. Verknüpfung gefunden... Choose a rule Regel wählen Ignore this link Diesen Link ignorieren Ignore directory Ordner ignorieren Ignore domain Domain ignorieren Catch this page only Nur diese Seite holen Mirror site Webseiten-Kopie Mirror domain Domain-Kopie Ignore all Keine Links Wizard query Assistenten-Abfrage NO NEIN File Datei Options Optionen Log Protokoll Window Fenster Help Hilfe Pause transfer Übertragung anhalten Exit Beenden Modify options Optionen ändern View log Protokoll anzeigen View error log Fehlerprotokoll anzeigen View file transfers Dateiübertragung anzeigen Hide Minimieren About WinHTTrack Website Copier Über WinHTTrack Website Copier Check program updates... Nach neuer Version suchen... &Toolbar &Werkzeugleiste &Status Bar &Statusleiste S&plit &Teilen File Datei Preferences Optionen Mirror Site-Kopie Log Protokoll Window Fenster Help Hilfe Exit Beenden Load default options Standardeinstellungen laden Save default options Standardeinstellungen speichern Reset to default options Standardeinstellungen löschen Load options... Einstellungen laden... Save options as... Einstellungen speichern als... Language preference... Spracheinstellungen... Contents... Inhalt... About WinHTTrack... Über WinHTTrack Website Copier... New project\tCtrl+N &Neues Projekt\tStrg+N &Open...\tCtrl+O Ö&ffnen...\tStrg+O &Save\tCtrl+S &Speichern\tStrg+S Save &As... Speichern &unter... &Delete... &Löschen... &Browse sites... &Webseiten anzeigen... User-defined structure Benutzerdefinierte Struktur %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tName der Datei ohne Dateityp (Bsp: Bild)\r\n%N\tName der Datei, mit Dateityp (Bsp: Bild.gif)\r\n%t\tDateityp (Bsp: gif)\r\n%p\tPfad [ohne letzten /] (Bsp: /Bilder)\r\n%h\tDomainname (Bsp: www.someweb.com)\r\n%M\tURL MD5 (128 Bits, 32 ASCII-Bytes)\r\n%Q\tAbfragetext MD5 (128 Bits, 32 ASCII-Bytes)\r\n%q\tKurzer Abfragetext MD5 (16 Bits, 4 ASCII-Bytes)\r\n\r\n%s?\tKurzname DOS(ex: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Beispiel:\t%h%p/%n%q.%t\n->\t\tc:\\Spiegelung\\www.someweb.com\\Bilder\\Bild.gif Proxy settings Proxy-Einstellungen Proxy address: Proxy-Adresse: Proxy port: Proxy-Port: Authentication (only if needed) Authentifizierung (nur wenn benötigt) Login Benutzername (Login) Password Passwort Enter proxy address here Proxy-Adresse hier eintragen Enter proxy port here Proxy-Port hier eintragen Enter proxy login Benutzernamen für Proxy hier eintragen Enter proxy password Passwort für Proxy hier eintragen Enter project name here Projektnamen hier eintragen Enter saving path here Hier den Pfad für das Projekt eintragen Select existing project to update Vorhandenes Projekt zum Aktualisieren auswählen Click here to select path Hier klicken, um einen Pfad auszuwählen Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Projektassistent New project name: Neuer Projektname: Existing project name: Existierender Projektname: Project name: Projektname: Base path: Basisverzeichnis: Project category: C:\\My Web Sites C:\\Meine Webseiten Type a new project name, \r\nor select existing project to update/resume Neuen Projektnamen eintragen, \r\noder existierendes Projekt zum Aktualisieren oder zur Wiederaufnahme auswählen New project Neues Projekt Insert URL URL eintragen: URL: URL: Authentication (only if needed) Authentifikation (nur wenn benötigt) Login Benutzername (Login): Password Passwort: Forms or complex links: Formulare oder komplexe Links: Capture URL... Hole URL... Enter URL address(es) here URL hier eintragen Enter site login Benutzername für Web-Site Enter site password Passwort für Web-Site Use this capture tool for links that can only be accessed through forms or javascript code Verwenden Sie diese Funktion, um verknüpfte Seiten zu holen, die nur über Formulare oder JavaScript-Code zu erreichen sind. Choose language according to preference Sprache einstellen Catch URL! Diese URL holen! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Ändern Sie bitte die Proxy-Einstellungen des Browsers vorübergehend wie folgt: (Proxy-Adresse und -Port von hier kopieren)\nKlicken Sie dann im Browser auf den Schalter Submit/Absenden o.ä. des Formulars oder auf die spezielle Verknüpfung, die Sie laden wollen. This will send the desired link from your browser to WinHTTrack. Dadurch wird die verknüpfte Information vom Browser zu WinHTTrack übertragen. ABORT ABBRECHEN Copy/Paste the temporary proxy parameters here Die temporären Proxyeinstellungen von hier kopieren Cancel Abbrechen Unable to find Help files! Kann Hilfedateien nicht finden! Unable to save parameters! Kann Parameter nicht speichern! Please drag only one folder at a time Bitte immer nur einen Ordner einfügen Please drag only folders, not files Bitte nur Ordner einfügen, keine Dateien Please drag folders only Bitte nur Ordner einfügen Select user-defined structure? Benutzerdefinierte Struktur für Site-Kopie wählen? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Bitte prüfen Sie, ob die benutzerdefinierte Zeichenkette korrekt ist.\nAndernfalls entstehen unsinnige Dateinamen. Do you really want to use a user-defined structure? Möchten Sie wirklich eine benutzerdefinierte Struktur wählen? Too manu URLs, cannot handle so many links!! Zu viele URLs! So viele Links können nicht bearbeitet werden! Not enough memory, fatal internal error.. Nicht genug Speicher. Kritischer interner Fehler... Unknown operation! Unbekannte Operation! Add this URL?\r\n Diese URL hinzufügen?\r\n Warning: main process is still not responding, cannot add URL(s).. Warnung: Hauptprozess antwortet nicht; kann keine URLs hinzufügen. Type/MIME associations Typ/MIME-Verknüpfungen File types: Dateitypen: MIME identity: MIME-Entsprechung Select or modify your file type(s) here Dateityp(en) hier auswählen oder ändern Select or modify your MIME type(s) here MIME-Entsprechung(en) hier auswählen oder ändern Go up Nach oben Go down Nach unten File download information Informationen zum Datei-Download Freeze Window Fenster fixieren More information: Weitere Informationen: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Willkommen beim WinHTTrack Website Copier!\n\nBitte auf WEITER klicken,\n\n- um ein neues Projekt zu beginnen\n- oder einen unterbrochenen Kopiervorgang\n wieder aufzunehmen. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Dateityp:\nDateiname enthält:\nDiese Datei:\nPfadname enthält:\nDieser Pfad:\nLinks zu dieser Domain:\nDomainname enthält:\nLinks zu diesem Server:\nLink enthält:\nDieser Link:\nALLE LINKS Show all\nHide debug\nHide infos\nHide debug and infos Alles zeigen\nInfos für Fehlersuche speichern\nAllgemeine Hinweise speichern\nFehler und Hinweise speichern Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Site-Struktur (Standard)\nHtml in web/, Bilder und anderes in web/images/\nHtml in web/html, Bilder und anderes in web/images\nHtml in web/, Bilder und anderes in web/\nHtml in web/, Bilder und anderes in web/xxx, mit xxx wie Dateityp\nHtml in web/html, Bilder und anderes in web/xxx\nSite-Struktur, ohne www.domain.xxx/\nHtml in site_name/, Bilder und anderes in site_name/images/\nHtml in site_name/html, Bilder und anderes in site_name/images\nHtml in site_name/, Bilder und anderes in site_name/\nHtml in site_name/, Bilder und anderes in site_name/xxx\nHtml in site_name/html, Bilder und anderes in site_name/xxx\nAlle Dateien in web/, mit Zufallsnamen (Spielerei!)\nAlle Dateien in site_name/, mit Zufallsnamen (Spielerei!)\nBenutzerdefinierte Struktur... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Nur Verknüpfungen analysieren\nHTML-Dateien speichern\nNicht-HTML-Dateien speichern\nAlle Dateien speichern (Standard)\nZuerst HTML-Dateien speichern Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Im selben Ordner bleiben\nKann nach unten gehen (Standard)\nKann nach oben gehen\nKann nach oben und unten gehen Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Bei Adresse bleiben (Standard)\nIn Domain bleiben\nIn Top-Level-Domain bleiben\nFreie Suche überall im Web Never\nIf unknown (except /)\nIf unknown Nie\nWenn unbekannt (ohne /)\nWenn unbekannt no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Regeln in robots.txt ignorieren\nrobots.txt folgen, außer Filtern\nRegeln in robots.txt folgen normal\nextended\ndebug Normal\nErweitert\nFehlersuche Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Automatische Web-Site-Kopie\nWeb-Site-Kopie mit Rückfrage\nSpezielle Dateien laden\nZu allen Links verzweigen (Kopie mehrerer Sites)\nLinks auf den Seiten testen (Lesezeichen prüfen)\n* Unterbrochenen Kopiervorgang fortsetzen\n* Vorhandene Kopie aktualisieren Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relative URL / Absolute URL (Standard)\nAbsolute URL / Absolute URL\nAbsolute URL / Absolute URL\nUnveränderte URL / Unveränderte URL Open Source offline browser Open source Offline-Browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. Webseiten-Kopierer/Offline-Browser. Kopien kompletter Internetangebote auf dem eigenen PC erstellen. Freeware httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) URL Liste (.txt) Previous Zurück Next Weiter URLs URLs Warning Warnung Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Ihr Browser unterstützt kein Javascript, oder es ist abgeschaltet. Eine bessere Darstellung erhalten Sie mit einem Javascript-fähigen Browser. Thank you Vielen Dank You can now close this window Sie können dieses Fenster jetzt schließen Server terminated Der Server wurde beendet A fatal error has occurred during this mirror Fataler Fehler während der Webseiten-Kopie Proxy type: Proxy-Typ: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxy-Protokoll. HTTP: normaler Proxy. HTTP (CONNECT-Tunnel): sendet jede Anfrage durch einen CONNECT-Tunnel, für Proxys, die nur CONNECT unterstützen, wie Tors HTTPTunnelPort. SOCKS5: Standardport 1080. Load cookies from file: Cookies aus Datei laden: Preload cookies from a Netscape cookies.txt file before crawling. Cookies aus einer Netscape-cookies.txt-Datei laden, bevor das Crawlen beginnt. Pause between files: Pause zwischen Dateien: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Zufällige Verzögerung zwischen Datei-Downloads, in Sekunden. MIN:MAX für einen Zufallsbereich verwenden (z. B. 2:8). Keep the www. prefix (do not merge www.host with host) www.-Präfix beibehalten (www.host nicht mit host zusammenführen) Do not treat www.host and host as the same site. www.host und host nicht als dieselbe Website behandeln. Keep double slashes in URLs Doppelte Schrägstriche in URLs beibehalten Do not collapse duplicate slashes in URLs. Doppelte Schrägstriche in URLs nicht zusammenführen. Keep the original query-string order Ursprüngliche Reihenfolge des Query-Strings beibehalten Do not reorder query-string parameters when deduplicating URLs. Query-String-Parameter beim Entfernen doppelter URLs nicht neu anordnen. Strip query keys: Query-Schlüssel entfernen: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Kommagetrennte Query-Schlüssel, die bei der Benennung gespeicherter Dateien entfallen (z. B. sid,utm_source). Write a WARC archive of the crawl WARC-Archiv des Crawls schreiben Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Jede heruntergeladene Antwort zusätzlich in einem ISO-28500-WARC/1.1-Archiv neben dem Spiegel speichern. WARC archive name: Name des WARC-Archivs: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Optionaler Basisname für das WARC-Archiv; leer lassen, um es automatisch im Ausgabeverzeichnis zu benennen. httrack-3.49.14/lang/Dansk.txt0000644000175000017500000011525015230602340011536 LANGUAGE_NAME Dansk LANGUAGE_FILE Dansk LANGUAGE_ISO da LANGUAGE_AUTHOR Jesper Bramm (bramm@get2net.dk)\r\nscootergrisen\r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Danish OK OK Cancel Annullér Exit Afslut Close Luk Cancel changes Annullér ændringer Click to confirm Klik for at bekræfte Click to get help! Klik for at få hjælp! Click to return to previous screen Klik for at gå til den forrige skærm Click to go to next screen Klik for at gå til den næste skærm Hide password Skjul adgangskode Save project Gem projekt Close current project? Vil du lukke det aktuelle projekt? Delete this project? Slette dette projekt? Delete empty project %s? Vil du slette det tomme projekt med navnet: %s? Action not yet implemented Denne handling er endnu ikke implementeret Error deleting this project Der opstod fejl under sletningen af dette projekt Select a rule for the filter Vælg en regel til filteret Enter keywords for the filter Indtast nøgleord til filteret Cancel Annullér Add this rule Tilføj denne regel Please enter one or several keyword(s) for the rule Indtast et eller flere nøgleord for denne regel Add Scan Rule Tilføj en skanningsregel Criterion Kriterie: String Streng Add Tilføj Scan Rules Skanningsregler Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Brug 'Jokertegn' [ * ] til at udelukke eller medtage URL' er eller links.\nDu kan indsætte flere skanningsstrenge i samme linje.\nBrug mellemrum som separatortegn.\n\nEksempel: +*.zip -www.*.dk -www.*.edu/cgi-bin/*.cgi Exclude links Udeluk link(s) Include link(s) Medtag link(s) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tip: for at medtage ALLE GIF-filer, så prøv at bruge: +www.eksempel.dk/*.gif. \n(+*.gif / -*.gif inkluderer/ekskluderer ALLE GIF-filer fra ALLE steder) Save prefs Gem foretrukne indstillinger Matching links will be excluded: Matchende links udelukkes Matching links will be included: Matchende links medtages: Example: Eksempel: gif\r\nWill match all GIF files gif\r\nVil matche alle .GIF filer blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' gul\r\nMedtager alle filer med en matchende 'gul'-understreng, såsom 'gulsky-lille.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' storfil.mov\r\nVil medtage filen 'storfil.mov', men ikke filen 'storfil2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nvil finde links med mappenavne der matcher understrengen 'cgi', såsom /cgi-bin/nogetcgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nvil finde links med mappenavne der matcher hele tekststrengen 'cgi-bin', men ikke 'cgi-bin-2' someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. eksempel.dk\r\nFinder links med matchende understreng, såsom www.eksempel.dk, privat.eksempel.dk osv. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. eksempel\r\nFinder links med matchende mappe-understreng, såsom www.eksempel.dk, www.eksempel.edu, privat.eksempel.andetweb.dk osv. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.eksempel.dk\r\nFinder links der matcher hele understrengen 'www.eksempel.dk' , (men IKKE links, såsom privat.eksempel.dk/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. eksempel\r\nFinder ethvert link med matchende understreng, såsom www.eksempel.dk/.., www.test.abc/franogetweb/index.html, www.test.abc/test/eksempel.html osv. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.dk/test/eksempel.html\r\nFinder kun 'www.test.dk/test/eksempel.html' file. Bemærk at du skal skrive den fulde sti [URL + stedsti] All links will match Alle links vil matche Add exclusion filter Tilføj udelukkelses-filter Add inclusion filter Tilføj et inkluderings-filter Existing filters Eksisterende filtre Cancel changes Annullér ændringer Save current preferences as default values Gem aktuelle præferencer som standardværdier Click to confirm Klik for at bekræfte No log files in %s! Der findes ingen logfil i %s! No 'index.html' file in %s! Der er ikke nogen 'index.html'-fil i %s! Click to quit WinHTTrack Website Copier Klik for at afslutte WinHTTrack Website Copier View log files Vis logfiler Browse HTML start page Se HTML-startside End of mirror Slut på spejlkopiering View log files Vis logfiler Browse Mirrored Website Gennemse spejlkopieret websted New project... Nyt projekt... View error and warning reports Vis rapport med fejl og advarsler View report Vis rapport Close the log file window Luk logfil vinduet Info type: Informationstype Errors Fejl Infos Information Find Søg Find a word Søg efter et ord Info log file Info logfil Warning/Errors log file Advarsel/fejl-logfil Unable to initialize the OLE system Kan ikke starte OLE-systemet WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack kunne ikke finde nogen afbrudte download filcache i den angivne mappe! Could not connect to provider Kunne ikke oprette forbindelse til udbyder receive modtager request anmoder connect opret forbindelse search søger ready klar error fejl Receiving files.. Modtager filer... Parsing HTML file.. Overfører HTML-fil... Purging files.. Sletter filer... Loading cache in progress.. Indlæser cache... Parsing HTML file (testing links).. Overfører HTML-fil (tester links)... Pause - Toggle [Mirror]/[Pause download] to resume operation Pause - Vælg [Spejlkopiér]/[Sæt download på pause] for at genoptage overførslen Finishing pending transfers - Select [Cancel] to stop now! Afslutter igangværende overførsler - Vælg [Annullér] for at afslutte nu! scanning skanner Waiting for scheduled time.. Venter på planlagt tidspunkt... Transferring data.. Overfører data... Connecting to provider Opretter forbindelse til udbyder [%d seconds] to go before start of operation [%d sekunder] inden denne handling starter Site mirroring in progress [%s, %s bytes] Igangværende spejlkopiering af sted [%s, %s byte] Site mirroring finished! Spejlkopieringen af sted er afsluttet! A problem occurred during the mirroring operation\n Der opstod et problem under spejlkopieringen\n \nDuring:\n \nSamtidigt:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Se eventuelt logfilen.\n\nKlik på UDFØR for at afslutte WinHTTrack Website Copier.\n\nTak for at du brugte WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Spejlkopieringen fuldført.\nKlik på Afslut for at afslutte WinHTTrack.\nSe logfil(erne) for at sikre at alt forløb OK.\n\nTak for at du brugte WinHTTrack!\r\n * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * SPEJLKOPIERING AFBRUDT! * *\r\nDen aktuelle cache er påkrævet for alle opdaterings operationer og indeholder kun data der er downloadet med den aktuelle afbrudte session.\r\nDen tidligere cache kan indeholde mere fyldestgørende information; hvis du ønsker at bevare den information, skal du gendanne den og slette den aktuelle cache.\r\n[Bemærk: dette kan nemt gøres ved at slette 'hts-cache/new.* files]\r\n\r\nTror du den tidligere cache-fil muligvis indeholder mere fyldestgørende information, og vil du gendanne denne? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * SPEJLKOPIERINGS FEJL! * *\r\nWinHTTrack har opdaget at den igangværende spejlkopiering er tom. Hvis du var i gang med at opdatere, vil den tidligere spejlkopiering blive gendannet.\r\nMulig årsag: den første side kunne enten ikke findes eller der opstod et problem med forbindelsen.\r\n=> Kontroller at webstedet findes og/eller kontroller proxy-indstillingerne! <= \n\nTip: Click [View log file] to see warning or error messages \n\nTip: klik på [Vis logfil] for at se advarsels- og fejlmeddelelser Error deleting a hts-cache/new.* file, please do it manually Der opstod en fejl i forbindelse med sletningen af hts-cache/new.*filen. Slet venligst filen manuelt. Do you really want to quit WinHTTrack Website Copier? Er du sikker på, at du vil afslutte WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Spejlkopieringstilstand -\n\nIndtast adresse(r) i URL-feltet - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktiv guide-tilstand (spørgsmål) -\n\nIndtast adresse(r) i URL-feltet - File Download Mode -\n\nEnter file address(es) in URL box - Fil-download-tilstand-\n\nIndtast adresse(r) i URL-feltet - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Links test tilstand-\n\nIndtast webadresse(r) med links til test i URL-feltet - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Opdateringstilstand -\n\nBekræft adresse(r) i URL-feltet. Tjek eventuelt dine indstillinger og klik derefter på 'Næste'. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Genoptag kopiering (hvis overførslen blev afbrudt) -\n\nBekræft adresse(r) i URL-feltet. Tjek eventuelt dine indstillinger og klik derefter på 'Næste'. Log files Path Stinavn for logfil Path Sti - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Links liste -\n\nBrug URL-feltet til at angive adresse(r) på sider der indeholder links som skal spejlkopieres. New project / Import? Nyt projekt / Importér? Choose criterion Vælg kriterier Maximum link scanning depth Maksimal skanningsdybde for links Enter address(es) here Indtast adresse(r) her Define additional filtering rules Tilføj yderligere filtreringsregler Proxy Name (if needed) Proxy-navn (om nødvendigt) Proxy Port Proxy portnummer Define proxy settings Angiv proxy-indstillinger Use standard HTTP proxy as FTP proxy Brug standard HTTP proxy som FTP-proxy Path Sti Select Path Vælg sti Path Sti Select Path Vælg sti Quit WinHTTrack Website Copier Afslut WinHTTrack Website Copier About WinHTTrack Om WinHTTrack Save current preferences as default values Gem de aktuelle præferencer som standardværdier Click to continue Klik for at fortsætte Click to define options Klik for at definere valgmuligheder Click to add a URL Klik for at tilføje en URL Load URL(s) from text file Indlæs URL(er) fra tekstfil WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack-præferencer (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Adresseliste-tekstfil (*.txt)|*.txt|| File not found! Filen blev ikke fundet! Do you really want to change the project name/path? Er du sikker på, at ændre i projekt/sti-navnet? Load user-default options? Indlæs brugerdefinerede valgmuligheder? Save user-default options? Gem brugerdefinerede valgmuligheder? Reset all default options? Nulstil alle valgmuligheder? Welcome to WinHTTrack! Velkommen til WinHTTrack! Action: Handling: Max Depth Maksimal dybde: Maximum external depth: Maksimal ekstern dybde: Filters (refuse/accept links) : Filtrerings-regel (udeluk/medtag links): Paths Sti Save prefs Gem indstillinger Define.. Angiv... Set options.. Angiv valgmuligheder... Preferences and mirror options: Præferencer og spejlkopiering-valgmuligheder: Project name Projektnavn Add a URL... Tilføj URL... Web Addresses: (URL) Webadresser: (URL) Stop WinHTTrack? Stop WinHTTrack? No log files in %s! Der er ikke nogen logfiler i %s! Pause Download? Sæt download på pause? Stop the mirroring operation Stop spejlkopieringen? Minimize to System Tray Minimér til proceslinjen Click to skip a link or stop parsing Klik for at springe et link over eller stoppe overførslen Click to skip a link Klik for at springe et link over Bytes saved Byte gemt: Links scanned Links skannet: Time: Tid: Connections: Forbindelser: Running: Kører: Hide Minimér Transfer rate Overfør. hastighed SKIP Spring over Information Informationer Files written: Filer skrevet: Files updated: Filer opdateret: Errors: Fejl: In progress: Arbejder: Follow external links Følg eksterne links Test all links in pages Test alle links på siderne Try to ferret out all links Prøv at udvide alle links Download HTML files first (faster) Download HTML-filer først (hurtigere) Choose local site structure Vælg lokal sted-struktur Set user-defined structure on disk Sæt brugerdefinerede indstillinger for den lokale struktur Use a cache for updates and retries Brug cache til opdateringer og opdateringsforsøg Do not update zero size or user-erased files Opdater ikke filer med nul-værdi eller filer som brugeren har slettet Create a Start Page Opret en startside Create a word database of all html pages Opret en ord-database af alle html-sider Build a complete RFC822 mail (MHT/EML) archive of the mirror Byg et komplet RFC822 mail (MHT/EML)-arkiv af spejlkopieringen Create error logging and report files Lav fejllog og rapport-filer Generate DOS 8-3 filenames ONLY Generér KUN DOS-8-3-filnavne Generate ISO9660 filenames ONLY for CDROM medias Generér KUN ISO9660-filnavne for CDROM-medier Do not create HTML error pages Opret ikke HTML-fejlsider Select file types to be saved to disk Vælg filtyper der skal gemmes på disken Select parsing direction Vælg overførselsretning Select global parsing direction Vælg overordnet overførselsretning Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Opsæt URL-genskrivningsregel for interne links (downloadede links), og eksterne links (ikke downloadede) Max simultaneous connections Maks.antal samtidige forbindelser File timeout Fil time-out Cancel all links from host if timeout occurs Annullér alle links hvis time-out opstår hos vært Minimum admissible transfer rate Mindste acceptable overførselshastighed Cancel all links from host if too slow Annullér alle links hvis værten er for langsom Maximum number of retries on non-fatal errors Maksimal antal forsøg efter ikke-fatale fejl Maximum size for any single HTML file Maksimal størrelse for enkelte HTML-filer Maximum size for any single non-HTML file Maksimal størrelse for ikke-HTML-filer Maximum amount of bytes to retrieve from the Web Maksimal antal byte der modtages fra webbet Make a pause after downloading this amount of bytes Hold pause efter download af denne mængde byte Maximum duration time for the mirroring operation Maksimal varighed for spejlkopieringen Maximum transfer rate Maksimal overførselshastighed Maximum connections/seconds (avoid server overload) Maksimal antal forbindelser/sekunder (for at undgå server overbelastning) Maximum number of links that can be tested (not saved!) Maksimal antal links der kan testes (ikke gemt!) Browser identity Browser-identitet Comment to be placed in each HTML file Kommentarer der indsættes i alle HTML-filer Languages accepted by the browser Sprog som accepteres af browseren Additional HTTP headers to be sent in each requests Yderligere HTTP-headere som skal sendes i hver forespørgsel HTTP referer to be sent for initial URLs HTTP reference som skal sendes for indledende URL'er Back to starting page Tilbage til startsiden Save current preferences as default values Gem aktuelle præferencer som standardværdier Click to continue Klik for at fortsætte Click to cancel changes Klik for at annullere ændringerne Follow local robots rules on sites Følg lokale robot-regler på steder Links to non-localised external pages will produce error pages Links til ikke-fundne eksterne sider, vil medføre fejlside(r) Do not erase obsolete files after update Slet ikke forældede filer efter opdatering Accept cookies? Acceptér cookies? Check document type when unknown? Tjek dokumenttypen hvis ukendt? Parse java applets to retrieve included files that must be downloaded? Overfør Java-applets sammen med inkluderede filer der skal downloades? Store all files in cache instead of HTML only Opbevar alle filer i cache fremfor kun HTML? Log file type (if generated) Log filtype (hvis genereret) Maximum mirroring depth from root address Maksimal spejlkopieringsdybde fra rod-adressen Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maksimal spejlkopieringsdybde for eksterne/forbudte adresser(0, altså ingen, er standard) Create a debugging file Opret en fejlfindings-fil Use non-standard requests to get round some server bugs Brug ikke-standard forespørgsler for at omgå server-fejl Use old HTTP/1.0 requests (limits engine power!) Brug gamle HTTP/1.0-type forespørgsler (begrænser effektiviteten!) Attempt to limit retransfers through several tricks (file size test..) Forsøg at begrænse gen-overførsler gennem brug af 'tricks' (test af filstørrelse...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Forsøg at begrænse antallet af links, ved at ignorer lignende URL'er (www.foo.dk==foo.dk, http=https ..) Write external links without login/password Skriv eksterne links uden brug af brugernavn/adgangskode Write internal links without query string Skriv interne links uden forespørgsels-streng Get non-HTML files related to a link, eg external .ZIP or pictures Hent ikke-HTML-filer relateret til et link, eksempelvis .ZIP -filer eller billeder Test all links (even forbidden ones) Test alle links (også forbudte links) Try to catch all URLs (even in unknown tags/code) Forsøg at fange alle URL'er (også i ukendte opmærkninger/kode) Get HTML files first! Hent HTML-filer først! Structure type (how links are saved) Angiv struktur (hvordan links skal gemmes) Use a cache for updates Brug cache for opdateringer Do not re-download locally erased files Download ikke filer igen der er slettet lokalt Make an index Opret et indeks Make a word database Opret en ord-database Build a mail archive Byg et mail-arkiv Log files Logfiler DOS names (8+3) DOS-navne (8+3) ISO9660 names (CDROM) ISO9660-navne (CDROM) No error pages Ingen fejl-sider Primary Scan Rule Primær skanningsregel Travel mode Søgemetode Global travel mode Global søgemetode These options should be modified only exceptionally Disse valgmuligheder bør kun ændres undtagelsesvist Activate Debugging Mode (winhttrack.log) Aktivér fejlfindingstilstand (winhttrack.log) Rewrite links: internal / external Genskriv links: internt/eksternt Flow control Flow-kontrol Limits Begrænsninger Identity Identitet HTML footer HTML-sidefod Languages Languages Additional HTTP Headers Yderligere HTTP Headere Default referer URL Standard reference URL N# connections Antal forbindelser Abandon host if error Forlad vært hvis der opstår fejl Minimum transfer rate (B/s) Mindste overførselshastighed (B/s) Abandon host if too slow Forlad værten hvis denne er for langsom Configure Konfigurer Use proxy for ftp transfers Brug proxy til FTP-overførsler TimeOut(s) Timeout(s) Persistent connections (Keep-Alive) Vedvarende forbindelser (Keep-Alive) Reduce connection time and type lookup time using persistent connections Reducér forbindelsestid og typeopslagstid, ved at anvende vedvarende forbindelser Retries Antal forsøg Size limit Størrelsesbegrænsning Max size of any HTML file (B) Maksimal størrelse for HTML-filer (B) Max size of any non-HTML file Maksimal størrelse for ikke-HTML-filer Max site size Maksimal størrelse af sted Max time Maksimal tid Save prefs Gem indstillinger Max transfer rate Maksimal overførselshastighed Follow robots.txt Følg robots.txt No external pages Ingen eksterne sider Do not purge old files Slet ikke gamle filer Accept cookies Acceptér cookies Check document type Tjek dokumenttypen Parse java files Overfør Java-filer Store ALL files in cache Opbevar alle filer i cache Tolerant requests (for servers) Acceptér forespørgsler (for servere) Update hack (limit re-transfers) Opdatér hack (begræns gen-overførsler) URL hacks (join similar URLs) URL-hacks (sammenføj ligende URL'er) Force old HTTP/1.0 requests (no 1.1) Gennemtving HTTP / 1.0-type forespørgsler (gælder ikke ver. 1.1) Max connections / seconds Maks.forbindelser/sekunder Maximum number of links Maksimal antal links Pause after downloading.. Pause efter download... Hide passwords Skjul adgangskoder Hide query strings Skjul forespørgsels-streng Links Links Build Struktur Experts Only Kun eksperter Flow Control Flow-kontrol Limits Begrænsninger Browser ID Browser-ID Scan Rules Skanningsregler Spider Spider Log, Index, Cache Log, indeks, cache Proxy Proxy MIME Types MIME-typer Do you really want to quit WinHTTrack Website Copier? Er du sikker på, at du vil afslutte WinHTTrack Website Copier? Do not connect to a provider (already connected) Opret ikke forbindelse til en udbyder (er allerede forbundet) Do not use remote access connection Brug ikke en fjernadgangsforbindelse Schedule the mirroring operation Planlæg spejlkopieringen Quit WinHTTrack Website Copier Afslut WinHTTrack Website Copier Back to starting page Tilbage til startsiden Click to start! Klik for at starte! No saved password for this connection! Der er ikke gemt en adgangskode for denne forbindelse! Can not get remote connection settings Kan ikke hente fjernforbindelsesindstillinger Select a connection provider Vælg en forbindelsesudbyder Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Justér venligst forbindelsesparameterne hvis det er nødvendigt.\nKlik på UDFØR for at starte spejlkopieringen. Save settings only, do not launch download now. Gem indstillingerne, men start ikke download endnu. On hold På hold Transfer scheduled for: (hh/mm/ss) Overførsel planlagt til: (tt/mm/ss) Start Start Connect to provider (RAS) Forbind til en udbyder (RAS) Connect to this provider Forbind til denne udbyder Disconnect when finished Afbryd forbindelsen når overførslen er færdig Disconnect modem on completion Afbryd modem når overførslen er færdig \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(finder du fejl eller opstår der problemer så kontakt os venligst)\r\n\r\nUdvikling:\r\nBrugerflade (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche og andre bidragydere\r\nMange tak for dansk oversættelse til:\r\nJesper Bramm (bramm@get2net.dk)\r\nscootergrisen About WinHTTrack Website Copier Om WinHTTrack Website Copier Please visit our Web page Besøg vores webside Wizard query Guide-forespørgsel Your answer: Dit svar: Link detected.. Link fundet Choose a rule Vælg en regel Ignore this link Ignorer dette link Ignore directory Ignorer dette bibliotek (mappe) Ignore domain Ignorer domæne Catch this page only Gem kun denne side Mirror site Spejlkopiér sted Mirror domain Spejlkopiér domæne Ignore all Ignorer alt Wizard query Guide-forespørgsel NO Nej File Fil Options Valgmuligheder Log Log Window Vindue Help Hjælp Pause transfer Pause overførsel Exit Afslut Modify options Rediger valgmuligheder View log Vis log View error log Vis fejllog View file transfers Vis filoverførsler Hide Minimér About WinHTTrack Website Copier Om WinHTTrack Website Copier Check program updates... Søg efter opdateringer... &Toolbar &Værktøjslinje &Status Bar &Statuslinje S&plit &Opdel File Filer Preferences Præferencer Mirror Spejlkopiér Log Log Window Vindue Help Hjælp Exit Afslut Load default options Indlæs standard-valgmuligheder Save default options Gem standard-valgmuligheder Reset to default options Nulstil standard-valgmuligheder Load options... Indlæs valgmuligheder... Save options as... Gem valgmuligheder som... Language preference... Foretrukne sprog... Contents... Indhold... About WinHTTrack... Om WinHTTrack... New project\tCtrl+N Nyt projekt\tCtrl+N &Open...\tCtrl+O &Åbn...\tCtrl+O &Save\tCtrl+S &Gem\tCtrl+S Save &As... Gem &som... &Delete... &Slet... &Browse sites... &Gennemse steder... User-defined structure Brugerdefineret struktur %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tFilnavn uden type(eks: image)\r\n%N\tHele filnavnet inklusive filtype (eks: billede.gif)\r\n%t\tKun filtype (eks: gif)\r\n%p\tSti [uden endelsen /] (eks: /noglebilleder)\r\n%h\tVærts navn (eks: www.eksempel.dk)\r\n%M\tMD5 URL (128 bit, 32 ascii byte)\r\n%Q\tMD5 forespørgsel streng (128 bit, 32 ascii byte)\r\n%q\tMD5 kort forespørgselsstreng (16 bit, 4 ascii byte)\r\n\r\n%s?\tKort navn (eks: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Eksempel:\t%h%p/%n%q.%t\n->\t\tc:\\spejlkopiering\\www.eksempel.dk\\noglebilleder\\billede.gif Proxy settings Proxy-indstillinger Proxy address: Proxy-adresse Proxy port: Proxy port Authentication (only if needed) Godkendelse (kun hvis det er nødvendigt) Login Brugernavn Password Adgangskode Enter proxy address here Indtast proxy-adressen her Enter proxy port here Indtast proxy portnummer her Enter proxy login Indtast proxy-brugernavn Enter proxy password Indtast proxy-adgangskode Enter project name here Indtast projektets navn her Enter saving path here Indtast stinavnet hvor projektet skal gemmes Select existing project to update Vælg et projektnavn at opdatere Click here to select path Klik her for at vælge en stil Select or create a new category name, to sort your mirrors in categories Vælg eller opret et nyt kategorinavn, for at sortere dine spejlkopieringer i kategorier HTTrack Project Wizard... HTTrack-projektguide... New project name: Nyt projektnavn Existing project name: Eksisterende projektnavn: Project name: Projektnavn: Base path: Sti til projekt: Project category: Projektkategori: C:\\My Web Sites C:\\Mine websteder Type a new project name, \r\nor select existing project to update/resume Skriv navnet på et nyt projekt, \r\neller vælg at opdatere et eksisterende projekt New project Nyt projekt Insert URL Indtast URL URL: Adresse URL: Authentication (only if needed) Godkendelse (kun hvis det er nødvendigt) Login Brugernavn Password Adgangskode Forms or complex links: Formularer eller komplekse links: Capture URL... Fang URL... Enter URL address(es) here Indtast URL-adresse(r) her Enter site login Indtast sted-brugernavn Enter site password Indtast sted-adgangskode Use this capture tool for links that can only be accessed through forms or javascript code Brug dette værktøj til at 'fange' links der kun kan opnås adgang til via formularer eller JavaScript-kode Choose language according to preference Vælg dit foretrukne sprog Catch URL! 'Fang' URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Sæt venligst browserens proxy indstillinger til følgende værdier:(Kopiér/Indsæt proxy-adresse og port).\nKlik på formularens SUBMIT-knap på din browser-side, eller klik på det specifikke link du ønsker at hente.\r\n\r\n This will send the desired link from your browser to WinHTTrack. Dette vil sende det ønskede link fra din browser til WinHTTrack. ABORT Annullér Copy/Paste the temporary proxy parameters here Kopiér og indsæt de midlertidige proxy parametre her Cancel Annullér Unable to find Help files! Kan ikke finde Hjælpefilerne! Unable to save parameters! Kan ikke gemme parametrene! Please drag only one folder at a time Træk kun én mappe ad gangen Please drag only folders, not files Træk kun mapper, ikke filer Please drag folders only Træk kun mapper Select user-defined structure? Vælg brugerdefineret struktur? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Vær sikker på, at den brugerdefinerede streng er korrekt\nI modsat fald vil filnavnene være ugyldige! Do you really want to use a user-defined structure? Er du sikker på, at ville bruge en brugerdefineret struktur? Too manu URLs, cannot handle so many links!! For mange URL' er, WinHTTrack kan ikke håndtere så mange links!!! Not enough memory, fatal internal error.. Ikke nok hukommelse, fatal intern fejl... Unknown operation! Ukendt handling! Add this URL?\r\n Tilføj denne URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Advarsel: hovedprocessen svarer stadigvæk ikke, URL'en kan ikke tilføjes... Type/MIME associations Type/MIME-tilknytning File types: Fil typer: MIME identity: MIME-identitet: Select or modify your file type(s) here Vælg eller ændrer dine filtype(r) her Select or modify your MIME type(s) here Vælg elle ændrer dine MIME-type(r) her Go up Gå op Go down Gå ned File download information Fil-downloadinformation Freeze Window Frys vindue More information: Mere information Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Velkommen til WinHTTrack Website Copier!\n\nKlik på Næste for at for at\n\n- starte et nyt projekt\n- eller genoptage et delvist download. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Filnavne med 'efternavn':\nFilnavne der indeholder:\nDette filnavn:\nMappenavne der indeholder:\nDette mappenavn:\nLinks på dette domæne:\nLinks på dette domæne der indeholder:\nLinks fra denne vært:\nLinks der indeholder:\nDette Link:\nAlle Links*/ Show all\nHide debug\nHide infos\nHide debug and infos Vis alle\nSkjul fejlfinding\nSkjul information\nSkjul fejlfinding og information Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Sted-struktur (standard)\nHtml i web/, images/other-filer i web/images/\nHtml i web/html, images/other i web/images\nHtml i web/, images/other i web/\nHtml i web/, images/other i web/xxx, hvor xxx er filendelsen\nHtml i web/html, images/other i web/xxx\nWebsted-struktur, uden www.domæne.xxx/\nHtml i webstednavn/, images/other-filer i webstednavn/images/\nHtml i webstednavn/html, images/other i webstednavn/images\nHtml i webstednavn/, images/other i webstednavn/\nHtml i webstednavn/, images/other i webstednavn/xxx\nHtml i webstednavn/html, images/other i webstednavn/xxx\nAlle filer in web/, med tilfældige navne (gadget !)\nAlle filer i webstednavn/, med tilfældige navne (gadget !)\nBrugerdefineret struktur... Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first ust skan\nOpbevar html-filer\nGem ikke-html-filer\nGem alle filer (standard)\nGem html-filer først Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Bliv i det samme bibliotek\nKan gå ned (standard]\nKan gå op\nKan gå både op og ned Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Bliv på den samme adresse (standard)\nBliv på det samme domæne\nBliv på det samme top-level-domæne\nGå overalt på webbet. Never\nIf unknown (except /)\nIf unknown Aldrig\nUkendt (undtaget /]\nhvis ukendt no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules Ingen robots.txt-regler\nrobots.txt med undtagelse af guiden\nfølg reglerne i robots.txt normal\nextended\ndebug Normal\nUdvidet\nFejlfinding Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Download websted(er)\nDownload websted(er) + spørgsmål\nHent enkelte filer\nDownload alle steder på sider (flere spejlkopiering)\nTest links på siderne (bogmærke test)\n* Fortsæt afbrudt projekt\n* Opdater tidligere projekt Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relativ URL / absolut URL (standard)\nAbsolut URL / absolut URL\nAbsolut URL / absolut URL\nOriginal URL / original URL Open Source offline browser Open source-offline-browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. Webstedskopiering/offline-browser. Kopiér fjern-websteder til din computer. Gratis. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline-browser URL list (.txt) URL-liste (.txt) Previous Forrige Next Næste URLs URL'er Warning Advarsel Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Din browser understøtter ikke JavaScript, på nuværende tidspunkt. Brug venligst en browser som forstår JavaScript, for at få et bedre resultat. Thank you Tak You can now close this window Du kan nu lukke vinduet Server terminated Server lukket A fatal error has occurred during this mirror Det opstod en fatal fejl under denne spejlkopiering View Documentation Vis dokumentation Go To HTTrack Website Gå til HTTrack website Go To HTTrack Forum Gå til HTTrack forum View License Vis licens Beware: you local browser might be unable to browse files with embedded filenames OBS: din lokale browser er måske ikke i stand til at browse filer med indlejrede filnavne Recreated HTTrack internal cached resources Genskabte HTTrack internt mellemlagret ressourcer Could not create internal cached resources Kunne ikke oprette internt mellemlagret ressourcer Could not get the system external storage directory Kunne ikke hente systemets eksterne lagringsmappe Could not write to: Kunne ikke skrive til: Read-only media (SDCARD) Skrivebeskyttet medie (SDCARD) No storage media (SDCARD) Intet lagringsmedie (SDCARD) HTTrack may not be able to download websites until this problem is fixed HTTrack er måske ikke i stand til at downloade websteder før dette problem er rettet HTTrack: mirror '%s' stopped! HTTrack: spejlkopiering '%s' stoppet! Click on this notification to restart the interrupted mirror Klik på denne notifikation for at genstarte den afbrudte spejlkopiering HTTrack: could not save profile for '%s'! HTTrack: kunne ikke gemme profil for '%s'! Proxy type: Proxytype: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Proxyprotokol. HTTP: standardproxy. HTTP (CONNECT-tunnel): sender hver forespørgsel gennem en CONNECT-tunnel, til proxyer der kun understøtter CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080. Load cookies from file: Indlæs cookies fra fil: Preload cookies from a Netscape cookies.txt file before crawling. Indlæs cookies fra en Netscape cookies.txt-fil, før crawlingen starter. Pause between files: Pause mellem filer: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Tilfældig forsinkelse mellem filoverførsler, i sekunder. Brug MIN:MAX for et tilfældigt interval (f.eks. 2:8). Keep the www. prefix (do not merge www.host with host) Behold www.-præfikset (sammenlæg ikke www.host med host) Do not treat www.host and host as the same site. Behandl ikke www.host og host som det samme websted. Keep double slashes in URLs Behold dobbelte skråstreger i URL'er Do not collapse duplicate slashes in URLs. Sammenfold ikke gentagne skråstreger i URL'er. Keep the original query-string order Behold den oprindelige rækkefølge i forespørgselsstrengen Do not reorder query-string parameters when deduplicating URLs. Omorden ikke forespørgselsstrengens parametre, når dublerede URL'er fjernes. Strip query keys: Fjern forespørgselsnøgler: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Kommaseparerede forespørgselsnøgler, der udelades i navngivningen af gemte filer (f.eks. sid,utm_source). Write a WARC archive of the crawl Skriv et WARC-arkiv af gennemsøgningen Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Gem også hvert hentet svar i et ISO-28500 WARC/1.1-arkiv ved siden af spejlet. WARC archive name: Navn på WARC-arkiv: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Valgfrit basisnavn til WARC-arkivet; lad feltet stå tomt for automatisk navngivning i outputmappen. httrack-3.49.14/lang/Croatian.txt0000644000175000017500000011620015230602340012232 LANGUAGE_NAME Hrvatski LANGUAGE_FILE Croatian LANGUAGE_ISO hr LANGUAGE_AUTHOR Dominko Aždajiæ (domazd@mail.ru) \r\n LANGUAGE_CHARSET ISO-8859-2 LANGUAGE_WINDOWSID Croatian OK U redu Cancel Odustati Exit Svršetak Close Zatvoriti Cancel changes Opozvati izmjene Click to confirm Preuzeti izmjene Click to get help! Kliknuti za pomoæ! Click to return to previous screen Kliknuti za povratak na prethodni prikaz Click to go to next screen Kliknuti za povratak na slijedeæi prikaz Hide password Sakriti lozinku Save project Pohraniti projekt Close current project? Zatvoriti tekuæi projekt? Delete this project? Izbrisati taj projekt? Delete empty project %s? Izbrisati prazni projekt %s? Action not yet implemented Funkcija još nije raspoloživa Error deleting this project Pogreška tijekom brisanja tog projekta Select a rule for the filter Izaberite neko pravilo za taj filtar Enter keywords for the filter Unesite kljuène rijeèi za taj filtar Cancel Odustati Add this rule Dodati to pravilo Please enter one or several keyword(s) for the rule Unesite molim jednu ili više kljuènih rijeèi za to pravilo Add Scan Rule Dodati pravilo filtriranja Criterion Pravilo filtra: String Unesite rijeè: Add Dodati Scan Rules Pravila filtriranja Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Koristite višeznaènik za ukljuèivanje ili iskljuèivanje mrežnih adresa ili poveznica.\nU isti redak možete staviti i nekoliko filtarskih pravila uzastopno.\nUpotrijebite praznine kao razdjelnike.\n\nPrimjerice: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Izuzete poveznice Include link(s) Obuhvaæene poveznice Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Preporuka: Za obuhvaæanje SVIH datoteka GIF, upotrijebite nešto poput +www.neka-mreža.com/*.gif. \n(+*.gif / -*.gif æe ukljuèivat/iskljuèivati SVE GIF-ove sa SVIH stranica) Save prefs Pohraniti postavke Matching links will be excluded: Shodne poveznice æe biti izuzete: Matching links will be included: Shodne poveznice æe biti obuhvaæene: Example: Primjer: gif\r\nWill match all GIF files gif\r\nPronalazi sve datoteke GIF blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nPronalazi sve datoteke koje sadržavaju 'blue' kao primjerice 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\Pronalazi sve datoteke 'bigfile.mov', ali ne i 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nPronalazi sve poveznice s mapama koje u nazivu sadrže 'cgi' kao primjerice /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nPronalazi poveznice prema mapama koje u nazivu sadrže cijeli niz 'cgi-bin' (ali ne i primjerice cgi-bin-2) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nPronalazi poveznice s pod-nizovima poput www.neka-mreža.com, privatno.neka-mreža.com itd. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nPronalazi poveznice sa shodnim pod-nizom poput www.neka-mreža.com, www.neka-mreža.edu, private.neka-mreža.druga-mreža.com itd. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nPronalazi poveznice koje u nazivu sadrže cijeli pod-niz 'www.neka-mreža.com' (ali ne i poveznice poput privatno.neka-mreža.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nPronalazi bilo koju poveznicu sa shodnim pod-nizom poput www.neka-mreža.com/.., www.primjer.abc/s-neke-mreže/kazalo.html, www.primjer.abc/primjer/neka-mreža.html itd. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nPronalazi samo datoteku 'www.primjer.com/primjer/neka-mreža.html'. Imajte na umu da morate unijeti potpunu putanju (URL + putanja do mrežnog mjesta) All links will match Obuhvaæene su sve poveznice Add exclusion filter Pridodati filtar izuzimanja Add inclusion filter Pridodati filtar obuhvaæanja Existing filters Postojeæi filtri Cancel changes Opozvati izmjene Save current preferences as default values Tekuæe postavke pohraniti kao polazne vrijednosti Click to confirm Kliknite za potvrðivanje No log files in %s! U %s nema datoteka zapisnika! No 'index.html' file in %s! U %s nema datoteke 'index.html'! Click to quit WinHTTrack Website Copier Kliknite za okonèavanje rada s WinHTTrack Website Copierom View log files Prikazati zapisnièke datoteke Browse HTML start page Prikazati poèetnu stranicu HTML-a End of mirror Zrcaljenje sadržaja je završeno View log files Prikazati zapisnièke datoteke Browse Mirrored Website Prikazati zrcaljene sadržaje New project... Novi projekt... View error and warning reports Prikazati izvješæa o pogreškama i upozorenjima View report Prikaz izvješæa Close the log file window Zatvoriti okno zapisnièke datoteke Info type: Vrsta informacija: Errors Pogreške Infos Informacije Find Pronaæi Find a word Pronaæi rijeè Info log file Zapisnièka info-datoteka Warning/Errors log file Datoteka zapisa o upozorenjima/pogreškama Unable to initialize the OLE system Sustav OLE-a nije mogao biti pokrenut WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack u navedenoj mapi nije mogao pronaæi meðupohranu nikakvog prekinutog preuzimanja datoteka! Could not connect to provider Povezivanje s dobavljaèem nije uspjelo receive zaprimiti request zatražiti connect povezati search tražiti ready gotovo error pogreška Receiving files.. Zaprimanje datoteka.. Parsing HTML file.. Rašèlanjivanje datoteke HTML-a.. Purging files.. Èišæenje datoteka.. Loading cache in progress.. U tijeku je uèitavanje meðuspremnika.. Parsing HTML file (testing links).. Rašèlanjivanje datoteke HTML-a (provjeravanje poveznica).. Pause - Toggle [Mirror]/[Pause download] to resume operation Stanka - Nastavak putem izbornièkih naredbi [Zrcaljenje]/[Stanka preuzimanja] Finishing pending transfers - Select [Cancel] to stop now! Završavaju se tekuæi prijenosi - Trenutna obustava pomoæu [Odustati] scanning pregledavanje Waiting for scheduled time.. Èeka se zadano vrijeme.. Transferring data.. Prenošenje podataka.. Connecting to provider Povezivanje s dobavljaèem [%d seconds] to go before start of operation [%d sekundi] do poèetka radnje Site mirroring in progress [%s, %s bytes] Zrcaljenje sadržaja je u tijeku [%s, %s bajta] Site mirroring finished! Zrcaljenje sadržaja je završeno! A problem occurred during the mirroring operation\n Tijekom zrcaljenja je nastao jedan problem\n \nDuring:\n \nTrajanje:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nPojedinosti po potrebi pogledajte u zapisnièkoj datoteci.\n\nKliknite na ZAVRŠITI za okonèavanje rada WinHTTrack Website Copiera.\n\nHvala Vam na uporabi WinHTTracka! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Zrcaljenje je dovršeno.\nKliknite na Svršetak za okonèavanje rada s WinHTTrackom.\nPogledajte po potrebi u zapisnik(e) kako bi se uvjerili da je sve u redu.\n\nHvala Vam na uporabi WinHTTracka!! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ZRCALJENJE JE PREKINUTO! * *\r\nTekuæi privremeni meðuspremnik æe biti potreban za neku buduæu aktualizaciju i sadrži samo podatke, koji su preuzeti tijekom upravo prekinutog zasjedanja.\r\nPrethodni meðuspremnik možda sadrži potpunije podatke; ukoliko te podatke ne želite izgubiti, morate ih ponovno uspostaviti i izbrisati tekuæi meðuspremnik.\r\n[Napomena: To se jednostavno može napraviti brisanjem datoteka hts-cache/new.*]\r\n\r\nMislite li da ovom zasjedanju prethodeæi meðuspremnik može sadržavati potpunije podatke, i želite li ga ponovno uspostaviti? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * POGREŠKA PRI ZRCALJENJU! * *\r\nHTTrack je zapazio da je tekuæe zrcalo prazno. Ukoliko je to bila neka dogradnja, onda je prethodno zrcalo ponovno uspostavljeno.\r\nRazlog: ili prva stranica nije mogla biti pronaðena, ili se pak pojavio neki problem.\r\n=> Uvjerite se da dotièno mrežno mjesto još uvijek postoji, i/ili provjerite postavke Vašeg usmjerivaèa! <= \n\nTip: Click [View log file] to see warning or error messages \n\nPreporuka: Kliknite na [Prikazati zapisnièke datoteke], kako bi vidjeli upozorenja ili dojave pogreški Error deleting a hts-cache/new.* file, please do it manually Pogreška pri brisanju datoteke hts-cache/new.*, molim obavite to ruèno Do you really want to quit WinHTTrack Website Copier? Doista želite okonèati rad s WinHTTrack Website Copierom? - Mirroring Mode -\n\nEnter address(es) in URL box - Stanje zrcaljenja -\n\nUnesite adresu(-e) u polje URL-a - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktivno stanje vodièa s povratnim pitanjima -\n\nUnesite adresu(-e) u polje URL-a - File Download Mode -\n\nEnter file address(es) in URL box - Stanje preuzimanja datoteka -\n\nUnesite adresu(-e) datoteke u polje URL-a - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Stanje provjere poveznica -\n\nUnesite spletnu adresu(-e) s poveznicama za provjeravanje u polje URL-a - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Stanje nadograðivanja -\n\nOvjerite adresu(-e) u polje URL-a, provjerite po potrebi parametre a zatim kliknite na gumb 'SLIJEDEÆE' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Stanje nadovezivanja (prekinute radnje) -\n\nOvjerite adresu(-e) u polje URL-a, provjerite po potrebi parametre a zatim kliknite na gumb 'SLIJEDEÆE' Log files Path Putanja zapisnièkih datoteka Path Putanja - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Stanje nabrajanja poveznica -\n\nKoristite okvir URL-a za unos adrese(-a) stranice(-a) koje sadrže dotiène poveznice New project / Import? Novi projekat / Uvoz? Choose criterion Odaberite kriterij Maximum link scanning depth Maksimum dubine grananja poveznica Enter address(es) here Ovdje unijeti adresu(-e) Define additional filtering rules Odrediti dodatna pravila filtriranja Proxy Name (if needed) Naziv posrednièkog raèunalo (po potrebi) Proxy Port Posrednièki port Define proxy settings Odredite postavke posrednika Use standard HTTP proxy as FTP proxy Koristiti standardni posrednik HTTP-a kao posrednik FTP-a Path Putanja Select Path Odabrati putanju Path Putanja Select Path Odabrati putanju Quit WinHTTrack Website Copier Okonèati rad WinHTTrack Website Copiera About WinHTTrack O programu WinHTTrack Save current preferences as default values Tekuæe postavke pohraniti kao polazne vrijednosti Click to continue Kliknite ovdje za nastavak Click to define options Kliknite ovdje za odreðivanje moguænosti Click to add a URL Kliknite ovdje za dodavanje URL-a Load URL(s) from text file URL(-e) uèitati iz tekstualne datoteke WinHTTrack preferences (*.opt)|*.opt|| Postavke WinHTTracka (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Tekstualna datoteka sa spiskom adresa (*.txt)|*.txt|| File not found! Datoteka nije pronaðena! Do you really want to change the project name/path? Doista želite izmijeniti naziv i putanju projekta? Load user-default options? Uèitati korisnikom zadane polazne moguænosti? Save user-default options? Pohraniti korisnikom zadane polazne moguænosti? Reset all default options? Sve moguænosti vratiti na polazno? Welcome to WinHTTrack! Dobrodošli u WinHTTrack! Action: Radnja: Max Depth Maksimum dubine Maximum external depth: Maksimum vanjske dubine: Filters (refuse/accept links) : Filtri (odbiti/pohraniti poveznice) : Paths Putanje Save prefs Postavke pohraniti Define.. Odrediti.. Set options.. Postaviti moguænosti.. Preferences and mirror options: Postavke i moguænosti zrcaljenja: Project name Naziv projekta Add a URL... Dodati mrežnu adresu... Web Addresses: (URL) Mrežne adrese: (URL) Stop WinHTTrack? Zaustaviti WinHTTrack? No log files in %s! U %s nema zapisnièkih datoteka! Pause Download? Napraviti stanku preuzimanja? Stop the mirroring operation Zaustaviti postupak zrcaljenja Minimize to System Tray Minimizirati u sustavnu traku odlaganja Click to skip a link or stop parsing Kliknite za preskok poveznice ili zaustavljanje rašèlanjivanja Click to skip a link Kliknite za preskok poveznice Bytes saved Pohranjeno bajta Links scanned Obraðene poveznice Time: Vrijeme: Connections: Veze: Running: Djelatno: Hide Sakriti Transfer rate Stopa prijenosa SKIP PRESKOÈITI Information Informacija Files written: Zapisano datoteka: Files updated: Aktualizirano datoteka: Errors: Pogreške: In progress: U tijeku: Follow external links Slijediti vanjske poveznice Test all links in pages Na stranicama provjeriti sve poveznice Try to ferret out all links Pokušati slijediti sve poveznice Download HTML files first (faster) Najprije preuzimati datoteke HTML-a (brže) Choose local site structure Odaberite mjesnu strukturu sadržaja Set user-defined structure on disk Sâmi odredite strukturu na disku Use a cache for updates and retries Za dogradnje i ponavljanja koristiti meðuspremnik Do not update zero size or user-erased files Ne nadopunjavati datoteke koje su prazne ili one koje je korisnik izbrisao Create a Start Page Napraviti poèetnu stranicu Create a word database of all html pages Napraviti spisak rijeèi sa svih stranica HTML-a Create error logging and report files Napraviti datoteke zapisnika pogrešaka i izvješæa o tijeku postupka Generate DOS 8-3 filenames ONLY Generirati nazive datoteka SAMO sukladno DOS-u 8-3 Generate ISO9660 filenames ONLY for CDROM medias Generirati nazive datoteka SAMO sukladno ISO9660 za medije CDROM-a Do not create HTML error pages Ne stvarati stranice pogrešaka HTML-a Select file types to be saved to disk Odaberite vrste datoteka, koje treba pohranjivati na disku Select parsing direction Odaberite smjer rašèlanjivanja Select global parsing direction Odaberite opæi smjer rašèlanjivanja Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Postavke pravila prilagoðavanja URL-a za unutarnje (jednom veæ preuzimane) i vanjske (ni jednom nisu preuzimane) poveznice Max simultaneous connections Maksimum istovremenih prikljuèivanja/veza File timeout Vrijeme èekanja na datoteke Cancel all links from host if timeout occurs Pri prekoraèenju vremena èekanja prekinuti sve poveznice prema dotiènom raèunalu Minimum admissible transfer rate Najniža podnošljiva stopa prijenosa Cancel all links from host if too slow Prekinuti sve poveznice prema ugostiteljskom raèunalu ako je presporo Maximum number of retries on non-fatal errors Najviši broj pokušaja ponavljanja pri ne-fatalnim pogreškama Maximum size for any single HTML file Vrhunac velièine neke pojedinaène datoteke HTML-a Maximum size for any single non-HTML file Vrhunac velièine neke pojedinaène datoteke ne-HTML-a Maximum amount of bytes to retrieve from the Web Vrhunac iznosa u bajtima za dobaviti s mrežnih mjesta Make a pause after downloading this amount of bytes Napraviti stanku nakon preuzimanja tog iznosa u bajtima Maximum duration time for the mirroring operation Vrhunac vremena trajanja za postupak zrcaljenja Maximum transfer rate Vrhunac stope prijenosa Maximum connections/seconds (avoid server overload) Najviši broj veza/sekundi (sprjeèava preoptereæivanje poslužitelja) Maximum number of links that can be tested (not saved!) Najviši broj poveznica, koje mogu biti provjeravane (za pohranjivanje nema ogranièenja!) Browser identity Preglednièko obilježje Comment to be placed in each HTML file Komentar koji æe biti smješten u svakoj datoteci HTML-a Back to starting page Natrag na poèetnu stranicu Save current preferences as default values Tekuæe postavke pohraniti kao polazne vrijednosti Click to continue Kliknite za nastavak Click to cancel changes Kliknuti za opoziv izmjena Follow local robots rules on sites Na mrežnim mjestima slijediti pravila mjesnih robota Links to non-localised external pages will produce error pages Poveznice prema nepreslikanim vanjskim stranicama æe stvarati stranice pogreški Do not erase obsolete files after update Nakon dogradnje ne brisati zastarjele datoteke Accept cookies? Prihvatiti kolaèiæ? Check document type when unknown? Provjeravati vrstu datoteke ukoliko je nepoznata? Parse java applets to retrieve included files that must be downloaded? Rašèlanjivati java applete radi pronalaženja obuhvaæenih datoteka, koje još moraju biti preuzete? Store all files in cache instead of HTML only Spremati sve datoteke u meðuspremnik a ne samo one u HTML-u Log file type (if generated) Vrsta datoteke zapisnika (ukoliko je naèinjen) Maximum mirroring depth from root address Najveæa dubina zrcaljenja od prve adrese Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Najveæa dubina zrcaljenja za vanjske/zabranjene adrese (polazno je 0, tj. bez vanjskog preuzimanja) Create a debugging file Naèiniti datoteku za traženje pogrešaka Use non-standard requests to get round some server bugs Koristiti nestandardne zahtjeve, kako bi se zaobišle neke poslužiteljske pogreške Use old HTTP/1.0 requests (limits engine power!) Koristiti zahtjeve starog HTTP/1.0 (ogranièava brzinu rada!) Attempt to limit retransfers through several tricks (file size test..) Raznim varkama pokušati ogranièiti opetovanja prijenosa (provjera velièine datoteka..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Preskakanjem sliènih URL-a (www.foo.com==foo.com, http=https ..) pokušati ogranièiti broj poveznica Write external links without login/password Vanjske poveznice zapisivati bez prijave/lozinke Write internal links without query string Unutarnje poveznice zapisivati bez teksta za upite Get non-HTML files related to a link, eg external .ZIP or pictures Dobavljati datoteke ne-HTML-a, združene s poveznicom (primjerice vanjski .ZIP ili slike) Test all links (even forbidden ones) Provjeravati sve poveznice (èak i one zabranjene) Try to catch all URLs (even in unknown tags/code) Pokušati pronaæi sve URL-e (èak i u nepoznatim oznakama/skriptama) Get HTML files first! Dobaviti najprije datoteke HTML-a! Structure type (how links are saved) Vrsta strukture (kako se pohranjuju poveznice) Use a cache for updates Za dogradnje koristiti meðuspremnik Do not re-download locally erased files Ne preuzimati ponovno datoteke, koje su veæ mjesno izbrisane Make an index Napraviti kazalo Make a word database Napraviti spisak rijeèi Log files Zapisnièke datoteke DOS names (8+3) Nazivi sukladno DOS-u (8+3) ISO9660 names (CDROM) Nazivi prema ISO9660 (CDROM) No error pages Bez stranica pogrešaka Primary Scan Rule Glavno pravilo filtra Travel mode Naèin traženja Global travel mode Globalni naèin traženja These options should be modified only exceptionally Ove moguænosti bi trebale biti preinaèavane samo iznimno Activate Debugging Mode (winhttrack.log) Aktivirati postupak traženja pogrešaka (winhttrack.log) Rewrite links: internal / external Prilagoditi poveznièke adrese: unutarnje / vanjske Flow control Nadzor toka Limits Granice Identity Obilježje HTML footer Podnožje HTML-a N# connections Broj veza Abandon host if error Pri pogreškama napustiti ugostitelja Minimum transfer rate (B/s) Minimum stope prijenosa (B/s) Abandon host if too slow Napustiti ugostitelja ukoliko je prespor Configure Prilagoditi Use proxy for ftp transfers Koristiti posrednika za prijenose putem FTP-a TimeOut(s) Vremenska ogranièenja Persistent connections (Keep-Alive) Održavati veze (Keep-Alive) Reduce connection time and type lookup time using persistent connections Održavane veze smanjuju vrijeme povezivanja i vrijeme za traženje vrsta Retries Opetovanja Size limit Ogranièenje velièine Max size of any HTML file (B) Najviši broj bajta u datotekama HTML-a Max size of any non-HTML file Najveæa velièina datoteka ne-HTML-a Max site size Najveæa velièina sadržaja Max time Najduže vrijeme Save prefs Pohraniti postavke Max transfer rate Vrhunac stope prijenosa Follow robots.txt Slijediti robots.txt No external pages Bez vanjskih stranica Do not purge old files Ne brisati stare datoteke Accept cookies Prihvaæati kolaèiæe Check document type Provjeravati vrstu dokumenata Parse java files Rašèlanjivati datoteke Java Store ALL files in cache Spremati SVE datoteke u meðuspremnik Tolerant requests (for servers) Snošljivi zahtjevi (za poslužitelje) Update hack (limit re-transfers) Iznuda dogradnji (ogranièava opetovane prijenose) URL hacks (join similar URLs) URL hacks (združuje sliène URL-e) Force old HTTP/1.0 requests (no 1.1) Nametati zahtjeve starog HTTP/1.0 (ne 1.1) Max connections / seconds Najviši broj veza / sekundi Maximum number of links Najviši broj poveznica Pause after downloading.. Èekati nakon preuzimanja.. Hide passwords Sakriti lozinke Hide query strings Sakriti tekst za upite Links Poveznice Build Graða Experts Only Samo za struènjake Flow Control Nadzor toka Limits Ogranièenja Browser ID Preglednièki ID Scan Rules Pravila filtriranja Spider Pauk Log, Index, Cache Zapisnik, Kazalo, Meðuspremnik Proxy Posrednik MIME Types Vrste MIME Do you really want to quit WinHTTrack Website Copier? Doista želite okonèati rad WinHTTrack Website Copiera? Do not connect to a provider (already connected) Ne povezivati s dobaviteljem (veæ je povezano) Do not use remote access connection Ne koristiti vezu daljinskog pristupa Schedule the mirroring operation Odrediti vrijeme zrcaljenja Quit WinHTTrack Website Copier Okonèati rad WinHTTrack Website Copiera Back to starting page Natrag na poèetnu stranicu Click to start! Kliknite za poèetak! No saved password for this connection! Za tu vezu nema pohranjene lozinke! Can not get remote connection settings Ne mogu se dobiti postavke daljinske veze Select a connection provider Odaberite dobavitelja veze Start Zapoèeti Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Po potrebi prilagodite molim parametre veze,\na zatim stisnite ZAVRŠITI kako bi pokrenuli zrcaljenje. Save settings only, do not launch download now. Samo pohraniti postavke, preuzimanje ne pokretati sada. On hold Na èekanju Transfer scheduled for: (hh/mm/ss) Prijenos je predviðen za: (hh/mm/ss) Start Zapoèeti Connect to provider (RAS) Povezati s dobavljaèem (RAS) Connect to this provider Povezati s tim dobavljaèem Disconnect when finished Prekinuti vezu kada bude gotovo Disconnect modem on completion Po dovršetku odvojiti modemsku vezu \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Molimo da nas obavijestite o svim pogreškama i poteškoæama)\r\n\r\nRazvoj:\r\nSuèelje (Windows): Xavier Roche\r\nPauk: Xavier Roche\r\nRazrediRašèlanjivaèaJave: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche i drugi suradnici\r\nPUNO HVALA za prijevodne preporuke upuæujemo:\r\nRobert Lagadec (rlagadec@yahoo.fr) About WinHTTrack Website Copier O programu WinHTTrack Website Copier Please visit our Web page Molimo da posjetite našu spletnu stranicu Wizard query Upit vodièa Your answer: Vaš odgovor: Link detected.. Pronaðena je poveznica.. Choose a rule Birajte pravilo Ignore this link Zanemariti tu poveznicu Ignore directory Zanemariti mape Ignore domain Zanemariti domenu Catch this page only Dobaviti samo tu stranicu Mirror site Sadržaj zrcaljenja Mirror domain Domena zrcaljenja Ignore all Bez poveznica Wizard query Upit vodièa NO NE File Datoteka Options Moguænosti Log Zapisnik Window Okno Help Pomoæ Pause transfer Napraviti stanku prijenosa Exit Svršetak Modify options Izmijeniti moguænosti View log Prikazati zapisnik View error log Prikazati zapisnik pogrešaka View file transfers Prikazati prijenose datoteka Hide Sakriti About WinHTTrack Website Copier O programu WinHTTrack Website Copier Check program updates... Potražiti programske dogradnje... &Toolbar &Traka alatki &Status Bar &Traka stanja S&plit Raz&dijeliti File Datoteka Preferences Postavke Mirror Zrcalo Log Zapisnik Window Okno Help Pomoæ Exit Svršetak Load default options Uèitati polazne moguænosti Save default options Pohraniti polazne moguænosti Reset to default options Vratiti polazne moguænosti Load options... Uèitati moguænosti... Save options as... Moguænosti pohraniti kao... Language preference... Jeziène postavke... Contents... Sadržaji... About WinHTTrack... O programu WinHTTrack... New project\tCtrl+N Novi projekat\tCtrl+N &Open...\tCtrl+O &Otvoriti...\tCtrl+O &Save\tCtrl+S &Pohraniti\tCtrl+S Save &As... Pohraniti &kao... &Delete... &Izbrisati... &Browse sites... &Pregledati sadržaje... User-defined structure Korisnikom odreðena struktura %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNaziv datoteke bez nastavka (npr. slika)\r\n%N\tNaziv datoteke s nastavkom (npr. slika.gif)\r\n%t\tSamo nastavak naziva datoteke (npr. gif)\r\n%p\tPutanja [bez svršetka /] (npr. /nekeslike)\r\n%h\tNaziv ugostitelja (npr. www.nekisplet.com)\r\n%M\tMD5 URL (128 bita, 32 ascii bajta)\r\n%Q\tTekst upita MD5 (128 bita, 32 ascii bajta)\r\n%q\tKratki tekst upita MD5 (16 bita, 4 ascii bajta)\r\n\r\n%s?\tKratki naziv (npr. %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Primjerice:\t%h%p/%n%q.%t\n->\t\tc:\\zrcaljenje\\www.nekisplet.com\\nekeslike\\slika.gif Proxy settings Postavke posrednika Proxy address: Adresa posrednika: Proxy port: Port posrednika: Authentication (only if needed) Ovjeravanje (samo po potrebi) Login Prijava Password Lozinka Enter proxy address here Ovdje unesite adresu posrednika Enter proxy port here Ovdje unesite port posrednika Enter proxy login Unesite prijavu na posredniku Enter proxy password Unesite lozinku na posredniku Enter project name here Ovdje unesite naziv projekta Enter saving path here Ovdje unesite putanju za pohranjivanje Select existing project to update Birajte postojeæi projekt za dogradnju Click here to select path Ovdje kliknite za izbor putanje Select or create a new category name, to sort your mirrors in categories Odaberite ili nadjenite neki naziv novoj kategoriji, kako bi Vaša zrcaljenja svrstali u kategorije HTTrack Project Wizard... Pomoènik za projekte HTTracka... New project name: Naziv novog projekta: Existing project name: Naziv postojeæeg projekta: Project name: Naziv projekta: Base path: Osnovna putanja: Project category: Kategorija projekta: C:\\My Web Sites C:\\Moji spletni sadržaji Type a new project name, \r\nor select existing project to update/resume Utipkajte naziv novog projekta, \r\nili odaberite postojeæi projekat za dograditi/nadovezati New project Novi projekat Insert URL Umetnite URL URL: URL: Authentication (only if needed) Ovjeravanje (samo ako je nužno) Login Prijava Password Lozinka Forms or complex links: Obrasci ili kompleksne poveznice: Capture URL... Zahvatiti URL... Enter URL address(es) here Ovdje unesite adresu(-e) URL-a Enter site login Unesite prijavu za to mrežno mjesto Enter site password Unesite lozinku za to mrežno mjesto Use this capture tool for links that can only be accessed through forms or javascript code Koristite ovu funkciju za dobavu povezanih sadržaja, kojima se inaèe može pristupiti samo putem obrazaca ili kôda JavaScript Choose language according to preference Izaberite jezik Catch URL! Dobaviti URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Molimo da privremeno izmijenite preglednikove postavke posrednièkog poslužitelja na slijedeæe vrijednosti (Adresu i port posrednika odavdje preslikati).\nKliknite zatim na stranici obrasca u Vašem pregledniku na gumb SUBMIT/POSLATI ili pak na odreðenu poveznicu, koju želite dobaviti. This will send the desired link from your browser to WinHTTrack. Time æe željena poveznica iz Vašeg preglednika biti poslana u WinHTTrack. ABORT PREKINUTI Copy/Paste the temporary proxy parameters here Privremene postavke posrednièkog poslužitelja preslikati odavdje Cancel Odustati Unable to find Help files! Nije bilo moguæe pronaæi datoteke Pomoæi! Unable to save parameters! Nije bilo moguæe pohraniti parametre! Please drag only one folder at a time Povucite mišom molim samo jednu mapu istovremeno Please drag only folders, not files Povucite mišom molim samo mape, ne datoteke Please drag folders only Povucite mišom molim samo mape Select user-defined structure? Za preslik sadržaja odabrati korisnikom odreðenu strukturu? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Provjerite molim je li korisnikom odreðeni znakovni niz ispravan,\nu suprotnom æe nastati iskrivljeni nazivi datoteka! Do you really want to use a user-defined structure? Doista želite koristiti korisnikom odreðenu strukturu? Too manu URLs, cannot handle so many links!! Previše je URL-a, ne mogu obraðivati toliko poveznica!! Not enough memory, fatal internal error.. Nema dovoljno spremnika, fatalna unutarnja pogreška.. Unknown operation! Nepoznata operacija! Add this URL?\r\n Dodati taj URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Warning: main process is still not responding, cannot add URL(s).. Type/MIME associations Type/MIME associations File types: Vrste datoteka: MIME identity: Istovjetnost MIME: Select or modify your file type(s) here Ovdje birajte ili izmijenite Vaše vrste datoteka Select or modify your MIME type(s) here Ovdje birajte ili izmijenite Vaše vrste MIME Go up Na gore Go down Na dolje File download information Informacije o preuzimanju datoteka Freeze Window Uglaviti okno More information: Više informacija: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Dobrodošli u program WinHTTrack Website Copier!\n\nKliknite molim na gumb SLIJEDEÆE kako bi\n\n- zapoèeli novi projekat\n- ili nastavili nedovršeno preuzimanje File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Nazivi datoteka s proširenjem:\nNazivi datoteka sadržavaju:\nTaj naziv datoteke:\nNazivi mapa sadržavaju:\nTaj naziv mape:\nPoveznice u toj domeni:\nPoveznice u domenama sadržavaju:\nPoveznice s tog ugostitelja:\nPoveznice sadržavaju:\nTa poveznica:\nSVE POVEZNICE Show all\nHide debug\nHide infos\nHide debug and infos Prikazati sve\nSakriti debug\nSakriti informacije\nSakriti debug i informacije Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Struktura sadržaja (polazno)\nHTML u spletu/, slike/ostale datoteke u spletu/slike/\nHTML u spletu/html, slike/ostalo u spletu/slike\nHTML u spletu/, slike/ostalo u spletu/\nHTML u spletu/, slike/ostalo u spletu/xxx, pri èemu je xxx proširenje naziva datoteke\nHTML u spletu/html, slike/ostalo u spletu/xxx\nStruktura sadržaja, bez www.domena.xxx/\nHTML u naziv_sadržaja/, slike/ostale datoteke u nazivu_sadržaja/slike/\nHTML u naziv_sadržaja/html, slike/ostalo u naziv_sadržaja/slike\nHTML u naziv_sadržaja/, slike/ostalo u naziv_sadržaja/\nHTML u naziv_sadržaja/, slike/ostalo u naziv_sadržaja/xxx\nHTML u naziv_sadržaja/html, slike/ostalo u naziv_sadržaja/xxx\nSve datoteke u spletu/, s nasumiènim nazivima (gadget !)\nSve datoteke u naziv_sadržaja/, s nasumiènim nazivima (gadget !)\nKorisnikom odreðena struktura.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Samo pregledati poveznice\nStpremiti datoteke HTML-a\nStpremiti datoteke ne-HTML-a\nSpremiti sve datoteke (polazno)\nSpremiti najprije datoteke HTML-a Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Ostati u istoj mapi\nMože iæi dolje (polazno)\nMože iæi gore\nMože iæi i gore i dolje Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Ostati na istoj adresi (polazno)\nOstati u istoj domeni\nOstati u istoj demeni vršne razine\nIæi posvuda po spletu Never\nIf unknown (except /)\nIf unknown Nikada\nUkoliko je nepoznato (izuzev /)\nUkoliko je nepoznato no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules bez pravila iz robots.txt\nslijediti pravila iz robots.txt s izuzetkom pomoènika\nslijediti pravila iz robots.txt normal\nextended\ndebug uobièajeno\nprošireno\ndebug Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Preuzimanje spletnih sadržaja\nPreuzimanje spletnih sadržaja + pitanja\nDobavljanje pojedinih datoteka\nPreuzimanje svih sadržaja sa stranica (višestruko zrcaljenje)\nProvjeriti poveznice u stranicama (provjera poveznica)\n* Nastaviti prekinuto preuzimanje\n* Aktualizirati postojeæe preuzimanje Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relativni URI / Apsolutni URL (polazno)\nApsolutni URL / Apsolutni URL\nApsolutni URI / Apsolutni URL\nIzvorni URL / Izvorni URL Open Source offline browser Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. Preslikavatelj spletnih sadržaja/Preglednik mjesnih sadržaja. Preslikavanje internetskih sadržaja na Vaše raèunalo. Besplatno. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) Spisak URL-a (.txt) Previous Prethodno Next Slijedeæe URLs URL-i Warning Upozorenje Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Vaš preglednik trenutno ne podržava JavaScript. Za bolje rezultate koristite molim preglednik koji ovladava JavaScript. Thank you Hvala Vam You can now close this window Sada možete zatvoriti ovo okno Server terminated Poslužitelj je razriješen A fatal error has occurred during this mirror Tijekom ovog zrcaljenja je nastala fatalna pogreška Proxy type: Vrsta posrednika: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protokol posrednika. HTTP: standardni posrednik. HTTP (CONNECT tunel): ¹alje svaki zahtjev kroz CONNECT tunel, za posrednike koji podr¾avaju samo CONNECT poput Torovog HTTPTunnelPorta. SOCKS5: zadani port 1080. Load cookies from file: Uèitati kolaèiæe iz datoteke: Preload cookies from a Netscape cookies.txt file before crawling. Prije zrcaljenja uèitati kolaèiæe iz datoteke Netscape cookies.txt. Pause between files: Stanka izmeðu datoteka: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Nasumièna odgoda izmeðu preuzimanja datoteka, u sekundama. Za nasumièni raspon koristiti MIN:MAX (npr. 2:8). Keep the www. prefix (do not merge www.host with host) Zadr¾ati www. predmetak (ne spajati www.host s host) Do not treat www.host and host as the same site. www.host i host ne smatrati istim web-mjestom. Keep double slashes in URLs Zadr¾ati dvostruke kose crte u URL-ovima Do not collapse duplicate slashes in URLs. Ne sa¾imati ponovljene kose crte u URL-ovima. Keep the original query-string order Zadr¾ati izvorni redoslijed teksta za upite Do not reorder query-string parameters when deduplicating URLs. Ne mijenjati redoslijed parametara teksta za upite pri uklanjanju dvostrukih URL-ova. Strip query keys: Ukloniti kljuèeve upita: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Zarezom odvojeni kljuèevi upita koji se izostavljaju iz naziva spremljenih datoteka (npr. sid,utm_source). Write a WARC archive of the crawl Zapi¹i WARC arhivu obilaska Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Spremi i svaki preuzeti odgovor u ISO-28500 WARC/1.1 arhivu, uz zrcalo. WARC archive name: Naziv WARC arhive: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Neobavezni osnovni naziv WARC arhive; ostavite prazno za automatsko imenovanje u izlaznom direktoriju. httrack-3.49.14/lang/Chinese-Simplified.txt0000644000175000017500000007364515230602340014152 LANGUAGE_NAME Chinese-Simplified LANGUAGE_FILE Chinese-Simplified LANGUAGE_ISO zh LANGUAGE_AUTHOR Brook Qin (brookqwr at sina.com) \r\n LANGUAGE_CHARSET gb2312 LANGUAGE_WINDOWSID Chinese (PRC) OK È·¶¨ Cancel È¡Ïû Exit Í˳ö Close ¹Ø±Õ Cancel changes È¡Ïû¸ü¸Ä Click to confirm µã»÷ÒÔÈ·ÈÏ Click to get help! µã»÷ÒÔ»ñÈ¡°ïÖú! Click to return to previous screen µã»÷ÒÔ·µ»ØÇ°Ò»ÆÁÄ» Click to go to next screen µã»÷ÒÔµ½´ïÏÂÒ»ÆÁÄ» Hide password Òþ²Ø¿ÚÁî Save project ±£´æ¹¤³Ì Close current project? ÊÇ·ñ¹Ø±Õµ±Ç°¹¤³Ì? Delete this project? ɾ³ý´Ë¹¤³Ì? Delete empty project %s? ɾ³ý¿ÕµÄ¹¤³Ì %s? Action not yet implemented ²Ù×÷ÈÔδִÐÐ Error deleting this project ɾ³ý¸Ã¹¤³Ìʱ³ö´í Select a rule for the filter Ϊ¹ýÂËÆ÷ѡȡ¹æÔò Enter keywords for the filter Ϊ¹ýÂËÆ÷ÊäÈë¹Ø¼ü´Ê Cancel È¡Ïû Add this rule Ìí¼Ó¸Ã¹æÔò Please enter one or several keyword(s) for the rule ÇëΪ´Ë¹æÔòÊäÈëÒ»ÖÁ¼¸¸ö¹Ø¼ü´Ê Add Scan Rule Ìí¼ÓɨÃè¹æÔò Criterion ×¼Ôò String ×Ö·û´® Add Ìí¼Ó Scan Rules ɨÃè¹æÔò Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi ʹÓÃͨÅä·ûÒÔ°üº¬»òÅųýURLs»òÁ´½Ó.\n¶à¸ö¹æ¶¨É¨Ãè¹æÔòµÄ×Ö·û´®¿ÉдÔÚͬһÐÐ.\nʹÓÿոñ¼ü×÷Ϊ·Ö¸ô·û.\n\nʾÀý: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links ÅųýÁ´½Ó Include link(s) °üº¬Á´½Ó Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Ìáʾ: Óû°üº¬Ä³ÓòÃûϵÄËùÓÐGIFÎļþ, ¿ÉÊäÈë +www.someweb.com/*.gif. \n(+*.gif / -*.gif ½«°üº¬/ÅųýÀ´×ÔËùÓÐÕ¾µãµÄGIFÎļþ) Save prefs ±£´æÉèÖà Matching links will be excluded: Æ¥ÅäµÄÁ´½Ó½«±»Åųý: Matching links will be included: Æ¥ÅäµÄÁ´½Ó½«±»°üº¬: Example: ʾÀý: gif\r\nWill match all GIF files gif\r\n½«Æ¥ÅäËùÓÐGIFÎļþ blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\n½«²éÕÒµ½ËùÓаüº¬'blue' µÄÎļþ, ÖîÈç 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\n½«Æ¥ÅäÎļþ 'bigfile.mov', µ«²»°üÀ¨ 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\n½«²éÕÒµ½Îļþ¼ÐÃûÄÚ°üº¬'cgi' µÄÁ´½Ó, ÖîÈç /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\n½«²éÕÒµ½Îļþ¼ÐÃûÄÚ°üº¬'cgi-bin' µÄÁ´½Ó (µ«cgi-bin-2 ³ýÍâ) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\n½«²éÕÒµ½°üº¬ÖîÈçwww.someweb.com, private.someweb.com µÈµÄÁ´½Ó someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\n½«²éÕÒµ½°üº¬ÖîÈçwww.someweb.com, www.someweb.edu, private.someweb.otherweb.com µÈµÄÁ´½Ó www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\n½«²éÕÒµ½°üº¬'www.someweb.com' µÄÁ´½Ó (µ«²»°üÀ¨private.someweb.com/ µÈ) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\n½«²éÕÒµ½ÈκÎÖîÈçÒÔϵÄÁ´½Ó: www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html µÈ www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\n½«½ö²éÕÒµ½'www.test.com/test/someweb.html' Îļþ. ×¢ÒâÇëÊäÈëÍêÕûµÄ·¾¶. All links will match ËùÓеÄÁ´½Ó¶¼½«Æ¥Åä Add exclusion filter Ϊ¹ýÂËÆ÷Ìí¼ÓÅųý¹æÔò Add inclusion filter Ϊ¹ýÂËÆ÷Ìí¼Ó°üº¬¹æÔò Existing filters ÒѶ¨ÖƵĹýÂË×Ö·û´® Cancel changes È¡Ïû¸ü¸Ä Save current preferences as default values ½«µ±Ç°ÉèÖôæÎªÈ±Ê¡Öµ Click to confirm µã»÷ÒÔÈ·ÈÏ No log files in %s! %s ÄÚÎÞÈÕÖ¾Îļþ! No 'index.html' file in %s! %s ÄÚÎÞ'index.html' Îļþ! Click to quit WinHTTrack Website Copier µã»÷ÒÔÍ˳öWinHTTrack Website Copier View log files ²ì¿´ÈÕÖ¾Îļþ Browse HTML start page ä¯ÀÀ HTML Æðʼҳ End of mirror ¾µÏñ½áÊø View log files ²ì¿´ÈÕÖ¾Îļþ Browse Mirrored Website ä¯ÀÀÒѾµÏñµÄÍøÕ¾ New project... ÐµĹ¤³Ì... View error and warning reports ²ì¿´´íÎó¼°¾¯¸æ»ã±¨ View report ²ì¿´»ã±¨ Close the log file window ¹Ø±ÕÈÕÖ¾Îļþ´°¿Ú Info type: ÐÅÏ¢ÀàÐÍ: Errors ´íÎó Infos ÐÅÏ¢ Find ²éÕÒ Find a word ²éÕÒÒ»¸öµ¥´Ê Info log file ÐÅÏ¢ÈÕÖ¾Îļþ Warning/Errors log file ¾¯¸æ/´íÎóÈÕÖ¾Îļþ Unable to initialize the OLE system ÎÞ·¨³õʼ»¯OLEϵͳ WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack δÄÜÔÚÖ¸¶¨Îļþ¼ÐÄÚÕÒµ½±»ÖжϵÄÎļþÏÂÔØÔ¤´æÇø! Could not connect to provider ÎÞ·¨Á¬½Óµ½ÍøÂç receive ½ÓÊÕ request ÇëÇó connect Á¬½Ó search ѰÕÒ ready ¾ÍÐ÷ error ´íÎó Receiving files.. ½ÓÊÕÎļþ.. Parsing HTML file.. ½âÎöHTMLÎļþ.. Purging files.. Çå³ýÎļþ.. Loading cache in progress.. Parsing HTML file (testing links).. ½âÎöHTMLÎļþ (²âÊÔÁ´½Ó).. Pause - Toggle [Mirror]/[Pause download] to resume operation ¾µÏñÔÝÍ£ - Çл»[¾µÏñ]/[ÔÝÍ£ÏÂÔØ]ÒÔ¼ÌÐø²Ù×÷ Finishing pending transfers - Select [Cancel] to stop now! ½áÊø½øÐÐÖеĴ«Êä - Ñ¡Ôñ[È¡Ïû]ÒÔÍ£Ö¹ scanning ɨÃè Waiting for scheduled time.. µÈ´ýÔ¤¶¨µÄʱ¼ä.. Connecting to provider ÕýÔÚÁ¬½ÓÍøÂç [%d seconds] to go before start of operation Àë²Ù×÷¿ªÊ¼»¹ÓÐ[%d Ãë] Site mirroring in progress [%s, %s bytes] Õ¾µã¾µÏñ½øÐÐÖÐ [%s, %s ×Ö½Ú] Site mirroring finished! Õ¾µã¾µÏñÍê±Ï! A problem occurred during the mirroring operation\n ¾µÏñʱ·¢Éú´íÎó\n \nDuring:\n \n·¢ÉúÔÚÒÔÏÂÆÚ¼ä:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nÈçÓÐÐèÒªÇë¿´ÈÕÖ¾Îļþ.\n\nµã»÷'½áÊø'ÒÔÍ˳öWinHTTrack Website Copier.\n\nллʹÓÃWinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! ¾µÏñÍê³É.\nµã»÷'È·¶¨'ÒÔÍ˳öWinHTTrack.\nÈçÓÐÐèÒªÇë¿´ÈÕÖ¾Îļþ, ÒÔÈ·±£ÍòÎÞһʧ.\n\nллʹÓÃWinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ¾µÏñ±»È¡Ïû! * *\r\nµ±Ç°ÁÙʱµÄÔ¤´æÇøÎªÈÕºó¸üÐÂËùÐè, ½ö´æÓд˴α»ÖжϵľµÏñÆÚ¼äÄÚÏÂÔØµÄÊý¾Ý.\r\n¶øÔ­ÓÐÔ¤´æÇø¿ÉÄÜ»á´æÓиüÍêÕûµÄÄÚÈÝ; Èç¹ûÄã²»ÏëʧȥԭÓеÄÊý¾Ý, Çë»Ö¸´Ö®, ²¢É¾³ýµ±Ç°Ô¤´æÇø.\r\n[×¢: Óûɾ³ýµ±Ç°Ô¤´æÇø, ½öÐèɾ³ýÒÔÏÂÎļþ: hts-cache/new.*]\r\n\r\nÄãÊÇ·ñ¿Ï¶¨Ô­ÓÐÔ¤´æÇø´æÓиüÍêÕûµÄÄÚÈÝ, ²¢Ï£Íû»Ö¸´Ö®? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ¾µÏñ³ö´í!* *\r\nHTTrack¼ì²âµ½µ±Ç°¾µÏñδ´¢´æÈκÎÊý¾Ý. ÈôʹÓõĸüÐÂģʽ, Ôòǰһ´Î¾µÏñÒѱ»»Ö¸´.\r\n=> Ô­Òò: Ê×ҳδÄÜÕÒµ½, »ò·¢ÉúÁ¬½Ó´íÎó.\r\nÇëÈ·¶¨Óû¾µÏñµÄÍøÕ¾´æÔÚ, ²¢/»ò¼ì²é´úÀíÉèÖÃ! <= \n\nTip: Click [View log file] to see warning or error messages \n\nÌáʾ: µã»÷ [²ì¿´ÈÕÖ¾Îļþ] ÒԲ쿴¾¯¸æ»ò´íÎóÏûÏ¢ Error deleting a hts-cache/new.* file, please do it manually ɾ³ýhts-cache/new.* Îļþʱ³ö´í, ÇëÊÖ¹¤É¾³ý Do you really want to quit WinHTTrack Website Copier? ÕæµÄÒªÍ˳öWinHTTrack Website Copier Âð? - Mirroring Mode -\n\nEnter address(es) in URL box - ¾µÏñģʽ -\n\nÇëÔÚURL¿òÄÚÊäÈëµØÖ· - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - ½»»¥Ïòµ¼Ä£Ê½ (·¢ÎÊ) -\n\nÇëÔÚURL¿òÄÚÊäÈëµØÖ· - File Download Mode -\n\nEnter file address(es) in URL box - ÎļþÏÂÔØÄ£Ê½ -\n\nÇëÔÚURL¿òÄÚÊäÈëÎļþµØÖ· - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Á´½Ó²âÊÔģʽ -\n\nÇëÔÚURL¿òÄÚÊäÈ뺬ÓÐÁ´½ÓµÄWebÒ³µØÖ· - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - ¸üÐÂģʽ -\n\nÇëºË¶ÔURL¿òÀïµÄµØÖ·, ÈçÓÐÐèÒªÇë¼ì²éÑ¡Ïî, È»ºóµã»÷'Next' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - ¼ÌÐøÄ£Ê½ (±»ÖжϵIJÙ×÷) -\n\nÇëºË¶ÔURL¿òÀïµÄµØÖ·, ÈçÓÐÐèÒªÇë¼ì²éÑ¡Ïî, È»ºóµã»÷'Next' Log files Path ÈÕÖ¾Îļþ·¾¶ Path ·¾¶ - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Á´½Ó±íģʽ -\n\nÇëÔÚURL¿òÄÚÊäÈëÒ³ÃæµÄµØÖ·, Ò³ÃæÖк¬ÓÐÁ´½ÓµÄÁбí, ÁбíÖÐËùÓÐÁ´½Ó¾ù»á±»¾µÏñ New project / Import? ÐµĹ¤³Ì / µ¼Èë? Choose criterion ѡȡ½«½øÐеIJÙ×÷µÄÀàÐÍ Maximum link scanning depth ×î´óÁ´½ÓɨÃèÉî¶È Enter address(es) here ÇëÔÚ´ËÊäÈëµØÖ· Define additional filtering rules ¶¨Ò帽¼Ó¹ýÂËÆ÷¹æÔò Proxy Name (if needed) ´úÀíµØÖ·(ÈçÈôÐèÒª) Proxy Port ´úÀí¶Ë¿Ú Define proxy settings ¶¨Òå´úÀí·þÎñÆ÷ÉèÖà Use standard HTTP proxy as FTP proxy ʹÓñê×¼HTTP´úÀíÌæ´úFTP´úÀí Path ·¾¶ Select Path Ñ¡Ôñ·¾¶ Path ·¾¶ Select Path Ñ¡Ôñ·¾¶ Quit WinHTTrack Website Copier Í˳öWinHTTrack Website Copier About WinHTTrack ¹ØÓÚWinHTTrack Save current preferences as default values ±£´æµ±Ç°ÉèÖÃΪȱʡֵ Click to continue µã»÷ÒÔ¼ÌÐø Click to define options µã»÷ÒÔÉ趨ѡÏî Click to add a URL µã»÷ÒÔÌí¼ÓURL Load URL(s) from text file ´ÓÎı¾ÎļþÖÐÔØÈëURL(s) WinHTTrack preferences (*.opt)|*.opt|| WinHTTrackÉèÖÃÎļþ (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| µØÖ·ÁбíÎı¾Îļþ (*.txt)|*.txt|| File not found! ÎļþδÕÒµ½! Do you really want to change the project name/path? ÕæµÄÒª¸Ä±ä¹¤³ÌµÄÃû³Æ»ò·¾¶Âð? Load user-default options? ÔØÈëÓû§¶¨ÒåµÄȱʡѡÏîÖµÂð? Save user-default options? ´æÎªÓû§¶¨ÒåµÄȱʡѡÏîÖµÂð? Reset all default options? ½«ËùÓÐÑ¡Ïî»Ö¸´µ½×î³õÉ趨Âð? Welcome to WinHTTrack! »¶Ó­Ê¹ÓÃWinHTTrack! Action: ²Ù×÷: Max Depth ×î´óÉî¶È Maximum external depth: ×î´óÍⲿÁ´½ÓÉî¶È Filters (refuse/accept links) : ¹ýÂËÆ÷ (Åųý/°üº¬Á´½Ó): Paths ·¾¶ Save prefs ±£´æÉèÖà Define.. ¶¨Òå.. Set options.. Ñ¡Ïî.. Preferences and mirror options: Ñ¡ÏîÉ趨: Project name ¹¤³ÌÃû³Æ Add a URL... Ìí¼ÓURL.. Web Addresses: (URL) WebµØÖ·: (URL) Stop WinHTTrack? Í£Ö¹WinHTTrack? No log files in %s! %s ÄÚÎÞÈÕÖ¾Îļþ! Pause Download? ÔÝÍ£ÏÂÔØ? Stop the mirroring operation Í£Ö¹¾µÏñ Minimize to System Tray ×îС»¯ÖÁϵͳÍÐÅÌÇø Click to skip a link or stop parsing µã»÷ÒÔÌø¹ýÒ»¸öÁ´½Ó»òÍ£Ö¹½âÎö Click to skip a link µã»÷ÒÔÌø¹ýÒ»¸öÁ´½Ó Bytes saved Òѱ£´æ×Ö½Ú: Links scanned ÒÑɨÃèÁ´½Ó: Time: ʱ¼ä: Connections: Á¬½Ó: Running: ÔËÐÐ: Hide Òþ²Ø Transfer rate ´«ÊäËÙÂÊ: SKIP Ìø¹ý Information ÐÅÏ¢ Files written: ÒÑ´¢´æÎļþ: Files updated: ÒѸüÐÂÎļþ: Errors: ´íÎó: In progress: ½ø³ÌÖÐ: Follow external links ×·ËæÍⲿÁ´½Ó Test all links in pages ²âÊÔÒ³ÃæÖеÄËùÓÐÁ´½Ó Try to ferret out all links ¾¡¿ÉÄܲé³öËùÓÐÁ´½Ó Download HTML files first (faster) ÏÈÏÂÔØHTMLÎļþ (¸ü¿ì) Choose local site structure Ñ¡Ôñ±¾µØÕ¾µã½á¹¹ Set user-defined structure on disk ÉèÖÃÔÚ´ÅÅÌÉϵÄÓû§×Ô¶¨Òå½á¹¹ Use a cache for updates and retries ʹÓÃÔ¤´æÇø, ÓÃÓÚ¸üкÍÖØÊÔ Do not update zero size or user-erased files ²»¸üÐÂÁã×Ö½ÚÎļþ»òÓÉÓû§É¾³ýµÄÎļþ Create a Start Page ´´½¨Ò»¸öÆðÊ¼Ò³Ãæ Create a word database of all html pages ¸ù¾ÝÍøÒ³Ê¹ÓÃÓïÑÔ´´½¨´Ê»ã¿âÎļþ Create error logging and report files ´´½¨´íÎó¼Ç¼¼°»ã±¨Îļþ Generate DOS 8-3 filenames ONLY ½öÉú³ÉDOSϵÄ8-3ÎļþÃû¸ñʽ Generate ISO9660 filenames ONLY for CDROM medias Do not create HTML error pages ²»´´½¨HTML´íÎóÒ³Ãæ Select file types to be saved to disk Ñ¡Ôñ½«±»´æÅ̵ÄÎļþÀàÐÍ Select parsing direction Ñ¡Ôñ½âÎö·½Ïò Select global parsing direction Ñ¡ÔñÈ«¾Ö½âÎö·½Ïò Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) É趨¶ÔÄÚ²¿Á´½Ó(±»ÏÂÔØÁ´½Ó)ºÍÍⲿÁ´½Ó(²»±»ÏÂÔØÁ´½Ó)µØÖ·¸üÖõĹæÔò Max simultaneous connections ×î¶à²¢·¢Á¬½ÓÊý File timeout Îļþ³¬Ê± Cancel all links from host if timeout occurs Èô³¬Ê±·¢Éú, È¡ÏûËùÓÐÀ´×ÔÖ÷»úµÄÁ´½Ó Minimum admissible transfer rate ×îСËùÔÊÐíµÄ´«ÊäËÙÂÊ Cancel all links from host if too slow Èô´«Êä¹ýÂý, È¡ÏûËùÓÐÀ´×ÔÖ÷»úµÄÁ´½Ó Maximum number of retries on non-fatal errors ×î¶àÖØÊÔ´ÎÊý (·¢Éú·ÇÖÂÃü´íÎóʱ) Maximum size for any single HTML file µ¥¸öHTMLÎļþËùÔÊÐíµÄ×î´ó³ß´ç Maximum size for any single non-HTML file µ¥¸ö·ÇHTMLÎļþËùÔÊÐíµÄ×î´ó³ß´ç Maximum amount of bytes to retrieve from the Web ×î¶àËùÔÊÐí´ÓWeb½ÓÊÕµÄ×Ö½ÚÊý Make a pause after downloading this amount of bytes ÏÂÔØÍêÖ¸¶¨µÄ×Ö½ÚÊýºóÔÝÍ£ Maximum duration time for the mirroring operation ¾µÏñ¹ý³ÌËùÔÊÐíµÄ×ʱ¼ä Maximum transfer rate ×î´óËùÏÞÖÆµÄ´«ÊäËÙÂÊ Maximum connections/seconds (avoid server overload) ÿÃë×î¶à²¢·¢Á¬½áÊý (·ÀÖ¹·þÎñÆ÷³¬ÔØ) Maximum number of links that can be tested (not saved!) ÔÊÐí¼ì²âµÄ×î¶àÁ´½ÓÊýÄ¿(²¢·Ç±£´æ!) Browser identity ä¯ÀÀÆ÷Éí·Ý Comment to be placed in each HTML file ÔÚÿ¸öHTMLÎļþÀïÌí¼ÓµÄ×¢ÊÍ Back to starting page »Øµ½ÆðÊ¼Ò³Ãæ Save current preferences as default values ½«µ±Ç°ÉèÖôæÎªÈ±Ê¡Öµ Click to continue µã»÷ÒÔ¼ÌÐø Click to cancel changes µã»÷ÒÔÈ¡Ïû¸Ä¶¯ Follow local robots rules on sites ×ñ´ÓÍøÕ¾µÄrobots¹æÔò Links to non-localised external pages will produce error pages δ±¾µØ»¯µÄÍâ²¿Ò³ÃæÁ´½Ó½«²úÉú´íÎóÒ³Ãæ Do not erase obsolete files after update ¸üкó²»É¾³ý·ÏÆúµÄÎļþ Accept cookies? ÊÇ·ñ½ÓÊÕcookies? Check document type when unknown? ÊÇ·ñ¼ì²éδ֪ÎļþÀàÐÍ? Parse java applets to retrieve included files that must be downloaded? ÊÇ·ñ½âÎöjavaÓ¦ÓóÌÐòÒÔÈ¡»ØÆäÖаüº¬µÄÎļþ? Store all files in cache instead of HTML only ½«ËùÓÐÎļþ½ö±£´æÔÚÔ¤´æÇøÀï (·ÇHTML) Log file type (if generated) ÈÕÖ¾ÎļþÀàÐÍ (ÈôÓÐ) Maximum mirroring depth from root address ´ÓµØÖ·¸ù²¿¿ªÊ¼×î´óµÄ¾µÏñÉî¶È Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Íⲿ/·Ç·¨µØÖ·¾µÏñµÄ×î´óÉî¶È(ȱʡΪ0, ¼´²»¾µÏñ) Create a debugging file ´´½¨Ò»¸öµ÷ÊÔÎļþ Use non-standard requests to get round some server bugs ʹÓ÷DZê×¼ÇëÇóÒÔ±ÜÃâijЩ·þÎñÆ÷´íÎó Use old HTTP/1.0 requests (limits engine power!) ʹÓÃ¾ÉµÄ HTTP/1.0 ÇëÇó (½«ÏÞÖÆ¾µÏñÄÜÁ¦!) Attempt to limit retransfers through several tricks (file size test..) ÊÔÒÔÈô¸ÉÊÖ¶ÎÏÞÖÆÔÙ´«ËÍ (Èçͨ¹ýÎļþ´óС²âÊÔ) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password ±£´æÁ´½Óʱ²»ÐºÂ¶µÇ½Ãû/¿ÚÁî Write internal links without query string ¸ÄдÄÚ²¿Á´½Óʱ²»ÏÔʾÊäÈëµÄÕ˺ÅÐÅÏ¢ Get non-HTML files related to a link, eg external .ZIP or pictures ±£´æËùÓÐÖ¸Ïò·ÇHTMLÎļþµÄÁ´½Ó, ÀýÈçÍⲿµÄZIPÎļþ»òͼƬÎļþ Test all links (even forbidden ones) ²âÊÔËùÓÐÁ´½Ó (¼´Ê¹±»½ûÖ¹µÄ) Try to catch all URLs (even in unknown tags/code) ÊÔͼ²¶»ñËùÓеÄURLs (¼´Ê¹´æÔÚÓÚδ֪µÄ±êʶ·û»ò´úÂëÄÚ) Get HTML files first! Ê×Ïȱ£´æHTMLÎļþ! Structure type (how links are saved) ½á¹¹ÀàÐÍ (Á´½Ó±£´æµÄ·½Ê½) Use a cache for updates ʹÓÃÔ¤´æÇøÒÔ±ãÈÕºó¸üРDo not re-download locally erased files ²»ÔÙÏÂÔØÔÚ±¾µØÒѱ»É¾³ýµÄÎļþ Make an index ´´½¨Ò»¸ö index.html Îļþ Make a word database ´´½¨´Ê»ã¿â Log files ÈÕÖ¾Îļþ DOS names (8+3) DOS ÎļþÃû¸ñʽ (8+3) ISO9660 names (CDROM) No error pages ³ýÈ¥´íÎóÒ³ Primary Scan Rule Ê×ҪɨÃè¹æÔò Travel mode ÐнøÄ£Ê½ Global travel mode È«¾ÖÐнøÄ£Ê½ These options should be modified only exceptionally ÒÔÏÂÑ¡ÏîÖ»ÔÚÌØÊâÇé¿öÏÂÐÞ¸Ä Activate Debugging Mode (winhttrack.log) Æô¶¯µ÷ÊÔģʽ (´´½¨winhttrack.log) Rewrite links: internal / external ¸üÖÃÁ´½Ó: ÄÚ²¿ / Íⲿ Flow control Á÷Á¿¿ØÖÆ Limits ÏÞÖÆ Identity Éí·Ý HTML footer HTMLÒ³½Å N# connections Á¬½ÓÊý Abandon host if error Èô·¢Éú´íÎó, Ôò·ÅÆúºÍÖ÷»úµÄÁ¬½Ó Minimum transfer rate (B/s) ×îС´«ÊäÂÊ (×Ö½Ú/Ãë) Abandon host if too slow Èô´«Êä¹ýÂý, Ôò·ÅÆúºÍÖ÷»úµÄÁ¬½Ó Configure ÅäÖà Use proxy for ftp transfers ʹÓôúÀí½øÐÐftp´«Êä TimeOut(s) ³¬Ê± Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries ÖØÊÔ Size limit ´óСÏÞÖÆ Max size of any HTML file (B) µ¥¸öHTMLÎļþµÄ×î´ó³ß´ç Max size of any non-HTML file µ¥¸ö·ÇHTMLÎļþµÄ×î´ó³ß´ç Max site size ¾µÏñÕ¾µã×î´ó³ß´ç Max time ×ʱ¼ä Save prefs ±£´æÉèÖà Max transfer rate ×î´ó´«ÊäËÙÂÊ Follow robots.txt ×ñÊØ robots.txt ¹æÔò No external pages ²»²úÉúÍâ²¿Ò³Ãæ Do not purge old files ²»Çå³ý·ÏÆúÎļþ Accept cookies ½ÓÊÕcookies Check document type ¼ì²éÎļþÀàÐÍ Parse java files ½âÎöjavaÎļþ Store ALL files in cache ±£´æËùÓÐÎļþÔÚÔ¤´æÇøÄÚ Tolerant requests (for servers) ÔÊÐí¶Ô·þÎñÆ÷µÄ·Ç¾«È·ÇëÇó Update hack (limit re-transfers) ¸üÐÂʱ²ÉÈ¡ÆäËûÊֶηÀÖ¹ÖØ¸´ÏÂÔØ URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Ç¿ÖÆÊ¹ÓþɵÄHTTP/1.0ÇëÇó (²»²ÉÓÃ1.1) Max connections / seconds ÿÃë×î¶àÁ¬½ÓÊý Maximum number of links ×î¶àɨÃèÁ´½Ó Pause after downloading.. ÔÝÍ£ÓÚÿÏÂÔØ.. Hide passwords Òþ²Ø¿ÚÁî Hide query strings Òþ²ØÕ˺ÅÐÅÏ¢ Links Á´½Ó Build ¹¹Ôì Experts Only ¸ß¼¶ Flow Control Á÷Á¿¿ØÖÆ Limits ÏÞÖÆ Browser ID ä¯ÀÀÆ÷±êʶ Scan Rules ɨÃè¹æÔò Spider ËÑѰ Log, Index, Cache ÈÕÖ¾, Ë÷Òý, Ô¤´æÇø Proxy ´úÀí MIME Types Do you really want to quit WinHTTrack Website Copier? ÕæµÄÒªÍ˳öWinHTTrack Website Copier Âð? Do not connect to a provider (already connected) ÒÑÁ¬½Óµ½ÍøÂç Do not use remote access connection ²»Ê¹ÓÃÔ¶³ÌÁ¬½Ó Schedule the mirroring operation Ô¤¶¨½øÐоµÏñµÄʱ¼ä Quit WinHTTrack Website Copier Í˳öWinHTTrack Website Copier Back to starting page »Øµ½ÆðÊ¼Ò³Ãæ Click to start! µã»÷ÒÔ¿ªÊ¼! No saved password for this connection! ¸ÃÁ¬½ÓȱÉÙÒѱ£´æµÄÃÜÂë! Can not get remote connection settings ÎÞ·¨»ñȡԶ³ÌÁ¬½ÓµÄÉèÖà Select a connection provider ÇëÑ¡ÔñÒ»¸öÁ¬½Ó Start ¿ªÊ¼ Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. ÈçÓÐÐèÒªÇëÐÞ¸ÄÁ¬½Ó²ÎÊý,\nÈ»ºó°´ 'Íê³É' ¿ªÊ¼¾µÏñ Save settings only, do not launch download now. ²»Á¢¼´½øÐоµÏñ, ½ö±£´æµ±Ç°ÉèÖà On hold ¹ÒÆð Transfer scheduled for: (hh/mm/ss) Ô¤¶¨¾µÏñ¿ªÊ¼ÓÚ: (µã/·Ö/Ãë) Start ¿ªÊ¼ Connect to provider (RAS) Á¬½Óµ½ÍøÂç(Ô¶³ÌÁ¬½Ó·þÎñÆ÷) Connect to this provider ʹÓøÃÁ¬½Ó: Disconnect when finished Íê³Éʱ¶ÏµôÁ¬½Ó Disconnect modem on completion Íê³Éʱ¶Ïµôµ÷ÖÆ½âµ÷Æ÷ \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(ÓÐÈκγÌÐò´íÎó»òÎÊÌâÇëÁªÏµÎÒÃÇ)\r\n\r\n¿ª·¢:\r\n½çÃæÉè¼Æ (Windows): Xavier Roche\r\n½âÎöÒýÇæ: Xavier Roche\r\nJava½âÎöÒýÇæ: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\n¸Ðл:\r\nRobert Lagadec (rlagadec@yahoo.fr) Ìṩ·­Òë¼¼ÇÉ About WinHTTrack Website Copier ¹ØÓÚWinHTTrack Website Copier Please visit our Web page Çë·ÃÎÊÎÒÃǵÄÖ÷Ò³ Wizard query Ïòµ¼ÌáÎÊ Your answer: ÄãµÄ´ð°¸: Link detected.. ¼ì²âµ½Á´½Ó.. Choose a rule ÇëÑ¡Ôñ¹æÔò Ignore this link ºöÂÔ´ËÁ´½Ó Ignore directory ºöÂÔ´ËĿ¼ Ignore domain ºöÂÔ´ËÓòÃû Catch this page only ½öÏÂÔØ´ËÒ³ Mirror site ¾µÏñÕ¾µã Mirror domain ¾µÏñÓòÃû Ignore all È«²¿ºöÂÔ Wizard query Ïòµ¼ÌáÎÊ NO ·ñ File Îļþ Options Ñ¡Ïî Log ÈÕÖ¾ Window ´°¿Ú Help °ïÖú Pause transfer ÔÝÍ£´«Êä Exit Í˳ö Modify options ÐÞ¸ÄÑ¡Ïî View log ²ì¿´ÈÕÖ¾ View error log ²ì¿´´íÎóÈÕÖ¾ View file transfers ²ì¿´Îļþ´«Êä Hide Òþ²Ø About WinHTTrack Website Copier ¹ØÓÚWinHTTrack Website Copier Check program updates... ¼ì²é°æ±¾¸üÐÂ... &Toolbar ¹¤¾ßÀ¸ &Status Bar ״̬À¸ S&plit ·Ö¸î File Îļþ Preferences ÉèÖà Mirror ¾µÏñ Log ÈÕÖ¾ Window ´°¿Ú Help °ïÖú Exit Í˳ö Load default options ÔØÈë×Ô¶¨ÒåȱʡѡÏî Save default options ´æÎª×Ô¶¨ÒåȱʡѡÏî Reset to default options »Ö¸´Ô­Ê¼É趨 Load options... ÔØÈëÑ¡Ïî... Save options as... ±£´æÑ¡Ïî... Language preference... ½çÃæÓïÑÔÉèÖÃ... Contents... ÄÚÈÝ... About WinHTTrack... ¹ØÓÚWinHTTrack... New project\tCtrl+N ÐµĹ¤³Ì\tCtrl+N &Open...\tCtrl+O &´ò¿ª...\tCtrl+O &Save\tCtrl+S &±£´æ\tCtrl+S Save &As... ±£´æÑ¡Ïî... &Delete... &ɾ³ý... &Browse sites... &ä¯ÀÀÒѾµÏñÕ¾µã... User-defined structure Óû§×Ô¶¨Òå½á¹¹ %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\t²»º¬À©Õ¹ÃûµÄÎļþÃû(Èç: image)\r\n%N\tº¬ÓÐÀ©Õ¹ÃûµÄÎļþÃû(Èç: image.gif)\r\n%t\t½öÀ©Õ¹Ãû(Èç: gif)\r\n%p\t·¾¶[ÎÞÎ²Ëæ'/'] (Èç: /someimages)\r\n%h\tÖ÷»úÃû(Èç: www.someweb.com)\r\n%M\tMD5 URL (128λ, 32 ascii ×Ö½Ú)\r\n%Q\tMD5 query string (128λ, 32 ascii ×Ö½Ú)\r\n%q\tMD5 small query string (16λ, 4 ascii ×Ö½Ú)\r\n\r\n%s?\t¶ÌÎļþÃû(Èç: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif ʾÀý:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings ´úÀíÉèÖà Proxy address: ´úÀíµØÖ·: Proxy port: ´úÀí¶Ë¿Ú: Authentication (only if needed) Éí·ÝÑéÖ¤ (ÈçÈôÐèÒª) Login µÇ¼ Password ¿ÚÁî Enter proxy address here ÔÚ´ËÊäÈë´úÀíµØÖ· Enter proxy port here ÔÚ´ËÊäÈë´úÀí¶Ë¿Ú Enter proxy login ÊäÈë´úÀí·þÎñÆ÷µÇ¼ÐÅÏ¢ Enter proxy password ÊäÈë´úÀí·þÎñÆ÷ËùÐè¿ÚÁî Enter project name here ÔÚ´ËÊäÈ빤³ÌÃû Enter saving path here ÔÚ´ËÊäÈë×ܱ£´æÂ·¾¶ Select existing project to update ÇëÑ¡ÔñÒ»¸öÒÑÓеŤ³ÌÒÔ¸üРClick here to select path µã»÷´Ë´¦ÒÔÑ¡Ôñ·¾¶ Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack ¹¤³ÌÏòµ¼... New project name: й¤³ÌµÄÃû³Æ: Existing project name: ÏÖÓй¤³ÌµÄÃû³Æ: Project name: ¹¤³ÌÃû: Base path: ×ܱ£´æÂ·¾¶: Project category: C:\\My Web Sites C:\\My Websites Type a new project name, \r\nor select existing project to update/resume Çë¼üÈëÒ»¸öÐµĹ¤³ÌÃû, \r\n»òÑ¡ÔñÒÑÓй¤³ÌÒÔ¸üлò¼ÌÐø New project ÐµĹ¤³Ì Insert URL ²åÈëURL URL: URLµØÖ·: Authentication (only if needed) Éí·ÝÑéÖ¤ (ÈçÈôÐèÒª) Login µÇ¼ Password ¿ÚÁî Forms or complex links: ±í¸ñ»ò¸´ÔÓÁ´½Ó: Capture URL... ²¶»ñURLµØÖ·... Enter URL address(es) here ÇëÔÚ´ËÊäÈëURLµØÖ· Enter site login ÇëÊäÈëÕ¾µãµÇ¼Ãû Enter site password ÇëÊäÈëÕ¾µãµÇ½¿ÚÁî Use this capture tool for links that can only be accessed through forms or javascript code ʹÓô˹¤¾ß²¶»ñÖ»ÄÜͨ¹ý±í¸ñ»òjava´úÂë·ÃÎʵ½µÄÁ´½Ó Choose language according to preference Çë¸ù¾Ý¸öÈËϲºÃÑ¡Ôñ½çÃæÓïÑÔ Catch URL! ²¶»ñURLµØÖ·! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. ÇëÏÈÔÝʱ½«ä¯ÀÀÆ÷µÄ´úÀíÉèΪÈçÏÂÊýÖµ(¿½±´/Õ³Ìù´úÀíµØÖ·ºÍ¶Ë¿Ú).\nÈ»ºóµã»÷ä¯ÀÀÆ÷Ò³ÃæÉϱí¸ñµÄSUBMIT°´Å¥, »òµã»÷ÏëÒª²¶»ñµÄÁ´½Ó This will send the desired link from your browser to WinHTTrack. ËùÐèµÄÁ´½Ó½«´Óä¯ÀÀÆ÷±»ËÍÖÁWinHTTrack. ABORT ·ÅÆú Copy/Paste the temporary proxy parameters here ÔÚ´Ë¿½±´/Õ³ÌùÔÝʱµÄ´úÀí²ÎÊý Cancel È¡Ïû Unable to find Help files! ÎÞ·¨ÕÒµ½°ïÖúÎļþ! Unable to save parameters! ÎÞ·¨±£´æ²ÎÊý! Please drag only one folder at a time Çëÿ´ÎÖ»ÍÏÒ»¸öÎļþ¼Ð Please drag only folders, not files Çë²»ÒªÍÏÎļþ, Ö»ÍÏÎļþ¼Ð Please drag folders only ÇëÖ»ÍÏÎļþ¼Ð Select user-defined structure? Ñ¡ÔñÓû§×Ô¶¨Òå½á¹¹Âð? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! ÇëÈ·±£Óû§¶¨ÒåµÄ×Ö·û´®µÄÕýÈ·ÐÔ,\n·ñÔòÉú³ÉÎļþÃûʱ¿ÉÄܳö´í! Do you really want to use a user-defined structure? ÕæµÄҪʹÓÃÓû§×Ô¶¨Òå½á¹¹Âð? Too manu URLs, cannot handle so many links!! ¹ý¶àURLsµØÖ·, ÎÞ·¨´¦Àí!! Not enough memory, fatal internal error.. ÄÚ´æ²»×ã, ·¢ÉúÖÂÃüÄÚ²¿´íÎó! Unknown operation! δ֪²Ù×÷! Add this URL?\r\n Ìí¼Ó´ËURL? Warning: main process is still not responding, cannot add URL(s).. ¾¯¸æ: Ö÷½ø³ÌδÓÐÏìÓ¦, ²»ÄÜÌí¼ÓURL(s).. Type/MIME associations ÎļþÀàÐÍ/À©Õ¹¹ØÁª File types: ÎļþÀàÐÍ: MIME identity: MIME identity Select or modify your file type(s) here ÔÚ´ËÑ¡Ôñ»òÐÞ¸ÄÎļþÀàÐÍ Select or modify your MIME type(s) here ÔÚ´ËÑ¡Ôñ»òÐ޸ĹØÁªÎļþÀàÐÍ Go up ÏòÉÏ Go down ÏòÏ File download information ÎļþÏÂÔØÐÅÏ¢ Freeze Window Ëø¶¨´°¿ÚÐÅÏ¢ More information: ¸ü¶àÐÅÏ¢: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download »¶Ó­Ê¹ÓÃWinHTTrack Website Copier!\n\nÇëµã»÷'Next' ÒÔ\n\n- ¿ªÊ¼Ò»¸öÐµĹ¤³Ì\n- »ò¼ÌÐøÖ´ÐÐÒ»¸öÒÔǰµÄ¾µÏñ File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS ÎļþÃûÖаüº¬À©Õ¹Ãû:\nÎļþÃûÖаüº¬:\n´ËÎļþÃû:\nÎļþ¼ÐÃûÖаüº¬:\n´ËÎļþ¼ÐÃû:\n´ËÓòÃû:\nÓòÃûÖаüº¬:\n´ËÖ÷»ú:\nÁ´½ÓÖаüº¬:\n´ËÁ´½Ó:\nËùÓÐÁ´½Ó Show all\nHide debug\nHide infos\nHide debug and infos ÏÔʾȫ²¿ÄÚÈÝ\nÒþ²Ø´íÎó\nÒþ²ØÏûÏ¢\nÒþ²Ø´íÎóºÍÏûÏ¢ Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Õ¾µãÔ­Óнṹ(ȱʡ)\nhtmlÎļþÔÚweb/, ͼƬºÍÆäËûÎļþÔÚweb/images/\nhtmlÎļþÔÚweb/html, ͼƬºÍÆäËûÎļþÔÚweb/images\nhtmlÎļþÔÚweb/, ͼƬºÍÆäËûÎļþÒ²ÔÚweb/\nhtmlÎļþÔÚweb/, ͼƬºÍÆäËûÎļþÔÚweb/xxx, xxxΪÎļþÀ©Õ¹Ãû\nhtmlÎļþÔÚweb/html, ͼƬºÍÆäËûÎļþÔÚweb/xxx\nÕ¾µãÔ­Óнṹ(È¥µôwww.domain.xxx/)\nhtmlÎļþÔÚsite_name/, ͼƬºÍÆäËûÎļþÔÚsite_name/images/\nhtmlÎļþÔÚsite_name/html, ͼƬºÍÆäËûÎļþÔÚsite_name/images\nhtmlÎļþÔÚsite_name/, ͼƬºÍÆäËûÎļþÒ²ÔÚsite_name/\nhtmlÎļþÔÚsite_name/, ͼƬºÍÆäËûÎļþÔÚsite_name/xxx\nhtmlÎļþÔÚsite_name/html, ͼƬºÍÆäËûÎļþÔÚsite_name/xxx\nËùÓÐÎļþÔÚweb/, ÎļþÃûÈÎÒâ²úÉú\nËùÓÐÎļþÔÚsite_name/, ÎļþÃûÈÎÒâ²úÉú\nÓû§×Ô¶¨Òå½á¹¹.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Ö»×öɨÃè\nÖ»±£´æhtmlÎļþ\nÖ»±£´æ·ÇhtmlÎļþ\n±£´æËùÓÐÎļþ (ȱʡ)\nÏȱ£´æhtmlÎļþ Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Í£ÁôÓÚͬһĿ¼\nÔÊÐíÍùϽøÐÐ (ȱʡ)\nÔÊÐíÍùÉϽøÐÐ\nÉÏ϶¼ÔÊÐí½øÐÐ Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Í£ÁôÓÚͬһµØÖ· (ȱʡ)\nÍ£ÁôÓÚͬһÓòÃû\nÍ£ÁôÓÚͬһ¶¥¼¶ÓòÃû\nÈκÎÍøÂçµØÖ· Never\nIf unknown (except /)\nIf unknown ´Ó²»\nÈç¹ûδ֪ (/ ³ýÍâ)\nÈç¹ûδ֪ no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ²»×ñÊØrobots.txt\n×ñÊØ¹ýÂËÆ÷ÓÅÏÈÓÚrobots.txt\nÍêÈ«×ñÊØrobots.txt normal\nextended\ndebug ÆÕͨÈÕÖ¾\nÀ©Õ¹ÈÕÖ¾\n³ý´íÈÕÖ¾ Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download ÏÂÔØÍøÕ¾\nÏÂÔØÍøÕ¾ + ÌáÎÊ\nÏÂÔØ¸ö±ðÎļþ\nÏÂÔØÒ³ÃæÖеÄËùÓÐÕ¾µã (¶à¸ö¾µÏñ)\n²âÊÔÒ³ÃæÖеÄÁ´½Ó (ÊéÇ©²âÊÔ)\n* ¼ÌÐø±»ÖжϵľµÏñ\n* ¸üÐÂÒÑÓоµÏñ Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Ïà¶ÔµØÖ· / ¾ø¶ÔµØÖ· (ȱʡ)\n¾ø¶ÔµØÖ· / ¾ø¶ÔµØÖ·\n¾ø¶ÔµØÖ· / ¾ø¶ÔµØÖ·\nԭʼ µØÖ· / ԭʼµØÖ· Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: ´úÀíÀàÐÍ: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. ´úÀíЭÒé¡£HTTP£º±ê×¼´úÀí¡£HTTP£¨CONNECT ËíµÀ£©£ºÍ¨¹ý CONNECT ËíµÀ·¢ËÍÿ¸öÇëÇó£¬ÓÃÓÚ½öÖ§³Ö CONNECT µÄ´úÀí£¬ÀýÈç Tor µÄ HTTPTunnelPort¡£SOCKS5£ºÄ¬ÈÏ¶Ë¿Ú 1080¡£ Load cookies from file: ´ÓÎļþ¼ÓÔØ cookies: Preload cookies from a Netscape cookies.txt file before crawling. ÔÚץȡǰ´Ó Netscape ¸ñʽµÄ cookies.txt ÎļþÔ¤¼ÓÔØ cookies¡£ Pause between files: Îļþ¼äÔÝÍ£: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). ÎļþÏÂÔØÖ®¼äµÄËæ»úÑÓ³Ù£¨Ã룩¡£Ê¹Óà MIN:MAX Ö¸¶¨Ëæ»ú·¶Î§ (ÀýÈç 2:8)¡£ Keep the www. prefix (do not merge www.host with host) ±£Áô www. ǰ׺ (²»½« www.host Óë host ºÏ²¢) Do not treat www.host and host as the same site. ²»°Ñ www.host ºÍ host ÊÓΪͬһվµã¡£ Keep double slashes in URLs ±£Áô URL ÖеÄ˫б¸Ü Do not collapse duplicate slashes in URLs. ²»ºÏ²¢ URL ÖÐÖØ¸´µÄб¸Ü¡£ Keep the original query-string order ±£Áô²éѯ×Ö·û´®µÄԭʼ˳Ðò Do not reorder query-string parameters when deduplicating URLs. ÔÚ¶Ô URL È¥ÖØÊ±²»ÖØÐÂÅÅÁвéѯ×Ö·û´®²ÎÊý¡£ Strip query keys: °þÀë²éѯ¼ü: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). ÓöººÅ·Ö¸ôµÄ²éѯ¼ü£¬½«Æä´Ó±£´æÎļþµÄÃüÃûÖÐɾ³ý (ÀýÈç sid,utm_source)¡£ Write a WARC archive of the crawl дÈë±¾´ÎץȡµÄ WARC ¹éµµ Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. ͬʱ½«Ã¿¸öÒÑ»ñÈ¡µÄÏìÓ¦±£´æÎª ISO-28500 WARC/1.1 ¹éµµ£¬ÖÃÓÚ¾µÏñÕ¾µãÅԱߡ£ WARC archive name: WARC ¹éµµÃû³Æ£º Optional base name for the WARC archive; leave blank to auto-name it under the output directory. WARC ¹éµµµÄ¿ÉÑ¡»ù±¾Ãû³Æ£»Áô¿ÕÔòÔÚÊä³öĿ¼ÖÐ×Ô¶¯ÃüÃû¡£ httrack-3.49.14/lang/Chinese-BIG5.txt0000644000175000017500000007470115230602340012545 LANGUAGE_NAME Chinese-BIG5 LANGUAGE_FILE Chinese-BIG5 LANGUAGE_ISO zh_TW LANGUAGE_AUTHOR David Hing Cheong Hung (DAVEHUNG@mtr.com.hk)\r\n LANGUAGE_CHARSET BIG5 LANGUAGE_WINDOWSID Chinese (Taiwan) OK ½T©w Cancel ¨ú®ø Exit Â÷¶} Close Ãö³¬ Cancel changes ¨ú®øÅܧó Click to confirm ÂIÀ»¥H½T»{ Click to get help! ÂIÀ»¥HÀò¨ú»¡©ú! Click to return to previous screen ÂIÀ»¥Hªð¦^«e¤@­¶ Click to go to next screen ÂIÀ»¥H¨ì¹F¤U¤@­¶ Hide password ÁôÂñK½X Save project «O¦s±M®× Close current project? ¬O§_Ãö³¬·í«e±M®×? Delete this project? §R°£¦¹±M®×? Delete empty project %s? §R°£ªÅªº±M®× %s? Action not yet implemented ¾Þ§@¤´¥¼°õ¦æ Error deleting this project §R°£¸Ó±M®×®É¥X¿ù Select a rule for the filter ¬°¹LÂo¾¹¿ï¨ú³W«h Enter keywords for the filter ¬°¹LÂo¾¹¿é¤JÃöÁäµü Cancel ¨ú®ø Add this rule ¼W¥[¸Ó³W«h Please enter one or several keyword(s) for the rule ½Ð¬°¦¹³W«h¿é¤J¤@¦Ü´X­ÓÃöÁäµü Add Scan Rule ¼W¥[±½´y³W«h Criterion ·Ç«h String ¦r¦ê Add ¼W¥[ Scan Rules ±½´y³W«h Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi ¨Ï¥Î¸U¥Î¦r¤¸¥H¥]§t©Î±Æ°£URLs©ÎÃìµ².\n¦h­Ó³W©w±½´y³W«hªº¦r¦ê¥i¼g¦b¦P¤@¦æ.\n¨Ï¥ÎªÅ¥ÕÁä§@¬°¤À¹j²Å¸¹.\n\n¨Ò¦p: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links ±Æ°£Ãìµ² Include link(s) ¥]§tÃìµ² Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) ´£¥Ü: ±ý¥]§t¬Yºô°ì¦WºÙ¤Uªº©Ò¦³GIFÀÉ®×, ¥i¿é¤J +www.someweb.com/*.gif. \n(+*.gif / -*.gif ±N¥]§t/±Æ°£¨Ó¦Û©Ò¦³¯¸ÂIªºGIFÀÉ®×) Save prefs «O¦s³]©w Matching links will be excluded: ¤Ç°tªºÃìµ²±N³Q±Æ°£: Matching links will be included: ¤Ç°tªºÃìµ²±N³Q¥]§t: Example: ¨Ò¦p: gif\r\nWill match all GIF files gif\r\n±N¤Ç°t©Ò¦³GIFÀÉ®× blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\n±N´M§ä¨ì©Ò¦³¥]§t'blue' ªºÀÉ®×, ½Ñ¦p 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\n±N¤Ç°tÀÉ®× 'bigfile.mov', ¦ý¤£¥]¬A 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\n±N´M§ä¨ìÀÉ®×§¨¦W¤º¥]§t'cgi' ªºÃìµ², ½Ñ¦p /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\n±N´M§ä¨ìÀÉ®×§¨¦W¤º¥]§t'cgi-bin' ªºÃìµ² (¦ýcgi-bin-2 °£¥~) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\n±N´M§ä¨ì¥]§t½Ñ¦pwww.someweb.com, private.someweb.com µ¥ªºÃìµ² someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\n±N´M§ä¨ì¥]§t½Ñ¦pwww.someweb.com, www.someweb.edu, private.someweb.otherweb.com µ¥ªºÃìµ² www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\n±N´M§ä¨ì¥]§t'www.someweb.com' ªºÃìµ² (¦ý¤£¥]¬Aprivate.someweb.com/ µ¥) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\n±N´M§ä¨ì¥ô¦ó½Ñ¦p¥H¤UªºÃìµ²: www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html µ¥ www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\n±N¶È´M§ä¨ì'www.test.com/test/someweb.html' ÀÉ®×. ª`·N½Ð¿é¤J§¹¾ãªº¸ô®|. All links will match ©Ò¦³ªºÃìµ²³£±N¤Ç°t Add exclusion filter ¬°¹LÂo¾¹¼W¥[±Æ°£³W«h Add inclusion filter ¬°¹LÂo¾¹¼W¥[¥]§t³W«h Existing filters ¤w©w¨îªº¹LÂo¦r¦ê Cancel changes ¨ú®øÅܧó Save current preferences as default values ±N·í«e³]©w¦s¬°¹w³]­È Click to confirm ÂIÀ»¥H½T»{ No log files in %s! %s ¤ºµL¤é»xÀÉ®×! No 'index.html' file in %s! %s ¤ºµL'index.html' ÀÉ®×! Click to quit WinHTTrack Website Copier ÂIÀ»¥HÂ÷¶}WinHTTrack Website Copier View log files ¬d¬Ý¤é»xÀÉ®× Browse HTML start page ÂsÄý HTML °_©l­¶ End of mirror Ãè¹³µ²§ô View log files ¬d¬Ý¤é»xÀÉ®× Browse Mirrored Website ÂsÄý¤wÃè¹³ªººô¯¸ New project... ·sªº±M®×... View error and warning reports ¬d¬Ý¿ù»~¤Îĵ§i³ø§i View report ¬d¬Ý³ø§i Close the log file window Ãö³¬¤é»xÀÉ®×µøµ¡ Info type: °T®§Ãþ«¬: Errors ¿ù»~ Infos °T®§ Find ´M§ä Find a word ´M§ä¤@­Ó³æµü Info log file °T®§¤é»xÀÉ®× Warning/Errors log file ĵ§i/¿ù»~¤é»xÀÉ®× Unable to initialize the OLE system µLªkªì©l¤ÆOLE¨t²Î WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack ¥¼¯à¦b«ü©wÀÉ®×§¨¤º§ä¨ì³Q¤¤Â_ªºÀɮפU¸ütemp°Ï! Could not connect to provider µLªk³s½u¨ìºô¸ô receive ±µ¦¬ request ­n¨D connect ³s½u search ´M§ä ready ´Nºü error ¿ù»~ Receiving files.. ±µ¦¬ÀÉ®×.. Parsing HTML file.. ¤ÀªRHTMLÀÉ®×.. Purging files.. ²M°£ÀÉ®×.. Loading cache in progress.. §Ö¨ú°O¾ÐÅé¸ü¤J¤¤.. Parsing HTML file (testing links).. ¤ÀªRHTMLÀÉ®× (´ú¸ÕÃìµ²).. Pause - Toggle [Mirror]/[Pause download] to resume operation Ãè¹³¼È°± - ¤Á´«[Ãè¹³]/[¼È°±¤U¸ü]¥HÄ~Äò¾Þ§@ Finishing pending transfers - Select [Cancel] to stop now! µ²§ô³B²z¤¤ªºÂಾ - ²{¦b¿ï¾Ü[¨ú®ø]¨Ó°±¤î scanning ±½´y Waiting for scheduled time.. µ¥«Ý¹w©wªº®É¶¡.. Connecting to provider ¥¿¦b³s½uºô¸ô [%d seconds] to go before start of operation Â÷¾Þ§@¶}©lÁÙ¦³[%d ¬í] Site mirroring in progress [%s, %s bytes] ¯¸ÂIÃè¹³¶i¦æ¤¤ [%s, %s byts] Site mirroring finished! ¯¸ÂIÃè¹³§¹²¦! A problem occurred during the mirroring operation\n Ãè¹³®Éµo¥Í¿ù»~\n \nDuring:\n \nµo¥Í¦b¥H¤U´Á¶¡:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \n¦p¦³»Ý­n½Ð¬Ý¤é»xÀÉ®×.\n\nÂIÀ»'µ²§ô'¥HÂ÷¶}WinHTTrack Website Copier.\n\nÁÂÁ¨ϥÎWinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Ãè¹³§¹¦¨.\nÂIÀ»'½T©w'¥HÂ÷¶}WinHTTrack.\n¦p¦³»Ý­n½Ð¬Ý¤é»xÀÉ®×, ¥H½T«O¸UµL¤@¥¢.\n\nÁÂÁ¨ϥÎWinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * Ãè¹³³Q¨ú®ø! * *\r\n·í«eÁ{®Éªº¹w¦s°Ï¬°¤é«á§ó·s©Ò»Ý, ¶È¦s¦³¦¹¦¸³Q¤¤Â_ªºÃè¹³´Á¶¡¤º¤U¸üªº¼Æ¾Ú.\r\n¦Ó­ì¦³¹w¦s°Ï¥i¯à·|¦s¦³§ó§¹¾ãªº¤º®e; ¦pªG§A¤£·Q¥¢¥h­ì¦³ªº¼Æ¾Ú, ½Ð«ì´_¤§, ¦}§R°£·í«e¹w¦s°Ï.\r\n[ª`: ±ý§R°£·í«e¹w¦s°Ï, ¶È»Ý§R°£¥H¤UÀÉ®×: hts-cache/new.*]\r\n\r\n§A¬O§_ªÖ©w­ì¦³¹w¦s°Ï¦s¦³§ó§¹¾ãªº¤º®e, ¦}§Æ±æ«ì´_¤§? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * Ãè¹³¥X¿ù!* *\r\nHTTrackÀË´ú¨ì·í«eÃè¹³¥¼Àx¦s¥ô¦ó¼Æ¾Ú. ­Y¨Ï¥Îªº§ó·s¼Ò¦¡, «h«e¤@¦¸Ãè¹³¤w³Q«ì´_.\r\n­ì¦]: ­º­¶¥¼¯à§ä¨ì, ©Îµo¥Í³s½u¿ù»~.\r\n=> ½Ð½T©w±ýÃè¹³ªººô¯¸¦s¦b, ¦}/©ÎÀˬdproxy³]©w! <= \n\nTip: Click [View log file] to see warning or error messages \n\n´£¥Ü: ÂIÀ» [¬d¬Ý¤é»xÀÉ®×] ¥H¬d¬Ýĵ§i©Î¿ù»~®ø®§ Error deleting a hts-cache/new.* file, please do it manually §R°£hts-cache/new.* Àɮ׮ɥX¿ù, ½Ð¤â¤u§R°£ Do you really want to quit WinHTTrack Website Copier? ¯uªº­nÂ÷¶}WinHTTrack Website Copier ¶Ü? - Mirroring Mode -\n\nEnter address(es) in URL box - Ãè¹³¼Ò¦¡ -\n\n½Ð¦bURL®Ø¤º¿é¤Jºô§} - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - ¥æ¤¬ºëÆF¼Ò¦¡ (µo°Ý) -\n\n½Ð¦bURL®Ø¤º¿é¤Jºô§} - File Download Mode -\n\nEnter file address(es) in URL box - ÀɮפU¸ü¼Ò¦¡ -\n\n½Ð¦bURL®Ø¤º¿é¤JÀɮ׺ô§} - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Ãìµ²´ú¸Õ¼Ò¦¡ -\n\n½Ð¦bURL®Ø¤º¿é¤J§t¦³Ãìµ²ªºWeb­¶ºô§} - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - §ó·s¼Ò¦¡ -\n\n½Ð®Ö¹ïURL®Øùتººô§}, ¦p¦³»Ý­n½ÐÀˬd¿ï¶µ, µM«áÂIÀ»'Next' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ä~Äò¼Ò¦¡ (³Q¤¤Â_ªº¾Þ§@) -\n\n½Ð®Ö¹ïURL®Øùتººô§}, ¦p¦³»Ý­n½ÐÀˬd¿ï¶µ, µM«áÂIÀ»'Next' Log files Path ¤é»xÀɮ׸ô®| Path ¸ô®| - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Ãìµ²ªí¼Ò¦¡ -\n\n½Ð¦bURL®Ø¤º¿é¤J­¶­±ªººô§}, ­¶­±¤¤§t¦³Ãìµ²ªº¦Cªí, ¦Cªí¤¤©Ò¦³Ãìµ²§¡·|³QÃè¹³ New project / Import? ·sªº±M®× / ¾É¤J? Choose criterion ¿ï¨ú±N¶i¦æªº¾Þ§@ªºÃþ«¬ Maximum link scanning depth ³Ì¤jÃìµ²±½´y²`«× Enter address(es) here ½Ð¦b¦¹¿é¤Jºô§} Define additional filtering rules ©w¸qªþ¥[¹LÂo¾¹³W«h Proxy Name (if needed) proxyºô§}(¦p­Y»Ý­n) Proxy Port proxy³s±µ°ð Define proxy settings ©w¸qproxy¦øªA¾¹³]©w Use standard HTTP proxy as FTP proxy ¨Ï¥Î¼Ð·ÇHTTP proxy ´À¥N FTP proxy Path ¸ô®| Select Path ¿ï¾Ü¸ô®| Path ¸ô®| Select Path ¿ï¾Ü¸ô®| Quit WinHTTrack Website Copier Â÷¶}WinHTTrack Website Copier About WinHTTrack Ãö©óWinHTTrack Save current preferences as default values «O¦s·í«e³]©w¬°¹w³]­È Click to continue ÂIÀ»¥HÄ~Äò Click to define options ÂIÀ»¥H³]©w¿ï¶µ Click to add a URL ÂIÀ»¥H¼W¥[URL Load URL(s) from text file ±q¤å¥»Àɮפ¤¸ü¤JURL(s) WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack³]©wÀÉ®× (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| ºô§}¦Cªí¤å¥»ÀÉ®× (*.txt)|*.txt|| File not found! ÀÉ®×¥¼§ä¨ì! Do you really want to change the project name/path? ¯uªº­n§ïÅܱM®×ªº¦WºÙ©Î¸ô®|¶Ü? Load user-default options? ¸ü¤J¨Ï¥ÎªÌ©w¸qªº¹w³]¿ï¶µ¶Ü? Save user-default options? ¦s¬°¨Ï¥ÎªÌ©w¸qªº¹w³]¿ï¶µ¶Ü? Reset all default options? ±N©Ò¦³¿ï¶µ«ì´_¨ì³Ìªì³]©w¶Ü? Welcome to WinHTTrack! Åwªï¨Ï¥ÎWinHTTrack! Action: ¾Þ§@: Max Depth ³Ì¤j²`«× Maximum external depth: ³Ì¤j¥~³¡Ãìµ²²`«× Filters (refuse/accept links) : ¹LÂo¾¹ (±Æ°£/¥]§tÃìµ²): Paths ¸ô®| Save prefs «O¦s³]©w Define.. ©w¸q.. Set options.. ¿ï¶µ.. Preferences and mirror options: ¿ï¶µ³]©w: Project name ±M®×¦WºÙ Add a URL... ¼W¥[URL.. Web Addresses: (URL) Webºô§}: (URL) Stop WinHTTrack? °±¤îWinHTTrack? No log files in %s! %s ¤ºµL¤é»xÀÉ®×! Pause Download? ¼È°±¤U¸ü? Stop the mirroring operation °±¤îÃè¹³ Minimize to System Tray ³Ì¤p¤Æ¦Ü¨t²Î¤u¨ã¦C Click to skip a link or stop parsing ÂIÀ»¥H¸õ¹L¤@­ÓÃìµ²©Î°±¤î¤ÀªR Click to skip a link ÂIÀ»¥H¸õ¹L¤@­ÓÃìµ² Bytes saved ¤w«O¦sbyts: Links scanned ¤w±½´yÃìµ²: Time: ®É¶¡: Connections: ³s½u: Running: ¹B¦æ: Hide ÁôÂà Transfer rate ¶Ç¿é³t²v: SKIP ¸õ¹L Information °T®§ Files written: ¤wÀx¦sÀÉ®×: Files updated: ¤w§ó·sÀÉ®×: Errors: ¿ù»~: In progress: ¶iµ{¤¤: Follow external links ¸òÀH¥~³¡Ãìµ² Test all links in pages ´ú¸Õ­¶­±¤¤ªº©Ò¦³Ãìµ² Try to ferret out all links ºÉ¥i¯à¬d¥X©Ò¦³Ãìµ² Download HTML files first (faster) ¥ý¤U¸üHTMLÀÉ®× (§ó§Ö) Choose local site structure ¿ï¾Ü¥»¦a¯¸ÂIµ²ºc Set user-defined structure on disk ³]©w¦bºÏºÐ¤Wªº¨Ï¥ÎªÌ¦Û©wµ²ºc Use a cache for updates and retries ¨Ï¥Î¹w¦s°Ï, ¥Î©ó§ó·s©M­«¸Õ Do not update zero size or user-erased files ¤£§ó·s¹sbytsÀɮשΥѨϥΪ̧R°£ªºÀÉ®× Create a Start Page ·s¼W¤@­Ó°_©l­¶­± Create a word database of all html pages ¬°©Ò¦³html­¶«Ø³y¤@­Ó¤å¦r¼Æ¾Ú®w Create error logging and report files ·s¼W¿ù»~°O¿ý¤Î³ø§iÀÉ®× Generate DOS 8-3 filenames ONLY ¶È²£¥ÍDOS¤Uªº8-3ÀɮצW®æ¦¡ Generate ISO9660 filenames ONLY for CDROM medias ¶È²£¥Í°ßŪ¥úºÐ¥ÎªºISO9660®æ¦¡¤UªºÀɮצW Do not create HTML error pages ¤£·s¼WHTML¿ù»~­¶­± Select file types to be saved to disk ¿ï¾Ü±N³Q¦sÀɪºÀÉ®×Ãþ«¬ Select parsing direction ¿ï¾Ü¤ÀªR¤è¦ì Select global parsing direction ¿ï¾Ü¥þ¤è¦ì¤ÀªR Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) ³]©w¤º³¡Ãìµ²(¤w¤U¸ü)¤Î¥~³¡Ãìµ²(¥¼¤U¸ü)ªºURL§ï¼g³W«h Max simultaneous connections ³Ì¦h¦P®É³s½u¼Æ File timeout ÀÉ®×¶W®É Cancel all links from host if timeout occurs ­Y¶W®Éµo¥Í, ¨ú®ø©Ò¦³¨Ó¦Û¥D¾÷ªºÃìµ² Minimum admissible transfer rate ³Ì¤p©Ò¤¹³\ªº¶Ç¿é³t²v Cancel all links from host if too slow ­Y¶Ç¿é¹LºC, ¨ú®ø©Ò¦³¨Ó¦Û¥D¾÷ªºÃìµ² Maximum number of retries on non-fatal errors ³Ì¦h­«¸Õ¦¸¼Æ (µo¥Í«D­P©R¿ù»~®É) Maximum size for any single HTML file ³æ­ÓHTMLÀɮשҤ¹³\ªº³Ì¤jsize Maximum size for any single non-HTML file ³æ­Ó«DHTMLÀɮשҤ¹³\ªº³Ì¤jsize Maximum amount of bytes to retrieve from the Web ³Ì¦h©Ò¤¹³\±qWeb±µ¦¬ªºbyts Make a pause after downloading this amount of bytes ¦b¤U¸ü³o¦ì¤¸²Õ¶q«á¼È°± Maximum duration time for the mirroring operation Ãè¹³¹Lµ{©Ò¤¹³\ªº³Ìªø®É¶¡ Maximum transfer rate ³Ì¤j©Ò­­¨îªº¶Ç¿é³t²v Maximum connections/seconds (avoid server overload) ¨C¬í³Ì¦h¦P®É³sµ²¼Æ (¨¾¤î¦øªA¾¹¶W¸ü) Maximum number of links that can be tested (not saved!) ³Ì¤jÃìµ²´ú¸Õ¼Æ(¤£«O¦s!) Browser identity ÂsÄý¾¹¨­¥÷ Comment to be placed in each HTML file ¦b¨C­ÓHTMLÀÉ®×ùؼW¥[ªºª`ÄÀ Back to starting page ¦^¨ì°_©l­¶­± Save current preferences as default values ±N·í«e³]©w¦s¬°¹w³]­È Click to continue ÂIÀ»¥HÄ~Äò Click to cancel changes ÂIÀ»¥H¨ú®ø§ï°Ê Follow local robots rules on sites ¿í±qºô¯¸ªºrobots³W«h Links to non-localised external pages will produce error pages ¥¼¥»¦a¤Æªº¥~³¡­¶­±Ãìµ²±N²£¥Í¿ù»~­¶­± Do not erase obsolete files after update §ó·s«á¤£§R°£¼o±óªºÀÉ®× Accept cookies? ¬O§_±µ¦¬cookies? Check document type when unknown? ¬O§_Àˬd¥¼ª¾ÀÉ®×Ãþ«¬? Parse java applets to retrieve included files that must be downloaded? ¬O§_¤ÀªRjavaÀ³¥Îµ{§Ç¥H¨ú¦^¨ä¤¤¥]§tªºÀÉ®×? Store all files in cache instead of HTML only ±N©Ò¦³ÀÉ®×¶È«O¦s¦b¹w¦s°ÏùØ («DHTML) Log file type (if generated) ¤é»xÀÉ®×Ãþ«¬ (­Y¦³) Maximum mirroring depth from root address ±qºô§}®Ú³¡¶}©l³Ì¤jªºÃè¹³²`«× Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximum mirroring depth for external/fodbidden addresses (0, that is, none, is the default) Create a debugging file ·s¼W¤@­Ó°»¿ùÀÉ®× Use non-standard requests to get round some server bugs ¨Ï¥Î«D¼Ð·Ç­n¨D¥HÁ×§K¬Y¨Ç¦øªA¾¹¿ù»~ Use old HTTP/1.0 requests (limits engine power!) ¨Ï¥Îªº HTTP/1.0 ­n¨D (±N­­¨îÃè¹³¯à¤O!) Attempt to limit retransfers through several tricks (file size test..) ¸Õ¥H­Y¤z¤èªk­­¨î¦A¶Ç°e (¦p³q¹LÀɮפj¤p´ú¸Õ) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password ¼g¤J¥~³¡Ãìµ²®É¤£¥]¬Aµn¤J/±K½X Write internal links without query string ¼g¤J¤º³¡Ãìµ²®É¤£¥]¬A¬d¸ß¦r¦ê Get non-HTML files related to a link, eg external .ZIP or pictures «O¦s©Ò¦³«ü¦V«DHTMLÀɮתºÃìµ², ¨Ò¦p¥~³¡ªºZIPÀɮשιϤùÀÉ®× Test all links (even forbidden ones) ´ú¸Õ©Ò¦³Ãìµ² (§Y¨Ï³Q¸T¤îªº) Try to catch all URLs (even in unknown tags/code) ¸Õ¹Ï§ì¨ú©Ò¦³ªºURLs (§Y¨Ï¦s¦b©ó¥¼ª¾ªº¼Ðñ©Î¥N½X¤º) Get HTML files first! ­º¥ý«O¦sHTMLÀÉ®×! Structure type (how links are saved) µ²ºcÃþ«¬ (Ãìµ²«O¦sªº¤è¦¡) Use a cache for updates ¨Ï¥Î¹w¦s°Ï¥H«K¤é«á§ó·s Do not re-download locally erased files ¤£¦A¤U¸ü¦b¥»¦a¤w³Q§R°£ªºÀÉ®× Make an index ·s¼W¤@­Ó index.html ÀÉ®× Make a word database «Ø³y¤@­Ó¤å¦r¼Æ¾Ú®w Log files ¤é»xÀÉ®× DOS names (8+3) DOS ÀɮצW®æ¦¡ (8+3) ISO9660 names (CDROM) ISO9660®æ¦¡¤UªºÀɮצW(°ßŪ¥úºÐ) No error pages °£¥h¿ù»~­¶ Primary Scan Rule ­º­n±½´y³W«h Travel mode ¦æ¶i¼Ò¦¡ Global travel mode ¥þ§½¦æ¶i¼Ò¦¡ These options should be modified only exceptionally ¥H¤U¿ï¶µ¥u¦b¯S®í±¡ªp¤U­×§ï Activate Debugging Mode (winhttrack.log) ±Ò°Ê½Õ¸Õ¼Ò¦¡ (·s¼Wwinhttrack.log) Rewrite links: internal / external §ï¼gÃìµ² : ¤º³¡/¥~³¡ Flow control ¬y¶q±±¨î Limits ­­¨î Identity ¨­¥÷ HTML footer HTML­¶¸} N# connections ³s½u¼Æ Abandon host if error ­Yµo¥Í¿ù»~, «h©ñ±ó©M¥D¾÷ªº³s½u Minimum transfer rate (B/s) ³Ì¤p¶Ç¿é²v (byts/¬í) Abandon host if too slow ­Y¶Ç¿é¹LºC, «h©ñ±ó©M¥D¾÷ªº³s½u Configure °t¸m Use proxy for ftp transfers ¨Ï¥Îproxy¶i¦æftp¶Ç¿é TimeOut(s) ¶W®É Persistent connections (Keep-Alive) «ùÄò³s±µ(«O«ù±µ³q) Reduce connection time and type lookup time using persistent connections «ùÄò³s±µ®ÉÁYµu³s±µ®É¶¡©M¿é¤J«ùÄò³s±µ¬d§ä®É¶¡ Retries ­«¸Õ Size limit ¤j¤p­­¨î Max size of any HTML file (B) ³æ­ÓHTMLÀɮתº³Ì¤jsize Max size of any non-HTML file ³æ­Ó«DHTMLÀɮתº³Ì¤jsize Max site size Ãè¹³¯¸ÂI³Ì¤jsize Max time ³Ìªø®É¶¡ Save prefs «O¦s³]©w Max transfer rate ³Ì¤j¶Ç¿é³t²v Follow robots.txt ¿í¦u robots.txt ³W«h No external pages ¤£²£¥Í¥~³¡­¶­± Do not purge old files ¤£²M°£¼o±óÀÉ®× Accept cookies ±µ¦¬cookies Check document type ÀˬdÀÉ®×Ãþ«¬ Parse java files ¤ÀªRjavaÀÉ®× Store ALL files in cache «O¦s©Ò¦³Àɮצb¹w¦s°Ï¤º Tolerant requests (for servers) ¤¹³\¹ï¦øªA¾¹ªº«Dºë½T­n¨D Update hack (limit re-transfers) §ó·s®É±Ä¨ú¨ä¥L¤èªk¨¾¤î­«½Æ¤U¸ü URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) ±j¨î¨Ï¥ÎªºHTTP/1.0­n¨D (¤£±Ä¥Î1.1) Max connections / seconds ¨C¬í³Ì¦h³s½u¼Æ Maximum number of links ³Ì¤jÃìµ²¼Æ Pause after downloading.. ¨C¦¸¤U¸ü«á¼È°±.. Hide passwords ÁôÂñK½X Hide query strings ÁôÂìd¸ß¦r¦ê Links Ãìµ² Build ºc³y Experts Only °ª¯Å Flow Control ¬y¶q±±¨î Limits ­­¨î Browser ID ÂsÄý¾¹¼ÐÃÑ Scan Rules ±½´y³W«h Spider ·j´M Log, Index, Cache ¤é»x, ¯Á¤Þ, ¹w¦s°Ï Proxy proxy MIME Types MIME Ãþ«¬ Do you really want to quit WinHTTrack Website Copier? ¯uªº­nÂ÷¶}WinHTTrack Website Copier ¶Ü? Do not connect to a provider (already connected) ¤w³s½u¨ìºô¸ô Do not use remote access connection ¤£¨Ï¥Î»·ºÝ³s½u Schedule the mirroring operation ¹w©w¶i¦æÃè¹³ªº®É¶¡ Quit WinHTTrack Website Copier Â÷¶}WinHTTrack Website Copier Back to starting page ¦^¨ì°_©l­¶­± Click to start! ÂIÀ»¥H¶}©l! No saved password for this connection! ¸Ó³s½u¯Ê¤Ö¤w«O¦sªº±K½X! Can not get remote connection settings µLªkÀò¨ú»·ºÝ³s½uªº³]©w Select a connection provider ½Ð¿ï¾Ü¤@­Ó³s½u Start ¶}©l Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. ¦p¦³»Ý­n½Ð­×§ï³s½u°Ñ¼Æ,\nµM«á«ö '§¹¦¨' ¶}©lÃè¹³ Save settings only, do not launch download now. ¤£¥ß§Y¶i¦æÃè¹³, ¶È«O¦s·í«e³]©w On hold ±¾°_ Transfer scheduled for: (hh/mm/ss) ¹w©wÃè¹³¶}©l©ó: (ÂI/¤À/¬í) Start ¶}©l Connect to provider (RAS) ³s½u¨ìºô¸ô(»·ºÝ³s½u¦øªA¾¹) Connect to this provider ¨Ï¥Î¸Ó³s½u: Disconnect when finished §¹¦¨®É¤ÁÂ_³s½u Disconnect modem on completion §¹¦¨®É¤ÁÂ_¼Æ¾Ú¾÷ \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(¦³¥ô¦óµ{§Ç¿ù»~©Î°ÝÃD½ÐÁpµ¸§Ú­Ì)\r\n\r\n¶}µo:\r\n¬É­±³]­p (Windows): Xavier Roche\r\n¤ÀªR¤ÞÀº: Xavier Roche\r\nJava¤ÀªR¤ÞÀº: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\n·PÁÂ:\r\nDavid Hing Cheong Hung (DAVEHUNG@mtr.com.hk) ´£¨Ñ½Ķ About WinHTTrack Website Copier Ãö©óWinHTTrack Website Copier Please visit our Web page ½Ð³X°Ý§Ú­Ìªº­º­¶ Wizard query ºëÆF´£°Ý Your answer: §Aªºµª®×: Link detected.. ÀË´ú¨ìÃìµ².. Choose a rule ½Ð¿ï¾Ü³W«h Ignore this link ©¿²¤¦¹Ãìµ² Ignore directory ©¿²¤¦¹¥Ø¿ý Ignore domain ©¿²¤¦¹ºô°ì¦WºÙ Catch this page only ¶È¤U¸ü¦¹­¶ Mirror site Ãè¹³¯¸ÂI Mirror domain Ãè¹³ºô°ì¦WºÙ Ignore all ¥þ³¡¥G²¤ Wizard query ºëÆF´£°Ý NO §_ File ÀÉ®× Options ¿ï¶µ Log ¤é»x Window µøµ¡ Help »¡©ú Pause transfer ¼È°±¶Ç¿é Exit Â÷¶} Modify options ­×§ï¿ï¶µ View log ¬d¬Ý¤é»x View error log ¬d¬Ý¿ù»~¤é»x View file transfers ¬d¬ÝÀÉ®×¶Ç¿é Hide ÁôÂà About WinHTTrack Website Copier Ãö©óWinHTTrack Website Copier Check program updates... Àˬdª©¥»§ó·s... &Toolbar ¤u¨ãÄæ &Status Bar ª¬ºAÄæ S&plit ¤À³Î File ÀÉ®× Preferences ³]©w Mirror Ãè¹³ Log ¤é»x Window µøµ¡ Help »¡©ú Exit Â÷¶} Load default options ¸ü¤J¦Û©w¹w³]¿ï¶µ Save default options ¦s¬°¦Û©w¹w³]¿ï¶µ Reset to default options «ì´_­ì©l³]©w Load options... ¸ü¤J¿ï¶µ... Save options as... «O¦s¿ï¶µ... Language preference... ¬É­±»y¨¥³]©w... Contents... ¤º®e... About WinHTTrack... Ãö©óWinHTTrack... New project\tCtrl+N ·sªº±M®×\tCtrl+N &Open...\tCtrl+O &¥´¶}...\tCtrl+O &Save\tCtrl+S &«O¦s\tCtrl+S Save &As... «O¦s¿ï¶µ... &Delete... &§R°£... &Browse sites... &ÂsÄý¤wÃè¹³¯¸ÂI... User-defined structure ¨Ï¥ÎªÌ¦Û©wµ²ºc %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\t¤£§t°ÆÀɦWªºÀɮצW(¦p: image)\r\n%N\t§t¦³°ÆÀɦWªºÀɮצW(¦p: image.gif)\r\n%t\t¶ÈÂX®i¦W(¦p: gif)\r\n%p\t¸ô®|[µL§ÀÀH'/'] (¦p: /someimages)\r\n%h\t¥D¾÷¦W(¦p: www.someweb.com)\r\n%M\tMD5 URL (128¦ì, 32 ascii byts)\r\n%Q\tMD5 query string (128¦ì, 32 ascii byts)\r\n%q\tMD5 small query string (16¦ì, 4 ascii byts)\r\n\r\n%s?\tµuÀɮצW(¦p: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif ¨Ò¦p:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings proxy³]©w Proxy address: proxyºô§}: Proxy port: proxy³s±µ°ð: Authentication (only if needed) ¨­¥÷Åçµý (¦p­Y»Ý­n) Login µn¿ý Password ±K½X Enter proxy address here ¦b¦¹¿é¤Jproxyºô§} Enter proxy port here ¦b¦¹¿é¤Jproxy³s±µ°ð Enter proxy login ¿é¤Jproxy¦øªA¾¹µn¿ý°T®§ Enter proxy password ¿é¤Jproxy¦øªA¾¹©Ò»Ý±K½X Enter project name here ¦b¦¹¿é¤J±M®×¦W Enter saving path here ¦b¦¹¿é¤J«O¦s¸ô®| Select existing project to update ½Ð¿ï¾Ü¤@­Ó¤w¦³ªº±M®×¥H§ó·s Click here to select path ÂIÀ»¦¹³B¥H¿ï¾Ü¸ô®| Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack ±M®×ºëÆF... New project name: ·s±M®×ªº¦WºÙ: Existing project name: ²{¦³±M®×ªº¦WºÙ: Project name: ±M®×¦WºÙ: Base path: Á`¦sÀɸô®|: Project category: C:\\My Web Sites C:\\My Websites Type a new project name, \r\nor select existing project to update/resume ½ÐÁä¤J¤@­Ó·sªº±M®×¦W, \r\n©Î¿ï¾Ü¤w¦³±M®×¥H§ó·s©ÎÄ~Äò New project ·sªº±M®× Insert URL ´¡¤JURL URL: URLºô§}: Authentication (only if needed) ¨­¥÷Åçµý (¦p­Y»Ý­n) Login µn¿ý Password ±K½X Forms or complex links: ªí®æ©Î´_ÂøÃìµ²: Capture URL... §ì¨úURLºô§}... Enter URL address(es) here ½Ð¦b¦¹¿é¤JURLºô§} Enter site login ½Ð¿é¤J¯¸ÂIµn¿ý¦W Enter site password ½Ð¿é¤J¯¸ÂIµn¿ý±K½X Use this capture tool for links that can only be accessed through forms or javascript code ¨Ï¥Î¦¹¤u¨ã§ì¨ú¥u¯à³q¹Lªí®æ©Îjava¥N½X«ô³X¹LªºÃìµ² Choose language according to preference ½Ð®Ú¾Ú­Ó¤H³ß¦n¿ï¾Ü¬É­±»y¨¥ Catch URL! §ì¨úURLºô§}! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. ½Ð¥ý¼È®É±NÂsÄý¾¹ªºproxy³]¬°¦p¤U¼Æ­È(½Æ»s/¶K¤Wproxyºô§}©M³s±µ°ð).\nµM«áÂIÀ»ÂsÄý¾¹­¶­±¤Wªí®æªºSUBMIT«ö¶s, ©ÎÂIÀ»·Q­n§ì¨úªºÃìµ² This will send the desired link from your browser to WinHTTrack. ©Ò»ÝªºÃìµ²±N±qÂsÄý¾¹³Q°e¦ÜWinHTTrack. ABORT ©ñ±ó Copy/Paste the temporary proxy parameters here ¦b¦¹½Æ»s/¶K¤W¼È®Éªºproxy°Ñ¼Æ Cancel ¨ú®ø Unable to find Help files! µLªk§ä¨ì»¡©úÀÉ®×! Unable to save parameters! µLªk«O¦s°Ñ¼Æ! Please drag only one folder at a time ½Ð¨C¦¸¥u©ì¦²¤@­ÓÀÉ®×§¨ Please drag only folders, not files ½Ð¤£­n©ì¦²ÀÉ®×, ¥u©ì¦²ÀÉ®×§¨ Please drag folders only ½Ð¥u©ì¦²ÀÉ®×§¨ Select user-defined structure? ¿ï¾Ü¨Ï¥ÎªÌ¦Û©wµ²ºc¶Ü? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! ½Ð½T«O¨Ï¥ÎªÌ©w¸qªº¦r¦êªº¥¿½T©Ê,\n§_«h²£¥ÍÀɮצW®É¥i¯à¥X¿ù! Do you really want to use a user-defined structure? ¯uªº­n¨Ï¥Î¨Ï¥ÎªÌ¦Û©wµ²ºc¶Ü? Too manu URLs, cannot handle so many links!! ¹L¦hURLºô§}, µLªk³B²z!! Not enough memory, fatal internal error.. °O¾ÐÅ餣¨¬, µo¥Í­P©Rªº¤º³¡¿ù»~! Unknown operation! ¥¼ª¾¾Þ§@! Add this URL?\r\n ¼W¥[¦¹URL? Warning: main process is still not responding, cannot add URL(s).. ĵ§i: ¥D¶iµ{¥¼¦³¦^À³, ¤£¯à¼W¥[URL(s).. Type/MIME associations Ãþ«¬/MIME Ápô File types: ÀÉ®×Ãþ«¬: MIME identity: MIME identity Select or modify your file type(s) here ¦b³o¸Ì¿ï¾Ü©Î­×§ï§AªºÀÉ®×Ãþ«¬ Select or modify your MIME type(s) here ¦b³o¸Ì¿ï¾Ü©Î­×§ï§Aªº MIME Ãþ«¬ Go up ©¹¤W Go down ©¹¤U File download information ÀɮפU¸ü°T®§ Freeze Window Âê©wµøµ¡°T®§ More information: §ó¦h°T®§: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Åwªï¨Ï¥Î WinHTTrack ºô¯¸«þ¨©¾¹!\n\n½ÐÂIÀ»'NEXT'«ö¶s¥h\n\n-¶}©l¤@­Ó·s±M®×\n- ©Î Ä~Äò¤@­Ó¥¼§¹¦¨ªº¤U¸ü File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS ÀɮצW¤¤¥]§t°ÆÀɦW:\nÀɮצW¤¤¥]§t:\n¦¹ÀɮצW:\nÀÉ®×§¨¦W¤¤¥]§t:\n¦¹ÀÉ®×§¨¦W:\n¦¹ºô°ì¦WºÙ:\nºô°ì¦WºÙ¤¤¥]§t:\n¦¹¥D¾÷:\nÃìµ²¤¤¥]§t:\n¦¹Ãìµ²:\n©Ò¦³Ãìµ² Show all\nHide debug\nHide infos\nHide debug and infos Åã¥Ü¥þ³¡¤º®e\nÁôÂÿù»~\nÁôÂîø®§\nÁôÂÿù»~©M®ø®§ Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. ¯¸ÂI­ì¦³µ²ºc(¹w³])\nhtmlÀɮצbweb/, ¹Ï¤ù©M¨ä¥LÀɮצbweb/images/\nhtmlÀɮצbweb/html, ¹Ï¤ù©M¨ä¥LÀɮצbweb/images\nhtmlÀɮצbweb/, ¹Ï¤ù©M¨ä¥LÀɮפ]¦bweb/\nhtmlÀɮצbweb/, ¹Ï¤ù©M¨ä¥LÀɮצbweb/xxx, xxx¬°ÀÉ®×°ÆÀɦW\nhtmlÀɮצbweb/html, ¹Ï¤ù©M¨ä¥LÀɮצbweb/xxx\n¯¸ÂI­ì¦³µ²ºc(¥h±¼www.domain.xxx/)\nhtmlÀɮצbsite_name/, ¹Ï¤ù©M¨ä¥LÀɮצbsite_name/images/\nhtmlÀɮצbsite_name/html, ¹Ï¤ù©M¨ä¥LÀɮצbsite_name/images\nhtmlÀɮצbsite_name/, ¹Ï¤ù©M¨ä¥LÀɮפ]¦bsite_name/\nhtmlÀɮצbsite_name/, ¹Ï¤ù©M¨ä¥LÀɮצbsite_name/xxx\nhtmlÀɮצbsite_name/html, ¹Ï¤ù©M¨ä¥LÀɮצbsite_name/xxx\n©Ò¦³Àɮצbweb/, ÀɮצW¥ô·N²£¥Í\n©Ò¦³Àɮצbsite_name/, ÀɮצW¥ô·N²£¥Í\n¨Ï¥ÎªÌ¦Û©wµ²ºc.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first ¥u°µ±½´y\n¥u«O¦shtmlÀÉ®×\n¥u«O¦s«DhtmlÀÉ®×\n«O¦s©Ò¦³ÀÉ®× (¹w³])\n¥ý«O¦shtmlÀÉ®× Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down °±¯d©ó¦P¤@¥Ø¿ý\n¤¹³\©¹¤U¶i¦æ (¹w³])\n¤¹³\©¹¤W¶i¦æ\n¤W¤U³£¤¹³\¶i¦æ Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web °±¯d©ó¦P¤@ºô§} (¹w³])\n°±¯d©ó¦P¤@ºô°ì¦WºÙ\n°±¯d©ó¦P¤@³»¯Åºô°ì¦WºÙ\n¥ô¦óºô¸ôºô§} Never\nIf unknown (except /)\nIf unknown ±q¤£\n¦pªG¥¼ª¾ (/ °£¥~)\n¦pªG¥¼ª¾ no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ¤£¿í¦urobots.txt\n¿í¦u¹LÂo¾¹Àu¥ý©órobots.txt\n§¹¥þ¿í¦urobots.txt normal\nextended\ndebug ´¶³q¤é»x\nÂX¥R¤é»x\n°»¿ù¤é»x Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download ¤U¸üºô¯¸\n¤U¸üºô¯¸ + ´£°Ý\n¤U¸ü­Ó§OÀÉ®×\n¤U¸ü­¶­±¤¤ªº©Ò¦³¯¸ÂI (¦h­ÓÃè¹³)\n´ú¸Õ­¶­±¤¤ªºÃìµ² (®Ññ´ú¸Õ)\n* Ä~Äò³Q¤¤Â_ªºÃè¹³\n* §ó·s¤w¦³Ãè¹³ Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL ¬Û¹ï URI / µ´¹ï URL (¹w³])\nµ´¹ï URL / µ´¹ï URL\nµ´¹ï URI / µ´¹ï URL\n­ì¥»ªº URL / ­ì¥»ªº URL Open Source offline browser ¶}©ñ­ì©lÀÉÂ÷½u¾\Äý¾¹ Website Copier/Offline Browser. Copy remote websites to your computer. Free. ºô¯¸«þ¨©¾¹/Â÷½u¾\Äý¾¹,§K¶O«þ¨©»·ºÝºô¯¸¨ì§Aªº¹q¸£ httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, Â÷½u¾\Äý¾¹ URL list (.txt) URL ªí (.txt) Previous ¤W¤@¨B Next ¤U¤@¨B URLs URLs Warning ĵ§i Your browser does not currently support javascript. For better results, please use a javascript-aware browser. §Aªº¾\Äý¾¹²{®É¤£¤ä´© javascript.¦p»Ý§ó¨Î®ÄªG½Ð¥Î¤ä´© javascript ªº¾\Äý¾¹ Thank you ¦hÁ You can now close this window §A²{¦b¥i¥HÃö³¬³oµøµ¡ Server terminated ¦øªA¾¹¤w²×¤î A fatal error has occurred during this mirror ³oÃè¹³µo¥Í¤F¤£¥i¦^´_ªº¿ù»~ Proxy type: proxy Ãþ«¬: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. ¥N²z¨ó©w¡CHTTP¡G¼Ð·Ç¥N²z¡CHTTP¡]CONNECT ÀG¹D¡^¡G³z¹L CONNECT ÀG¹D¶Ç°e¨C­Ó½Ð¨D¡A¥Î©ó¶È¤ä´© CONNECT ªº¥N²z¡A¨Ò¦p Tor ªº HTTPTunnelPort¡CSOCKS5¡G¹w³]³s±µ°ð 1080¡C Load cookies from file: ±qÀɮ׸ü¤J cookies: Preload cookies from a Netscape cookies.txt file before crawling. ¦b§ì¨ú«e±q Netscape ®æ¦¡ªº cookies.txt ÀÉ®×¹w¥ý¸ü¤J cookies¡C Pause between files: Àɮפ§¶¡¼È°±: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). ÀɮפU¸ü¤§¶¡ªºÀH¾÷©µ¿ð¡]¬í¡^¡C¨Ï¥Î MIN:MAX «ü©wÀH¾÷½d³ò (¨Ò¦p 2:8)¡C Keep the www. prefix (do not merge www.host with host) «O¯d www. «eºó (¤£±N www.host »P host ¦X¨Ö) Do not treat www.host and host as the same site. ¤£±N www.host »P host µø¬°¦P¤@¯¸ÂI¡C Keep double slashes in URLs «O¯d URL ¤¤ªºÂù±×½u Do not collapse duplicate slashes in URLs. ¤£¦X¨Ö URL ¤¤­«½Æªº±×½u¡C Keep the original query-string order «O¯d¬d¸ß¦r¦êªº­ì©l¶¶§Ç Do not reorder query-string parameters when deduplicating URLs. ¦b¹ï URL ¥h­«®É¤£­«·s±Æ¦C¬d¸ß¦r¦ê°Ñ¼Æ¡C Strip query keys: ²¾°£¬d¸ßÁä: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). ¥H³r¸¹¤À¹jªº¬d¸ßÁä¡A±N¨ä±qÀx¦sÀɮתº©R¦W¤¤²¾°£ (¨Ò¦p sid,utm_source)¡C Write a WARC archive of the crawl ¼g¤J¦¹¦¸§ì¨úªº WARC «Ê¦sÀÉ Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. ¦P®É±N¨C­Ó¤wÂ^¨úªº¦^À³Àx¦s¬° ISO-28500 WARC/1.1 «Ê¦sÀÉ¡A¸m©óÃè¹³ºô¯¸®Ç¡C WARC archive name: WARC «Ê¦sÀɦWºÙ¡G Optional base name for the WARC archive; leave blank to auto-name it under the output directory. WARC «Ê¦sÀɪº¿ï¥Î°ò¥»¦WºÙ¡F¯dªÅ«h©ó¿é¥X¥Ø¿ý¤¤¦Û°Ê©R¦W¡C httrack-3.49.14/lang/Cesky.txt0000644000175000017500000010707115230602340011556 LANGUAGE_NAME Èesky LANGUAGE_FILE Cesky LANGUAGE_ISO cs LANGUAGE_AUTHOR Antonín Matìjèík (matejcik@volny.cz) \r \n LANGUAGE_CHARSET WINDOWS-1250 LANGUAGE_WINDOWSID Czech OK Ano Cancel Zrušit Exit Konec Close Zavøít Cancel changes Zrušit zmìny Click to confirm Klikni pro potvrzení Click to get help! Klikni pro nápovìdu Click to return to previous screen Klikni pro návrat do pøedchozího okna Click to go to next screen Klikni pro pokraèování na následujícím oknì Hide password Skrýt heslo Save project Uložit projekt Close current project? Zavøít aktuální projekt? Delete this project? Smazat tento projekt? Delete empty project %s? Smazat prázdný projekt %s? Action not yet implemented Akce není ještì implementována Error deleting this project Chyba pøi mazání tohoto projektu Select a rule for the filter Výbìr pravidla pro filtr Enter keywords for the filter Zadej klíèová slova pro filtr Cancel Zrušit Add this rule Pøidat toto pravidlo Please enter one or several keyword(s) for the rule Zadej jedno nebo nìkolik klíèových slov pro pravidlo Add Scan Rule Pøidat filtr Criterion Kritérium filtru String Øetìzec Add Pøidat Scan Rules Filtry Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Používej zástupných znakù (wildcards) pro pøidání nebo odebrání URL nebo odkazù. \nMùžeš použít nìkolik zástupných znakù na jediném øádku. \Používej mezery jako oddìlovaèe. \n\nNapøíklad: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi */ Exclude links Vylouèit odkaz(y) Include link(s) Zahrnout odkaz(y) Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Tip: Pro zahrnutí všech GIF souborù, použij tøeba +www.someweb.com/*.gif. \n(+*.gif / -*.gif zahrne/vylouèí VŠECHNY GIF soubory ze všech stránek) Save prefs Uložit nastavení Matching links will be excluded: Shodné odkazy budou vylouèeny: Matching links will be included: Shodné odkazy budou zahrnuty: Example: Pøíklad: gif\r\nWill match all GIF files gif\r\nZahrne všechny GIF soubory blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' modrá\r\nZahrne všechny soubory obsahující slova 'modrá', napø. 'modrá-obloha.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nZahrne soubor 'bigfile.mov', ale již ne 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nNajde odkazy s názvem adresáøe obsahující øetìzec 'cgi' jako tøeba /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nNajde odkazy s názvem adresáøe obsahující celý 'cgi-bin' øetìzec (ale již ne cgi-bin-2) someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nNajde odkazy obsahující øetìzce www.someweb.com, private.someweb.com apod. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nNajde odkazy shodné s názvem adresáøe obsahující øetìzce www.someweb.com, www.someweb.edu, private.someweb.otherweb.com apod. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nNajde odkazy obsahující celý 'www.someweb.com' øetìzec (ale ne øetìzce jako private.someweb.com/..) someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nNajde jakékoliv odkazy obsahující øetìzec jako www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html apod. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nNajde pouze soubor 'www.test.com/test/someweb.html'. Nezapomeò, že musíš zadat celou cestu (URL + cesta ke stránce) All links will match Všechny odkazy se budou shodovat Add exclusion filter Pøidat filtr pro vylouèení Add inclusion filter Pøidat filtr pro zahrnutí Existing filters Definované filtry Cancel changes Zrušit zmìny Save current preferences as default values Uložit aktuální nastavení jako výchozí Click to confirm Klikni pro potvrzení No log files in %s! Chybí protokoly v %s! No 'index.html' file in %s! Chybí 'index.html' soubor v %s! Click to quit WinHTTrack Website Copier Klikni pro ukonèení programu WinHTTrack Website Copier View log files Zobrazit protokoly Browse HTML start page Prohlídnout úvodní HTML stránku End of mirror Konec stahování View log files Zobrazit protokoly Browse Mirrored Website Prohlídnout stažené stránky New project... Nový projekt.. View error and warning reports Zobrazit chyby a upozornìní View report Zobrazit hlášení Close the log file window Zavøít okno s protokolem Info type: Typ informace: Errors Chyby Infos Informace Find Najít Find a word Najít slovo Info log file Informaèní protokol Warning/Errors log file Protokol s chybami Unable to initialize the OLE system Inicializace OLE systému selhala WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack nemùže nalézt žádné stažené soubory v cache pøi pøerušení stahování v urèeném adresáøi! Could not connect to provider Spojení s poskytovatelem nenavázáno receive pøíjem request požadavek connect spojení search hledání ready hotovo error chyba Receiving files.. Pøíjem souborù.. Parsing HTML file.. Analýza HTML souboru.. Purging files.. Uvolnìní souborù.. Loading cache in progress.. Parsing HTML file (testing links).. Analýza HTML souboru (test odkazù).. Pause - Toggle [Mirror]/[Pause download] to resume operation Pøerušení - Pro pokraèování zvol [Stahování]/[Pøerušit pøenos] Finishing pending transfers - Select [Cancel] to stop now! Dokonèují se zbývající pøenosy - Zvol [Zrušit] pro jejich zastavení scanning provìøování Waiting for scheduled time.. Èekání na naplánovaný èas.. Connecting to provider Pøipojování k poskytovateli [%d seconds] to go before start of operation [%d sekund] do startu Site mirroring in progress [%s, %s bytes] Probíhá stahování stránek [%s, %s bajtù] Site mirroring finished! Stahování stránek skonèeno! A problem occurred during the mirroring operation\n Pøi stahování se vyskytl problém\n \nDuring:\n \nBìhem:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nZobraz protokol.\n\nKlikni na Ukonèit pro ukonèení programu WinHTTrack Website Copier.\n\nDíky za použití programu WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Stahování skonèeno.\nKlikni na Konec pro ukonèení programu WinHTTrack.\nZobraz si protokoly pro kontrolu chyb pøi stahování.\n\nDíky za použití programu WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * STAHOVÁNÍ ZRUŠENO! * *\r\nPro pokraèování stahování je zapotøebí lokální cache, obsahující stažená data.\r\nPøedchozí cache mùže obsahovat více informací. Pokud je nechceš ztratit, musíš ji obnovit a smazat aktuální cache.\r\n[Poznámka: To mùže být provedeno teï smazáním hts-cache/new.* souborù]\r\n\r\nMyslíš, že cache obsahuje více informací a pøeješ si ji obnovit? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * CHYBA PØI STAHOVÁNÍ! * *\r\nHTTrack zjistil, že se nestáhla žádná data. Pokud se jednalo o aktualizaci, pak pøedešlá data byla obnovena.\r\nDùvod: Nemohla být nalezena první stránka nebo se vyskytl problém se spojením.\r\n=>Provìø zda zadaná adresa existuje anebo zkontroluj nastavení proxy! <= \n\nTip: Click [View log file] to see warning or error messages \n\nTip: Klikni [Zobraz protokoly] pro zobrazení upozornìní a chyb Error deleting a hts-cache/new.* file, please do it manually Chyba pøi mazání hts-cache/new.* souborù, udìlej to ruènì Do you really want to quit WinHTTrack Website Copier? Opravdu ukonèit WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Mód stahování -\n\nZadej adresu(y) do URL øádky - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Interaktivní mód (otázky) -\n\nZadej adresu(y) do URL øádky - File Download Mode -\n\nEnter file address(es) in URL box - Mód stahování souborù -\n\nZadej adresu(y) do URL øádky - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Mód kontroly odkazù -\n\nZadej Web adresu(y) s odkazy pro kontrolu do URL øádky - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Mód pro aktualizaci -\n\nZkontroluj adresu(y) v URL øádce, ovìø znovu parametry (pokud je to nutné) a klikni na 'Další' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Mód pro navázání (pøi pøerušení) -\n\nZkontroluj adresu(y) v seznamu, ovìø znovu parametry (pokud je to nutné) a klikni na 'Další' Log files Path Cesta k protokolùm Path Cesta - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Mód seznamu odkazù -\n\nDo URL øádky zadej adresu(y) stránek obsahující odkazy ke stažení New project / Import? Nový projekt/Import? Choose criterion Vybrat kritérium Maximum link scanning depth Maximální hloubka provìøování odkazù Enter address(es) here Zadej adresu(y) Define additional filtering rules Definice dodateèných filtrù Proxy Name (if needed) Jméno proxy (pokud to je nutné) Proxy Port Proxy port Define proxy settings Proxy nastavení Use standard HTTP proxy as FTP proxy Použít standardní proxy jako FTP proxy Path Cesta Select Path Vyber cestu Path Cesta Select Path Vyber cestu Quit WinHTTrack Website Copier Ukonèit WinHTTrack Website Copier About WinHTTrack O programu WinHTTrack Website Copier Save current preferences as default values Uložit aktuální nastavení jako výchozí Click to continue Klikni pro pokraèování Click to define options Klikni pro nastavení Click to add a URL Klikni pro pøidání URL adresy Load URL(s) from text file Naèíst URL adresu z textového souboru WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack nastavení (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Soubor obsahující seznam adres (*.txt)|*.txt|| File not found! Soubor nenalezen! Do you really want to change the project name/path? Opravdu chceš zmìnit název/cestu projektu? Load user-default options? Naèíst uživatelsky-výchozí nastavení? Save user-default options? Uložit uživatelsky-výchozí nastavení? Reset all default options? Obnovit všechna výchozí nastavení? Welcome to WinHTTrack! Vítá Vás program WinHTTrack Website Copier! Action: Akce: Max Depth Maximální hloubka Maximum external depth: Maximální hloubka externího odkazu Filters (refuse/accept links) : Filtry (odmítnout/pøijmout odkazy): Paths Cesty Save prefs Ulož nastavení Define.. Definice.. Set options.. Nastavení.. Preferences and mirror options: Pøedvolby a nastavení stahování: Project name Název projektu Add a URL... Pøidat URL.. Web Addresses: (URL) Adresa WWW (URL): Stop WinHTTrack? Zastavit WinHTTrack? No log files in %s! Nenalezen žádný protokol v %s! Pause Download? Pøerušit stahování? Stop the mirroring operation Zastavit stahování? Minimize to System Tray Minimalizace do systémové lišty Click to skip a link or stop parsing Klikni pro pøeskoèení odkazu nebo pro zastavení provìøování odkazu Click to skip a link Klikni pro pøeskoèení odkazu Bytes saved Bajtù uloženo: Links scanned Odkazù provìøeno: Time: Èas: Connections: Spojení: Running: Zobrazit prùbìh Hide Skrýt Transfer rate Pøenosová rychlost: SKIP PØESKOÈIT Information Informace Files written: Zapsáno souborù: Files updated: Zaktualizováno: Errors: Chyby: In progress: Zpracovává se: Follow external links Následuj externí odkazy Test all links in pages Vyzkoušej všechny odkazy na stránce Try to ferret out all links Zkus prohledat všechny odkazy Download HTML files first (faster) Nejprve stáhnout HTML stránky (rychlejší) Choose local site structure Zvolit místní strukturu stránky Set user-defined structure on disk Nastavit uživatelsky-definovanou strukturu na disku Use a cache for updates and retries Použít cache pro aktualizace a obnovení Do not update zero size or user-erased files Neaktualizovat soubory uživatelem smazané nebo s nulovou velikostí Create a Start Page Vytvoøit úvodní stránku Create a word database of all html pages Vytvoøit seznam slov ze všech HTML stránek Create error logging and report files Vytvoøit protokol s chybami a hlášeními Generate DOS 8-3 filenames ONLY Vytváøet názvy souborù v DOS 8+3 Generate ISO9660 filenames ONLY for CDROM medias Do not create HTML error pages Nevytváøet HTML stránky s chybami Select file types to be saved to disk Vyber typy souborù pro ukládání na disk Select parsing direction Vybrat smìr analýzy Select global parsing direction Vybrat globální smìr analýzy Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Nastav pøepis zásad URL pro interní odkazy (jednou již stažené) a externí odkazy (ještì nestažené) Max simultaneous connections Maximální poèet soubìžných spojení File timeout Doba èekání pro soubory Cancel all links from host if timeout occurs Zruš všechny odkazy pokud je pøekroèena doba èekání Minimum admissible transfer rate Minimální pøípustná pøenosová rychlost Cancel all links from host if too slow Zruš všechny odkazy pokud je pøenos pøíliš pomalý Maximum number of retries on non-fatal errors Maximální poèet opakování pøi nepodstatných chybách Maximum size for any single HTML file Maximální velikost jednoho HTML souboru Maximum size for any single non-HTML file Maximální velikost jednoho ne-HTML souboru Maximum amount of bytes to retrieve from the Web Maximální poèet pøenesených bajtù z Webu Make a pause after downloading this amount of bytes Pozastavit stahování po pøenosu tohoto poètu bajtù Maximum duration time for the mirroring operation Maximální èas trvání stahování Maximum transfer rate Maximální pøenosová rychlost Maximum connections/seconds (avoid server overload) Maximální poèet spojení/sekund (zabránìní pøetížení serveru) Maximum number of links that can be tested (not saved!) Maximální poèet odkazù, které mají být otestovány (ne uloženy) Browser identity Totožnost prohlížeèe Comment to be placed in each HTML file Komentáø vložený do každého HTML souboru Back to starting page Zpìt na úvodní stránku Save current preferences as default values Uložit aktuální nastavení jako výchozí Click to continue Klikni pro pokraèování Click to cancel changes Klikni pro zrušení zmìn Follow local robots rules on sites Aplikuj lokální pravidla robotù na stránkách Links to non-localised external pages will produce error pages Odkazy na nelokalizované externí stránky zapøièiní vytvoøení stránek s chybami Do not erase obsolete files after update Nesmazat starší soubory po jejich aktualizaci Accept cookies? Pøijímat cookies? Check document type when unknown? Provìøit typ dokumentu pokud je neznámý? Parse java applets to retrieve included files that must be downloaded? Analyzovat java aplety kvùli nalezení nutných souborù pro stažení Store all files in cache instead of HTML only Uložení všech souborù do cache místo jen do HTML Log file type (if generated) Typ protokolu (pokud je vytvoøen) Maximum mirroring depth from root address Maximální hloubka stahování z koøenového adresáøe Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximální hloubka stahování pro externí/zakázané adresy (0 - znamenající žádná - je výchozí) Create a debugging file Vytvoøení souboru pro ladìní Use non-standard requests to get round some server bugs Použít nestandardních požadavkù pro pøedejití chyb serveru Use old HTTP/1.0 requests (limits engine power!) Použít starší verze HTTP/1.0 požadavkù (omezuje výkonost stroje) Attempt to limit retransfers through several tricks (file size test..) Pokus k zamezení opìtovného pøenosu pomocí rùzných zpùsobù (test velikosti souboru,..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Zápis externích odkazù bez pøihlášení/hesla Write internal links without query string Zápis interních odkazù bez ovìøení øetìzce Get non-HTML files related to a link, eg external .ZIP or pictures Stáhnout soubory patøící k odkazu v ne-HTML formátu, napø. externí .ZIP nebo obrázky Test all links (even forbidden ones) Kontrola všech odkazù (vèetnì zakázaných) Try to catch all URLs (even in unknown tags/code) Pokus o získání všech URL (vèetnì tìch v neznámých znacích nebo kódech) Get HTML files first! Stáhnout nejprve HTML soubory! Structure type (how links are saved) Typ struktury (jak budou odkazy uloženy) Use a cache for updates Použít cache pro aktualizaci Do not re-download locally erased files Znovu nestahovat lokálnì smazané soubory Make an index Vytvoøit rejstøík Make a word database Vytvoøit seznam slov Log files Protokoly DOS names (8+3) Jména souborù v DOS (8+3) ISO9660 names (CDROM) No error pages Žádné chybové stránky Primary Scan Rule Primární filtr Travel mode Mód pro cestování Global travel mode Globální mód pro cestování These options should be modified only exceptionally Tyto parametry by mìli být zmìnìny pouze vyjímeènì Activate Debugging Mode (winhttrack.log) Aktivuj mód ladìní (winhttrack.log) Rewrite links: internal / external Pøepiš odkazy: interní/externí Flow control Sledování bìhu Limits Limity Identity Identifikace HTML footer Záhlaví HTML N# connections Poèet spojení Abandon host if error Pøerušit spojení, pokud dojde k chybì serveru Minimum transfer rate (B/s) Minimální pøenosová rychlost (B/s) Abandon host if too slow Pøerušit spojení, pokud je pøenos pøíliš pomalý Configure Konfigurace Use proxy for ftp transfers Použít proxy pro FTP pøenos TimeOut(s) Èasové limity Persistent connections (Keep-Alive) Reduce connection time and type lookup time using persistent connections Retries Poèet opakování Size limit Omezení velikosti Max size of any HTML file (B) Maximální velikost HTML souboru Max size of any non-HTML file Maximální velikost ne-HTML souboru Max site size Maximální velikost stránky Max time Maximální èas Save prefs Uložit nastavení Max transfer rate Maximální pøenososvá rychlost Follow robots.txt Øiï se podle robots.txt No external pages Žádné externí stránky Do not purge old files Neuvolnit staré soubory Accept cookies Pøíjem cookies Check document type Kontrola typu dokumentu Parse java files Analyzovat java soubory Store ALL files in cache Ukládat VŠECHNY soubory do cache Tolerant requests (for servers) Pøípustné požadavky (pro servery) Update hack (limit re-transfers) Aktualizovat chytrou obnovu (zabrání znovu pøenosu souborù) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Použít pouze staré HTTP/1.0 požadavky (ne HTTP/1.1) Max connections / seconds Maximální poèet spojení/sekund Maximum number of links Maximální poèet odkazù Pause after downloading.. Pøerušit po stažení Hide passwords Skrýt heslo Hide query strings Skrýt ovìøovací znaky Links Odkazy Build Struktura Experts Only Pro odborníky Flow Control Øízení bìhu Limits Limitní hodnoty Browser ID ID prohlížeèe Scan Rules Filtry Spider Pavouk Log, Index, Cache Protokol, rejstøík, cache Proxy Proxy MIME Types Do you really want to quit WinHTTrack Website Copier? Opravdu ukonèit WinHTTrack Website Copier? Do not connect to a provider (already connected) Nepøipojovat se k poskytovateli (již spojeno) Do not use remote access connection Nepoužívat vzdáleného pøístupového spojení Schedule the mirroring operation Naplánovat stahování Quit WinHTTrack Website Copier Ukonèit WinHTTrack Website Copier Back to starting page Zpìt na úvodní stránku Click to start! Klikni pro start No saved password for this connection! Není uloženo heslo pro toto spojení! Can not get remote connection settings Není pøístup k nastavení vzdáleného spojení Select a connection provider Vyber poskytovatele Start Start Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Pokud je to nutné, uprav parametry spojení,\npak klikni na DOKONÈIT pro zahájení stahování Save settings only, do not launch download now. Pouze uložit nastavení, nezahájit stahování. On hold Podržet Transfer scheduled for: (hh/mm/ss) Nastavení èasu stahování v: (hh/mm/ss) Start Start Connect to provider (RAS) Spojení s poskytovatelem (RAS) Connect to this provider Spojit s tímto poskytovatelem spojení Disconnect when finished Odpojit po dokonèení Disconnect modem on completion Odpojit modem po dokonèení \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Prosíme o podání hlášení o jakýchkoliv chybách)\r\n\r\nVývoj:\r\nRozhraní (Windows): Xavier Roche\r\nPavouk: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche a ostatní, kdo pøispìli\r\nÈeský pøeklad:\r\nAntonín Matìjèík (matejcik@volny.cz) About WinHTTrack Website Copier O programu WinHTTrack Website Copier Please visit our Web page Návštìva naší stránky Wizard query Otázky pro pomocníka Your answer: Tvá odpovìï: Link detected.. Odkaz detekován.. Choose a rule Vybrat filtr Ignore this link Ignorovat tento odkaz Ignore directory Ignorovat adresáø Ignore domain Ignorovat doménu Catch this page only Získat pouze tuto stránku Mirror site Stránka pro stahování Mirror domain Doména stránky pro stahování Ignore all Ignoruj vše Wizard query Otázka pomocníka NO Ne File Soubor Options Nastavení Log Protokol Window Okno Help Nápovìda Pause transfer Pøerušit pøenos Exit Konec Modify options Zmìna nastavení View log Zobrazit protokol View error log Zobrazit chybový protokol View file transfers Zobrazit pøenosy souborù Hide Do systémové lišty About WinHTTrack Website Copier O programu WinHTTrack Website Copier Check program updates... Stažení novìjší verze.. &Toolbar &Lišta &Status Bar &Stavová lišta S&plit R&ozdìlit File Soubor Preferences Nastavení Mirror Stahování Log Protokol Window Okno Help Nápovìda Exit Konec Load default options Nahrát výchozí nastavení Save default options Uložit výchozí nastavení Reset to default options Obnovit výchozí nastavení Load options... Nahrát nastavení.. Save options as... Uložit nastavení jako.. Language preference... Volba jazyka Contents... Obsah (Anglicky) About WinHTTrack... O programu WiHTTrack Website Copier New project\tCtrl+N Nový projekt\tCtrl+N &Open...\tCtrl+O &Oteøít..\tCtrl+O &Save\tCtrl+S &Uložit\tCtrl+S Save &As... Uložit &jako.. &Delete... &Smazat &Browse sites... &Prohlídnout stažené stránky.. User-defined structure Uživatelsky-definovaná struktura %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNázev souboru bez pøípony (napø. obr)\r\n%N\tNázev souboru vèetnì pøípony (napø. obr.gif)\r\n%t\tPouze pøípona (napø. gif)\r\n%p\tCesta [bez posledního /] (napø. /obrázky)\r\n%h\tWeb adresa (napø. www.kdesi.com)\r\n%M\tMD5 URL (128 bitù, 32 ascii bajtù)\r\n%Q\tMD5 ovìøovací øetìzec (128 bitù, 32 ascii bajtù)\r\n%q\tMD5 malý ovìøovací øetìzec (16 bitù, 4 ascii bajtù)\r\n\r\n%s?\tZkratka (napø. %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Pøíklad:\t%h%p/%n%q.%t\n->\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Nastavení proxy Proxy address: Adresa Proxy: Proxy port: Port Proxy Authentication (only if needed) Ovìøení (pouze když je vyžadováno) Login Pøihlášení Password Heslo Enter proxy address here Vlož adresu proxy Enter proxy port here Vlož port proxy Enter proxy login Vlož pøihlášení k proxy Enter proxy password Vlož heslo proxy Enter project name here Napiš název projektu Enter saving path here Vlož cestu pro uložení Select existing project to update Zvolt existující projekt pro aktualizaci Click here to select path Klikni pro výbìr cesty Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... Pomocník HTTrack projektu.. New project name: Název nového projektu: Existing project name: Existující název projektu: Project name: Název projektu: Base path: Základní cesta: Project category: C:\\My Web Sites C:\\Temp\Projekty Type a new project name, \r\nor select existing project to update/resume Napiš nový název projektu, \r\nnebo vyber projekt k aktualizaci New project Nový projekt Insert URL Vložit URL adresu URL: URL adresa: Authentication (only if needed) Ovìøení (pouze pokud je tøeba) Login Pøihlášení Password Heslo Forms or complex links: Formuláøe nebo souhrné odkazy: Capture URL... Získat URL.. Enter URL address(es) here Vlož URL adresu(y) Enter site login Vlož pøihlášení na stránku Enter site password Vlož heslo pro stránku Use this capture tool for links that can only be accessed through forms or javascript code Použít tento nástroj pro získání odkazù, které mohou být dostupné pouze pomocí formuláøù nebo java skriptù Choose language according to preference Volba jazyka podle nastavení Catch URL! Získej URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Nastav doèasnì proxy pro tvùj prohlížeè na následující hodnoty (zkopírovat/vložit adresu a port proxy).\nPak klikni na tlaèítko OK na formuláøi ve tvém prohlížeèi nebo klikni na daný odkaz, který chceš získat. This will send the desired link from your browser to WinHTTrack. Požadovaný odkaz se odešle z tvého prohlížeèe do programu WinHTTrack. ABORT ZRUŠIT Copy/Paste the temporary proxy parameters here Zkopírovat/Vložit doèasné proxy parametry Cancel Zrušit Unable to find Help files! Nebylo možné nalézt soubory Nápovìdy! Unable to save parameters! Nebylo možné uložit parametry! Please drag only one folder at a time Prosím uchop do myši najednou pouze jeden adresáø Please drag only folders, not files Prosím uchopuj pouze adresáøe, ne soubory Please drag folders only Prosím uchopuj pouze adresáøe Select user-defined structure? Vybrat uživatelsky-definovanou strukturu? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Prosím zajisti, že uživatelsky-definovaný øetìzec je správný, jinak budou názvy souborù špatnì pojmenovány! Do you really want to use a user-defined structure? Opravdu chceš použít uživatelsky-definovanou strukturu? Too manu URLs, cannot handle so many links!! Pøíliš mnoho URL adres, není možné pracovat s takovým množstvím! Not enough memory, fatal internal error.. Nedostatek pamìti, vážná vnitøní chyba.. Unknown operation! Neznámá operace! Add this URL?\r\n Pøidat tuto URL adresu?\r\n Warning: main process is still not responding, cannot add URL(s).. Upozornìní: hlavní proces ještì nereaguje, nemožné pøidat URL adresu(y).. Type/MIME associations Type/MIME pøidružení File types: Typy souborù: MIME identity: Identita MIME: Select or modify your file type(s) here Vybrat nebo zmìnit typ(y) souborù Select or modify your MIME type(s) here Vybrat nebo zmìnit typ(y) MIME souborù Go up Nahoru Go down Dolù File download information Informace o staženém souboru Freeze Window Zamrznutí okna More information: Další informace: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Vítej v programu WinHTTrack!\n\nKlikni na tlaèítko Další pro\n\n- vytvoøení nového projektu\n nebo \n- návrat k èásteènì staženému projektu File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Názvy souborù s pøíponami:\nNázvy souborù obsahující:\n Tento název souboru:\nJména adresáøù obsahující:\nTento název adresáøe:\nOdkazy v této doménì:\nOdkazy v doménách obsahující:\nOdkazy z tohoto poèítaèe:\nOdkazy obsahující:\nTento odkaz:\nVŠECHNY ODKAZY Show all\nHide debug\nHide infos\nHide debug and infos Zobraz vše\nSkryj ladìní\nSkryj informace\nSkryj ladìní a informace Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Struktura stránky (výchozí)\nHtml ve web/, obrázky/ostatní soubory ve web/obrázky/\nHtml ve web/html, obrázky/ostatní ve web/obrázky\nHtml ve web/, obrázky/ostatní ve web/\nHtml ve web/, obrázky/ostatní ve web/xxx, kde xxx znaèí pøíponu souboru\nHtml ve web/html, obrázky/ostatní ve web/xxx\nStruktura stránky bez www.doména.xxx/\nHtml v název_stránky/, obrázky/ostatní soubory v název_stránky/obrázky/\nHtml v název_stránky/html, obrázky/ostatní v název_stránky/obrázky\nHtml v název_stránky/, obrázky/ostatní v název_stránky/\nHtml v název_stránky/, obrázky/ostatní v název_stránky/xxx\nHtml v název_stránky/html, obrázky/ostatní v název_stránky/xxx\nVšechny soubory ve web/, s náhodnými názvy (vynález!)\nVšechny soubory v název_stránky/, s náhodnými názvy (vynález!)\nUživatelsky-definovaná struktura.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Pouze provìøit\nUložit HTML soubory\nUložit ne-HTML soubory\nUložit všechny soubory (výchozí)\nUložit nejprve HTML soubory Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Zùstat ve stejném adresáøi\nDolù (výchozí)\nNahoru\nNahoru i dolù Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Zùstat na stejné adrese (výchozí)\nZùstat ve stejné doménì\nZùstat ve stejné doménì nejvyš. øádu\nJít na jakýkoliv web Never\nIf unknown (except /)\nIf unknown Nikdy\nPokud není znám (kromì /)\nPokud není znám no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules žádná pravidla podle robot.txt\nrobot.txt kromì pomocníka\naplikovat pravidla podle robot.txt normal\nextended\ndebug normální\nrozšíøený\nladìní Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Stažení web stránek\nStažení web stránek + otázky\nStažení souborù\nStažení všech stránek (vícenásobné stažení)\nKontrola odkazù na stránkách (test záložek)\n* Navázání pøerušeného stahování\n* Aktualizace stažených stránek Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Relativní URI/Absolutní URL (výchozí)\nAbsolutní URL/Absolutní URL\nAbsolutní URI/Absolutní URL\nPùvodní URL/Pùvodní URL Open Source offline browser Website Copier/Offline Browser. Copy remote websites to your computer. Free. httrack, winhttrack, webhttrack, offline browser URL list (.txt) Previous Next URLs Warning Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Thank you You can now close this window Server terminated A fatal error has occurred during this mirror Proxy type: Typ proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protokol proxy. HTTP: standardní proxy. HTTP (tunel CONNECT): odešle každý požadavek pøes tunel CONNECT, pro proxy podporující jen CONNECT jako HTTPTunnelPort v Toru. SOCKS5: výchozí port 1080. Load cookies from file: Naèíst cookies ze souboru: Preload cookies from a Netscape cookies.txt file before crawling. Naèíst cookies ze souboru Netscape cookies.txt pøed zahájením stahování. Pause between files: Prodleva mezi soubory: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Náhodná prodleva mezi stahováním souborù, v sekundách. Pro náhodný rozsah použijte MIN:MAX (napø. 2:8). Keep the www. prefix (do not merge www.host with host) Zachovat pøedponu www. (nesluèovat www.host s host) Do not treat www.host and host as the same site. Nepovažovat www.host a host za stejný web. Keep double slashes in URLs Zachovat dvojitá lomítka v URL Do not collapse duplicate slashes in URLs. Nesluèovat opakovaná lomítka v URL. Keep the original query-string order Zachovat pùvodní poøadí øetìzce dotazu Do not reorder query-string parameters when deduplicating URLs. Nemìnit poøadí parametrù øetìzce dotazu pøi odstraòování duplicitních URL. Strip query keys: Odebrat klíèe dotazu: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Klíèe dotazu oddìlené èárkami, které se vynechají z pojmenování ukládaných souborù (napø. sid,utm_source). Write a WARC archive of the crawl Zapsat archiv WARC z procházení Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Uložit také každou staženou odpovìï do archivu WARC/1.1 podle ISO-28500 vedle zrcadla. WARC archive name: Název archivu WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Volitelný základní název archivu WARC; ponechte prázdné pro automatické pojmenování ve výstupním adresáøi. httrack-3.49.14/lang/Castellano.txt0000644000175000017500000011563515230602340012572 LANGUAGE_NAME Castellano LANGUAGE_FILE Castellano LANGUAGE_ISO es LANGUAGE_AUTHOR Juan Pablo Barrio Lera (Universidad de León) \r\n LANGUAGE_CHARSET ISO-8859-1 LANGUAGE_WINDOWSID Spanish (Spain, Modern Sort) OK Ya Cancel Cancelar Exit Salir Close Cerrar Cancel changes Cancelar los cambios Click to confirm Haga click para confirmar Click to get help! Haga click para obtener ayuda Click to return to previous screen Haga click para volver atrás Click to go to next screen Haga click para pasar a la siguiente pantalla Hide password Ocultar palabra clave Save project Guardar proyecto Close current project? ¿Cerrar el proyecto actual? Delete this project? ¿Borrar este proyecto? Delete empty project %s? ¿Borrar el proyecto vacío %s? Action not yet implemented Acción aún no implementada Error deleting this project Error al borrar este proyecto Select a rule for the filter Escoja una regla para el filtro Enter keywords for the filter Escriba aquí una palabra clave para el filtro Cancel Cancelar Add this rule Añadir esta regla Please enter one or several keyword(s) for the rule Escriba una o más palabras clave para la regla Add Scan Rule Añadir un filtro Criterion Escoger una regla String Escribir una palabra clave Add Añadir Scan Rules Filtros Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Puede excluir o aceptar varias URLs o enlaces, empleando los comodines\nSe pueden utilizar espacios entre los filtros\nEjemplo: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Excluir enlaces Include link(s) Aceptar enlaces Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Consejo: Si desea aceptar todos los ficheros GIF de un sitio, utilice algo similar a +www.monweb.com/*.gif\n(+*.gif / -*.gif autorizará TODOS los ficheros GIF en TODOS los sitios) Save prefs Guardar preferencias Matching links will be excluded: Los enlaces que sigan esta regla serán prohibidos Matching links will be included: Los lugares que sigan esta regla serán aceptados Example: Ejemplo: gif\r\nWill match all GIF files gif\r\nDetectará todos los ficheros gif (o ficheros GIF) blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nDetectará todos los ficheros que contengan la palabra blue, como 'bluesky-small.jpeg'\r\n bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nDetectará el fichero 'bigfile.mov', pero no 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nDetectará los enlaces con nombre de ruta que incluya 'cgi', como /cgi-bin/somecgi.cgi\r\n cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nDetectará los enlaces con nombre de ruta que incluya 'cgi-bin' (pero no cgi-bin-2, por ejemplo)\r\n someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nDetectará enlaces como www.someweb.com, private.someweb.com, etc.\r\n someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb\r\nDetectará enlaces como www.someweb.com, www.someweb.edu, private.someweb.otherweb.com, etc.\r\n www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nDetectará enlaces como www.someweb.com/... (pero no private.someweb.com/ y similares)\r\n someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nDetectará enlaces como www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html, etc.\r\n www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nDetectará únicamente www.test.com/test/someweb.html. Note que deberá introducir a la vez la dirección (www.xxx.yyy) y la ruta (/test/someweb.html)\r\n All links will match Todos los enlaces serán autorizados/prohibidos Add exclusion filter Añadir un filtro de exclusión Add inclusion filter Añadir un filtro de inclusión Existing filters Filtros adicionales Cancel changes Cancelar los cambios Save current preferences as default values Guardar preferencias como valores por defecto Click to confirm Haga click para confirmar No log files in %s! ¡No hay ficheros de auditoría en %s! No 'index.html' file in %s! ¡No hay fichero index.html en %s! Click to quit WinHTTrack Website Copier Haga click para salir de WinHTTrack Website Copier View log files Ver fichero de auditoría Browse HTML start page Hojear la página inicial End of mirror Fin del volcado View log files Ver fichero de auditoría Browse Mirrored Website Hojear la Web New project... Nuevo proyecto... View error and warning reports Ver errores y mensajes View report Ver informe de auditoría Close the log file window Cerrar la ventana de auditoría Info type: Tipo de información: Errors Errores Infos Informaciones Find Buscar Find a word Encontrar una palabra Info log file Fichero de auditoría Warning/Errors log file Fichero de auditoría de avisos/errores Unable to initialize the OLE system Imposible inicializar el sistema OLE WinHTTrack could not find any interrupted download file cache in the specified folder! No hay caché en el directorio indicado\nWinHTTrack no puede encontrar el volcado interrumpido Could not connect to provider Imposible establecer la conexión receive recepción request petición connect conexión search búsqueda ready listo error error Receiving files.. Recepción de ficheros Parsing HTML file.. Recorriendo fichero HTML Purging files.. Vaciando ficheros.. Loading cache in progress.. Ejecutando la carga del caché.. Parsing HTML file (testing links).. Recorriendo fichero HTML (comprobando enlaces) Pause - Toggle [Mirror]/[Pause download] to resume operation En pausa (escoja [Fichero]/[Interrumpir transferencias] para continuar Finishing pending transfers - Select [Cancel] to stop now! Finalizando transferencias pendientes - Seleccione [Cancelar] para terminar ahora scanning recorriendo Waiting for scheduled time.. Esperando a la hora especificada para comenzar Connecting to provider Conexión con el proveedor [%d seconds] to go before start of operation Volcado en espera [%d segundos] Site mirroring in progress [%s, %s bytes] Volcado en ejecución [%s, %s bytes] Site mirroring finished! ¡Copia del sitio finalizada! A problem occurred during the mirroring operation\n Ha ocurrido un problema durante el volcado\n \nDuring:\n \nDurante:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! Ver el fichero de auditoría si es necesario.\n\nPulse OK para salir de WinHTTrack Website Copier.\n\n¡Gracias por usar WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! El volcado ha finalizado.\nPulse OK para salir de WinHTTrack\n\nConsulte los ficheros de auditoría para verificar que todo ha salido bien\n\n¡Gracias por utilizar WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ¡COPIA INTERRUMPIDA! * *\r\nEs necesario el cache temporal actual para cualquier operación de actualización y solamente contiene datos bajados durante la presente sesión abortada.\r\nEl antiguo cache puede contener datos más completos; si vd. no desea perder dichos datos, deberá que restaurarlo y excluir el cache actual.\r\n[Nota: Esto puede hacerse fácilmente aquí excluyendo el hts-cache/nuevo.* ficheros]\r\n\r\n¿Cree que el antiguo cache puede contener datos más completos, y desea restaurarlo? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ¡ERROR DE VOLCADO! * *\r\nHTTrack ha detectado que el volcado actual está vacío. Si se trataba de una actualización, el volcado anterior ha sido recuperado.\r\nRazón: no se ha(n) encontrado la(s) primera(s) página(s), o ha habido un problema de conexión.\r\n=> Asegúrese de que el sitio web existe aún, y/o compruebe los ajustes de su proxy! <= \n\nTip: Click [View log file] to see warning or error messages \n\nConsejo: Pulse [Ver ficheros auditoría] para ver los errores y mensajes Error deleting a hts-cache/new.* file, please do it manually Error al excluir un hts-cache/nuevo.* fichero; por favor, hágalo manualmente Do you really want to quit WinHTTrack Website Copier? ¿Desea realmente salir de WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Modo de volcado -\n\nRellene la(s) direccion(es) en la lista de URLs. - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Modo de volcado semiautomático (con preguntas); rellene la(s) direccion(es) en la lista de URLs. - File Download Mode -\n\nEnter file address(es) in URL box - Modo de telecarga de ficheros; rellene la(s) direccion(es) de los ficheros en la lista de URLs. - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Modo de comprobación de enlaces -\n\nRellene la(s) direccion(es) de las páginas con enlaces a comprobar en el recuadro de URL. - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modo de actualización/continuación de volcado -\n\nVerifique la(s) direccion(es) de la lista de URLs, y luego pulse el botón 'SIGUIENTE' y verifique los parámetros. - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Modo de continuación de volcado -\n\nVerifique la(s) direccion(es) de la lista de URLs, y luego pulse el botón 'SIGUIENTE' y verifique los parámetros. Log files Path Ruta de ficheros log Path Ruta - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror Modo de volcado de enlaces; rellene las direcciones de las páginas que contengan los enlaces a volcar en la lista de URLs. New project / Import? Nuevo proyecto / importar ? Choose criterion Escoja una acción Maximum link scanning depth Profundidad máxima Enter address(es) here Escriba aquí las direcciones Define additional filtering rules Definir filtros adicionales Proxy Name (if needed) Proxy si es necesario Proxy Port Puerto del proxy Define proxy settings Definir las preferencias del proxy Use standard HTTP proxy as FTP proxy Usar el proxy HTTP estándar como proxy FTP Path Ruta Select Path Escoja ruta Path Ruta Select Path Escoja ruta Quit WinHTTrack Website Copier Salir de WinHTTrack Website Copier About WinHTTrack Acerca de WinHTTrack Save current preferences as default values Guardar preferencias como valores por defecto Click to continue Haga click para continuar Click to define options Haga click para definir las opciones Click to add a URL Haga click para añadir una URL Load URL(s) from text file Cargar URL(s) desde fichero de texto WinHTTrack preferences (*.opt)|*.opt|| Preferencias de WinHTTrack (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Fichero de texto de Lista de Direcciones (*txt)|*.txt|| File not found! ¡Fichero no encontrado! Do you really want to change the project name/path? ¿Desea realmente cambiar el nombre/ruta del proyecto? Load user-default options? ¿Cargar las opciones de usuario por defecto? Save user-default options? ¿Guardar las opciones de usuario por defecto? Reset all default options? ¿Pasar todas las opciones a sus valores por defecto? Welcome to WinHTTrack! Bienvenido a WinHTTrack Website Copier! Action: Acción Max Depth Profundidad máxima: Maximum external depth: Profundidad externa máxima: Filters (refuse/accept links) : Filtros (rehusar/aceptar enlaces) : Paths Rutas Save prefs Guardar prefs Define.. Definir... Set options.. Definir las opciones.. Preferences and mirror options: Definir las opciones.. Project name Nombre del proyecto Add a URL... Añadir... Web Addresses: (URL) Dirección Web: (URL) Stop WinHTTrack? ¿Detener WinHTTrack? No log files in %s! ¡No hay ficheros de auditoría en %s! Pause Download? ¿Poner en pausa la transferencia? Stop the mirroring operation Detener el volcado Minimize to System Tray Ocultar esta ventana tras la barra de sistema Click to skip a link or stop parsing Haga click para saltar un enlace o interrumpir el recorrido Click to skip a link Haga click para saltar un enlace Bytes saved Bytes guardados: Links scanned Enlaces recorridos: Time: Tiempo: Connections: Conexiones: Running: En ejecución: Hide Ocultar Transfer rate Tasa de transferencia: SKIP SALTAR Information Informaciones Files written: Ficheros escritos: Files updated: Ficheros puestos al día: Errors: Errores: In progress: En progreso: Follow external links Recuperar ficheros incluso bajo enlaces externos Test all links in pages Comprobar todos los enlaces de las páginas Try to ferret out all links Intentar detectar todos los enlaces Download HTML files first (faster) Bajar ficheros HTML primero (más rápido) Choose local site structure Escoger la estructura local de ficheros Set user-defined structure on disk Definir la estructura del sitio en el disco Use a cache for updates and retries Utilizar un caché para actualizaciones y reintentos Do not update zero size or user-erased files No volver a descargar ficheros ya existentes con tamaño nulo o que hayan sido borrados por el usuario Create a Start Page Generar página de inicio Create a word database of all html pages Crear una base de datos de palabras de todas las páginas HTML Create error logging and report files Generar ficheros de auditoría para los errores y mensajes Generate DOS 8-3 filenames ONLY Generar únicamente ficheros con nombres cortos 8-3 Generate ISO9660 filenames ONLY for CDROM medias Generar nombres de fichero ISO9660 SOLO para soportes CDROM Do not create HTML error pages No generar ficheros de error html Select file types to be saved to disk Selección de los tipos de fichero a guardar Select parsing direction Selección de la dirección del volcado Select global parsing direction Selección de la dirección global del volcado Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Configurar reglas de regrabación de URLs para enlaces internos (los bajados) y enlaces externos (los no bajados) Max simultaneous connections Número máximo de conexiones File timeout Tiempo muerto máximo para un fichero Cancel all links from host if timeout occurs Anular todos los enlaces de un dominio en caso de tiempo muerto Minimum admissible transfer rate Tasa de transferencia mínima tolerada Cancel all links from host if too slow Anular todos los enlaces de un dominio en caso de transferencia demasiado lenta Maximum number of retries on non-fatal errors Número máximo de reintentos en caso de error no fatal Maximum size for any single HTML file Tamaño máximo para una página html Maximum size for any single non-HTML file Tamaño máximo para un fichero Maximum amount of bytes to retrieve from the Web Tamaño total máximo para el volcado Make a pause after downloading this amount of bytes Hacer una pausa antes de descargar esta cantidad de bytes Maximum duration time for the mirroring operation Tiempo total máximo para el volcado Maximum transfer rate Tasa de transferencia máxima Maximum connections/seconds (avoid server overload) Nº máximo de conexiones/segundo (evitar sobrecarga de servidor) Maximum number of links that can be tested (not saved!) Número máximo de enlaces que pueden ser comprobados (¡no grabados!) Browser identity Identidad del navegador Comment to be placed in each HTML file Pie de página colocado en cada fichero HTML Back to starting page Volver a la primera página Save current preferences as default values Guardar preferencias como valores por defecto Click to continue Haga click para continuar Click to cancel changes Haga click para cancelar Follow local robots rules on sites Seguir las reglas locales de los robots sobre los sitios Links to non-localised external pages will produce error pages Las páginas externas (no capturadas) apuntarán a páginas de error Do not erase obsolete files after update No borrar los ficheros antiguos tras una puesta al día Accept cookies? ¿Aceptar las cookies enviadas? Check document type when unknown? ¿Verificar el tipo de documento cuando es desconocido? Parse java applets to retrieve included files that must be downloaded? ¿Analizar los applets Java para recuperar los ficheros incluidos? Store all files in cache instead of HTML only Forzar el almacenaje de todos los ficheros en el cache y no solamente los HTML Log file type (if generated) Tipo de fichero de auditoría generado Maximum mirroring depth from root address Profundidad máxima de volcado desde las primeras direcciones Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Maximum mirroring depth for external/fodbidden addresses (0, that is, none, is the default) Create a debugging file Crear un fichero de depuración Use non-standard requests to get round some server bugs Intentar evitar los fallos de algunos servidores empleando peticiones no estandarizadas Use old HTTP/1.0 requests (limits engine power!) Usar peticiones del antiguo HTTP/1.0 (¡limita la potencia del motor!) Attempt to limit retransfers through several tricks (file size test..) Intentar limitar las retransferencias mediante varios trucos (comprobación de tamaño de ficheros, ...) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Intentar limitar el número de enlaces descartando URLs similares (www.foo.com==foo.com, http=https ..) Write external links without login/password Grabar enlaces externos sin login/password Write internal links without query string Grabar enlaces externos sin cadena de petición Get non-HTML files related to a link, eg external .ZIP or pictures Capturar los ficheros no html próximos (ej: ficheros ZIP situados en el exterior) Test all links (even forbidden ones) Comprobar todos los enlaces (incluso los no permitidos) Try to catch all URLs (even in unknown tags/code) Intentar detectar todos los enlaces (incluso los tags desconocidos / código javascript) Get HTML files first! ¡Recibir ficheros HTML primero! Structure type (how links are saved) Tipo de estructura (forma en la que serán guardados los enlaces) Use a cache for updates Utilizar un cache para la puesta al día Do not re-download locally erased files No volver a descargar ficheros borrados localmente Make an index Hacer un índice Make a word database Elaborar una base de datos de palabras Log files Ficheros auditoría DOS names (8+3) Nombres DOS (8+3) ISO9660 names (CDROM) Nombres ISO9660 (CDROM) No error pages Sin páginas de error Primary Scan Rule Filtro primario Travel mode Modo de recorrido Global travel mode Modo de recorrido global These options should be modified only exceptionally Normalmente estas opciones no deberían ser modificadas Activate Debugging Mode (winhttrack.log) Activar el modo de depuración (winhttrack.log) Rewrite links: internal / external Volver a grabar enlaces: internos / externos Flow control Control de flujo Limits Límites Identity Identidad HTML footer Pie de página HTML N# connections Nº de conexiones Abandon host if error Abandonar host en caso de error Minimum transfer rate (B/s) Tasa de transferencia mínima (B/s) Abandon host if too slow Abandonar host si es muy lento Configure Configurar Use proxy for ftp transfers Usar el proxy para transferencias FTP TimeOut(s) Intervalo(s) Persistent connections (Keep-Alive) Conexiones persistentes (mantener activas) Reduce connection time and type lookup time using persistent connections Reduzca tiempo de conexión y búsqueda de tipos mediante las conexiones persistentes Retries Reintentos Size limit Límite de tamaño Max size of any HTML file (B) Tamaño máximo html Max size of any non-HTML file Tamaño máximo otro Max site size Tamaño máximo del sitio Max time Tiempo máximo Save prefs Guardar preferencias Max transfer rate Velocidad máxima Follow robots.txt Seguir robots.txt No external pages Sin páginas externas Do not purge old files No eliminar ficheros antiguos Accept cookies Aceptar las cookies Check document type Verificar el tipo de documento Parse java files Analizar los ficheros Java Store ALL files in cache Forzar almacenaje de todos los ficheros en el cache Tolerant requests (for servers) Peticiones tolerantes (para servidores) Update hack (limit re-transfers) Update hack (limitar retransferencias) URL hacks (join similar URLs) Trucos para URLs (unir URLs similares) Force old HTTP/1.0 requests (no 1.1) Forzar peticiones HTTP/1.0 anterior (no 1.1) Max connections / seconds Nº máx. conexiones / segundos Maximum number of links Número máximo de enlaces Pause after downloading.. Suspender tras copiar... Hide passwords Ocultar palabra clave Hide query strings Ocultar cadenas de petición Links Enlaces Build Estructura Experts Only Experto Flow Control Control de flujo Limits Límites Browser ID Identidad Scan Rules Filtros Spider Araña (spider) Log, Index, Cache Auditoría, Índice, Cache Proxy Proxy MIME Types Tipos MIME Do you really want to quit WinHTTrack Website Copier? ¿Desea realmente salir de WinHTTrack Website Copier? Do not connect to a provider (already connected) no conectar con proveedor (conexión ya establecida) Do not use remote access connection No utilizar conexión de acceso remoto Schedule the mirroring operation Programar un volcado Quit WinHTTrack Website Copier Salir de WinHTTrack Website Copier Back to starting page Volver a la primera página Click to start! Haga click para comenzar No saved password for this connection! ¿No hay palabra clave guardada para esta conexión! Can not get remote connection settings Imposible obtener los parámetros de conexión Select a connection provider Seleccione aquí un proveedor con el cual conectar Start COMENZAR Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Puede comenzar el volcado pulsando la tecla COMENZAR,\no definir más opciones de conexión Save settings only, do not launch download now. Grabar solamente configuraciones, no cargar o bajar ahora. On hold Retrasar Transfer scheduled for: (hh/mm/ss) Esperar hasta las: (hh/mm/ss) Start COMENZAR Connect to provider (RAS) Proveedor de Internet Connect to this provider Conectar con este proveedor Disconnect when finished Desconectar al terminar la operación Disconnect modem on completion Desconectar el modem al terminar \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(notifíquenos fallos o problemas)\r\n\r\nDesarrollo:\r\nInterface (Windows): Xavier Roche\r\nMotor: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for Spanish translations to:\r\nJuan Pablo Barrio Lera (Universidad de León) About WinHTTrack Website Copier Acerca de... Please visit our Web page ¡Visite nuestra página Web! Wizard query Pregunta del asistente Your answer: Su respuesta: Link detected.. Se ha detectado un enlace Choose a rule Escoja una regla Ignore this link Ignorar este enlace Ignore directory Ignorar directorio Ignore domain Ignorar dominio Catch this page only Coger sólo esta página Mirror site Volcar el sitio Mirror domain Volcar todo el dominio Ignore all Ignorar todo Wizard query Pregunta del asistente NO NO File Ficheros Options Opciones Log Auditoría Window Ventanas Help Ayuda Pause transfer Poner en pausa Exit Salir Modify options Modificar las opciones View log Ver fichero de auditoría View error log Ver fichero de error View file transfers Ver las transferencias de ficheros Hide Ocultar About WinHTTrack Website Copier Acerca de... Check program updates... Buscar actualizaciones de WinHTTrack... &Toolbar Barra de herramientas &Status Bar Barra de estado S&plit Dividir File Ficheros Preferences Opciones Mirror Copia del sitio Log Auditoría Window Ventanas Help Ayuda Exit Salir Load default options Cargar opciones por defecto Save default options Guardar opciones por defecto Reset to default options Borrar opciones por defecto Load options... Cargar opciones... Save options as... Guardar opciones como... Language preference... Preferencias de idioma Contents... Indice.. About WinHTTrack... Acerca de WinHTTrack Website Copier New project\tCtrl+N Nuevo proyecto\tCtrl+N &Open...\tCtrl+O &Abrir...\tCtrl+O &Save\tCtrl+S &Guardar\tCtrl+S Save &As... Guardar &como... &Delete... &Borrar... &Browse sites... &Explorer sites... User-defined structure Estructura local de ficheros %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tNombre de fichero sin ext. (ej: image)\r\n%N\tNombre de fichero con extensión (ej: image.gif)\r\n%t\tExtensión (ex: gif)\r\n%p\tRuta [sin / al final] (ej: /someimages)\r\n%h\tNombre del servidor (ej: www.someweb.com)\r\n%M\tURL MD5 (128 bits, 32 ascii bytes)\r\n%Q\tquery string MD5 (128 bits, 32 ascii bytes)\r\n%q\tsmall query string MD5 (16 bits, 4 ascii bytes)\r\n\r\n%s?\tVersión corta DOS (ej: %sN)\r\n Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Ejemplo:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif\r\n Proxy settings Preferencias del proxy Proxy address: Dirección del proxy Proxy port: Puerto del proxy Authentication (only if needed) Identificación (si es necesaria) Login Login Password Pass Enter proxy address here Escriba aquí la dirección del proxy Enter proxy port here Escriba aquí el puerto del proxy Enter proxy login Escriba el nombre del usuario del proxy Enter proxy password Escriba la palabra clave de acceso al proxy Enter project name here Escriba aquí el nombre del proyecto Enter saving path here Escriba aquí la ruta donde será grabado el proyecto Select existing project to update Seleccione aquí un proyecto existente para actualizarlo Click here to select path Haga click aquí para seleccionar la ruta Select or create a new category name, to sort your mirrors in categories Seleccionar o crear un nuevo nombre de categoría, o clasificar los volcados en categorías HTTrack Project Wizard... Asistente para proyectos de HTTrack New project name: Nuevo nombre del proyecto: Existing project name: Nombre de proyecto existente: Project name: Nombre del proyecto: Base path: Ruta base: Project category: Categoría del proyecto: C:\\My Web Sites C:\\Mis lugares Web Type a new project name, \r\nor select existing project to update/resume Escriba el nombre de un nuevo proyecto, \r\no seleccione un proyecto existente para ponerle al día o continuar\r\n\r\n New project Nuevo proyecto Insert URL Insertar dirección URL URL: Dirección URL Authentication (only if needed) Identificación (si es necesaria) Login Login Password Pass Forms or complex links: Formularios o URL complejas: Capture URL... Capturar URL... Enter URL address(es) here Escriba aquí la dirección URL Enter site login Escriba el nombre de usuario del lugar Enter site password Escriba la palabra clave de acceso al lugar Use this capture tool for links that can only be accessed through forms or javascript code Use esta herramienta para capturar enlaves que solamente puedan ser accedidos a través de formularios o enlaces javascript Choose language according to preference Seleccione aquí su idioma Catch URL! ¡Capturar URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Por favor, disponga temporalmente sus preferencias de proxy en el navegador en los siguientes valores (cortar/pegar la dirección y puerto del proxy). Luego, en el navegador, pulse el botón de envío del formulario o en el enlace concreto que quiera capturar. This will send the desired link from your browser to WinHTTrack. Esto capturará el enlace deseado desde su navegador hasta HTTrack. ABORT CANCELAR Copy/Paste the temporary proxy parameters here Copie y pegue aquí las preferencias temporales del proxy Cancel Cancelar Unable to find Help files! ¡Imposible localizar ficheros de ayuda! Unable to save parameters! ¡Imposible guardar los parámetros! Please drag only one folder at a time No deposite más que una carpeta Please drag only folders, not files Deposite sólo una carpeta, no un fichero Please drag folders only Deposite sólo una carpeta Select user-defined structure? ¿Seleccionar estructura definible por el usuario? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Asegúrese de que la cadena de usuario es correcta\n¡Si no lo es, los nombres de ficheros serán erróneos!\r\n\r\n Do you really want to use a user-defined structure? ¿Desea realmente seleccionar la estructura definible por el usuario? Too manu URLs, cannot handle so many links!! Demasiadas URLs. ¡es imposible manejar tantos enlaces! Not enough memory, fatal internal error.. Memoria insuficiente; error interno crítico. Unknown operation! ¡Operación desconocida! Add this URL?\r\n ¿Añadir esta URL?\r\n Warning: main process is still not responding, cannot add URL(s).. Aviso: el proceso principal no responde aún; imposible añadir las URLs. Type/MIME associations Asociaciones de tipo/MIME File types: Tipos de fichero: MIME identity: MIME identity Select or modify your file type(s) here Seleccione o modifique sus tipos de fichero aquí Select or modify your MIME type(s) here Seleccione o modifique sus tipos MIME aquí Go up Ir más arriba Go down Ir más abajo File download information Informaciones sobre los ficheros bajados Freeze Window Congelar la ventana More information: Más informaciones Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download ¡Bienvenido al WinHTTrack Website Copier!\n\nPor favor, pulse el botón AVANZAR para\n\niniciar un nuevo proyecto o volver a un proyecto parcialmente realizado. File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Nombres de fichero con extensión:\nNombres de fichero conteniendo:\nNombre de este fichero:\nNombres de carpeta conteniendo:\nNombre de esta carpeta:\nEnlaces de este domínio:\nEnlaces en domínios conteniendo:\nEnlaces de este servidor:\nEnlaces conteniendo:\nEste enlace:\nTODOS LOS ENLACES Show all\nHide debug\nHide infos\nHide debug and infos Mostrar todo\nOcultar errores\nOcultar informaciones\nOcultar errores e informaciones Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Estructura del sitio (por defecto)\nHtml en la web/, imágenes/otros archivos en la web/imágenes/\nHtml en la web/html, imágenes/otros en la web/imágenes\nHtml en la web/, imágenes/otros en la web/\nHtml en la web/, imágenes/otros en la web/xxx, donde xxx es la extensión del fichero\nHtml en la web/html, imágenes/otros en la web/xxx\nEstructura del sitio, sin www.dominio.xxx/\nHtml en nombre_del_sitio/, imágenes/otros en nombre_del_sitio/imágenes/\nHtml en nombre_del_sitio/html, imágenes/otros en nombre_del_sitio/imágenes\nHtml en nombre_del_sitio/, imágenes/otros en nombre_del_sitio/\nHtml en nombre_del_sitio/, imágenes/otros en nombre_del_sitio/xxx\nHtml en nombre_del_sitio/html, imágenes/otros en nombre_del_sitio/xxx\nTodos los ficheros en la web/, con nombres aleatorios (gadget !)\nTodos los ficheros en nombre_del_sitio/, con nombres aleatorios (gadget !)\nEstructura definida por el usuario.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Solamente analizar\nAlmacenar ficheroos html\nAlmacenar ficheros, no html\nAlmacenar todos los ficheros (por omisión)\nAlmacenar ficheros html primero Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Permanecer en el mismo directorio\nPermite ir hacia abajo (por omisión)\nPermite ir hacia arriba\nPermite ir hacia arriba & hacia abajo Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Permanecer en la misma dirección (por omisión)\nPermanecer en el mismo domínio\nPermanecer en el mismo domínio de nivel superior\nIr a todos los lugares de la Web Never\nIf unknown (except /)\nIf unknown Nunca\nSi es desconocido (excepto /)\nSi es desconocido no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules ninguna regla para robots.txt\nexcepto asistente robots.txt\nseguir reglas robots.txt normal\nextended\ndebug normal\nextendido\ncorregir Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Copiar sitio(s) de la Web\nCopiar sitio(s) interactivos de la Web (preguntas)\nRecibir ficheros específicos\nCopiar todas las páginas del sitio (copia múltiple)\nComprobar enlaces en las páginas (probar marcadores)\n* Continuar proyecto interrumpido\n* Actualizar proyecto existente Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL URI relativa / URL absoluta (por omisión)\nURL Absoluta / URL absoluta\nURI absoluta / URL absoluta\nURL original / URL original Open Source offline browser Navegador offline Open Source Website Copier/Offline Browser. Copy remote websites to your computer. Free. Copiador de sitios Web/Browser Offline. Copia sitios web remotos en el ordenador. Gratuito. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser URL list (.txt) Lista de URLs (.txt) Previous Anterior Next Siguiente URLs URLs Warning Aviso Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Su navegador no soporta javascript. Obtendrá mejores resultados si usa un navegador que admita javascript. Thank you Gracias You can now close this window Ya puede cerrar esta ventana Server terminated Servidor desconectado A fatal error has occurred during this mirror Ha ocurrido un error fatal durante esta copia Proxy type: Tipo de proxy: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Protocolo del proxy. HTTP: proxy estándar. HTTP (túnel CONNECT): envía cada petición a través de un túnel CONNECT, para proxys que solo admiten CONNECT como el HTTPTunnelPort de Tor. SOCKS5: puerto predeterminado 1080. Load cookies from file: Cargar cookies desde un archivo: Preload cookies from a Netscape cookies.txt file before crawling. Precargar cookies desde un archivo Netscape cookies.txt antes de comenzar la descarga. Pause between files: Pausa entre archivos: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Retardo aleatorio entre descargas de archivos, en segundos. Use MIN:MAX para un rango aleatorio (p. ej. 2:8). Keep the www. prefix (do not merge www.host with host) Mantener el prefijo www. (no combinar www.host con host) Do not treat www.host and host as the same site. No tratar www.host y host como el mismo sitio. Keep double slashes in URLs Mantener las barras dobles en las URL Do not collapse duplicate slashes in URLs. No colapsar las barras duplicadas en las URL. Keep the original query-string order Mantener el orden original de la query string Do not reorder query-string parameters when deduplicating URLs. No reordenar los parámetros de la query string al deduplicar las URL. Strip query keys: Eliminar claves de query string: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Claves de query string, separadas por comas, que se eliminarán del nombre de los archivos guardados (p. ej. sid,utm_source). Write a WARC archive of the crawl Escribir un archivo WARC del rastreo Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Guardar también cada respuesta descargada en un archivo WARC/1.1 ISO-28500, junto a la réplica. WARC archive name: Nombre del archivo WARC: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Nombre base opcional para el archivo WARC; déjelo en blanco para nombrarlo automáticamente en el directorio de salida. httrack-3.49.14/lang/Bulgarian.txt0000644000175000017500000011436115230602340012404 LANGUAGE_NAME Bulgarian LANGUAGE_FILE Bulgarian LANGUAGE_ISO bg LANGUAGE_AUTHOR Èëèÿ Ëèíäîâ [ilia@infomat-bg.com]\r\n LANGUAGE_CHARSET windows-1251 LANGUAGE_WINDOWSID Bulgarian OK Äà Cancel Îòêàç Exit Èçõîä Close Çàòâîðè Cancel changes Îòêàæè ïðîìåíèòå Click to confirm Ïîòâúðäè Click to get help! Çà ïîìîù Click to return to previous screen Âðúùàíå êúì ïðåäõîäíèÿ ïðîçîðåö Click to go to next screen Êúì ñëåäâàùèÿ ïðîçîðåö Hide password Ñêðèé ïàðîëàòà Save project Çàïàçè ïðîåêòà Close current project? Çàòâîðè òåêóùèÿ ïðîçîðåö? Delete this project? Èçòðèé ïðîåêòà? Delete empty project %s? Èçòðèé ïðàçíèÿ ïðîåêò %s? Action not yet implemented Äåéñòâèåòî å íåèçïúëíèìî Error deleting this project Ãðåøêà ïðè èçòðèâàíåòî íà ïðîåêòà Select a rule for the filter Èçáåðè ïðàâèëî çà òúðñåíå Enter keywords for the filter Âúâåäè êëþ÷îâè äóìè çà òúðñåíå Cancel Îòêàç Add this rule Äîáàâè òîâà ïðàâèëî Please enter one or several keyword(s) for the rule Ìîëÿ âúâåäåòå åäíà èëè íÿêîëêî êëþ÷îâè äóìè çà ïðàâèëîòî Add Scan Rule Äîáàâè ïðàâèëî ïðè ñêàíèðàíåòî Criterion Êðèòåðèé String Íèç Add Äîáàâè Scan Rules Ïðàâèëà çà ñêàíèðàíå Use wildcards to exclude or include URLs or links.\nYou can put several scan strings on the same line.\nUse spaces as separators.\n\nExample: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Èçïîëçâàéòå ñïåö. ñèìâîëè çà äà âêëþ÷èòå èëè èçêëþ÷èòå URL àäðåñè èëè ïðåïðàòêè.\nÌîæå äà èçïîëçâàòå íÿêîëêî íèçà çà ñêàíèðàíå íà åäèí ðåä,\nêàòî èçïîëçâàòå èíòåðâàëè çà ðàçäåëèòåëè\n\nÍàïðèìåð: +*.zip -www.*.com -www.*.edu/cgi-bin/*.cgi Exclude links Èçêëþ÷è ïðåïðàòêèòå Include link(s) Äîáàâè ïðåïðàòêèòå Tip: To have ALL GIF files included, use something like +www.someweb.com/*.gif. \n(+*.gif / -*.gif will include/exclude ALL GIFs from ALL sites) Ñúâåò: Çà äà äîáàâèòå âñè÷êè .GIF ôàéëîâå, èçïîëçâàéòå íàïðèìåð +www.someweb.com/*.gif. \n(+*.gif / -*.gif, êîåòî ùå âêëþ÷è/èçêëþ÷è ÂÑÈ×ÊÈ .GIF ôàéëîâå îò ÂÑÈ×ÊÈ ñàéòîâå Save prefs Çàïàçè ïðåäïî÷èòàíèÿòà Matching links will be excluded: Ñúâïàäàùèòå ïðåïðàòêè ùå áúäàò èçêëþ÷åíè Matching links will be included: Ñúâïàäàùèòå ïðåïðàòêè ùå áúäàò âêëþ÷åíè Example: Ïðèìåð: gif\r\nWill match all GIF files gif\r\nÙå ñúâïàäíàò âñè÷êè .GIF ôàéëîâå blue\r\nWill find all files with a matching 'blue' sub-string such as 'bluesky-small.jpeg' blue\r\nÙå íàìåðè âñè÷êè ôàéëîâå ñúñ ñúâïàäàù 'blue' ïîäíèç êàòî 'bluesky-small.jpeg' bigfile.mov\r\nWill match the file 'bigfile.mov', but not 'bigfile2.mov' bigfile.mov\r\nÙå ñúâïàäíå ñ ôàéë 'bigfile.mov', íî íå è ñ 'bigfile2.mov' cgi\r\nWill find links with folder name matching sub-string 'cgi' such as /cgi-bin/somecgi.cgi cgi\r\nÙå íàìåðè ïðåïðàòêè êúì äèðåêòîðèè ñúñ ñúâïàäàù ïîäíèç 'cgi' êàòî /cgi-bin/somecgi.cgi cgi-bin\r\nWill find links with folder name matching whole 'cgi-bin' string (but not cgi-bin-2, for example) cgi-bin\r\nÙå íàìåðè ïðåïðàòêè êúì äèðåêòîðèè ñúâïàäàùè ñ öåëèÿ íèç 'cgi-bin', íî íå è ñ cgi-bin-2, íàïðèìåð someweb.com\r\nWill find links with matching sub-string such as www.someweb.com, private.someweb.com etc. someweb.com\r\nÙå íàìåðè ïðåïðàòêè ñúñ ñúâïàäàù ïîäíèç êàòî www.someweb.com, private.someweb.com è ò.í. someweb\r\nWill find links with matching folder sub-string such as www.someweb.com, www.someweb.edu, private.someweb.otherweb.com etc. someweb.com\r\nÙå íàìåðè ïðåïðàòêè êúì äèðåêòîðèè ñúñ ñúâïàäàù ïîäíèç êàòî www.someweb.com, www.someweb.edu, private.someweb.otherweb.com è ò.í. www.someweb.com\r\nWill find links matching whole 'www.someweb.com' sub-string (but not links such as private.someweb.com/..) www.someweb.com\r\nÙå íàìåðè ïðåïðàòêè ñúâïàäàùè ñ öåëèÿ ïîäíèç 'www.someweb.com', íî íå è ñ ïðåïðàòêè êàòî private.someweb.com/ someweb\r\nWill find any links with matching sub-string such as www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html etc. someweb\r\nÙå íàìåðè âñÿêàêâè ïðåïðàòêè ñúâïàäàùè ñ ïîäíèç êàòî www.someweb.com/.., www.test.abc/fromsomeweb/index.html, www.test.abc/test/someweb.html è ò.í. www.test.com/test/someweb.html\r\nWill only find the 'www.test.com/test/someweb.html' file. Note that you have to type the complete path (URL + site path) www.test.com/test/someweb.html\r\nÙå íàìåðè ñàìî ôàéëà 'www.test.com/test/someweb.html'. Îòáåëåæåòå, ÷å òðÿáâà äà íàïèøåòå ïúëíèÿ ïúò (URL + ïúòÿ â ñàìèÿ ñàéò) All links will match Âñè÷êè ïðåïðàòêè ùå ñúâïàäíàò Add exclusion filter Äîáàâè èçêëþ÷âàù ôèëòúð Add inclusion filter Äîáàâè âêëþ÷âàù ôèëòúð Existing filters Ñúùåñòâóâàùè ôèëòðè Cancel changes Îòêàæè ïðîìåíèòå Save current preferences as default values Çàïàçè òåêóùèòå ïðåäïî÷èòàíèÿ êàòî îñíîâíè Click to confirm Êëèêíè çà ïîòâúðæäåíèå No log files in %s!  %s íå ñà íàìåðåíè log ôàéëîâå! No 'index.html' file in %s!  %s íå ñúùåñòâóâà ôàéë 'index.html'! Click to quit WinHTTrack Website Copier Êëèêíè çà èçõîä îò WinHTTrack Website Copier View log files Ïðåãëåäàé log-ôàéëîâåòå Browse HTML start page Ïðåãëåäàé ñòàðòîâàòà HTML ñòðàíèöà End of mirror Ñúçäàâàíåòî íà îãëåäàëíèÿ ñàéò ïðèêëþ÷è View log files Ïðåãëåäàé log-ôàéëîâåòå Browse Mirrored Website Ðàçãëåäàé îãë. ñàéò New project... Íîâ ïðîåêò... View error and warning reports Ïðåãëåäàé îò÷åòèòå çà ãðåøêèòå è ïðåäóïðåæäåíèÿòà View report Ïðåãëåäàé îò÷åòà Close the log file window Çàòâîðè ïðîçîðåöà íà log-ôàéëà Info type: Òèï íà èíôîðìàöèÿòà: Errors Ãðåøêè Infos Èíôîðìàöèÿ Find Íàìåðè Find a word Íàìåðè äóìà Info log file Èíôîðìàöèÿ çà log-ôàéëà Warning/Errors log file Ôàéë çà ïðåäóïð. è ãðåøêè Unable to initialize the OLE system Íå ìîæå äà áúäå èíèöèàëèçèðàíà OLE ñèñòåìàòà WinHTTrack could not find any interrupted download file cache in the specified folder! WinHTTrack íå íàìèðà íèêàêâè êåø-ôàéëîâå íà ïðåêúñíàòî ñâàëÿíå â çàäàäåíàòà äèðåêòîðèÿ! Could not connect to provider Íå ìîæå äà ñå ñâúðæå ñ äîñòàâ÷èêà receive ïîëó÷àâà request çàÿâÿâà connect âðúçêà search òúðñè ready ãîòîâ error ãðåøêà Receiving files.. Ïîëó÷àâà ôàéëîâå... Parsing HTML file.. Ïðàâè ðàçáîð íà HTML ôàéë... Purging files.. Ïðî÷èñòâà ôàéëîâå... Loading cache in progress.. Çàðåæäàíåòî íà êåøà íàïðåäâà... Parsing HTML file (testing links).. Ïðàâè ðàçáîð íà HTML ôàéë (òåñòâà ïðåïðàòêè)... Pause - Toggle [Mirror]/[Pause download] to resume operation Ïàóçà - Èçáåðåòå [Îãëåäàëî]/[Ïàóçà íà ñâàëÿíåòî] çà äà ïðîäúëæèòå Finishing pending transfers - Select [Cancel] to stop now! Äîâúðøâàíå íà çàïî÷íàòèòå òðàíñôåðè - Èçáåðåòå [Îòêàç] çà äà ñïðåòå ñåãà! scanning ñêàíèðà Waiting for scheduled time.. Î÷àêâà çàäàäåíîòî âðåìå çà íà÷àëî... Connecting to provider Ñâúðçâàíå êúì äîñòàâ÷èêà [%d seconds] to go before start of operation [%d ñåêóíäè] äî ñòàðòà íà îïåðàöèÿòà Site mirroring in progress [%s, %s bytes] Ïðîãðåñ íà ñúçäàâàíåòî íà îãëåäàëíèÿ ñàéò [%s, %s áàéòà] Site mirroring finished! Ñúäàâàíåòî íà îãëåäàëíèÿ ñàéò çàâúðøè! A problem occurred during the mirroring operation\n Âúçíèêíà ïðîáëåì ïî âðåìå íà ñúçäàâàíåòî íà îãëåäàëíèÿ ñàéò\n \nDuring:\n \nÏî âðåìå íà:\n \nSee the log file if necessary.\n\nClick FINISH to quit WinHTTrack Website Copier.\n\nThanks for using WinHTTrack! \nÂèæ log-ôàéëà àêî å íåîáõîäèìî.\n\nÊëèêíè ÊÐÀÉ çà èçõîä îò WinHTTrack Website Copier.\n\nÁëàãîäàðèì, Âè, ÷å èçïîëçâàòå WinHTTrack! Mirroring operation complete.\nClick Exit to quit WinHTTrack.\nSee log file(s) if necessary to ensure that everything is OK.\n\nThanks for using WinHTTrack! Ñúçäàâàíåòî íà îãëåäàëíèÿ ñàéò çàâúðøè!\nÊëèêíè Èçõîä çà çàòâàðÿíå íà WinHTTrack.\nÂèæòå log-ôàéëîâåòå äà ñà ñå óâåðèòå, ÷å âñè÷êî å íàðåä.\n\nÁëàãîäàðèì, Âè, ÷å èçïîëçâàòå WinHTTrack! * * MIRROR ABORTED! * *\r\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\r\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\r\n[Note: This can easily be done here by erasing the hts-cache/new.* files]\r\n\r\nDo you think the former cache might contain more complete information, and do you want to restore it? * * ÊÎÏÈÐÀÍÅÒÎ ÏÐÅÊÚÑÍÀÒÎ! * *\r\nÒåêóùèÿò âðåìåíåí êåø å íåîáõîäèì çà âñÿêàêâè îáíîâëåíèÿ è ñúäúðæà ñàìî äàííè ñâàëåíè ïî âðåìå íà òàçè ïðåêúñíàòà ñåñèÿ.\r\nÂúçìîæíî å ïðåäøåñòâàùèÿò êåø äà ñúäúðæà ïî-ïúëíà èíôîðìàöèÿ; àêî íå æåëàåòå çà çàãóáèòå òàçè èíôîðìàöèÿ, òðÿáâà äà ÿ âúçñòàíîâèòå è èçòðèåòå òåêóùèÿ êåø.\r\n[Çàáåëåæêà: Òîâà ìîæå äà áúäå ïîñòèãíàòî ëåñíî ÷ðåç èçòðèâàíå íà hts-cache/new.* ôàéëîâåòå]\r\n\r\nÏðåäïîëàãàòå ëè, ÷å ïðåäøåñòâàùèÿ êåø ñúäúðæà ïî ïúëíà èíôîðìàöèÿ è æåëàåòå ëè äà ÿ âúçñòàíîâèòå? * * MIRROR ERROR! * *\r\nHTTrack has detected that the current mirror is empty. If it was an update, the previous mirror has been restored.\r\nReason: the first page(s) either could not be found, or a connection problem occurred.\r\n=> Ensure that the website still exists, and/or check your proxy settings! <= * * ÃÐÅØÊÀ ÏÐÈ ÊÎÏÈÐÀÍÅÒÎ! * *\r\nÒåêóùèÿò ñàéò å ïðàçåí.Àêî äåéñòâèåòî å áèëî îáíîâëåíèå, òî ïðåäõîäíîòî îãëåäàëíî êîïèå å âúçñòàíîâåíî.\r\nÏðè÷èíà: ïúðâàòà ñòðàíèöà(è) èëè íå áå îòêðèòà, èëè å âúçíèêíàë ïðîáëåì ñ âðúçêàòà.\r\n=>Óâåðåòå ñå, ÷å òîçè ñàéò âñå îùå ñúùåñòâóâà è/èëè ïðîâåðåòå Âàøèòå proxy íàñòðîéêè! <= \n\nTip: Click [View log file] to see warning or error messages \n\nÑúâåò: Êëèêíè [Âèæ log-ôàéë] çà ïðåäóïðåäèòåëíèòå ñúîáùåíèÿ èëè ñúîáùåíèÿòà çà ãðåøêè Error deleting a hts-cache/new.* file, please do it manually Ãðåøêà ïðè èçòðèâàíå íà hts-cache/new.* ôàéë, ìîëÿ íàïðàâåòå ãî ðú÷íî Do you really want to quit WinHTTrack Website Copier? Ñèãóðíè ëè ñòå, ÷å æåëàåòå èçõîä îò WinHTTrack Website Copier? - Mirroring Mode -\n\nEnter address(es) in URL box - Ðåæèì: Ñúçäàâàíå íà îãëåäàëåí ñàéò -\n\nÂúâåäåòå àäðåñèòå â URL êóòèÿòà - Interactive Wizard Mode (questions) -\n\nEnter address(es) in URL box - Ðåæèì: Èíòåðàêòèâåí Ïîìîùíèê (âúïðîñè) -\n\nÂúâåäåòå àäðåñèòå â URL êóòèÿòà - File Download Mode -\n\nEnter file address(es) in URL box - Ðåæèì: Ñâàëÿíå íà ôàéë -\n\nÂúâåäåòå àäðåñèòå íà ôàéëîâåòå â URL êóòèÿòà - Link Testing Mode -\n\nEnter Web address(es) with links to test in URL box - Ðåæèì: Òåñòâàíå íà ïðåïðàòêèòå -\n\nÂúâåäåòå àäðåñèòå ñ ëèíêîâå çà òåñòâàíå â URL êóòèÿòà - Update Mode -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ðåæèì: Îáíîâÿâàíå -\n\nÏðîâåðåòå àäðåñèòå â URL êóòèÿòà è îñòàíàëèòå ïàðàìåòðè, àêî å íåîáõîäèìî, è êëèêíåòå âúðõó áóòîíà 'ÍÀÏÐÅÄ' - Resume Mode (Interrupted Operation) -\n\nVerify address(es) in URL box, check parameters if necessary then click on 'NEXT' button - Ðåæèì: Ïðîäúëæåíèå (Ïðåêúñíàòà îïåðàöèÿ) -\n\nÏðîâåðåòå àäðåñèòå â URL êóòèÿòà è îñòàíàëèòå ïàðàìåòðè, àêî å íåîáõîäèìî, è êëèêíåòå âúðõó áóòîíà 'ÍÀÏÐÅÄ' Log files Path Ïúò êúì log-ôàéëîâåòå Path Ïúò - Links List Mode -\n\nUse URL box to enter address(es) of page(s) containing links to mirror - Ðåæèì: Òåñòâàíå íà ïðåïðàòêèòå -\n\nÈçïîëçâàéòå URL êóòèÿòà çà äà âúâåäåòå àäðåñè íà ñòðàíèöè ñúäúðæàùè ïðåïðàòêè çà ñúçäàâàíå íà îãëåäàëíî êîïèå New project / Import? Íîâ ïðîåêò / Èìïîðò Choose criterion Èçáåðè êðèòåðèé Maximum link scanning depth Ìàêñèìàëíà äúëáî÷èíà çà ñêàíèðàíå íà ïðåïðàòêèòå Enter address(es) here Âúâåäåòå àäðåñèòå òóê Define additional filtering rules Îïðåäåëè äîïúëíèòåëíè ïðàâèëà çà ôèëòðèðàíå Proxy Name (if needed) Èìå íà Proxy (àêî å íåîáõîäèìî) Proxy Port Ïîðò íà Proxy Define proxy settings Îïðåäåëè íàñòðîéêè çà proxy Use standard HTTP proxy as FTP proxy Èçïîëçâàé ñòàíäàðòíîòî HTTP proxy çà FTP proxy Path Ïúò Select Path Èçáåðè ïúò Path Ïúò Select Path Èçáåðè ïúò Quit WinHTTrack Website Copier Èçõîä îò WinHTTrack Website Copier About WinHTTrack Çà WinHTTrack Save current preferences as default values Çàïàçè òåêóùèòå ïðåäïî÷èòàíèÿ êàòî îñíîâíè Click to continue Êëèêíè çà ïðîäúëæåíèå Click to define options Êëèêíè çà äåôèíèðàíå íà îïöèèòå Click to add a URL Êëèêíè çà äîáàâÿíå íà URL Load URL(s) from text file Çàðåäè URL ñïèñúê îò òåêñòîâ ôàéë WinHTTrack preferences (*.opt)|*.opt|| WinHTTrack ïðåäïî÷èòàíèÿ (*.opt)|*.opt|| Address List text file (*.txt)|*.txt|| Òåêñòîâ ôàéë ñ àäðåñè (*.txt)|*.txt|| File not found! Ôàéëúò íå å íàìåðåí! Do you really want to change the project name/path? Ñèãóðíè ëè ñòå, ÷å æåëàåòå äà ïðîìåíèòå èìåòî/ïúòÿ íà ïðîåêòà? Load user-default options? Çàðåäè îñíîâíèòå çà ïîòðåáèòåëÿ îïöèè? Save user-default options? Ñúõðàíè îñíîâíèòå çà ïîòðåáèòåëÿ îïöèè? Reset all default options? Âúðíè âñè÷êè îñíîâíè îïöèè? Welcome to WinHTTrack! Äîáðå äîøëè âúâ WinHTTrack! Action: Äåéñòâèå: Max Depth Ìàêñèìàëíà äúëáî÷èíà: Maximum external depth: Ìàêñ. äúëáî÷èíà çà âúíøíè ñàéòîâå: Filters (refuse/accept links) : Ôèëòðè (îòêàæè/ïðèåìè ïðåïðàòêè) : Paths Ïúòèùà Save prefs Ñúõðàíè ïðåäïî÷èòàíèÿòà Define.. Îïðåäåëè... Set options.. Íàñòðîé îïöèè... Preferences and mirror options: Ïðåäïî÷èòàíèÿ è îïöèè çà îãë. êîïèå... Project name Èìå íà ïðîåêòà Add a URL... Äîáàâè URL... Web Addresses: (URL) Àäðåñè: (URL) Stop WinHTTrack? Ñïðè WinHTTrack? No log files in %s!  %s íÿìà log-ôàéëîâå! Pause Download? Ïàóçà íà ñâàëÿíåòî? Stop the mirroring operation Ñïðè îïåðàöèÿòà çà ñúçäàâàíå íà îãëåäàëåí ñàéò? Minimize to System Tray Ìèíèìèçèðàé â System Tray Click to skip a link or stop parsing Êëèêíè çà ïðîïóñêàíå íà ïðåïðàòêà èëè çà ñïðèðàíå íà ðàçáîðà Click to skip a link Êëèêíè çà ïðîïóñêàíå íà ïðåïðàòêà Bytes saved Çàïèñàíè áàéòîâå: Links scanned Ñêàíèðàíè ïðåïðàòêè Time: Âðåìå: Connections: Âðúçêè: Running: Àêòèâíè: Hide Ñêðèé Transfer rate Ñêîðîñò íà òðàíñôåð: SKIP ÏÐÎÏÓÑÍÈ Information Èíôîðìàöèÿ Files written: Çàïèñàíè ôàéëîâå: Files updated: Îáíîâåíè ôàéëîâå: Errors: Ãðåøêè: In progress:  èçïúëíåíèå: Follow external links Ñëåäâàé ïðåïðàòêèòå êúì âúíøíè ñàéòîâå Test all links in pages Òåñòâàé âñè÷êè ïðåïðàòêè â ñòðàíèöèòå Try to ferret out all links Îïèòàé äà îòêðèåø âñè÷êè ïðåïðàòêè Download HTML files first (faster) Ñâàëè ïúðâî HTML ôàéëîâåòå (ïî-áúðçî) Choose local site structure Èçáåðè ñòðóêòóðàòà íà ëîêàëíèÿ ñàéò Set user-defined structure on disk Îïðåäåëè äåôèíèðàíà îò ïîòðåáèòåëÿ ñòðóêòóðà íà äèñêà Use a cache for updates and retries Èçïîëçâàé êåø çà îáíîâëåíèÿòà è ïîâòîðíèòå îïèòè Do not update zero size or user-erased files Íå îáíîâÿâàé íóëåâèÿ ðàçìåð íà ôàéëîâå èçòðèòè îò ïîòðåáèòåëÿ Create a Start Page Ñúçäàé ñòàðòîâà ñòðàíèöà Create a word database of all html pages Ñúçäàé áàçà äàííè ñ äóìèòå îò âñè÷êè html ñòðàíèöè Create error logging and report files Ñúçäàé ôàéëîâå çà îò÷åòè è çàïèñ íà ãðåøêèòå Generate DOS 8-3 filenames ONLY Ñúçäàâàé èìåíàòà íà ôàéëîâåòå ÑÀÌÎ â DOS ôîðìàò (8-3) Generate ISO9660 filenames ONLY for CDROM medias Ñúçäàâàé èìåíàòà íà ôàéëîâåòå ÑÀÌÎ â ISO9660 ôîðìàò çà CDROM íîñèòåëè Do not create HTML error pages Íå ñúçäàâàé HTML ñòðàíèöè-ãðåøêè Select file types to be saved to disk Èçáåðè òèïîâåòå ôàéëîâå, êîèòî äà áúäàò çàïèñàíè íà äèñêà Select parsing direction Èçáåðåòå ïîñîêà çà èçïúëíåíèå íà ðàçáîðà Select global parsing direction Èçáåðåòå ãëîáàëíà ïîñîêà çà èçïúëíåíèå íà ðàçáîðà Setup URL rewriting rules for internal links (downloaded ones) and external links (not downloaded ones) Íàñòðîé ïðàâèëàòà çà ïðåçàïèñâàíå íà URL çà âúòðåøíèòå ïðåïðàòêè (âå÷å ñâàëåíè) è âúíøíèòå ïðåïðàòêè (êîèòî íå ñà ñâàëåíè) Max simultaneous connections Ìàêñèìàëåí áðîé åäíîâðåìåííè âðúçêè File timeout Ìàêñèìàëíî âðåìå çà èç÷àêâàíå íà ôàéë Cancel all links from host if timeout occurs Îòêàæè âñè÷êè ïðåïðàòêè îò äàäåí õîñò àêî ìàêñ. âðåìå çà èç÷àêâàíå èçòå÷å Minimum admissible transfer rate Ìèíèìàëíî ïðèåìëèâà ñêîðîñò íà òðàíñôåð Cancel all links from host if too slow Îòêàæè âñè÷êè ïðåïðàòêè îò äàäåí õîñò àêî ñêîðîñòòà íà òðàíñôåð å ïðåêàëåíî íèñêà Maximum number of retries on non-fatal errors Ìàêñèìàëåí áðîé ïîâòîðíè îïèòè ïðè íå-ôàòàëíè ãðåøêè Maximum size for any single HTML file Ìàêñèìàëåí ðàçìåð íà âñåêè åäèí HTML ôàéë Maximum size for any single non-HTML file Ìàêñèìàëåí ðàçìåð íà âñåêè åäèí íå-HTML ôàéë Maximum amount of bytes to retrieve from the Web Ìàêñèìàëíî êîëè÷åñòâî áàéòîâå, êîèòî äà áúäàò ñâàëåíè îò ñàéòà Make a pause after downloading this amount of bytes Íàïðàâè ïàóçà ñëåä ñâàëÿíå íà òîâà êîëè÷åñòâî áàéòîâå Maximum duration time for the mirroring operation Ìàêñèìàëíî âðåìåòðàåíå íà êîïèðàíå íà îãëåäàëíèÿ ñàéò Maximum transfer rate Ìàêñèìàëíà ñêîðîñò íà òðàíñôåð Maximum connections/seconds (avoid server overload) Ìàêñèìàëåí áðîé âðúçêè/ñåêóíäè (ïðåäîòâðàòÿâàíå ïðåòîâàðâàíå íà ñúðâúðà) Maximum number of links that can be tested (not saved!) Ìàêñèìàëåí áðîé ïðåïðàòêè, êîèòî ìîãàò äà áúäàò òåñòâàíè (íå çàïèñàíè!) Browser identity Èäåíòèôèêàöèÿ íà áðàóçúðà Comment to be placed in each HTML file Äà áúäå ïîñòàâåí êîìåíòàð âúâ âñåêè HTML ôàéë Back to starting page Íàçàä êúì ñòàðòîâàòà ñòðàíèöà Save current preferences as default values Çàïàçè òåêóùèòå ïðåäïî÷èòàíèÿ êàòî îñíîâíè Click to continue Êëèêíè çà ïðîäúëæåíèå Click to cancel changes Êëèêíè çà îòêàç îò ïðîìåíèòå Follow local robots rules on sites Ñëåäâàé ëîêàëíèòå ïðàâèëà çà ðîáîòè â ñàéòîâåòå Links to non-localised external pages will produce error pages Ïðåïðàòêè êúì íåëîêàëèçèðàíè âúíøíè ñòðàíèöè ùå ñúäàäàò ñòðàíèöè-ãðåøêè Do not erase obsolete files after update Íå èçòðèâàé ñòàðèòå ôàéëîâå ñëåä îáíîâëåíèå Accept cookies? Ïðèåìàé 'áèñêâèòêè'? Check document type when unknown? Ïðîâåðè òèïà íà äîêóìåíòà, êîãàòî å íåèçâåñòåí? Parse java applets to retrieve included files that must be downloaded? Ïðàâè ðàçáîð íà Java àïëåòè çà îòêðèâàíå íà ôàéëîâå, êîèòî òðÿáâà äà áúäàò ñâàëåíè? Store all files in cache instead of HTML only Çàïàçè âñè÷êè ôàéëîâå â êåøà, âìåñòî ñàìî â HTML ôàéëîâå Log file type (if generated) Òèï íà log-ôàéëà (àêî å ãåíåðèðàí) Maximum mirroring depth from root address Ìàêñèìàëíî äúëáî÷èííî íèâî íà ñêàíèðàíå îò îñíîâíèÿ àäðåñ Maximum mirroring depth for external/forbidden addresses (0, that is, none, is the default) Ìàêñèìàëíî äúëáî÷èííî íèâî íà ñêàíèðàíå çà âúíøíè/çàáðàíåíè àäðåñè (0 - íåîãðàíè÷åíî, îñíîâíî ïî ïîäðàçáèðàíå) Create a debugging file Ñúçäàé debug-ôàéë Use non-standard requests to get round some server bugs Èçïîëçâàé íåñòàíäàðòíè çàÿâêè, çà äà ñå èçáåãíàò íÿêîè ñúðâúðíè ïðîáëåìè Use old HTTP/1.0 requests (limits engine power!) Èçïîëçâàé ñòàðè HTTP/1.0 çàÿâêè (îãðàíè÷àâà âúçìîæíîñòèòå íà ïðîãðàìàòà) Attempt to limit retransfers through several tricks (file size test..) Îïèò äà ñå îãðàíè÷è ðå-òðàíñôåðèðàíå ÷ðåç íÿêîëêî òðèêà (òåñò íà ãîëåìèíàòà íà ôàéëà..) Attempt to limit the number of links by skipping similar URLs (www.foo.com==foo.com, http=https ..) Write external links without login/password Çàïèñâàé âúíøíèòå ïðåïðàòêè áåç èìå/ïàðîëà Write internal links without query string Çàïèñâàé âúòðåøíèòå ïðåïðàòêè áåç âúïðîñèòåëåí çíàê Get non-HTML files related to a link, eg external .ZIP or pictures Âçåìè íå-HTML ôàéëîâå îòíàñÿùè ñå äî ïðåïðàòêà, íàïð. âúíøíè .ZIP èëè êàðòèíêè Test all links (even forbidden ones) Òåñòâàé âñè÷êè ïðåïðàòêè (äîðè è çàáðàíåíèòå) Try to catch all URLs (even in unknown tags/code) Îïèòàé äà çàñå÷åø âñè÷êè URL àäðåñè (äîðè ïðè íåéçâåñòíè òàãîâå/êîä) Get HTML files first! Âçåìè ïúðâî HTML ôàéëîâåòå! Structure type (how links are saved) Òèï íà ñòðóêòóðàòà (êàê ñå çàïèñâàò ïðåïðàòêèòå) Use a cache for updates Èçïîëçâàé êåø çà îáíîâÿâàíå Do not re-download locally erased files Íå ñâàëÿé ïîâòîðíî ëîêàëíî èçòðèòèòå ôàéëîâå Make an index Ñúçäàé èíäåêñ Make a word database Ñúçäàé áàçà äàííè ñ äóìè Log files Log ôàéëîâå DOS names (8+3) DOS èìåíà (8+3) ISO9660 names (CDROM) ISO9660 èìåíà (CDROM) No error pages Áåç ñòðàíèöè ãðåøêè Primary Scan Rule Ïúðâè÷íî ïðàâèëî ïðè ñêàíèðàíå Travel mode Ìåòîä íà ñêàíèðàíå Global travel mode Ãëîáàëåí ìåòîä íà ñêàíèðàíå These options should be modified only exceptionally Îáè÷àéíî, òåçè îïöèè íå òðÿáâà äà ñå ïðîìåíÿò Activate Debugging Mode (winhttrack.log) Ðåæèì Òðàñèðàíå çà ãðåøêè (winhttrack.log) Rewrite links: internal / external Ïðåçàïèøè ïðåïðàòêèòå: (âúòðåøíè/âúíøíè) Flow control Êîíòðîë íà ïîòîêà Limits Îãðàíè÷åíèÿ Identity Èäåíòè÷íîñò HTML footer HTML êðàé (footer) N# connections Áðîé âðúçêè Abandon host if error Èçîñòàâè õîñòà ïðè ãðåøêà Minimum transfer rate (B/s) Ìèí. ñêîðîñò íà òðàíñôåð (Á/ñåê.) Abandon host if too slow Èçîñòàâè õîñòà àêî å ïðåêàëåíî áàâåí Configure Íàñòðîé Use proxy for ftp transfers Èçïîëçâàé ïðîêñè çà FTP òðàíñôåðè TimeOut(s) Ïðåêúñâàíå(íèÿ) Persistent connections (Keep-Alive) Ïîñòîÿííè âðúçêè (Keep-Alive) Reduce connection time and type lookup time using persistent connections Íàìàëè âðåìåòðàåíåòî íà âðúçêàòà è âðåìåòî çà îïðåäåëÿíå íà òèïà ÷ðåç ïðîñòîÿííè âðúçêè Retries Ïîâòîðíè îïèòè Size limit Îãðàíè÷åíèå íà ðàçìåðà Max size of any HTML file (B) Ìàêñ. ðàçìåð íà HTML ôàéë (Á) Max size of any non-HTML file Ìàêñ. ðàçìåð íà íå-HTML ôàéë (Á) Max site size Ìàêñèìàëåí ðàçìåð íà ñàéòà Max time Ìàêñèìàëíî âðåìåòðàåíå Save prefs Çàïàçè ïðåäïî÷èòàíèÿòà Max transfer rate Ìàêñèìàëíà ñêîðîñò íà òðàíñôåð Follow robots.txt Ñëåäâàé robots.txt No external pages Áåç âúíøíè ñòðàíèöè Do not purge old files Íå ïðåìàõâàé ñòàðèòå ôàéëîâå Accept cookies Ïðèåìàé 'áèñêâèòêè' Check document type Ïðîâåðè òèïà íà äîêóìåíòà Parse java files Ïðàâè ðàçáîð íà Java ôàéëîâå Store ALL files in cache Çàïàçè ÂÑÈ×ÊÈ ôàéëîâå â êåøà Tolerant requests (for servers) Òîëåðàíòíè çàÿâêè (êúì ñúðâúðèòå) Update hack (limit re-transfers) Update hack (îãðàíè÷è ïîâòîðíèòå òðàíñôåðè) URL hacks (join similar URLs) Force old HTTP/1.0 requests (no 1.1) Èçïîëçâàé ñòàðè HTTP/1.0 çàÿâêè (íå 1.1) Max connections / seconds Ìàêñèìàëåí áðîé âðúçêè/ñåêóíäè Maximum number of links Ìàêñèìàëåí áðîé ïðåïðàòêè Pause after downloading.. Ïàóçà ñëåä ñâàëÿíå.. Hide passwords Ñêðèâàé ïàðîëèòå Hide query strings Ñêðèâàé âúïðîñèòåëíèòå íèçîâå Links Ïðåïðàòêè Build Ñòðóêòóðà Experts Only Ñàìî çà åêñïåðòè Flow Control Êîíòðîë íà ïîòîêà Limits Îãðàíè÷åíèÿ Browser ID Èäåíòèôèêàöèÿ íà áðàóçúðà Scan Rules Ïðàâèëà çà ñêàíèðàíå Spider Ïàÿê Log, Index, Cache Log, Èíäåêñ, Êåø Proxy Ïðîêñè MIME Types MIME òèïîâå Do you really want to quit WinHTTrack Website Copier? Ñèãóðíè ëè ñòå, ÷å æåëàåòå èçõîä îò WinHTTrack Website Copier? Do not connect to a provider (already connected) Íå ñå ñâúðçâàé ñ äîñòàâ÷èê (âðúçêàòà å âå÷å óñòàíîâåíà) Do not use remote access connection Íå èçïîëçâàé âðúçêà ñ îòäàëå÷åí äîñòúï Schedule the mirroring operation Ïëàíèðàé îïåðàöèÿòà ïî ñúçäàâàíå íà îãëåäàëåí ñàéò Quit WinHTTrack Website Copier Èçõîä îò WinHTTrack Website Copier Back to starting page Íàçàä êúì ñòàðòîâàòà ñòðàíèöà Click to start! Êëèêíè çà ñòàðò! No saved password for this connection! Íÿìà ñúõðàíåíà ïàðîëà çà òàçè âðúçêà! Can not get remote connection settings Íå ìîæå äà ïîëó÷è íàñòðîéêèòå çà îòäàëå÷åíàòà âðúçêà Select a connection provider Èçáåðåòå äîñòàâ÷èê çà âðúçêà Start Ñòàðò Please adjust connection parameters if necessary,\nthen press FINISH to launch the mirroring operation. Ìîëÿ, äîíàñòðîéòå ïàðàì. íà âðúçêàòà àêî å íåîáõîäèìî,\nñëåä òîâà íàòèñíåòå ÊÐÀÉ çà ñòàðò íà îïðåàöèÿòà çà ñúçäàâàíå íà îãëåäàëåí ñàéò. Save settings only, do not launch download now. Ñàìî çàïàçè íàñòðîéêèòå! Íå ñòàðòèðàé êîïèðàíåòî ñåãà! On hold Çàäðúæ Transfer scheduled for: (hh/mm/ss) Òðàíñôåðúò å ïëàíèðàí çà: (÷÷/ìì/ññ) Start Ñòàðò Connect to provider (RAS) Ñâúðæè ñå ñ äîñòàâ÷èê (÷ðåç ìîäåì) Connect to this provider Ñâúðæè ñå ñ òîçè äîñòàâ÷èê Disconnect when finished Ïðåêðàòè âðúçêàòà ñëåä êðàÿ íà îïåðàöèÿòà Disconnect modem on completion Ñëåä êðàÿ íà îïåðàöèÿòà ðàçêà÷è ìîäåìà \r\n(Please notify us of any bug or problem)\r\n\r\nDevelopment:\r\nInterface (Windows): Xavier Roche\r\nSpider: Xavier Roche\r\nJavaParserClasses: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche and other contributors\r\nMANY THANKS for translation tips to:\r\nRobert Lagadec (rlagadec@yahoo.fr) \r\n(Ìîëÿ óâåäîìåòå íè çà âñÿêà ãðåøêà èëè ïðîáëåì)\r\n\r\nÐàçðàáîòêà:\r\nÈíòåðôåéñ (Windows): Xavier Roche\r\nÏàÿê: Xavier Roche\r\nJava Ðàçáîðíè Êëàñîâå: Yann Philippot\r\n\r\n(C)1998-2003 Xavier Roche è äðóãè ñúòðóäíèöè\r\nÌÍÎÃÎ ÁËÀÃÎÄÀÐÍÎÑÒÈ çà Áúëãàðñêèÿò ïðåâîä íà:\r\nÈëèÿ Ëèíäîâ (ilia@infomat-bg.com) About WinHTTrack Website Copier Çà WinHTTrack Website Copier Please visit our Web page Ìîëÿ ïîñåòåòå íàøàòà Èíòåðíåò ñòðàíèöà Wizard query Çàïèòâàíå êúì ñúâåòíèêà Your answer: Âàøèÿò îòãîâîð: Link detected.. Íàìåðåíà âðúçêà.. Choose a rule Èçáåðè ïðàâèëî Ignore this link Èãíîðèðàé òàçè ïðåïðàòêà Ignore directory Èãíîðèðàé äèðåêòîðèÿ Ignore domain Èãíîðèðàé îáëàñò Catch this page only Ñâàëè ñàìî òàçè ñòðàíèöà Mirror site Íàïðàâè îãëåäàëíî êîïèå íà ñàéòà Mirror domain Íàïðàâè îãëåäàëíî êîïèå íà îáëàñòòà Ignore all Èãíîðèðàé âñè÷êî Wizard query Çàïèòâàíå êúì ñúâåòíèêà NO ÍÅ File Ôàéë Options Îïöèè Log Log Window Ïðîçîðåö Help Ïîìîù Pause transfer Ïàóçà íà òðàíñôåðà Exit Èçõîä Modify options Ïðîìåíè îïöèèòå View log Âèæ log-à View error log Âèæ log-à çà ãðåøêè View file transfers Âèæ òðàíñôåðèòå íà ôàéëîâå Hide Ñêðèé About WinHTTrack Website Copier Çà WinHTTrack Website Copier Check program updates... Ïðîâåðè çà îáíîâëåíèÿ íà ïðîãðàìàòà... &Toolbar &Ïàíåë ñ èíñòðóìåíòè &Status Bar &Ñòàòóñ ïàíåë S&plit &Ðàçäåëè File Ôàéë Preferences Ïðåäïî÷èòàíèÿ Mirror Îãëåäàëî Log Log Window Ïðîçîðåö Help Ïîìîù Exit Èçõîä Load default options Çàðåäè îñíîâíèòå ïðåäïî÷èòàíèÿ Save default options Çàïàçè îñíîâíèòå ïðåäïî÷èòàíèÿ Reset to default options Âúðíè îñíîâíèòå îïöèè Load options... Çàðåäè îïöèè... Save options as... Çàïàçè îïöèèòå êàòî... Language preference... Ïðåäïî÷èòàí åçèê... Contents... Ñúäúðæàíèå About WinHTTrack... Çà WinHTTrack... New project\tCtrl+N Íîâ ïðîåêò\tCtrl+N &Open...\tCtrl+O &Îòâîðè...\tCtrl+O &Save\tCtrl+S &Çàïàçè\tCtrl+S Save &As... Çàïàçè &Êàòî... &Delete... &Èçòðèé &Browse sites... &Ïðåãëåäàé ñàéò... User-defined structure Ñòðóêòóðà îïðåäåëåíà îò ïîòðåáèòåëÿ %n\tName of file without file type (ex: image)\r\n%N\tName of file including file type (ex: image.gif)\r\n%t\tFile type only (ex: gif)\r\n%p\tPath [without ending /] (ex: /someimages)\r\n%h\tHost name (ex: www.someweb.com)\r\n%M\tMD5 URL (128 bits, 32 ascii bytes)\r\n%Q\tMD5 query string (128 bits, 32 ascii bytes)\r\n%q\tMD5 small query string (16 bits, 4 ascii bytes)\r\n\r\n%s?\tShort name (ex: %sN) %n\tÈìå íà ôàéë áåç ðàçøèðåíèå (íàïð.: image)\r\n%N\tÈìå íà ôàéë ñ ðàçøèðåíèå (íàïð.: image.gif)\r\n%t\tÑàìî òèï íà ôàéë(ðàçøèðåíèå)(íàïð.: gif)\r\n%p\tÏúò [áåç '/' íàêðàÿ](íàïð.: /someimages)\r\n%h\tÈìå íà õîñò (íàïð.: www.someweb.com)\r\n%M\tMD5 URL (128 áèòà, 32 ascii áèòà)\r\n%Q\tMD5 âúïðîñèòåëåí íèç (128 áèòà, 32 ascii áèòà)\r\n%q\tMD5 ìàëúê âúïðîñèòåëåí íèç (16 áèòà, 4 ascii áèòà)\r\n\r\n%s?\tÊúñî èìå (íàïð.: %sN) Example:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Ïðèìåð:\t%h%p/%n%q.%t\n->\t\tc:\\mirror\\www.someweb.com\\someimages\\image.gif Proxy settings Ïðîêñè íàñòðîéêè Proxy address: Ïðîêñè àäðåñ: Proxy port: Ïðîêñè ïîðò: Authentication (only if needed) Èäåíòèôèöèðàíå (ñàìî àêî å íåîáõîäèìî) Login Èäåíòèôèêàòîð Password Ïàðîëà Enter proxy address here Âúâåäåòå àäðåñ íà ïðîêñè òóê Enter proxy port here Âúâåäåòå ïîðò íà ïðîêñè òóê Enter proxy login Âúâåäåòå èäåíòèôèêàòîð çà ïðîêñè Enter proxy password Âúâåäåòå ïàðîëà çà ïðîêñè Enter project name here Âúâåäåòå èìå íà ïðîåêòà òóê Enter saving path here Âúâåäåòå ïúò çà çàïèñâàíå òóê Select existing project to update Èçáåðåòå ñúùåñòâóâàù ïðîåêò çà îáíîâëåíèå Click here to select path Êëèêíåòå òóê çà äà èçáåðåòå ïúò Select or create a new category name, to sort your mirrors in categories HTTrack Project Wizard... HTTrack Ñúâåòíèê-Ïðîåêòè... New project name: Èìå íà íîâ ïðîåêò: Existing project name: Èìå íà ñúùåñòâóâàù ïðîåêò: Project name: Èìå íà ïðîåêò: Base path: Îñíîâåí ïúò: Project category: Êàòåãîðèÿ íà ïðîåêòà C:\\My Web Sites C:\\Ìîèòå Èíòåðíåò Ñòðàíèöè Type a new project name, \r\nor select existing project to update/resume Çàäàéòå èìå íà íîâ ïðîåêò, \r\nèëè èçáåðåòå ñúùåñòâóâàù ïðîåêò çà îáíîâëåíèå/ïðîäúëæåíèå New project Íîâ ïðîåêò Insert URL Âúâåäåòå URL URL: URL: Authentication (only if needed) Èäåíòèôèêàöèÿ Login Èäåíòèôèêàòîð Password Ïàðîëà Forms or complex links: Ôîðìóëè èëè ñëîæíè ïðåïðàòêè: Capture URL... Ïðèõâàíè URL... Enter URL address(es) here Âúâåäåòå URL àäðåñúò(èòå) òóê Enter site login Âúâåäåòå èäåíòèôèêàòîð çà ñàéòà Enter site password Âúâåäåòå ïàðîëà çà ñàéòà Use this capture tool for links that can only be accessed through forms or javascript code Èçïîëçâàé òîçè èíñòðóìåíò çà ïðèõâàùàíå íà ïðåïðàòêè, êîèòî ìîãàò äà áúäàò äîñòèãíàòè ñàìî ÷ðåç ôîðìè èëè JavaScript êîä Choose language according to preference Èçáåðè åçèê ñúãëàñíî ïðåäïî÷èòàíèÿòà Catch URL! Ïðèõâàíè URL! Please set temporary browser proxy settings to the following values (Copy/Paste Proxy Address and Port).\nThen click on the Form SUBMIT button in your browser page, or click on the specific link you want to capture. Ìîëÿ âðåìåííî çàäàéòå ïîêàçàíèòå ïðîêñè íàñòðîéêè íà Âàøèÿ áðàóçúð ('Copy/Paste' ïðîêñè àäðåñà è ïîðòà).\nÑëåä òîâà êëèêíåòå âúðõó áóòîíà ÏÐÅÄÀÉ (SUBMIT) â ñòðàíèöàòà íà áðàóçúðà èëè êëèêíåòå âúðõó ïðåïðàòêà, êîÿòî æåëàåòå äà áúäå ïðèõâàíàòà. This will send the desired link from your browser to WinHTTrack. Òîâà ùå èçïðàòè ïðåäïî÷åòåíàòà ïðåïðàòêà îò Âàøèÿ áðàóçúð êúì WinHTTrack. ABORT ÀÍÓËÈÐÀÉ Copy/Paste the temporary proxy parameters here Copy/Paste âðåìåííèòå ïðîêñè ïàðàìåòðè òóê Cancel Îòêàç Unable to find Help files! Íå ñà íàìåðåíè ôàéëîâåòå çà Ïîìîù! Unable to save parameters! Ïàðàìåòðèòå íå ìîãàò äà áúäàò çàïèñàíè! Please drag only one folder at a time Ìîëÿ ïðèäðúïâàéòå ñàìî ïî åäíà äèðåêòîðèÿ Please drag only folders, not files Ìîëÿ ïðèäðúïâàéòå ñàìî äèðåêòîðèè, íå ôàéëîâå Please drag folders only Ìîëÿ ïðèäðúïâàéòå ñàìî äèðåêòîðèè Select user-defined structure? Èçáèðàòå ñòðóêòóðà äåôèíèðàíà îò ïîòðåáèòåëÿ? Please ensure that the user-defined-string is correct,\notherwise filenames will be bogus! Ìîëÿ óâåðåòå ñå, ÷å íèçúò äåôèíèðàí îò ïîòðåáèòåëÿ å ïðàâèëåí,\nèíà÷å èìåíàòà íà ôàéëîâåòå ùå áúäàò íåêîðåêòíè (ïîâðåäåíè)! Do you really want to use a user-defined structure? Ñèãóðíè ëè ñòå, ÷å æåëàåòå äà èçïîëçâàòå äåôèíèðàíà îò ïîòðåáèòåëÿ ñòðóêòóðà? Too manu URLs, cannot handle so many links!! Ïðåêàëåíî ìíîãî URL àäðåñè, ïðîãðàìàòà íå ìîæå äà ñå ñïðàâè ñ òàêîâà êîëè÷åñòâî ïðåïðàòêè! Not enough memory, fatal internal error.. Íåäîñòàòú÷íî ïàìåò, ôàòàëíà âúòðåøíà ãðåøêà... Unknown operation! Íåèçâåñòíà îïåðàöèÿ! Add this URL?\r\n Äîáàâè òîçè URL àäðåñ?\r\n Warning: main process is still not responding, cannot add URL(s).. Ïðåäóïðåæäåíèå: Îñíîâíèÿò ïðîöåñ âñå îùå íå îòãîâàðÿ. Íå ìîãàò äà áúäàò äîáàâÿíè URL àäðåñè... Type/MIME associations Òèï/MIME àñîöèàöèè File types: Ôàéëîâè òèïîâå: MIME identity: MIME èäåíòè÷íîñò: Select or modify your file type(s) here Èçáåðåòå èëè ïðîìåíåòå Âàøèòå ôàéëîâè òèïîâå òóê Select or modify your MIME type(s) here Èçáåðåòå èëè ïðîìåíåòå Âàøèòå MIME òèïîâå òóê Go up Íàãîðå Go down Íàäîëó File download information Èíôîðìàöèÿ çà ñâàëÿíåòî íà ôàéëà Freeze Window Çàìðàçè ïðîçîðåöà More information: Ïîâå÷å èíôîðìàöèÿ: Welcome to WinHTTrack Website Copier!\n\nPlease click on the NEXT button to\n\n- start a new project\n- or resume a partial download Äîáðå äîøëè âúâ WinHTTrack Website Copier!\n\nÌîëÿ êëèêíåòå âúðõó áóòîíà 'ÍÀÏÐÅÄ'\n\n- çà äà ñúçäàäåòå íîâ ïðîåêò\n\n- èëè çà äà ïðîäúëæèòå íåçàâúðøåíî ñâàëÿíå File names with extension:\nFile names containing:\nThis file name:\nFolder names containing:\nThis folder name:\nLinks on this domain:\nLinks on domains containing:\nLinks from this host:\nLinks containing:\nThis link:\nALL LINKS Ôàéëîâè èìåíà ñ ðàçøèðåíèå:\nÔàéëîâè èìåíà ñúäúðæàùè:\nÒîâà èìå íà ôàéë:\nÈìåíà íà äèðåêòîðèè ñúäúðæàùè:\nÒîâà èìå íà äèðåêòîðèÿ:\nÏðåïðàòêè â òàçè îáëàñò:\nÏðåïðàòêè â îáëàñòè ñúäúðæàùè:\nÏðåïðàòêè îò òîçè õîñò:\nÏðåïðàòêè ñúäúðæàùè:\nÒàçè ïðåïðàòêà:\nÂÑÈ×ÊÈ ÏÐÅÏÐÀÒÊÈ Show all\nHide debug\nHide infos\nHide debug and infos Ïîêàæè âñè÷êè\nÑêðèé debug\nÑêðèé èíôîðìàöèÿòà\nÑêðèé debug è èíôîðìàöèÿòà Site-structure (default)\nHtml in web/, images/other files in web/images/\nHtml in web/html, images/other in web/images\nHtml in web/, images/other in web/\nHtml in web/, images/other in web/xxx, where xxx is the file extension\nHtml in web/html, images/other in web/xxx\nSite-structure, without www.domain.xxx/\nHtml in site_name/, images/other files in site_name/images/\nHtml in site_name/html, images/other in site_name/images\nHtml in site_name/, images/other in site_name/\nHtml in site_name/, images/other in site_name/xxx\nHtml in site_name/html, images/other in site_name/xxx\nAll files in web/, with random names (gadget !)\nAll files in site_name/, with random names (gadget !)\nUser-defined structure.. Ñòðóêòóðà íà ñàéòà(ïî ïîäðàçáèðàíå)\nHtml â ìðåæàòà/, èçîáð./äðóãè ôàéëîâå â ìðåæàòà/èçîáð./\nHtml â ìðåæàòà/html, èçîáð./äðóãè â ìðåæàòà/èçîáð.\nHtml â ìðåæàòà/, èçîáð./äðóãè â ìðåæàòà/\nHtml â ìðåæàòà/, èçîáð./äð. â ìðåæàòà/xxx, êúäåòî õõõ å ðàçø. íà ôàéëà\nHtml â ìðåæàòà/html, èçîáð./äðóãè â ìðåæàòà/xxx\nÑòðóêòóðà íà ñàéòà, áåç www.îáëàñò.xxx/\nHtml â èìå_íà_ñàéòà/, èçîáð./äðóãè ôàéëîâå â èìå_íà_ñàéòà/èçîáð./\nHtml â èìå_íà_ñàéòà/html, èçîáð./äðóãè â èìå_íà_ñàéòà/èçîáð.\nHtml â èìå_íà_ñàéòà/, èçîáð./äðóãè â èìå_íà_ñàéòà/\nHtml â èìå_íà_ñàéòà/, èçîáð./äðóãè â èìå_íà_ñàéòà/xxx\nHtml â èìå_íà_ñàéòà/html, èçîáð./äðóãè â èìå_íà_ñàéòà/õõõ\nÂñè÷êè ôàéëîâå â ìðåæàòà/, ñúñ ñëó÷àéíè èìåíà (gadget !)\nÂñè÷êè ôàéëîâå â èìå_íà_ñàéòà/, ñúñ ñëó÷àéíè èìåíà (gadget !)\nÑòðóêòóðà äåôèíèðàíà îò ïîòðåáèòåëÿ.. Just scan\nStore html files\nStore non html files\nStore all files (default)\nStore html files first Ñàìî ñêàíèðàé\nÇàïàçè html ôàéëîâå\nÇàïàçè íå-html ôàéëîâå\nÇàïàçè âñ. ôàéëîâå (ïî ïîäðàçáèðàíå)\nÇàïàçè ïúðâî html ôàéëîâåòå Stay in the same directory\nCan go down (default)\nCan go up\nCan both go up & down Ñòîé â ñúùàòà äèðåêòîðèÿ\nÌîæå äà ñëèçà íàäîëó (ïî ïîäðàçá.)\nÌîæå äà ñå èçêà÷âà íàãîðå\nÌîæå äà õîäè íàãîðå è íàäîëó Stay on the same address (default)\nStay on the same domain\nStay on the same top level domain\nGo everywhere on the web Ñòîé íà ñúùèÿ àäðåñ (ïî ïîäðàçá.)\nÑòîé â ñúùàòà îáëàñò\nÑòîé â îñíîâíàòà (top level) îáëàñò\nÕîäè íàâñÿêúäå â ìðåæàòà Never\nIf unknown (except /)\nIf unknown Íèêîãà\nÀêî å íåèçâåñòåí (îñâåí /)\nÀêî å íåèçâåñòåí no robots.txt rules\nrobots.txt except wizard\nfollow robots.txt rules íÿìà robots.txt ïðàâèëà\nrobots.txt èçêëþ÷âàù ñúâåòíèê\nñëåäâàé robots.txt ïðàâèëàòà normal\nextended\ndebug íîðìàëåí\nðàçøèðåí\nòðàñèðàíå çà ãðåøêè Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download Ñâàëè ñàéòà(ñàéòîâåòå)\nÑâàëè ñàéòà(ñàéòîâåòå) + âúïðîñè\nÂçåìè èíäèâèäóàëíè ôàéëîâå\nÑâàëè âñè÷êè ñàéòîâå â ñòð.(ìíîãî îãë. ñàéòîâå)\nÒåñòâàé ïðåïð. â ñòðàíèöèòå (òåñò íà îòìåòêèòå)\n* Ïðîäúëæè ïðåêúñíàòî ñâàëÿíå\n* Îáíîâè ñúùåñòâóâàùî êîïèå Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL Îòíîñ. URI / Àáñ. URL (ïî ïîäðàçáèðàíå)\nÀáñîëþòåí URL / Àáñîëþòåí URL\nÀáñîëþòåí URI / Àáñîëþòåí URI\nÎðèãèíàëåí URL / Îðèãèíàëåí URL Open Source offline browser Offline áðàóçúð Îòâîðåí Êîä Website Copier/Offline Browser. Copy remote websites to your computer. Free. Ïðîãðàìà çà êîïèðàíå íà ñàéòîâå/Offline áðàóçúð. Êîïèðà îòäàëå÷åíè ñàéòîâå íà Âàøèÿ êîìïþòúð. Áåçïëàòíà. httrack, winhttrack, webhttrack, offline browser httrack, winhttrack, webhttrack, offline browser, offline áðàóçúð URL list (.txt) URL ñïèñúê (.txt) Previous Ïðåäõîäåí Next Ñëåäâàù URLs URL-òà Warning Ïðåäóïðåæäåíèå Your browser does not currently support javascript. For better results, please use a javascript-aware browser. Âàøèÿò áðàóçúð íå ïîääúðæà JavaScript. Çà ïî-äîáðè ðåçóëòàòè, ìîëÿ èçïîëçâàéòå áðàóçúð ñ JavaScript ïîääðúæêà. Thank you Áëàãîäàðÿ You can now close this window Ñåãà ìîæåòå äà çàòâîðèòå òîçè ïðîçîðåö Server terminated Ñúðâúðúò íå îòãîâàðÿ A fatal error has occurred during this mirror Ôàòàëíà ãðåøêà ïðè ñúçäàâàíåòî íà òîçè îãëåäàëåí ñàéò Proxy type: Òèï íà ïðîêñè: Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080. Ïðîòîêîë íà ïðîêñè. HTTP: ñòàíäàðòíî ïðîêñè. HTTP (CONNECT òóíåë): èçïðàùà âñÿêà çàÿâêà ïðåç CONNECT òóíåë, çà ïðîêñè ïîääúðæàùè ñàìî CONNECT êàòî HTTPTunnelPort íà Tor. SOCKS5: ïîðò ïî ïîäðàçáèðàíå 1080. Load cookies from file: Çàðåæäàíå íà 'áèñêâèòêè' îò ôàéë: Preload cookies from a Netscape cookies.txt file before crawling. Ïðåäâàðèòåëíî çàðåæäàíå íà 'áèñêâèòêè' îò ôàéë Netscape cookies.txt ïðåäè îáõîæäàíåòî. Pause between files: Ïàóçà ìåæäó ôàéëîâåòå: Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8). Ñëó÷àéíî çàáàâÿíå ìåæäó èçòåãëÿíèÿòà íà ôàéëîâå, â ñåêóíäè. Èçïîëçâàéòå MIN:MAX çà ñëó÷àåí äèàïàçîí (íàïðèìåð 2:8). Keep the www. prefix (do not merge www.host with host) Çàïàçâàíå íà ïðåôèêñà www. (áåç ñëèâàíå íà www.host ñ host) Do not treat www.host and host as the same site. www.host è host äà íå ñå òðåòèðàò êàòî åäèí è ñúù ñàéò. Keep double slashes in URLs Çàïàçâàíå íà äâîéíèòå íàêëîíåíè ÷åðòè â URL Do not collapse duplicate slashes in URLs. Áåç ïðåìàõâàíå íà ïîâòàðÿùèòå ñå íàêëîíåíè ÷åðòè â URL. Keep the original query-string order Çàïàçâàíå íà îðèãèíàëíèÿ ðåä íà ïàðàìåòðèòå â çàÿâêàòà Do not reorder query-string parameters when deduplicating URLs. Áåç ïðåíàðåæäàíå íà ïàðàìåòðèòå íà çàÿâêàòà ïðè ïðåìàõâàíå íà äóáëèðàíè URL. Strip query keys: Ïðåìàõâàíå íà êëþ÷îâå îò çàÿâêàòà: Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source). Êëþ÷îâå îò çàÿâêàòà, ðàçäåëåíè ñúñ çàïåòàÿ, êîèòî äà ñå ïðåìàõíàò îò èìåòî íà çàïèñàíèÿ ôàéë (íàïðèìåð sid,utm_source). Write a WARC archive of the crawl Çàïèñâàíå íà WARC àðõèâ íà îáõîæäàíåòî Also save every fetched response into an ISO-28500 WARC/1.1 archive, next to the mirror. Çàïèñâàíå íà âñåêè èçòåãëåí îòãîâîð è â WARC/1.1 àðõèâ ïî ISO-28500, äî îãëåäàëîòî. WARC archive name: Èìå íà WARC àðõèâà: Optional base name for the WARC archive; leave blank to auto-name it under the output directory. Íåçàäúëæèòåëíî áàçîâî èìå çà WARC àðõèâà; îñòàâåòå ïðàçíî çà àâòîìàòè÷íî èìåíóâàíå â èçõîäíàòà äèðåêòîðèÿ. httrack-3.49.14/lang/README.md0000644000175000017500000000313315230602340011210 # Translating HTTrack Interface strings live here, one `.txt` file per language. `English.txt` is the reference: every other file maps each English string to its translation. ## File format Plain text, entries in consecutive pairs of lines: ``` ``` The first line of a pair is the lookup key and must stay identical to the one in `English.txt`; translate only the second line. Missing entries fall back to the English text at runtime, so a partial translation works. Preserve any `\r\n`, `\t` and `printf` placeholders (`%s`, `%d`, ...) in the translation. A few `LANGUAGE_*` entries at the top describe the file itself: | Key | Meaning | | --- | --- | | `LANGUAGE_NAME` | Name shown in the language picker, in its own language (`Deutsch`, not `German`) | | `LANGUAGE_ISO` | ISO 639 code, with region if needed (`de`, `pt_BR`) | | `LANGUAGE_CHARSET` | Encoding the file is saved in (`ISO-8859-1`, `windows-1251`, `UTF-8`, ...) | | `LANGUAGE_AUTHOR` | Your name and contact | | `LANGUAGE_WINDOWSID` | Windows locale name used by WinHTTrack (`German (Standard)`) | Save the file in exactly its declared `LANGUAGE_CHARSET`; an editor that rewrites it as UTF-8 will corrupt the non-ASCII bytes. ## Adding or updating a language 1. Copy `English.txt` to `.txt`, or edit the existing file. 2. Translate each second line; leave the English keys untouched. 3. Fill in the `LANGUAGE_*` header for a new file. 4. Open a pull request, or attach the file to a GitHub issue. When new strings land in `English.txt` they show up untranslated (as English) until a translator fills them in. httrack-3.49.14/lang/Makefile.in0000644000175000017500000004057715230604702012017 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lang ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ $(top_srcdir)/m4/check_codecs.m4 \ $(top_srcdir)/m4/check_zlib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/visibility.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(langdir)" "$(DESTDIR)$(langrootdir)" DATA = $(lang_DATA) $(langroot_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in README.md DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BROTLI_ENABLED = @BROTLI_ENABLED@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGS_PIE = @CFLAGS_PIE@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CFLAGS = @DEFAULT_CFLAGS@ DEFAULT_LDFLAGS = @DEFAULT_LDFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HTTPS_SUPPORT = @HTTPS_SUPPORT@ ICONV_LIBS = @ICONV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_PIE = @LDFLAGS_PIE@ LFS_FLAG = @LFS_FLAG@ LIBC_FORCE_LINK = @LIBC_FORCE_LINK@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CV_OBJDIR = @LT_CV_OBJDIR@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ONLINE_UNIT_TESTS = @ONLINE_UNIT_TESTS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHLIBPATH_VAR = @SHLIBPATH_VAR@ SOCKET_LIBS = @SOCKET_LIBS@ STRIP = @STRIP@ THREADS_CFLAGS = @THREADS_CFLAGS@ THREADS_LIBS = @THREADS_LIBS@ V6_FLAG = @V6_FLAG@ V6_SUPPORT = @V6_SUPPORT@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ ZSTD_ENABLED = @ZSTD_ENABLED@ ZSTD_LIBS = @ZSTD_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ langdir = $(datadir)/httrack/lang # Glob against $(srcdir): a bare "*.txt" is resolved against the build dir and # stays unexpanded (breaking "make") in an out-of-tree build. lang_DATA = $(srcdir)/*.txt langrootdir = $(datadir)/httrack langroot_DATA = ../lang.def ../lang.indexes EXTRA_DIST = $(lang_DATA) $(langroot_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lang/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lang/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-langDATA: $(lang_DATA) @$(NORMAL_INSTALL) @list='$(lang_DATA)'; test -n "$(langdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(langdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(langdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(langdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(langdir)" || exit $$?; \ done uninstall-langDATA: @$(NORMAL_UNINSTALL) @list='$(lang_DATA)'; test -n "$(langdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(langdir)'; $(am__uninstall_files_from_dir) install-langrootDATA: $(langroot_DATA) @$(NORMAL_INSTALL) @list='$(langroot_DATA)'; test -n "$(langrootdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(langrootdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(langrootdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(langrootdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(langrootdir)" || exit $$?; \ done uninstall-langrootDATA: @$(NORMAL_UNINSTALL) @list='$(langroot_DATA)'; test -n "$(langrootdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(langrootdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(langdir)" "$(DESTDIR)$(langrootdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-langDATA install-langrootDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-langDATA uninstall-langrootDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-langDATA \ install-langrootDATA install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-langDATA uninstall-langrootDATA .PRECIOUS: Makefile #dist-hook: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% httrack-3.49.14/lang/Makefile.am0000644000175000017500000000052215230602340011764 langdir = $(datadir)/httrack/lang # Glob against $(srcdir): a bare "*.txt" is resolved against the build dir and # stays unexpanded (breaking "make") in an out-of-tree build. lang_DATA = $(srcdir)/*.txt langrootdir = $(datadir)/httrack langroot_DATA = ../lang.def ../lang.indexes EXTRA_DIST = $(lang_DATA) $(langroot_DATA) #dist-hook: httrack-3.49.14/templates/0000755000175000017500000000000015230604720011072 5httrack-3.49.14/templates/topindex-bodycat.html0000644000175000017500000000004115230602340015144
%s httrack-3.49.14/templates/topindex-header.html0000644000175000017500000001005615230602340014756 List of available projects - HTTrack Website Copier %s
HTTrack Website Copier - Open Source offline browser

Index of locally available projects:

httrack-3.49.14/templates/topindex-body.html0000644000175000017500000000017415230602340014463 httrack-3.49.14/templates/index-footer.html0000644000175000017500000000114115230602340014274
· %s



Mirror and index made by HTTrack Website Copier [XR&CO'2008]
%s %s
httrack-3.49.14/templates/topindex-footer.html0000644000175000017500000000112015230602340015014
Mirror and index made by HTTrack Website Copier [XR&CO'2008]
%s
httrack-3.49.14/templates/index-header.html0000644000175000017500000001020715230602340014231 Local index - HTTrack Website Copier %s
HTTrack Website Copier - Open Source offline browser
Local index - HTTrack

Index of locally available sites:

httrack-3.49.14/templates/index-body.html0000644000175000017500000000016315230602340013736 httrack-3.49.14/templates/Makefile.in0000644000175000017500000003667515230604702013100 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = templates ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ $(top_srcdir)/m4/check_codecs.m4 \ $(top_srcdir)/m4/check_zlib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/visibility.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(templatesdir)" DATA = $(templates_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BROTLI_ENABLED = @BROTLI_ENABLED@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGS_PIE = @CFLAGS_PIE@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CFLAGS = @DEFAULT_CFLAGS@ DEFAULT_LDFLAGS = @DEFAULT_LDFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HTTPS_SUPPORT = @HTTPS_SUPPORT@ ICONV_LIBS = @ICONV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_PIE = @LDFLAGS_PIE@ LFS_FLAG = @LFS_FLAG@ LIBC_FORCE_LINK = @LIBC_FORCE_LINK@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CV_OBJDIR = @LT_CV_OBJDIR@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ONLINE_UNIT_TESTS = @ONLINE_UNIT_TESTS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHLIBPATH_VAR = @SHLIBPATH_VAR@ SOCKET_LIBS = @SOCKET_LIBS@ STRIP = @STRIP@ THREADS_CFLAGS = @THREADS_CFLAGS@ THREADS_LIBS = @THREADS_LIBS@ V6_FLAG = @V6_FLAG@ V6_SUPPORT = @V6_SUPPORT@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ ZSTD_ENABLED = @ZSTD_ENABLED@ ZSTD_LIBS = @ZSTD_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ templatesdir = $(datadir)/httrack/templates templates_DATA = index-body.html index-header.html topindex-footer.html \ index-footer.html topindex-body.html topindex-header.html \ topindex-bodycat.html EXTRA_DIST = $(templates_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu templates/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu templates/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-templatesDATA: $(templates_DATA) @$(NORMAL_INSTALL) @list='$(templates_DATA)'; test -n "$(templatesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(templatesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(templatesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(templatesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(templatesdir)" || exit $$?; \ done uninstall-templatesDATA: @$(NORMAL_UNINSTALL) @list='$(templates_DATA)'; test -n "$(templatesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(templatesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(templatesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-templatesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-templatesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-templatesDATA installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-templatesDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% httrack-3.49.14/templates/Makefile.am0000644000175000017500000000035315230602340013043 templatesdir = $(datadir)/httrack/templates templates_DATA = index-body.html index-header.html topindex-footer.html \ index-footer.html topindex-body.html topindex-header.html \ topindex-bodycat.html EXTRA_DIST = $(templates_DATA) httrack-3.49.14/libtest/0000755000175000017500000000000015230604720010542 5httrack-3.49.14/libtest/libtest.vcproj0000644000175000017500000001031015230602340013344 httrack-3.49.14/libtest/libtest.mak0000644000175000017500000000335315230602340012622 # Makefile OBJDIR = ./Release/ PATH = $(DEVSTU)\vc\bin;$(DEVSTU)\sharedide\bin;$(PATH) INCLUDES = /I "." /I ".." /I "../src" /I "$(DEVSTU)\vc\include" /I"../../openssl-1.0.1j\include\openssl" LIB_FLAGS = /link /LIBPATH:"L:\HTTrack\httrack\src_win\libhttrack" /LIBPATH:"L:\HTTrack\httrack\libhttrack" COMMON_FLAGS = /W3 /O2 /Fo"$(OBJDIR)" /Fd"$(OBJDIR)" /Fa"$(OBJDIR)" $(INCLUDES) CPP_FLAGS = /LD $(COMMON_FLAGS) libhttrack.lib BIN_FLAGS = /link /LIBPATH:"C:\temp\Debuglib" all: cl $(CPP_FLAGS) \ callbacks-example-simple.c -Fe$(OBJDIR)callbacks-example-simple.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-log.c -Fe$(OBJDIR)callbacks-example-log.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-baselinks.c -Fe$(OBJDIR)callbacks-example-baselinks.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-contentfilter.c -Fe$(OBJDIR)callbacks-example-contentfilter.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-displayheader.c -Fe$(OBJDIR)callbacks-example-displayheader.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-filename.c -Fe$(OBJDIR)callbacks-example-filename.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-filename2.c -Fe$(OBJDIR)callbacks-example-filename2.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-filenameiisbug.c -Fe$(OBJDIR)callbacks-example-filenameiisbug.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-changecontent.c -Fe$(OBJDIR)callbacks-example-changecontent.dll \ $(LIB_FLAGS) cl $(CPP_FLAGS) \ callbacks-example-listlinks.c -Fe$(OBJDIR)callbacks-example-listlinks.dll \ $(LIB_FLAGS) cl $(COMMON_FLAGS) \ example.c wsock32.lib libhttrack.lib -Fe$(OBJDIR)example.exe \ $(BIN_FLAGS) httrack-3.49.14/libtest/readme.txt0000644000175000017500000000417215230602340012460 HTTrack library example ----------------------- Here is an example of how to integrate HTTrack Website Copier into a project to use it as a "core library". Important Notice: ---------------- These sources are covered by the GNU General Public License (see below) (Projects based on these sources must follow the GPL, too) Copyright notice: ---------------- HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) Xavier Roche and other contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ======================================================================== MAKEFILE PROJECT : libtest Project Overview ======================================================================== AppWizard has created this libtest project for you. This file contains a summary of what you will find in each of the files that make up your libtest project. libtest.vcproj This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard. This project allows you to build/clean/rebuild from within Visual Studio by calling the commands you have input in the wizard. The build command can be nmake or any other tool you use. This project does not contain any files, so there are none displayed in Solution Explorer. ///////////////////////////////////////////////////////////////////////////// httrack-3.49.14/libtest/example-main.h0000644000175000017500000001244215230602340013207 /* HTTrack library example .h file */ #ifdef __WIN32 #define CDECL __cdecl #else #define CDECL #endif static void CDECL httrack_wrapper_init(t_hts_callbackarg * carg); static void CDECL httrack_wrapper_uninit(t_hts_callbackarg * carg); static int CDECL httrack_wrapper_start(t_hts_callbackarg * carg, httrackp * opt); static int CDECL httrack_wrapper_chopt(t_hts_callbackarg * carg, httrackp * opt); static int CDECL httrack_wrapper_end(t_hts_callbackarg * carg, httrackp * opt); static int CDECL httrack_wrapper_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file); static int CDECL httrack_wrapper_loop(t_hts_callbackarg * carg, httrackp * opt, void *_back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats); static const char *CDECL httrack_wrapper_query(t_hts_callbackarg * carg, httrackp * opt, const char *question); static const char *CDECL httrack_wrapper_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question); static const char *CDECL httrack_wrapper_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question); static int CDECL httrack_wrapper_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status); static void CDECL httrack_wrapper_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile); static void CDECL httrack_wrapper_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file); static int CDECL httrack_wrapper_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link); static int CDECL httrack_wrapper_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, void *back); static int CDECL httrack_wrapper_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); static int CDECL httrack_wrapper_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); static int CDECL httrack_wrapper_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status); static void CDECL httrack_wrapper_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *save, int is_new, int is_modified, int not_updated); static int CDECL httrack_wrapper_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag); static int CDECL httrack_wrapper_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); static int CDECL httrack_wrapper_sendheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing); static int CDECL httrack_wrapper_receiveheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming); httrack-3.49.14/libtest/example-main.c0000644000175000017500000002325615230602340013207 /* HTTrack library example .c file Prerequisites: - install winhttrack - set the proper path in the project settings (especially for the httrack lib and dll) How to build: (callback.so or callback.dll) With GNU-GCC: gcc -I/usr/include/httrack -O -g3 -Wall -D_REENTRANT -o example example.c -lhttrack2 With MS-Visual C++: cl -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.exe" callbacks-example.c wsock32.lib libhttrack.lib */ #include #include #include #ifdef _WIN32 #include #endif /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Local definitions */ #include "example-main.h" /* * Name: main * Description: main() function * Parameters: None * Should return: error status */ int main(void) { /* First, ask for an URL Note: For the test, option r2 (mirror max depth=1) and --testscan (no index, no cache, do not store, no log files) */ char _argv[][256] = { "httrack_test", "", "-r3", "--testscan", "" }; char *argv[] = { NULL, NULL, NULL, NULL, NULL }; int argc = 0; httrackp *opt; int ret; while(strlen(_argv[argc])) { argv[argc] = _argv[argc]; argc++; } argv[argc] = NULL; printf("HTTrackLib test program\n"); printf("Enter URL (example: www.foobar.com/index.html) :"); scanf("%s", argv[1]); printf("Test: 1 depth\n"); /* Initialize the library */ #ifdef _WIN32 { WORD wVersionRequested; // requested version WinSock API WSADATA wsadata; // Windows Sockets API data int stat; wVersionRequested = 0x0101; stat = WSAStartup(wVersionRequested, &wsadata); if (stat != 0) { printf("Winsock not found!\n"); return; } else if (LOBYTE(wsadata.wVersion) != 1 && HIBYTE(wsadata.wVersion) != 1) { printf("WINSOCK.DLL does not support version 1.1\n"); WSACleanup(); return; } } #endif hts_init(); /* Create option settings and set callbacks (wrappers) */ opt = hts_create_opt(); CHAIN_FUNCTION(opt, init, httrack_wrapper_init, NULL); CHAIN_FUNCTION(opt, uninit, httrack_wrapper_uninit, NULL); CHAIN_FUNCTION(opt, start, httrack_wrapper_start, NULL); CHAIN_FUNCTION(opt, end, httrack_wrapper_end, NULL); CHAIN_FUNCTION(opt, chopt, httrack_wrapper_chopt, NULL); CHAIN_FUNCTION(opt, preprocess, httrack_wrapper_preprocesshtml, NULL); CHAIN_FUNCTION(opt, postprocess, httrack_wrapper_postprocesshtml, NULL); CHAIN_FUNCTION(opt, check_html, httrack_wrapper_checkhtml, NULL); CHAIN_FUNCTION(opt, query, httrack_wrapper_query, NULL); CHAIN_FUNCTION(opt, query2, httrack_wrapper_query2, NULL); CHAIN_FUNCTION(opt, query3, httrack_wrapper_query3, NULL); CHAIN_FUNCTION(opt, loop, httrack_wrapper_loop, NULL); CHAIN_FUNCTION(opt, check_link, httrack_wrapper_check, NULL); CHAIN_FUNCTION(opt, check_mime, httrack_wrapper_check_mime, NULL); CHAIN_FUNCTION(opt, pause, httrack_wrapper_pause, NULL); CHAIN_FUNCTION(opt, filesave, httrack_wrapper_filesave, NULL); CHAIN_FUNCTION(opt, filesave2, httrack_wrapper_filesave2, NULL); CHAIN_FUNCTION(opt, linkdetected, httrack_wrapper_linkdetected, NULL); CHAIN_FUNCTION(opt, linkdetected2, httrack_wrapper_linkdetected2, NULL); CHAIN_FUNCTION(opt, xfrstatus, httrack_wrapper_xfrstatus, NULL); CHAIN_FUNCTION(opt, savename, httrack_wrapper_savename, NULL); CHAIN_FUNCTION(opt, sendhead, httrack_wrapper_sendheader, NULL); CHAIN_FUNCTION(opt, receivehead, httrack_wrapper_receiveheader, NULL); /* Then, launch the mirror */ ret = hts_main2(argc, argv, opt); /* Wait for a key */ printf("\nPress ENTER key to exit\n"); scanf("%s", argv[1]); /* Clear option state */ hts_free_opt(opt); hts_uninit(); #ifdef _WIN32 WSACleanup(); #endif /* That's all! */ return 0; } /* CALLBACK FUNCTIONS */ /* Initialize the Winsock */ static void CDECL httrack_wrapper_init(t_hts_callbackarg * carg) { printf("Engine started\n"); } static void CDECL httrack_wrapper_uninit(t_hts_callbackarg * carg) { printf("Engine exited\n"); } static int CDECL httrack_wrapper_start(t_hts_callbackarg * carg, httrackp * opt) { printf("Start of mirror\n"); return 1; } static int CDECL httrack_wrapper_chopt(t_hts_callbackarg * carg, httrackp * opt) { return 1; } static int CDECL httrack_wrapper_end(t_hts_callbackarg * carg, httrackp * opt) { printf("End of mirror\n"); return 1; } static int CDECL httrack_wrapper_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file) { printf("Parsing html file: http://%s%s\n", url_address, url_file); return 1; } static int CDECL httrack_wrapper_loop(t_hts_callbackarg * carg, httrackp * opt, void *_back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats) { /* printf("..httrack_wrapper_loop called\n"); */ return 1; } static const char *CDECL httrack_wrapper_query(t_hts_callbackarg * carg, httrackp * opt, const char *question) { /* Answer is No */ return "N"; } static const char *CDECL httrack_wrapper_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question) { /* Answer is No */ return "N"; } static const char *CDECL httrack_wrapper_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question) { /* Answer is "" */ return ""; } static int CDECL httrack_wrapper_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status) { printf("Link status tested: http://%s%s\n", adr, fil); return -1; } static void CDECL httrack_wrapper_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile) { /* Wait until lockfile is removed.. */ } static void CDECL httrack_wrapper_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file) { } static int CDECL httrack_wrapper_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link) { printf("Link detected: %s\n", link); return 1; } static int CDECL httrack_wrapper_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, void *back) { return 1; } static int CDECL httrack_wrapper_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { return 1; } static int CDECL httrack_wrapper_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { return 1; } static int CDECL httrack_wrapper_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status) { return -1; } static void CDECL httrack_wrapper_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *save, int is_new, int is_modified, int not_updated) { } static int CDECL httrack_wrapper_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag) { return 1; } static int CDECL httrack_wrapper_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { return 1; } static int CDECL httrack_wrapper_sendheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing) { return 1; } static int CDECL httrack_wrapper_receiveheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming) { return 1; } httrack-3.49.14/libtest/callbacks-example-simple.c0000644000175000017500000000670515230602340015471 /* HTTrack external callbacks example : print all downloaded html documents How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ /* system includes */ #include #include #include /* standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); EXTERNAL_FUNCTION int hts_unplug(httrackp * opt); /* local function called as "check_html" callback */ static int process_file(t_hts_callbackarg /*the carg structure, holding various information */ * carg, /*the option settings */ httrackp * opt, /*other parameters are callback-specific */ char *html, int len, const char *url_address, const char *url_file) { void *ourDummyArg = (void *) CALLBACKARG_USERDEF(carg); /*optional user-defined arg */ (void) ourDummyArg; /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, check_html) (CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { return 0; /* abort */ } } printf("file %s%s content: %s\n", url_address, url_file, html); return 1; /* success */ } /* local function called as "end" callback */ static int end_of_mirror(t_hts_callbackarg /*the carg structure, holding various information */ * carg, /*the option settings */ httrackp * opt) { void *ourDummyArg = (void *) CALLBACKARG_USERDEF(carg); /*optional user-defined arg */ (void) ourDummyArg; /* processing */ fprintf(stderr, "That's all, folks!\n"); /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { /* status is ok on our side, return other callabck's status */ return CALLBACKARG_PREV_FUN(carg, end) (CALLBACKARG_PREV_CARG(carg), opt); } return 1; /* success */ } /* module entry point the function name and prototype MUST match this prototype */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { /* optional argument passed in the commandline we won't be using here */ const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* plug callback functions */ CHAIN_FUNCTION(opt, check_html, process_file, /*optional user-defined arg */ NULL); CHAIN_FUNCTION(opt, end, end_of_mirror, /*optional user-defined arg */ NULL); return 1; /* success */ } /* module exit point the function name and prototype MUST match this prototype */ EXTERNAL_FUNCTION int hts_unplug(httrackp * opt) { fprintf(stderr, "Module unplugged"); return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-log.c0000644000175000017500000001010015230602340014741 /* HTTrack external callbacks example : dumy plugin, aimed to log for debugging purpose How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ /* system includes */ #include #include #include /* standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); EXTERNAL_FUNCTION int hts_unplug(httrackp * opt); /* local function called as "check_html" callback */ static int process_file(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file) { void *ourDummyArg = (void *) CALLBACKARG_USERDEF(carg); /*optional user-defined arg */ char *fmt; (void) ourDummyArg; /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, check_html) (CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { return 0; /* abort */ } } /* log */ fprintf(stderr, "* parsing file %s%s\n", url_address, url_file); fmt = malloc(strlen(url_address) + strlen(url_file) + 128); sprintf(fmt, " parsing file %s%s", url_address, url_file); hts_log(opt, "log-wrapper-info", fmt); free(fmt); return 1; /* success */ } static int start_of_mirror(t_hts_callbackarg * carg, httrackp * opt) { const char *arginfo = (char *) CALLBACKARG_USERDEF(carg); fprintf(stderr, "* mirror start\n"); hts_log(opt, arginfo, "mirror started"); /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { /* status is ok on our side, return other callabck's status */ return CALLBACKARG_PREV_FUN(carg, start) (CALLBACKARG_PREV_CARG(carg), opt); } return 1; /* success */ } /* local function called as "end" callback */ static int end_of_mirror(t_hts_callbackarg * carg, httrackp * opt) { const char *arginfo = (char *) CALLBACKARG_USERDEF(carg); fprintf(stderr, "* mirror end\n"); hts_log(opt, arginfo, "mirror ended"); /* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */ if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { /* status is ok on our side, return other callabck's status */ return CALLBACKARG_PREV_FUN(carg, end) (CALLBACKARG_PREV_CARG(carg), opt); } return 1; /* success */ } /* module entry point the function name and prototype MUST match this prototype */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { /* optional argument passed in the commandline we won't be using here */ const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* plug callback functions */ if (arg == NULL) arg = "log-wrapper-info"; hts_log(opt, arg, "* plugging functions"); CHAIN_FUNCTION(opt, check_html, process_file, (void *) (uintptr_t) arg); CHAIN_FUNCTION(opt, start, start_of_mirror, (void *) (uintptr_t) arg); CHAIN_FUNCTION(opt, end, end_of_mirror, (void *) (uintptr_t) arg); hts_log(opt, arg, "* module successfully plugged"); return 1; /* success */ } /* module exit point the function name and prototype MUST match this prototype */ EXTERNAL_FUNCTION int hts_unplug(httrackp * opt) { hts_log(opt, "log-wrapper-info", "* module successfully unplugged"); return 1; } httrack-3.49.14/libtest/callbacks-example-listlinks.c0000644000175000017500000001153515230602340016211 /* HTTrack external callbacks example .c file How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Function definitions */ static int process_file(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file); static int check_detectedlink(t_hts_callbackarg * carg, httrackp * opt, char *link); static int check_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back *back, int back_max, int back_index, int lien_tot, int lien_ntot, int stat_time, hts_stat_struct * stats); static int end(t_hts_callbackarg * carg, httrackp * opt); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* This sample just lists all links in documents with the parent link: -> This sample can be improved, for example, to make a map of a website. */ typedef struct t_my_userdef { char currentURLBeingParsed[2048]; } t_my_userdef; /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { t_my_userdef *userdef; /* */ const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Create user-defined structure */ userdef = (t_my_userdef *) malloc(sizeof(t_my_userdef)); /* userdef */ userdef->currentURLBeingParsed[0] = '\0'; /* Plug callback functions */ CHAIN_FUNCTION(opt, check_html, process_file, userdef); CHAIN_FUNCTION(opt, end, end, userdef); CHAIN_FUNCTION(opt, linkdetected, check_detectedlink, userdef); CHAIN_FUNCTION(opt, loop, check_loop, userdef); return 1; /* success */ } static int process_file(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); char *const currentURLBeingParsed = userdef->currentURLBeingParsed; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, check_html) (CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { return 0; /* Abort */ } } /* Process */ printf("now parsing %s%s..\n", url_address, url_file); strcpy(currentURLBeingParsed, url_address); strcat(currentURLBeingParsed, url_file); return 1; /* success */ } static int check_detectedlink(t_hts_callbackarg * carg, httrackp * opt, char *link) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); char *const currentURLBeingParsed = userdef->currentURLBeingParsed; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, linkdetected) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, linkdetected) (CALLBACKARG_PREV_CARG(carg), opt, link)) { return 0; /* Abort */ } } /* Process */ printf("[%s] -> [%s]\n", currentURLBeingParsed, link); return 1; /* success */ } static int check_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back *back, int back_max, int back_index, int lien_tot, int lien_ntot, int stat_time, hts_stat_struct * stats) { static int fun_animation = 0; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, loop) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, loop) (CALLBACKARG_PREV_CARG(carg), opt, back, back_max, back_index, lien_tot, lien_ntot, stat_time, stats)) { return 0; /* Abort */ } } /* Process */ printf("%c\r", "/-\\|"[(fun_animation++) % 4]); return 1; } static int end(t_hts_callbackarg * carg, httrackp * opt) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); fprintf(stderr, "** info: wrapper_exit() called!\n"); if (userdef != NULL) { free(userdef); userdef = NULL; } /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { return CALLBACKARG_PREV_FUN(carg, end) (CALLBACKARG_PREV_CARG(carg), opt); } return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-filenameiisbug.c0000644000175000017500000000514315230602340017156 /* HTTrack external callbacks example : changing folder names ending with ".com" with ".c0m" as a workaround of IIS bug (see KB 275601) How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Function definitions */ static int mysavename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; CHAIN_FUNCTION(opt, savename, mysavename, NULL); return 1; /* success */ } /* Replaces all "offending" IIS extensions (exe, dll..) with "nice" ones */ static int mysavename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { static const char *iisBogus[] = { ".com", ".exe", ".dll", ".sh", NULL }; static const char *iisBogusReplace[] = { ".c0m", ".ex3", ".dl1", ".5h", NULL }; /* MUST be the same sizes */ char *a; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, savename) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, savename) (CALLBACKARG_PREV_CARG(carg), opt, adr_complete, fil_complete, referer_adr, referer_fil, save)) { return 0; /* Abort */ } } /* Process */ for(a = save; *a != '\0'; a++) { int i; for(i = 0; iisBogus[i] != NULL; i++) { int j; for(j = 0; iisBogus[i][j] == a[j] && iisBogus[i][j] != '\0'; j++) ; if (iisBogus[i][j] == '\0' && (a[j] == '\0' || a[j] == '/' || a[j] == '\\')) { strncpy(a, iisBogusReplace[i], strlen(iisBogusReplace[i])); break; } } } return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-filename2.c0000644000175000017500000001076615230602340016044 /* How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback,string1,string2 .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Function definitions */ static int mysavename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); static int myend(t_hts_callbackarg * carg, httrackp * opt); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* TOLOWER */ #define TOLOWER_(a) (a >= 'A' && a <= 'Z') ? (a + ('a' - 'A')) : a #define TOLOWER(a) ( TOLOWER_( (a) ) ) /* This sample just replaces all occurences of "string1" into "string2" string1 and string2 are passed in the callback string: httrack --wrapper save-name=callback:mysavename,string1,string2 .. */ typedef struct t_my_userdef { char string1[256]; char string2[256]; } t_my_userdef; /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Check args */ if (arg == NULL || *arg == '\0' || strchr(arg, ',') == NULL) { fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); fprintf(stderr, "usage: httrack --wrapper save-name=callback:mysavename,string1,string2\n"); fprintf(stderr, "example: httrack --wrapper save-name=callback:mysavename,foo,bar\n"); return 0; /* failed */ } else { char *pos = strchr(arg, ','); t_my_userdef *userdef = (t_my_userdef *) malloc(sizeof(t_my_userdef)); char *const string1 = userdef->string1; char *const string2 = userdef->string2; /* Split args */ fprintf(stderr, "** info: wrapper_init(%s) called!\n", arg); fprintf(stderr, "** callback example: changing destination filename word by another one\n"); string1[0] = string1[1] = '\0'; strncat(string1, arg, pos - arg); strcpy(string2, pos + 1); fprintf(stderr, "** callback info: will replace %s by %s in filenames!\n", string1, string2); /* Plug callback functions */ CHAIN_FUNCTION(opt, savename, mysavename, userdef); CHAIN_FUNCTION(opt, end, myend, userdef); } return 1; /* success */ } static int myend(t_hts_callbackarg * carg, httrackp * opt) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); fprintf(stderr, "** info: wrapper_exit() called!\n"); if (userdef != NULL) { free(userdef); userdef = NULL; } /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { return CALLBACKARG_PREV_FUN(carg, end) (CALLBACKARG_PREV_CARG(carg), opt); } return 1; /* success */ } static int mysavename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); char *const string1 = userdef->string1; char *const string2 = userdef->string2; /* */ char *buff, *a, *b; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, savename) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, savename) (CALLBACKARG_PREV_CARG(carg), opt, adr_complete, fil_complete, referer_adr, referer_fil, save)) { return 0; /* Abort */ } } /* Process */ buff = strdup(save); a = buff; b = save; *b = '\0'; /* the "save" variable points to a buffer with "sufficient" space */ while(*a) { if (strncmp(a, string1, (int) strlen(string1)) == 0) { strcat(b, string2); b += strlen(b); a += strlen(string1); } else { *b++ = *a++; *b = '\0'; } } free(buff); return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-filename.c0000644000175000017500000000507615230602340015760 /* HTTrack external callbacks example : changing the destination filename .c file How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Local function definitions */ static int mysavename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* Options settings */ #include "htsopt.h" /* TOLOWER */ #define TOLOWER_(a) (a >= 'A' && a <= 'Z') ? (a + ('a' - 'A')) : a #define TOLOWER(a) ( TOLOWER_( (a) ) ) /* This sample just changes the destination filenames to ROT-13 equivalent ; that is, a -> n b -> o c -> p d -> q .. n -> a o -> b .. -> This sample can be improved, for example, to make a map of a website. */ /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Plug callback functions */ CHAIN_FUNCTION(opt, savename, mysavename, NULL); return 1; /* success */ } static int mysavename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { char *a; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, savename) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, savename) (CALLBACKARG_PREV_CARG(carg), opt, adr_complete, fil_complete, referer_adr, referer_fil, save)) { return 0; /* Abort */ } } /* Process */ for(a = save; *a != 0; a++) { char c = TOLOWER(*a); if (c >= 'a' && c <= 'z') *a = (((c - 'a') + 13) % 26) + 'a'; // ROT-13 } return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-displayheader.c0000644000175000017500000000407615230602340017015 /* HTTrack external callbacks example : display all incoming request headers Example of _init and _exit call (httrack >> 3.31) .c file How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Local function definitions */ static int process(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Plug callback functions */ CHAIN_FUNCTION(opt, receivehead, process, NULL); return 1; /* success */ } static int process(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming) { /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, receivehead) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, receivehead) (CALLBACKARG_PREV_CARG(carg), opt, buff, adr, fil, referer_adr, referer_fil, incoming)) { return 0; /* Abort */ } } /* Process */ printf("[ %s%s ]\n%s\n", adr, fil, buff); return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-contentfilter.c0000644000175000017500000001205615230602340017054 /* HTTrack external callbacks example : crawling html pages depending on content Example of _init and _exit call (httrack >> 3.31) .c file How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback,stringtofind,stringtofind.. .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Local function definitions */ static int process(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *address, const char *filename); static int end(t_hts_callbackarg * carg, httrackp * opt); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* TOLOWER */ #define TOLOWER_(a) (a >= 'A' && a <= 'Z') ? (a + ('a' - 'A')) : a #define TOLOWER(a) ( TOLOWER_( (a) ) ) /* This sample just crawls pages that contains certain keywords, and skips the other ones */ typedef struct t_my_userdef { char stringfilter[8192]; char *stringfilters[128]; } t_my_userdef; /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Check args */ if (arg == NULL || *arg == '\0') { fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); fprintf(stderr, "usage: httrack --wrapper callback,stringtofind,stringtofind..\n"); fprintf(stderr, "example: httrack --wrapper callback,apple,orange,lemon\n"); return 0; } else { t_my_userdef *userdef = (t_my_userdef *) malloc(sizeof(t_my_userdef)); /* userdef */ char *const stringfilter = userdef->stringfilter; char **const stringfilters = userdef->stringfilters; /* */ char *a = stringfilter; int i = 0; fprintf(stderr, "** info: wrapper_init(%s) called!\n", arg); fprintf(stderr, "** callback example: crawling pages only if specific keywords are found\n"); /* stringfilters = split(arg, ','); */ strcpy(stringfilter, arg); while(a != NULL) { stringfilters[i] = a; a = strchr(a, ','); if (a != NULL) { *a = '\0'; a++; } fprintf(stderr, "** callback info: will crawl pages with '%s' in them\n", stringfilters[i]); i++; } stringfilters[i++] = NULL; /* Plug callback functions */ CHAIN_FUNCTION(opt, check_html, process, userdef); CHAIN_FUNCTION(opt, end, end, userdef); } return 1; /* success */ } static int process(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *address, const char *filename) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); /*char * const stringfilter = userdef->stringfilter; */ char **const stringfilters = userdef->stringfilters; /* */ int i = 0; int getIt = 0; char *pos; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, check_html) (CALLBACKARG_PREV_CARG(carg), opt, html, len, address, filename)) { return 0; /* Abort */ } } /* Process */ if (strcmp(address, "primary") == 0 && strcmp(filename, "/primary") == 0) /* primary page (list of links) */ return 1; while(stringfilters[i] != NULL && !getIt) { if ((pos = strstr(html, stringfilters[i])) != NULL) { int j; getIt = 1; fprintf(stderr, "** callback info: found '%s' keyword in '%s%s', crawling this page!\n", stringfilters[i], address, filename); fprintf(stderr, "** details:\n(..)"); for(j = 0; j < 72 && pos[j]; j++) { if (pos[j] > 32) fprintf(stderr, "%c", pos[j]); else fprintf(stderr, "?"); } fprintf(stderr, "(..)\n"); } i++; } if (getIt) { return 1; /* success */ } else { fprintf(stderr, "** callback info: won't parse '%s%s' (no specified keywords found)\n", address, filename); return 0; /* this page sucks, don't parse it */ } } static int end(t_hts_callbackarg * carg, httrackp * opt) { t_my_userdef *userdef = (t_my_userdef *) CALLBACKARG_USERDEF(carg); fprintf(stderr, "** info: wrapper_exit() called!\n"); if (userdef != NULL) { free(userdef); userdef = NULL; } /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, end) != NULL) { return CALLBACKARG_PREV_FUN(carg, end) (CALLBACKARG_PREV_CARG(carg), opt); } return 1; /* success */ } httrack-3.49.14/libtest/callbacks-example-changecontent.c0000644000175000017500000000370015230602340017010 /* HTTrack external callbacks example : display all incoming request headers Example of _init and _exit call (httrack >> 3.31) .c file How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Local function definitions */ static int postprocess(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Plug callback functions */ CHAIN_FUNCTION(opt, postprocess, postprocess, NULL); return 1; /* success */ } static int postprocess(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { char *old = *html; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, postprocess) != NULL) { if (CALLBACKARG_PREV_FUN(carg, postprocess) (CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { /* Modified *html */ old = *html; } } /* Process */ *html = strdup(*html); hts_free(old); return 1; } httrack-3.49.14/libtest/callbacks-example-baselinks.c0000644000175000017500000001023015230602340016137 /* HTTrack external callbacks example : enforce a constant base href Can be useful to make copies of site's archives using site's URL base href as root reference .c file How to build: (callback.so or callback.dll) With GNU-GCC: gcc -O -g3 -Wall -D_REENTRANT -shared -o mycallback.so callbacks-example.c -lhttrack2 With MS-Visual C++: cl -LD -nologo -W3 -Zi -Zp4 -DWIN32 -Fe"mycallback.dll" callbacks-example.c libhttrack.lib Note: the httrack library linker option is only necessary when using libhttrack's functions inside the callback How to use: httrack --wrapper mycallback .. */ #include #include #include /* Standard httrack module includes */ #include "httrack-library.h" #include "htsopt.h" #include "htsdefines.h" /* Local function definitions */ static int process_file(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file); static int check_detectedlink(t_hts_callbackarg * carg, httrackp * opt, char *link); static int check_detectedlink_end(t_hts_callbackarg * carg, httrackp * opt); /* external functions */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv); /* module entry point */ EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) { const char *arg = strchr(argv, ','); if (arg != NULL) arg++; /* Check args */ fprintf(stderr, "Plugged..\n"); if (arg == NULL || *arg == '\0' || strlen(arg) >= HTS_URLMAXSIZE / 2) { fprintf(stderr, "** callback error: arguments expected or bad arguments\n"); fprintf(stderr, "usage: httrack --wrapper modulename,base\n"); fprintf(stderr, "example: httrack --wrapper callback,http://www.example.com/\n"); return 0; /* failed */ } else { char *callbacks_userdef = strdup(arg); /* userdef */ /* Plug callback functions */ CHAIN_FUNCTION(opt, check_html, process_file, callbacks_userdef); CHAIN_FUNCTION(opt, linkdetected, check_detectedlink, callbacks_userdef); CHAIN_FUNCTION(opt, end, check_detectedlink_end, callbacks_userdef); fprintf(stderr, "Using root '%s'\n", callbacks_userdef); } return 1; /* success */ } static int process_file(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file) { char *prevBase; /* Call parent functions if multiple callbacks are chained. */ if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) { if (!CALLBACKARG_PREV_FUN(carg, check_html) (CALLBACKARG_PREV_CARG(carg), opt, html, len, url_address, url_file)) { return 0; /* Abort */ } } /* Disable base href, if any */ if ((prevBase = strstr(html, "&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libtest ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ $(top_srcdir)/m4/check_codecs.m4 \ $(top_srcdir)/m4/check_zlib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/visibility.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(exemplesdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) am__DEPENDENCIES_1 = libbaselinks_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libbaselinks_la_OBJECTS = callbacks-example-baselinks.lo libbaselinks_la_OBJECTS = $(am_libbaselinks_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libbaselinks_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libbaselinks_la_LDFLAGS) $(LDFLAGS) \ -o $@ libchangecontent_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libchangecontent_la_OBJECTS = callbacks-example-changecontent.lo libchangecontent_la_OBJECTS = $(am_libchangecontent_la_OBJECTS) libchangecontent_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libchangecontent_la_LDFLAGS) \ $(LDFLAGS) -o $@ libcontentfilter_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libcontentfilter_la_OBJECTS = callbacks-example-contentfilter.lo libcontentfilter_la_OBJECTS = $(am_libcontentfilter_la_OBJECTS) libcontentfilter_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libcontentfilter_la_LDFLAGS) \ $(LDFLAGS) -o $@ libdisplayheader_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libdisplayheader_la_OBJECTS = callbacks-example-displayheader.lo libdisplayheader_la_OBJECTS = $(am_libdisplayheader_la_OBJECTS) libdisplayheader_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libdisplayheader_la_LDFLAGS) \ $(LDFLAGS) -o $@ libfilename_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libfilename_la_OBJECTS = callbacks-example-filename.lo libfilename_la_OBJECTS = $(am_libfilename_la_OBJECTS) libfilename_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libfilename_la_LDFLAGS) $(LDFLAGS) -o \ $@ libfilename2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libfilename2_la_OBJECTS = callbacks-example-filename2.lo libfilename2_la_OBJECTS = $(am_libfilename2_la_OBJECTS) libfilename2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libfilename2_la_LDFLAGS) $(LDFLAGS) \ -o $@ libfilenameiisbug_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libfilenameiisbug_la_OBJECTS = callbacks-example-filenameiisbug.lo libfilenameiisbug_la_OBJECTS = $(am_libfilenameiisbug_la_OBJECTS) libfilenameiisbug_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libfilenameiisbug_la_LDFLAGS) \ $(LDFLAGS) -o $@ liblistlinks_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_liblistlinks_la_OBJECTS = callbacks-example-listlinks.lo liblistlinks_la_OBJECTS = $(am_liblistlinks_la_OBJECTS) liblistlinks_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(liblistlinks_la_LDFLAGS) $(LDFLAGS) \ -o $@ liblog_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/src/libhttrack.la am_liblog_la_OBJECTS = callbacks-example-log.lo liblog_la_OBJECTS = $(am_liblog_la_OBJECTS) liblog_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(liblog_la_LDFLAGS) $(LDFLAGS) -o $@ libsimple_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/src/libhttrack.la am_libsimple_la_OBJECTS = callbacks-example-simple.lo libsimple_la_OBJECTS = $(am_libsimple_la_OBJECTS) libsimple_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libsimple_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/callbacks-example-baselinks.Plo \ ./$(DEPDIR)/callbacks-example-changecontent.Plo \ ./$(DEPDIR)/callbacks-example-contentfilter.Plo \ ./$(DEPDIR)/callbacks-example-displayheader.Plo \ ./$(DEPDIR)/callbacks-example-filename.Plo \ ./$(DEPDIR)/callbacks-example-filename2.Plo \ ./$(DEPDIR)/callbacks-example-filenameiisbug.Plo \ ./$(DEPDIR)/callbacks-example-listlinks.Plo \ ./$(DEPDIR)/callbacks-example-log.Plo \ ./$(DEPDIR)/callbacks-example-simple.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbaselinks_la_SOURCES) $(libchangecontent_la_SOURCES) \ $(libcontentfilter_la_SOURCES) $(libdisplayheader_la_SOURCES) \ $(libfilename_la_SOURCES) $(libfilename2_la_SOURCES) \ $(libfilenameiisbug_la_SOURCES) $(liblistlinks_la_SOURCES) \ $(liblog_la_SOURCES) $(libsimple_la_SOURCES) DIST_SOURCES = $(libbaselinks_la_SOURCES) \ $(libchangecontent_la_SOURCES) $(libcontentfilter_la_SOURCES) \ $(libdisplayheader_la_SOURCES) $(libfilename_la_SOURCES) \ $(libfilename2_la_SOURCES) $(libfilenameiisbug_la_SOURCES) \ $(liblistlinks_la_SOURCES) $(liblog_la_SOURCES) \ $(libsimple_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(exemples_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BROTLI_ENABLED = @BROTLI_ENABLED@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGS_PIE = @CFLAGS_PIE@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CFLAGS = @DEFAULT_CFLAGS@ DEFAULT_LDFLAGS = @DEFAULT_LDFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HTTPS_SUPPORT = @HTTPS_SUPPORT@ ICONV_LIBS = @ICONV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_PIE = @LDFLAGS_PIE@ LFS_FLAG = @LFS_FLAG@ LIBC_FORCE_LINK = @LIBC_FORCE_LINK@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CV_OBJDIR = @LT_CV_OBJDIR@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ONLINE_UNIT_TESTS = @ONLINE_UNIT_TESTS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHLIBPATH_VAR = @SHLIBPATH_VAR@ SOCKET_LIBS = @SOCKET_LIBS@ STRIP = @STRIP@ THREADS_CFLAGS = @THREADS_CFLAGS@ THREADS_LIBS = @THREADS_LIBS@ V6_FLAG = @V6_FLAG@ V6_SUPPORT = @V6_SUPPORT@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ ZSTD_ENABLED = @ZSTD_ENABLED@ ZSTD_LIBS = @ZSTD_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ exemplesdir = $(datadir)/httrack/libtest # Glob against $(srcdir), not the build dir: a bare "*.c" is resolved relative to # the build dir and stays unexpanded (breaking "make") in an out-of-tree build. exemples_DATA = $(srcdir)/*.c $(srcdir)/*.h $(srcdir)/*.txt EXTRA_DIST = $(exemples_DATA) libtest.mak libtest.vcproj # Use $(top_srcdir)/src, not ../src: the latter is relative to the build dir and # misses the source headers (e.g. httrack-library.h) in an out-of-tree build. AM_CPPFLAGS = @DEFAULT_CFLAGS@ @THREADS_CFLAGS@ @V6_FLAG@ @LFS_FLAG@ \ -DPREFIX=\""$(prefix)"\" -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDATADIR=\""$(datadir)"\" -DLIBDIR=\""$(libdir)"\" \ -I$(top_srcdir)/src # The callback examples reference libc only through libhttrack, so the direct # libc edge gets dropped from DT_NEEDED (library-not-linked-against-libc). # Force libc back; configure gates the flag since only a GNU-style linker # accepts it (LIBC_FORCE_LINK is empty on e.g. macOS). AM_LDFLAGS = \ @DEFAULT_LDFLAGS@ \ -L../src \ @LIBC_FORCE_LINK@ # Examples libbaselinks_la_SOURCES = callbacks-example-baselinks.c libbaselinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libbaselinks_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libchangecontent_la_SOURCES = callbacks-example-changecontent.c libchangecontent_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libchangecontent_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libcontentfilter_la_SOURCES = callbacks-example-contentfilter.c libcontentfilter_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libcontentfilter_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libdisplayheader_la_SOURCES = callbacks-example-displayheader.c libdisplayheader_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libdisplayheader_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libfilename2_la_SOURCES = callbacks-example-filename2.c libfilename2_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libfilename2_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libfilename_la_SOURCES = callbacks-example-filename.c libfilename_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libfilename_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libfilenameiisbug_la_SOURCES = callbacks-example-filenameiisbug.c libfilenameiisbug_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libfilenameiisbug_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 liblistlinks_la_SOURCES = callbacks-example-listlinks.c liblistlinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la liblistlinks_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 liblog_la_SOURCES = callbacks-example-log.c liblog_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la liblog_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libsimple_la_SOURCES = callbacks-example-simple.c libsimple_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libsimple_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 pkglib_LTLIBRARIES = libbaselinks.la libchangecontent.la libcontentfilter.la libdisplayheader.la libfilename2.la libfilename.la libfilenameiisbug.la liblistlinks.la liblog.la libsimple.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libtest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu libtest/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -$(am__rm_f) $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ echo rm -f $${locs}; \ $(am__rm_f) $${locs} libbaselinks.la: $(libbaselinks_la_OBJECTS) $(libbaselinks_la_DEPENDENCIES) $(EXTRA_libbaselinks_la_DEPENDENCIES) $(AM_V_CCLD)$(libbaselinks_la_LINK) -rpath $(pkglibdir) $(libbaselinks_la_OBJECTS) $(libbaselinks_la_LIBADD) $(LIBS) libchangecontent.la: $(libchangecontent_la_OBJECTS) $(libchangecontent_la_DEPENDENCIES) $(EXTRA_libchangecontent_la_DEPENDENCIES) $(AM_V_CCLD)$(libchangecontent_la_LINK) -rpath $(pkglibdir) $(libchangecontent_la_OBJECTS) $(libchangecontent_la_LIBADD) $(LIBS) libcontentfilter.la: $(libcontentfilter_la_OBJECTS) $(libcontentfilter_la_DEPENDENCIES) $(EXTRA_libcontentfilter_la_DEPENDENCIES) $(AM_V_CCLD)$(libcontentfilter_la_LINK) -rpath $(pkglibdir) $(libcontentfilter_la_OBJECTS) $(libcontentfilter_la_LIBADD) $(LIBS) libdisplayheader.la: $(libdisplayheader_la_OBJECTS) $(libdisplayheader_la_DEPENDENCIES) $(EXTRA_libdisplayheader_la_DEPENDENCIES) $(AM_V_CCLD)$(libdisplayheader_la_LINK) -rpath $(pkglibdir) $(libdisplayheader_la_OBJECTS) $(libdisplayheader_la_LIBADD) $(LIBS) libfilename.la: $(libfilename_la_OBJECTS) $(libfilename_la_DEPENDENCIES) $(EXTRA_libfilename_la_DEPENDENCIES) $(AM_V_CCLD)$(libfilename_la_LINK) -rpath $(pkglibdir) $(libfilename_la_OBJECTS) $(libfilename_la_LIBADD) $(LIBS) libfilename2.la: $(libfilename2_la_OBJECTS) $(libfilename2_la_DEPENDENCIES) $(EXTRA_libfilename2_la_DEPENDENCIES) $(AM_V_CCLD)$(libfilename2_la_LINK) -rpath $(pkglibdir) $(libfilename2_la_OBJECTS) $(libfilename2_la_LIBADD) $(LIBS) libfilenameiisbug.la: $(libfilenameiisbug_la_OBJECTS) $(libfilenameiisbug_la_DEPENDENCIES) $(EXTRA_libfilenameiisbug_la_DEPENDENCIES) $(AM_V_CCLD)$(libfilenameiisbug_la_LINK) -rpath $(pkglibdir) $(libfilenameiisbug_la_OBJECTS) $(libfilenameiisbug_la_LIBADD) $(LIBS) liblistlinks.la: $(liblistlinks_la_OBJECTS) $(liblistlinks_la_DEPENDENCIES) $(EXTRA_liblistlinks_la_DEPENDENCIES) $(AM_V_CCLD)$(liblistlinks_la_LINK) -rpath $(pkglibdir) $(liblistlinks_la_OBJECTS) $(liblistlinks_la_LIBADD) $(LIBS) liblog.la: $(liblog_la_OBJECTS) $(liblog_la_DEPENDENCIES) $(EXTRA_liblog_la_DEPENDENCIES) $(AM_V_CCLD)$(liblog_la_LINK) -rpath $(pkglibdir) $(liblog_la_OBJECTS) $(liblog_la_LIBADD) $(LIBS) libsimple.la: $(libsimple_la_OBJECTS) $(libsimple_la_DEPENDENCIES) $(EXTRA_libsimple_la_DEPENDENCIES) $(AM_V_CCLD)$(libsimple_la_LINK) -rpath $(pkglibdir) $(libsimple_la_OBJECTS) $(libsimple_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-baselinks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-changecontent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-contentfilter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-displayheader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-filename.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-filename2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-filenameiisbug.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-listlinks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-log.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks-example-simple.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-exemplesDATA: $(exemples_DATA) @$(NORMAL_INSTALL) @list='$(exemples_DATA)'; test -n "$(exemplesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(exemplesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(exemplesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(exemplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(exemplesdir)" || exit $$?; \ done uninstall-exemplesDATA: @$(NORMAL_UNINSTALL) @list='$(exemples_DATA)'; test -n "$(exemplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(exemplesdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(exemplesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/callbacks-example-baselinks.Plo -rm -f ./$(DEPDIR)/callbacks-example-changecontent.Plo -rm -f ./$(DEPDIR)/callbacks-example-contentfilter.Plo -rm -f ./$(DEPDIR)/callbacks-example-displayheader.Plo -rm -f ./$(DEPDIR)/callbacks-example-filename.Plo -rm -f ./$(DEPDIR)/callbacks-example-filename2.Plo -rm -f ./$(DEPDIR)/callbacks-example-filenameiisbug.Plo -rm -f ./$(DEPDIR)/callbacks-example-listlinks.Plo -rm -f ./$(DEPDIR)/callbacks-example-log.Plo -rm -f ./$(DEPDIR)/callbacks-example-simple.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-exemplesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/callbacks-example-baselinks.Plo -rm -f ./$(DEPDIR)/callbacks-example-changecontent.Plo -rm -f ./$(DEPDIR)/callbacks-example-contentfilter.Plo -rm -f ./$(DEPDIR)/callbacks-example-displayheader.Plo -rm -f ./$(DEPDIR)/callbacks-example-filename.Plo -rm -f ./$(DEPDIR)/callbacks-example-filename2.Plo -rm -f ./$(DEPDIR)/callbacks-example-filenameiisbug.Plo -rm -f ./$(DEPDIR)/callbacks-example-listlinks.Plo -rm -f ./$(DEPDIR)/callbacks-example-log.Plo -rm -f ./$(DEPDIR)/callbacks-example-simple.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-exemplesDATA uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-pkglibLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exemplesDATA install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkglibLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-exemplesDATA \ uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% httrack-3.49.14/libtest/Makefile.am0000644000175000017500000000644715230602340012525 exemplesdir = $(datadir)/httrack/libtest # Glob against $(srcdir), not the build dir: a bare "*.c" is resolved relative to # the build dir and stays unexpanded (breaking "make") in an out-of-tree build. exemples_DATA = $(srcdir)/*.c $(srcdir)/*.h $(srcdir)/*.txt EXTRA_DIST = $(exemples_DATA) libtest.mak libtest.vcproj AM_CPPFLAGS = \ @DEFAULT_CFLAGS@ \ @THREADS_CFLAGS@ \ @V6_FLAG@ \ @LFS_FLAG@ \ -DPREFIX=\""$(prefix)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDATADIR=\""$(datadir)"\" \ -DLIBDIR=\""$(libdir)"\" # Use $(top_srcdir)/src, not ../src: the latter is relative to the build dir and # misses the source headers (e.g. httrack-library.h) in an out-of-tree build. AM_CPPFLAGS += -I$(top_srcdir)/src # The callback examples reference libc only through libhttrack, so the direct # libc edge gets dropped from DT_NEEDED (library-not-linked-against-libc). # Force libc back; configure gates the flag since only a GNU-style linker # accepts it (LIBC_FORCE_LINK is empty on e.g. macOS). AM_LDFLAGS = \ @DEFAULT_LDFLAGS@ \ -L../src \ @LIBC_FORCE_LINK@ # Examples libbaselinks_la_SOURCES = callbacks-example-baselinks.c libbaselinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libbaselinks_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libchangecontent_la_SOURCES = callbacks-example-changecontent.c libchangecontent_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libchangecontent_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libcontentfilter_la_SOURCES = callbacks-example-contentfilter.c libcontentfilter_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libcontentfilter_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libdisplayheader_la_SOURCES = callbacks-example-displayheader.c libdisplayheader_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libdisplayheader_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libfilename2_la_SOURCES = callbacks-example-filename2.c libfilename2_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libfilename2_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libfilename_la_SOURCES = callbacks-example-filename.c libfilename_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libfilename_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libfilenameiisbug_la_SOURCES = callbacks-example-filenameiisbug.c libfilenameiisbug_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libfilenameiisbug_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 liblistlinks_la_SOURCES = callbacks-example-listlinks.c liblistlinks_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la liblistlinks_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 liblog_la_SOURCES = callbacks-example-log.c liblog_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la liblog_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 libsimple_la_SOURCES = callbacks-example-simple.c libsimple_la_LIBADD = $(THREADS_LIBS) $(SOCKET_LIBS) $(top_builddir)/src/libhttrack.la libsimple_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 pkglib_LTLIBRARIES = libbaselinks.la libchangecontent.la libcontentfilter.la libdisplayheader.la libfilename2.la libfilename.la libfilenameiisbug.la liblistlinks.la liblog.la libsimple.la httrack-3.49.14/man/0000755000175000017500000000000015230604720007647 5httrack-3.49.14/man/makeman.sh0000755000175000017500000001536315230602340011543 #!/bin/sh # # Regenerate man/httrack.1 from "httrack --help" and the top-level README. # # Usage: # man/makeman.sh [HTTRACK_BINARY] > man/httrack.1 # # HTTRACK_BINARY defaults to "httrack" (looked up in $PATH). Set SOURCE_DATE_EPOCH # for a reproducible page date. # # The OPTIONS section is derived from --help by indentation, which is what makes # it robust (no more prose turning into bogus options, see Debian #1061053): # column 0 starting with "--" -> long option (.IP) # column 0 otherwise -> section header (.SS) # 1-2 leading spaces -> option (.IP) # 3+ leading spaces -> continuation / sub-value (description text) # # This replaces the previous out-of-tree script that grepped the first token of # every indented line and mislabelled continuations as options. set -eu httrack=${1:-httrack} script_dir=$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd) topdir=${TOPDIR:-$(CDPATH='' cd -- "$script_dir/.." && pwd)} readme=${README:-$topdir/README} # Reproducible date when SOURCE_DATE_EPOCH is set, otherwise today. if [ -n "${SOURCE_DATE_EPOCH:-}" ]; then date_str=$(LC_ALL=C date -u -d "@${SOURCE_DATE_EPOCH}" '+%d %B %Y' 2>/dev/null || LC_ALL=C date -u -r "${SOURCE_DATE_EPOCH}" '+%d %B %Y') else date_str=$(LC_ALL=C date '+%d %B %Y') fi year=${date_str##* } help=$("$httrack" --quiet --help 2>/dev/null) st=$(printf '%s\n' "$help" | grep -n 'General options' | head -1 | cut -d: -f1) en=$(printf '%s\n' "$help" | grep -nE '^example' | head -1 | cut -d: -f1) en2=$(printf '%s\n' "$help" | grep -nE '^HTTrack version' | tail -1 | cut -d: -f1) # SYNOPSIS: one "[ -x, --long ]" per option carrying a long name (skip "#" guru # options, as the original did). synopsis=$(printf '%s\n' "$help" | awk ' $0 ~ /\(--/ && $0 !~ / #/ { short = $1 if (match($0, /\(--[^ )]+/)) { lng = substr($0, RSTART + 3, RLENGTH - 3) gsub(/-/, "\\-", short); gsub(/-/, "\\-", lng) printf "[ \\fB\\-%s, \\-\\-%s\\fR ]\n", short, lng } }') # OPTIONS: indentation-driven classifier (see header comment). options=$(printf '%s\n' "$help" | sed -n "${st},$((en - 2))p" | awk ' function esc(s) { gsub(/\\/, "\\\\", s) gsub(/-/, "\\-", s) return s } function emit(s) { # body text: escape + guard ./%apostrophe leaders s = esc(s) if (substr(s, 1, 1) == "." || substr(s, 1, 1) == "\x27") s = "\\&" s print s } /^[ \t]*$/ { next } { match($0, /^ */); ind = RLENGTH if (ind == 0 && substr($0, 1, 2) == "--") { # long option opt = $1 rest = $0; sub(/^[^ \t]+[ \t]+/, "", rest) printf ".IP %s\n", esc(opt) emit(rest) } else if (ind == 0) { # section header printf ".SS %s\n", esc($0) } else if (ind <= 2) { # option opt = $1 gsub(/^\x27|\x27$/, "", opt) # drop quotes around tokens like %t rest = $0; sub(/^[ \t]+[^ \t]+[ \t]*/, "", rest) printf ".IP \\-%s\n", esc(opt) if (rest != "") emit(rest) } else { # continuation / sub-value line = $0; sub(/^[ \t]+/, "", line) print ".br" emit(line) } }') # EXAMPLES: "example: " / "means: " pairs after the options block. examples=$(printf '%s\n' "$help" | sed -n "${en},$((en2 - 1))p" | awk ' function esc(s) { gsub(/\\/, "\\\\", s); gsub(/-/, "\\-", s); return s } /^example:/ { sub(/^example:[ \t]*/, ""); printf ".TP\n.B %s\n", esc($0); next } /^means:/ { sub(/^means:[ \t]*/, ""); if ($0 != "") print esc($0); next } ') # LIMITS: the "Engine limits" block from the README. limits=$(awk ' function esc(s) { gsub(/\\/, "\\\\", s); gsub(/-/, "\\-", s); return s } /^Engine limits/ { grab = 1; next } /^Advanced options/ { grab = 0 } grab { if ($0 ~ /^-/) { print ".SM"; print esc($0) } else if ($0 !~ /^[ \t]*$/) print esc($0) }' "$readme") # --- assemble the page: static prose in quoted heredocs, dynamic parts printf'd --- cat <<'EOF' .\" Process this file with .\" groff -man -Tascii httrack.1 .\" .\" This file is generated by man/makeman.sh; do not edit by hand. .\" SPDX-License-Identifier: GPL-3.0-or-later EOF printf '.TH httrack 1 "%s" "httrack website copier"\n' "$date_str" cat <<'EOF' .SH NAME httrack \- offline browser : copy websites to a local directory .SH SYNOPSIS .B httrack [ url ]... [ \-filter ]... [ +filter ]... EOF printf '%s\n' "$synopsis" cat <<'EOF' .SH DESCRIPTION .B httrack allows you to download a World Wide Web site from the Internet to a local directory, building recursively all directories, getting HTML, images, and other files from the server to your computer. HTTrack arranges the original site's relative link-structure. Simply open a page of the "mirrored" website in your browser, and you can browse the site from link to link, as if you were viewing it online. HTTrack can also update an existing mirrored site, and resume interrupted downloads. .SH EXAMPLES EOF printf '%s\n' "$examples" cat <<'EOF' .SH OPTIONS EOF printf '%s\n' "$options" cat <<'EOF' .SH FILES .I /etc/httrack.conf .RS The system wide configuration file. .SH ENVIRONMENT .IP HOME Is being used if you defined in /etc/httrack.conf the line .I path ~/websites/# .SH DIAGNOSTICS Errors/Warnings are reported to .I hts\-log.txt by default, or to stderr if the .I \-v option was specified. .SH LIMITS EOF printf '%s\n' "$limits" cat <<'EOF' .SH BUGS Please reports bugs to .B . Include a complete, self-contained example that will allow the bug to be reproduced, and say which version of httrack you are using. Do not forget to detail options used, OS version, and any other information you deem necessary. .SH COPYRIGHT EOF printf 'Copyright (C) 1998-%s Xavier Roche and other contributors\n' "$year" cat <<'EOF' This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .SH AVAILABILITY The most recent released version of httrack can be found at: .B http://www.httrack.com .SH AUTHOR Xavier Roche .SH "SEE ALSO" The .B HTML documentation (available online at .B http://www.httrack.com/html/ ) contains more detailed information. Please also refer to the .B httrack FAQ (available online at .B http://www.httrack.com/html/faq.html ) EOF httrack-3.49.14/man/proxytrack.10000644000175000017500000000427315230602340012061 .\" Process this file with .\" groff -man -Tascii proxytrack.1 .\" .\" SPDX-License-Identifier: GPL-3.0-or-later .TH proxytrack 1 "Mar 2003" "httrack website copier" .SH NAME proxytrack \- proxy to serve content archived by httrack website copier .SH SYNOPSIS .B proxytrack proxy_address:proxy_port icp_address:icp_port [ httrack_cache_filename_1 [ httrack_cache_filename_2 .. ] ] .B .SH DESCRIPTION .B proxytrack this program allows you to create a proxy to deliver content already archived by .BR httrack (1) , a website copier. .SH EXAMPLES .TP .B proxytrack proxy:8080 localhost:3130 /home/archives/example.com/hts-cache/new.zip will launch the proxytrack proxy, listening to :8080, to deliver content archived in the /home/archives/example.com/hts-cache/new.zip cache .SH ENVIRONMENT .SH DIAGNOSTICS Errors/Warnings are reported the console and standard error .SH BUGS Please reports bugs to .B . Include a complete, self-contained example that will allow the bug to be reproduced, and say which version of (web)httrack you are using. Do not forget to detail options used, OS version, and any other information you deem necessary. .SH COPYRIGHT Copyright (C) 1998-2026 Xavier Roche and other contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .SH AVAILABILITY The most recent released version of (web)httrack can be found at: .B http://www.httrack.com .SH AUTHOR Xavier Roche .SH "SEE ALSO" The .B HTML documentation (available online at .B http://www.httrack.com/html/ ) contains more detailed information. Please also refer to the .B httrack FAQ (available online at .B http://www.httrack.com/html/faq.html ) httrack-3.49.14/man/htsserver.10000644000175000017500000000426015230602340011674 .\" Process this file with .\" groff -man -Tascii htsserver.1 .\" .\" SPDX-License-Identifier: GPL-3.0-or-later .TH htsserver 1 "Mar 2003" "httrack website copier" .SH NAME htsserver \- offline browser server : copy websites to a local directory .SH SYNOPSIS .B htsserver [ path/ ] [ keyword value [ keyword value .. ] ] .B .SH DESCRIPTION .B htsserver this program is a web frontend server to .BR httrack (1). , a website copier, used by .BR webhttrack (1). .SH EXAMPLES .TP .B htsserver /usr/share/httrack/ path "$HOME/websites" lang 1 then, browse http://localhost:8080/ .SH FILES .I /etc/httrack.conf .RS The system wide configuration file. .SH ENVIRONMENT .IP HOME Is being used if you defined in /etc/httrack.conf the line .I path ~/websites/# .SH DIAGNOSTICS Errors/Warnings are reported to .I hts-log.txt located in the destination directory. .SH BUGS Please reports bugs to .B . Include a complete, self-contained example that will allow the bug to be reproduced, and say which version of (web)httrack you are using. Do not forget to detail options used, OS version, and any other information you deem necessary. .SH COPYRIGHT Copyright (C) 1998-2026 Xavier Roche and other contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .SH AVAILABILITY The most recent released version of (web)httrack can be found at: .B http://www.httrack.com .SH AUTHOR Xavier Roche .SH "SEE ALSO" The .B HTML documentation (available online at .B http://www.httrack.com/html/ ) contains more detailed information. Please also refer to the .B httrack FAQ (available online at .B http://www.httrack.com/html/faq.html ) httrack-3.49.14/man/webhttrack.10000644000175000017500000000430315230602340012003 .\" Process this file with .\" groff -man -Tascii webhttrack.1 .\" .\" SPDX-License-Identifier: GPL-3.0-or-later .TH webhttrack 1 "Mar 2003" "httrack website copier" .SH NAME webhttrack \- offline browser : copy websites to a local directory .SH SYNOPSIS .B webhttrack [ keyword value [ keyword value .. ] ] .B .SH DESCRIPTION .B webhttrack this program is a script frontend to .BR httrack (1) and .BR htsserver (1) , a website copier. .SH EXAMPLES .TP .B webhttrack lang 1 will launch the webhttrack server frontend, and the default system browser, with "lang" set to "english" (language #1) .SH FILES .I /etc/httrack.conf .RS The system wide configuration file. .SH ENVIRONMENT .IP HOME Is being used if you defined in /etc/httrack.conf the line .I path ~/websites/# .SH DIAGNOSTICS Errors/Warnings are reported to .I hts-log.txt located in the destination directory. .SH BUGS Please reports bugs to .B . Include a complete, self-contained example that will allow the bug to be reproduced, and say which version of (web)httrack you are using. Do not forget to detail options used, OS version, and any other information you deem necessary. .SH COPYRIGHT Copyright (C) 1998-2026 Xavier Roche and other contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .SH AVAILABILITY The most recent released version of (web)httrack can be found at: .B http://www.httrack.com .SH AUTHOR Xavier Roche .SH "SEE ALSO" The .B HTML documentation (available online at .B http://www.httrack.com/html/ ) contains more detailed information. Please also refer to the .B httrack FAQ (available online at .B http://www.httrack.com/html/faq.html ) httrack-3.49.14/man/httrack.10000644000175000017500000005072715230604717011332 .\" Process this file with .\" groff -man -Tascii httrack.1 .\" .\" This file is generated by man/makeman.sh; do not edit by hand. .\" SPDX-License-Identifier: GPL-3.0-or-later .TH httrack 1 "24 July 2026" "httrack website copier" .SH NAME httrack \- offline browser : copy websites to a local directory .SH SYNOPSIS .B httrack [ url ]... [ \-filter ]... [ +filter ]... [ \fB\-O, \-\-path\fR ] [ \fB\-w, \-\-mirror\fR ] [ \fB\-W, \-\-mirror\-wizard\fR ] [ \fB\-g, \-\-get\-files\fR ] [ \fB\-i, \-\-continue\fR ] [ \fB\-Y, \-\-mirrorlinks\fR ] [ \fB\-P, \-\-proxy\fR ] [ \fB\-%f, \-\-httpproxy\-ftp[=N]\fR ] [ \fB\-%b, \-\-bind\fR ] [ \fB\-rN, \-\-depth[=N]\fR ] [ \fB\-%eN, \-\-ext\-depth[=N]\fR ] [ \fB\-mN, \-\-max\-files[=N]\fR ] [ \fB\-MN, \-\-max\-size[=N]\fR ] [ \fB\-EN, \-\-max\-time[=N]\fR ] [ \fB\-AN, \-\-max\-rate[=N]\fR ] [ \fB\-%cN, \-\-connection\-per\-second[=N]\fR ] [ \fB\-%G, \-\-pause\fR ] [ \fB\-GN, \-\-max\-pause[=N]\fR ] [ \fB\-cN, \-\-sockets[=N]\fR ] [ \fB\-TN, \-\-timeout[=N]\fR ] [ \fB\-RN, \-\-retries[=N]\fR ] [ \fB\-JN, \-\-min\-rate[=N]\fR ] [ \fB\-HN, \-\-host\-control[=N]\fR ] [ \fB\-%P, \-\-extended\-parsing[=N]\fR ] [ \fB\-n, \-\-near\fR ] [ \fB\-t, \-\-test\fR ] [ \fB\-%L, \-\-list\fR ] [ \fB\-%S, \-\-urllist\fR ] [ \fB\-NN, \-\-structure[=N]\fR ] [ \fB\-%N, \-\-delayed\-type\-check\fR ] [ \fB\-%D, \-\-cached\-delayed\-type\-check\fR ] [ \fB\-%M, \-\-mime\-html\fR ] [ \fB\-LN, \-\-long\-names[=N]\fR ] [ \fB\-KN, \-\-keep\-links[=N]\fR ] [ \fB\-x, \-\-replace\-external\fR ] [ \fB\-%x, \-\-disable\-passwords\fR ] [ \fB\-%q, \-\-include\-query\-string\fR ] [ \fB\-%g, \-\-strip\-query\fR ] [ \fB\-o, \-\-generate\-errors\fR ] [ \fB\-X, \-\-purge\-old[=N]\fR ] [ \fB\-%p, \-\-preserve\fR ] [ \fB\-%T, \-\-utf8\-conversion\fR ] [ \fB\-bN, \-\-cookies[=N]\fR ] [ \fB\-%K, \-\-cookies\-file\fR ] [ \fB\-%Y, \-\-why\fR ] [ \fB\-u, \-\-check\-type[=N]\fR ] [ \fB\-j, \-\-parse\-java[=N]\fR ] [ \fB\-sN, \-\-robots[=N]\fR ] [ \fB\-%h, \-\-http\-10\fR ] [ \fB\-%k, \-\-keep\-alive\fR ] [ \fB\-%z, \-\-disable\-compression\fR ] [ \fB\-%B, \-\-tolerant\fR ] [ \fB\-%s, \-\-updatehack\fR ] [ \fB\-%u, \-\-urlhack\fR ] [ \fB\-%A, \-\-assume\fR ] [ \fB\-@iN, \-\-protocol[=N]\fR ] [ \fB\-%w, \-\-disable\-module\fR ] [ \fB\-F, \-\-user\-agent\fR ] [ \fB\-%R, \-\-referer\fR ] [ \fB\-%E, \-\-from\fR ] [ \fB\-%F, \-\-footer\fR ] [ \fB\-%l, \-\-language\fR ] [ \fB\-%a, \-\-accept\fR ] [ \fB\-%X, \-\-headers\fR ] [ \fB\-C, \-\-cache[=N]\fR ] [ \fB\-k, \-\-store\-all\-in\-cache\fR ] [ \fB\-%r, \-\-warc\fR ] [ \fB\-%n, \-\-do\-not\-recatch\fR ] [ \fB\-%v, \-\-display\fR ] [ \fB\-Q, \-\-do\-not\-log\fR ] [ \fB\-q, \-\-quiet\fR ] [ \fB\-z, \-\-extra\-log\fR ] [ \fB\-Z, \-\-debug\-log\fR ] [ \fB\-v, \-\-verbose\fR ] [ \fB\-f, \-\-file\-log\fR ] [ \fB\-f2, \-\-single\-log\fR ] [ \fB\-I, \-\-index\fR ] [ \fB\-%i, \-\-build\-top\-index\fR ] [ \fB\-%I, \-\-search\-index\fR ] [ \fB\-pN, \-\-priority[=N]\fR ] [ \fB\-S, \-\-stay\-on\-same\-dir\fR ] [ \fB\-D, \-\-can\-go\-down\fR ] [ \fB\-U, \-\-can\-go\-up\fR ] [ \fB\-B, \-\-can\-go\-up\-and\-down\fR ] [ \fB\-a, \-\-stay\-on\-same\-address\fR ] [ \fB\-d, \-\-stay\-on\-same\-domain\fR ] [ \fB\-l, \-\-stay\-on\-same\-tld\fR ] [ \fB\-e, \-\-go\-everywhere\fR ] [ \fB\-%H, \-\-debug\-headers\fR ] [ \fB\-%!, \-\-disable\-security\-limits\fR ] [ \fB\-V, \-\-userdef\-cmd\fR ] [ \fB\-%W, \-\-callback\fR ] [ \fB\-y, \-\-background\-on\-suspend\fR ] [ \fB\-K, \-\-keep\-links[=N]\fR ] .SH DESCRIPTION .B httrack allows you to download a World Wide Web site from the Internet to a local directory, building recursively all directories, getting HTML, images, and other files from the server to your computer. HTTrack arranges the original site's relative link-structure. Simply open a page of the "mirrored" website in your browser, and you can browse the site from link to link, as if you were viewing it online. HTTrack can also update an existing mirrored site, and resume interrupted downloads. .SH EXAMPLES .TP .B httrack www.example.com/bob/ mirror site www.example.com/bob/ and only this site .TP .B httrack www.example.com/bob/ www.anothertest.com/mike/ +*.com/*.jpg \-mime:application/* mirror the two sites together (with shared links) and accept any .jpg files on .com sites .TP .B httrack www.example.com/bob/bobby.html +* \-r6 .TP .B httrack www.example.com/bob/bobby.html \-\-spider \-P proxy.myhost.com:8080 .TP .B httrack \-\-update .TP .B httrack .TP .B httrack \-\-continue .SH OPTIONS .SS General options: .IP \-O path for mirror/logfiles+cache (\-O path_mirror[,path_cache_and_logfiles]) (\-\-path ) .SS Action options: .IP \-w *mirror web sites (\-\-mirror) .IP \-W mirror web sites, semi\-automatic (asks questions) (\-\-mirror\-wizard) .IP \-g just get files (saved in the current directory) (\-\-get\-files) .IP \-i continue an interrupted mirror using the cache (\-\-continue) .IP \-Y mirror ALL links located in the first level pages (mirror links) (\-\-mirrorlinks) .SS Proxy options: .IP \-P proxy use (\-P [socks5://|connect://][user:pass@]proxy:port) (\-\-proxy ) .IP \-%f *use proxy for ftp (f0 don't use) (\-\-httpproxy\-ftp[=N]) .IP \-%b use this local hostname to make/send requests (\-%b hostname) (\-\-bind ) .SS Limits options: .IP \-rN set the mirror depth to N (* r9999) (\-\-depth[=N]) .IP \-%eN set the external links depth to N (* %e0) (\-\-ext\-depth[=N]) .IP \-mN maximum file length for a non\-html file (\-\-max\-files[=N]) .IP \-mN,N2 maximum file length for non html (N) and html (N2) .IP \-MN maximum overall size that can be uploaded/scanned (\-\-max\-size[=N]) .IP \-EN maximum mirror time in seconds (60=1 minute, 3600=1 hour) (\-\-max\-time[=N]) .IP \-AN maximum transfer rate in bytes/seconds (1000=1KB/s max) (\-\-max\-rate[=N]) .IP \-%cN maximum number of connections/seconds (*%c5) (\-\-connection\-per\-second[=N]) .IP \-%G random pause of MIN[:MAX] seconds between files (e.g. %G5:10) (\-\-pause ) .IP \-GN pause transfer if N bytes reached, and wait until lock file is deleted (\-\-max\-pause[=N]) .SS Flow control: .IP \-cN number of multiple connections (*c4) (\-\-sockets[=N]) .IP \-TN timeout, number of seconds after a non\-responding link is shutdown; also bounds host name resolution (\-\-timeout[=N]) .IP \-RN number of retries, in case of timeout or non\-fatal errors (*R1) (\-\-retries[=N]) .IP \-JN traffic jam control, minimum transfert rate (bytes/seconds) tolerated for a link (\-\-min\-rate[=N]) .IP \-HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow (\-\-host\-control[=N]) .SS Links options: .IP \-%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (\-\-extended\-parsing[=N]) .IP \-n get non\-html files 'near' an html file (ex: an image located outside) (\-\-near) .IP \-t test all URLs (even forbidden ones) (\-\-test) .IP \-%L add all URL located in this text file (one URL per line) (\-\-list ) .IP \-%S add all scan rules located in this text file (one scan rule per line) (\-\-urllist ) .SS Build options: .IP \-NN structure type (0 *original structure, 1+: see below) (\-\-structure[=N]) .br or user defined structure (\-N "%h%p/%n%q.%t") .IP \-%N delayed type check, don't make any link test but wait for files download to start instead (experimental) (%N0 don't use, %N1 use for unknown extensions, * %N2 always use) (\-\-delayed\-type\-check) .IP \-%D cached delayed type check, don't wait for remote type during updates, to speedup them (%D0 wait, * %D1 don't wait) (\-\-cached\-delayed\-type\-check) .IP \-%M generate a RFC MIME\-encapsulated full\-archive (.mht) (\-\-mime\-html) .IP \-%t keep the original file extension, don't rewrite it from the MIME type (%t0 rewrite) .IP \-LN long names (L1 *long names / L0 8\-3 conversion / L2 ISO9660 compatible) (\-\-long\-names[=N]) .IP \-KN keep original links (e.g. http://www.adr/link) (K0 *relative link, K absolute links, K4 original links, K3 absolute URI links, K5 transparent proxy link) (\-\-keep\-links[=N]) .IP \-x replace external html links by error pages (\-\-replace\-external) .IP \-%x do not include any password for external password protected websites (%x0 include) (\-\-disable\-passwords) .IP \-%q *include query string for local files (useless, for information purpose only) (%q0 don't include) (\-\-include\-query\-string) .IP \-%g strip query keys for dedup ([host/pattern=]key1,key2,...) (\-\-strip\-query ) .IP \-o *generate output html file in case of error (404..) (o0 don't generate) (\-\-generate\-errors) .IP \-X *purge old files after update (X0 keep delete) (\-\-purge\-old[=N]) .IP \-%p preserve html files 'as is' (identical to '\-K4 \-%F ""') (\-\-preserve) .IP \-%T links conversion to UTF\-8 (\-\-utf8\-conversion) .SS Spider options: .IP \-bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (\-\-cookies[=N]) .IP \-%K load extra cookies from a Netscape cookies.txt (\-\-cookies\-file ) .IP \-%Y explain which filter rule accepts or rejects a URL, then exit (\-\-why ) .IP \-u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (\-\-check\-type[=N]) .IP \-j *parse scripts (j0 don't parse, bitmask: |1 parse default, |4 don't parse .js |8 don't be aggressive) (\-\-parse\-java[=N]) .IP \-sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (\-\-robots[=N]) .IP \-%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (\-\-http\-10) .IP \-%k use keep\-alive if possible, greately reducing latency for small files and test requests (%k0 don't use) (\-\-keep\-alive) .IP \-%z do not request compressed content (%z0 request) (\-\-disable\-compression) .IP \-%B tolerant requests (accept bogus responses on some servers, but not standard!) (\-\-tolerant) .IP \-%s update hacks: various hacks to limit re\-transfers when updating (identical size, bogus response..) (\-\-updatehack) .IP \-%u url hacks: various hacks to limit duplicate URLs (strip //, www.foo.com==foo.com..) (\-\-urlhack) .br opt out of one url\-hack part: \-\-keep\-www\-prefix (www.foo.com<>foo.com), \-\-keep\-double\-slashes (//), \-\-keep\-query\-order (?b&a) .IP \-%A assume that a type (cgi,asp..) is always linked with a mime type (\-%A php3,cgi=text/html;dat,bin=application/x\-zip) (\-\-assume ) .br shortcut: '\-\-assume standard' is equivalent to \-%A php2 php3 php4 php cgi asp jsp pl cfm nsf=text/html .br can also be used to force a specific file type: \-\-assume foo.cgi=text/html .IP \-@iN internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (\-\-protocol[=N]) .IP \-%w disable a specific external mime module (\-%w httrack\-plugin) (\-\-disable\-module ) .SS Browser ID: .IP \-F user\-agent field sent in HTTP headers (\-F "user\-agent name") (\-\-user\-agent ) .IP \-%R default referer field sent in HTTP headers (\-\-referer ) .IP \-%E from email address sent in HTTP headers (\-\-from ) .IP \-%F footer string in Html code (\-%F "Mirrored from {url} on {date}"; fields {addr} {path} {url} {date} {lastmodified} {version} {mime} {charset} {status} {size}, or legacy %s) (\-\-footer ) .IP \-%l preferred language (\-%l "fr, en, jp, *" (\-\-language ) .IP \-%a accepted formats (\-%a "text/html,image/png;q=0.9,*/*;q=0.1" (\-\-accept ) .IP \-%X additional HTTP header line (\-%X "X\-Magic: 42" (\-\-headers ) .SS Log, index, cache .IP \-C create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before) (\-\-cache[=N]) .IP \-k store all files in cache (not useful if files on disk) (\-\-store\-all\-in\-cache) .IP \-%r write an ISO\-28500 WARC/1.1 archive; \-\-warc\-file NAME sets the output name, \-\-warc\-max\-size N rotates segments past N bytes, \-\-warc\-cdx also writes a sorted CDXJ index, \-\-wacz packages it all as a WACZ file (\-\-warc) .IP \-%n do not re\-download locally erased files (\-\-do\-not\-recatch) .IP \-%v display on screen filenames downloaded (in realtime) \- * %v1 short version \- %v2 full animation (\-\-display) .IP \-Q no log \- quiet mode (\-\-do\-not\-log) .IP \-q no questions \- quiet mode (\-\-quiet) .IP \-z log \- extra infos (\-\-extra\-log) .IP \-Z log \- debug (\-\-debug\-log) .IP \-v log on screen (\-\-verbose) .IP \-f *log in files (\-\-file\-log) .IP \-f2 one single log file (\-\-single\-log) .IP \-I *make an index (I0 don't make) (\-\-index) .IP \-%i make a top index for a project folder (* %i0 don't make) (\-\-build\-top\-index) .IP \-%I make an searchable index for this mirror (* %I0 don't make) (\-\-search\-index) .SS Expert options: .IP \-pN priority mode: (* p3) (\-\-priority[=N]) .br p0 just scan, don't save anything (for checking links) .br p1 save only html files .br p2 save only non html files .br *p3 save all files .br p7 get html files before, then treat other files .IP \-S stay on the same directory (\-\-stay\-on\-same\-dir) .IP \-D *can only go down into subdirs (\-\-can\-go\-down) .IP \-U can only go to upper directories (\-\-can\-go\-up) .IP \-B can both go up&down into the directory structure (\-\-can\-go\-up\-and\-down) .IP \-a *stay on the same address (\-\-stay\-on\-same\-address) .IP \-d stay on the same principal domain (\-\-stay\-on\-same\-domain) .IP \-l stay on the same TLD (eg: .com) (\-\-stay\-on\-same\-tld) .IP \-e go everywhere on the web (\-\-go\-everywhere) .IP \-%H debug HTTP headers in logfile (\-\-debug\-headers) .SS Guru options: (do NOT use if possible) .IP \-#test list engine self\-tests (run one with \-#test=NAME [args]) .IP \-#C cache list (\-#C '*.com/spider*.gif' (\-\-debug\-cache ) .IP \-#R cache repair (damaged cache) (\-\-repair\-cache) .IP \-#d debug parser (\-\-debug\-parsing) .IP \-#E extract new.zip cache meta\-data in meta.zip .IP \-#f always flush log files (\-\-advanced\-flushlogs) .IP \-#FN maximum number of filters (\-\-advanced\-maxfilters[=N]) .IP \-#h version info (\-\-version) .IP \-#K scan stdin (debug) (\-\-debug\-scanstdin) .IP \-#L maximum number of links (\-#L1000000) (\-\-advanced\-maxlinks[=N]) .IP \-#p display ugly progress information (\-\-advanced\-progressinfo) .IP \-#P catch URL (\-\-catch\-url) .IP \-#T generate transfer ops. log every minutes (\-\-debug\-xfrstats) .IP \-#u wait time (\-\-advanced\-wait) .IP \-#Z generate transfer rate statistics every minutes (\-\-debug\-ratestats) .SS Dangerous options: (do NOT use unless you exactly know what you are doing) .IP \-%! bypass built\-in security limits aimed to avoid bandwidth abuses (bandwidth, simultaneous connections) (\-\-disable\-security\-limits) .br IMPORTANT NOTE: DANGEROUS OPTION, ONLY SUITABLE FOR EXPERTS .br USE IT WITH EXTREME CARE .SS Command\-line specific options: .IP \-V execute system command after each files ($0 is the filename: \-V "rm \\$0") (\-\-userdef\-cmd ) .IP \-%W use an external library function as a wrapper (\-%W myfoo.so[,myparameters]) (\-\-callback ) .IP \-y go to background when suspended (y0 don't) (\-\-background\-on\-suspend) .SS Details: Option N .IP \-N0 Site\-structure (default) .IP \-N1 HTML in web/, images/other files in web/images/ .IP \-N2 HTML in web/HTML, images/other in web/images .IP \-N3 HTML in web/, images/other in web/ .IP \-N4 HTML in web/, images/other in web/xxx, where xxx is the file extension (all gif will be placed onto web/gif, for example) .IP \-N5 Images/other in web/xxx and HTML in web/HTML .IP \-N99 All files in web/, with random names (gadget !) .IP \-N100 Site\-structure, without www.domain.xxx/ .IP \-N101 Identical to N1 except that "web" is replaced by the site's name .IP \-N102 Identical to N2 except that "web" is replaced by the site's name .IP \-N103 Identical to N3 except that "web" is replaced by the site's name .IP \-N104 Identical to N4 except that "web" is replaced by the site's name .IP \-N105 Identical to N5 except that "web" is replaced by the site's name .IP \-N199 Identical to N99 except that "web" is replaced by the site's name .IP \-N1001 Identical to N1 except that there is no "web" directory .IP \-N1002 Identical to N2 except that there is no "web" directory .IP \-N1003 Identical to N3 except that there is no "web" directory (option set for g option) .IP \-N1004 Identical to N4 except that there is no "web" directory .IP \-N1005 Identical to N5 except that there is no "web" directory .IP \-N1099 Identical to N99 except that there is no "web" directory .SS Details: User\-defined option N .IP \-%n Name of file without file type (ex: image) .IP \-%N Name of file, including file type (ex: image.gif) .IP \-%t File type (ex: gif) .IP \-%p Path [without ending /] (ex: /someimages) .IP \-%h Host name (ex: www.example.com) .IP \-%M URL MD5 (128 bits, 32 ascii bytes) .IP \-%Q query string MD5 (128 bits, 32 ascii bytes) .IP \-%k full query string .IP \-%r protocol name (ex: http) .IP \-%q small query string MD5 (16 bits, 4 ascii bytes) .br \&'%s?' Short name version (ex: %sN) .IP \-%[param] param variable in query string .IP \-%[param:before:after:empty:notfound] advanced variable extraction .SS Details: User\-defined option N and advanced variable extraction .br %[param:before:after:empty:notfound] .br param : parameter name .br before : string to prepend if the parameter was found .br after : string to append if the parameter was found .br notfound : string replacement if the parameter could not be found .br empty : string replacement if the parameter was empty .br all fields, except the first one (the parameter name), can be empty .SS Details: Option K .IP \-K0 foo.cgi?q=45 \-> foo4B54.html?q=45 (relative URI, default) .IP \-K \-> http://www.foobar.com/folder/foo.cgi?q=45 (absolute URL) (\-\-keep\-links[=N]) .IP \-K3 \-> /folder/foo.cgi?q=45 (absolute URI) .IP \-K4 \-> foo.cgi?q=45 (original URL) .IP \-K5 \-> http://www.foobar.com/folder/foo4B54.html?q=45 (transparent proxy URL) .SS Shortcuts: .IP \-\-mirror *make a mirror of site(s) (default) .IP \-\-get get the files indicated, do not seek other URLs (\-qg) .IP \-\-list add all URL located in this text file (\-%L) .IP \-\-mirrorlinks mirror all links in 1st level pages (\-Y) .IP \-\-testlinks test links in pages (\-r1p0C0I0t) .IP \-\-spider spider site(s), to test links: reports Errors & Warnings (\-p0C0I0t) .IP \-\-testsite identical to \-\-spider .IP \-\-skeleton make a mirror, but gets only html files (\-p1) .IP \-\-update update a mirror, without confirmation (\-iC2) .IP \-\-continue continue a mirror, without confirmation (\-iC1) .IP \-\-catchurl create a temporary proxy to capture an URL or a form post URL .IP \-\-clean erase cache & log files .IP \-\-http10 force http/1.0 requests (\-%h) .SS Details: Option %W: External callbacks prototypes .SS see htsdefines.h .SH FILES .I /etc/httrack.conf .RS The system wide configuration file. .SH ENVIRONMENT .IP HOME Is being used if you defined in /etc/httrack.conf the line .I path ~/websites/# .SH DIAGNOSTICS Errors/Warnings are reported to .I hts\-log.txt by default, or to stderr if the .I \-v option was specified. .SH LIMITS These are the principals limits of HTTrack for that moment. Note that we did not heard about any other utility that would have solved them. .SM \- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif') .SM \- Cgi\-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like \-*cgi\-bin* .SH BUGS Please reports bugs to .B . Include a complete, self-contained example that will allow the bug to be reproduced, and say which version of httrack you are using. Do not forget to detail options used, OS version, and any other information you deem necessary. .SH COPYRIGHT Copyright (C) 1998-2026 Xavier Roche and other contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .SH AVAILABILITY The most recent released version of httrack can be found at: .B http://www.httrack.com .SH AUTHOR Xavier Roche .SH "SEE ALSO" The .B HTML documentation (available online at .B http://www.httrack.com/html/ ) contains more detailed information. Please also refer to the .B httrack FAQ (available online at .B http://www.httrack.com/html/faq.html ) httrack-3.49.14/man/Makefile.in0000644000175000017500000004226015230604702011640 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = man ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_add_fortify_source.m4 \ $(top_srcdir)/m4/check_codecs.m4 \ $(top_srcdir)/m4/check_zlib.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/visibility.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BROTLI_ENABLED = @BROTLI_ENABLED@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAGS_PIE = @CFLAGS_PIE@ CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFAULT_CFLAGS = @DEFAULT_CFLAGS@ DEFAULT_LDFLAGS = @DEFAULT_LDFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DL_LIBS = @DL_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_VISIBILITY = @HAVE_VISIBILITY@ HTTPS_SUPPORT = @HTTPS_SUPPORT@ ICONV_LIBS = @ICONV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_PIE = @LDFLAGS_PIE@ LFS_FLAG = @LFS_FLAG@ LIBC_FORCE_LINK = @LIBC_FORCE_LINK@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CV_OBJDIR = @LT_CV_OBJDIR@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ ONLINE_UNIT_TESTS = @ONLINE_UNIT_TESTS@ OPENSSL_LIBS = @OPENSSL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHLIBPATH_VAR = @SHLIBPATH_VAR@ SOCKET_LIBS = @SOCKET_LIBS@ STRIP = @STRIP@ THREADS_CFLAGS = @THREADS_CFLAGS@ THREADS_LIBS = @THREADS_LIBS@ V6_FLAG = @V6_FLAG@ V6_SUPPORT = @V6_SUPPORT@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ ZSTD_ENABLED = @ZSTD_ENABLED@ ZSTD_LIBS = @ZSTD_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # man_MANS = httrack.1 man_MANS = httrack.1 webhttrack.1 htsserver.1 proxytrack.1 EXTRA_DIST = $(man_MANS) makeman.sh all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu man/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-man \ uninstall-man1 .PRECIOUS: Makefile # Regenerate httrack.1 from the "httrack --help" output and the top-level # README. Run by hand after changing options or help text: # make -C man regen-man # The generated page is committed; this target only refreshes it. Honors # SOURCE_DATE_EPOCH for a reproducible date. regen-man: makeman.sh $(top_builddir)/src/httrack$(EXEEXT) README='$(top_srcdir)/README' $(SHELL) $(srcdir)/makeman.sh \ '$(top_builddir)/src/httrack$(EXEEXT)' > $(srcdir)/httrack.1 .PHONY: regen-man # Render html/httrack.man.html from httrack.1. Needs the groff html device # (Debian: full "groff" package, not "groff-base"). Run by hand: make -C man regen-man-html # Strip groff's version-stamp and creation-date comments so the committed file # doesn't churn across groff versions or rebuilds; the ci man-page-sync guard # only requires this file to change whenever httrack.1 does. regen-man-html: httrack.1 groff -t -man -Thtml $(srcdir)/httrack.1 \ | sed -e 's/groff version [0-9][0-9.]*/groff/' -e '/^ WIN32;_CONSOLE;_MBCS;ZLIB_CONST;HTS_INTHASH_USES_MD5;WINVER=0x0601;_WIN32_WINNT=0x0601;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)coucal;%(AdditionalIncludeDirectories) Level3 true CompileAsC Console Ws2_32.lib;%(AdditionalDependencies) true _DEBUG;%(PreprocessorDefinitions) Disabled MultiThreadedDebugDLL EnableFastChecks ProgramDatabase NDEBUG;%(PreprocessorDefinitions) MaxSpeed MultiThreadedDLL true true true true true {e76ad871-54c1-45e8-a657-6117adeffb46} httrack-3.49.14/src/proxytrack.vcxproj0000644000175000017500000001163415230602340013427 Debug Win32 Release Win32 Debug x64 Release x64 17.0 {2F9E0E4C-2B5B-4B2E-9F6D-1C0A5E7B3D03} proxytrack 10.0 Application true v143 MultiByte Application false v143 MultiByte true x86-windows x64-windows $(MSBuildThisFileDirectory)$(Platform)\$(Configuration)\ $(MSBuildThisFileDirectory)$(Platform)\$(Configuration)\obj\proxytrack\ proxytrack WIN32;_CONSOLE;_MBCS;NO_MALLOCT;ZLIB_CONST;HTS_INTHASH_USES_MD5;ZLIB_DLL;WINVER=0x0601;_WIN32_WINNT=0x0601;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)coucal;$(MSBuildThisFileDirectory)proxy;%(AdditionalIncludeDirectories) Level3 true CompileAsC Console Ws2_32.lib;%(AdditionalDependencies) true _DEBUG;%(PreprocessorDefinitions) Disabled MultiThreadedDebugDLL EnableFastChecks ProgramDatabase NDEBUG;%(PreprocessorDefinitions) MaxSpeed MultiThreadedDLL true true true true true httrack-3.49.14/src/libhttrack.vcxproj0000644000175000017500000001501215230602340013342 Debug Win32 Release Win32 Debug x64 Release x64 17.0 {E76AD871-54C1-45E8-A657-6117ADEFFB46} libhttrack 10.0 DynamicLibrary true v143 MultiByte DynamicLibrary false v143 MultiByte true x86-windows x64-windows $(MSBuildThisFileDirectory)$(Platform)\$(Configuration)\ $(MSBuildThisFileDirectory)$(Platform)\$(Configuration)\obj\ libhttrack WIN32;_WINDOWS;_MBCS;_USRDLL;LIBHTTRACK_EXPORTS;ZLIB_DLL;HTS_USEBROTLI=1;HTS_USEZSTD=1;WINVER=0x0601;_WIN32_WINNT=0x0601;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)coucal;%(AdditionalIncludeDirectories) Level3 true CompileAsC Ws2_32.lib;Shell32.lib;%(AdditionalDependencies) true _DEBUG;%(PreprocessorDefinitions) Disabled MultiThreadedDebugDLL EnableFastChecks ProgramDatabase NDEBUG;%(PreprocessorDefinitions) MaxSpeed MultiThreadedDLL true true true true true httrack-3.49.14/src/httrack.vcxproj0000644000175000017500000001146015230602340012656 Debug Win32 Release Win32 Debug x64 Release x64 17.0 {2F9E0E4C-2B5B-4B2E-9F6D-1C0A5E7B3D01} httrack 10.0 Application true v143 MultiByte Application false v143 MultiByte true x86-windows x64-windows $(MSBuildThisFileDirectory)$(Platform)\$(Configuration)\ $(MSBuildThisFileDirectory)$(Platform)\$(Configuration)\obj\httrack\ httrack WIN32;_CONSOLE;_MBCS;WINVER=0x0601;_WIN32_WINNT=0x0601;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) $(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)coucal;%(AdditionalIncludeDirectories) Level3 true CompileAsC Console Ws2_32.lib;%(AdditionalDependencies) true _DEBUG;%(PreprocessorDefinitions) Disabled MultiThreadedDebugDLL EnableFastChecks ProgramDatabase NDEBUG;%(PreprocessorDefinitions) MaxSpeed MultiThreadedDLL true true true true true {e76ad871-54c1-45e8-a657-6117adeffb46} httrack-3.49.14/src/vcpkg.json0000644000175000017500000000045015230602340011603 { "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", "name": "libhttrack", "version-string": "3.49", "builtin-baseline": "cd61e1e26a038e82d6550a3ebbe0fbbfe7da78e3", "dependencies": [ "brotli", "openssl", "zlib", "zstd" ] }httrack-3.49.14/src/httrack.rc0000644000175000017500000000037015230602340011565 // Version resource for httrack.exe, the command line program. See version.rc. #define VER_FILE_DESCRIPTION "HTTrack Website Copier (command line)" #define VER_ORIGINAL_FILENAME "httrack.exe" #define VER_FILETYPE VFT_APP #include "version.rc" httrack-3.49.14/src/libhttrack.rc0000644000175000017500000000033415230602340012254 // Version resource for libhttrack.dll. See version.rc. #define VER_FILE_DESCRIPTION "HTTrack Website Copier engine" #define VER_ORIGINAL_FILENAME "libhttrack.dll" #define VER_FILETYPE VFT_DLL #include "version.rc" httrack-3.49.14/src/version.rc0000644000175000017500000000303415230602340011612 // Version resource for libhttrack.dll and httrack.exe. Signing enforces that every // binary in a release names the same product and version, so both need one. // Spelled out here because a VERSIONINFO cannot take a version string apart; // tests/01_engine-version-macros.test fails if this drifts from htsglobal.h. // The per-binary parts come from libhttrack.rc / httrack.rc. #include #ifndef VER_FILE_DESCRIPTION #define VER_FILE_DESCRIPTION "HTTrack Website Copier" #endif #ifndef VER_ORIGINAL_FILENAME #define VER_ORIGINAL_FILENAME "" #endif #ifndef VER_FILETYPE #define VER_FILETYPE VFT_APP #endif VS_VERSION_INFO VERSIONINFO FILEVERSION 3, 49, 14, 0 PRODUCTVERSION 3, 49, 14, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0x0L #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VER_FILETYPE FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" // U.S. English, Unicode BEGIN VALUE "CompanyName", "Xavier Roche" VALUE "FileDescription", VER_FILE_DESCRIPTION VALUE "FileVersion", "3.49.14" VALUE "InternalName", VER_ORIGINAL_FILENAME VALUE "LegalCopyright", "Copyright (C) 1998-2026 Xavier Roche and other contributors. GNU GPL v3 or later." VALUE "OriginalFilename", VER_ORIGINAL_FILENAME VALUE "ProductName", "HTTrack Website Copier" VALUE "ProductVersion", "3.49-14" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END httrack-3.49.14/src/webhttrack0000755000175000017500000001347715230602340011677 #!/bin/bash # # WebHTTrack launcher script # Initializes the htsserver GUI frontend and launch the default browser BROWSEREXE= SRCHBROWSEREXE=(x-www-browser www-browser iceape mozilla firefox-developer-edition firefox icecat iceweasel abrowser firebird galeon konqueror midori opera google-chrome chrome chromium chromium-browser netscape firefox-developer-edition) # shellcheck disable=SC2153 # BROWSER is the standard freedesktop env var, not a typo if test -n "${BROWSER}"; then # sensible-browser will f up if BROWSER is not set SRCHBROWSEREXE=(xdg-open sensible-browser "${SRCHBROWSEREXE[@]}") fi # Patch for Darwin/Mac by Ross Williams if test "$(uname -s)" == "Darwin"; then # Darwin's 'open -W' launches the default browser and waits for it to quit. # Keep it only as a fallback so a configured $BROWSER still wins the search. BROWSEREXEFALLBACK="/usr/bin/open -W" fi BINWD=$(dirname "$0") SRCHPATH=("$BINWD" /usr/local/bin /usr/share/bin /usr/bin /usr/lib/httrack /usr/local/lib/httrack /usr/local/share/httrack /opt/local/bin /sw/bin "${HOME}/usr/bin" "${HOME}/bin") IFS=':' read -ra pathdirs <<<"$PATH" for d in "${pathdirs[@]}"; do # drop empty PATH fields, matching the old echo|tr word-split test -n "$d" && SRCHPATH+=("$d") done SRCHDISTPATH=("$BINWD/../share" "$BINWD/.." /usr/share /usr/local /usr /local /usr/local/share "${HOME}/usr" "${HOME}/usr/share" /opt/local/share /sw "${HOME}/usr/local" "${HOME}/usr/share") ### # And now some famous cuisine function log { echo "$0($$): $*" >&2 return 0 } # Map a POSIX locale ("zh_TW.UTF-8@euro") to its lang.indexes number, English (1) if unknown function lang_index { local locale=$1 indexes=$2 tag n t tag=$(echo "${locale}" | cut -f1 -d'.' | cut -f1 -d'@' | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z_') # a few languages carry a region-specific entry (zh_tw, pt_br); else use the bare language for t in "${tag}" "${tag%%_*}"; do n=$(grep -E "^${t}:" "${indexes}" | cut -f2 -d':') test -n "${n}" && break done test -n "${n}" || n=1 echo "${n}" } function launch_browser { log "Launching $1" browser=$1 url=$2 log "Spawning browser.." ${browser} "${url}" # note: browser can hiddenly use the -remote feature of # mozilla and therefore return immediately log "Browser (or helper) exited" } # First ensure that we can launch the server BINPATH= for i in "${SRCHPATH[@]}"; do ! test -n "${BINPATH}" && test -x "${i}/htsserver" && BINPATH="${i}" done for i in "${SRCHDISTPATH[@]}"; do ! test -n "${DISTPATH}" && test -f "${i}/httrack/lang.def" && DISTPATH="${i}/httrack" done test -n "${BINPATH}" || ! log "Could not find htsserver" || exit 1 test -n "${DISTPATH}" || ! log "Could not find httrack directory" || exit 1 test -f "${DISTPATH}/lang.def" || ! log "Could not find ${DISTPATH}/lang.def" || exit 1 test -f "${DISTPATH}/lang.indexes" || ! log "Could not find ${DISTPATH}/lang.indexes" || exit 1 test -d "${DISTPATH}/lang" || ! log "Could not find ${DISTPATH}/lang" || exit 1 test -d "${DISTPATH}/html" || ! log "Could not find ${DISTPATH}/html" || exit 1 # Locale: POSIX precedence, LC_ALL overrides LC_MESSAGES overrides LANG HTSLANG="${LC_ALL}" ! test -n "${HTSLANG}" && HTSLANG="${LC_MESSAGES}" ! test -n "${HTSLANG}" && HTSLANG="${LANG}" LANGN=$(lang_index "${HTSLANG}" "${DISTPATH}/lang.indexes") # Find the browser # note: not all systems have sensible-browser or www-browser alternative # thefeore, we have to find a bit more if sensible-browser could not be found for i in "${SRCHBROWSEREXE[@]}"; do for j in "${SRCHPATH[@]}"; do if test -x "${j}/${i}"; then BROWSEREXE="${j}/${i}" fi test -n "$BROWSEREXE" && break done test -n "$BROWSEREXE" && break done test -n "$BROWSEREXE" || BROWSEREXE="${BROWSEREXEFALLBACK}" test -n "$BROWSEREXE" || ! log "Could not find any suitable browser" || exit 1 # "browse" command if test "$1" = "browse"; then if test -f "${HOME}/.httrack.ini"; then INDEXF=$(tr '\r' '\n' <"${HOME}/.httrack.ini" | grep -E "^path=" | cut -f2- -d'=') if test -n "${INDEXF}" -a -d "${INDEXF}" -a -f "${INDEXF}/index.html"; then INDEXF="${INDEXF}/index.html" else INDEXF="" fi fi if ! test -n "$INDEXF"; then INDEXF="${HOME}/websites/index.html" fi launch_browser "${BROWSEREXE}" "file://${INDEXF}" exit $? fi # Create a temporary filename TMPSRVFILE="$(mktemp "${TMPDIR:-/tmp}/.webhttrack.XXXXXXXX")" || ! log "Could not create the temporary file ${TMPSRVFILE}" || exit 1 # Launch htsserver binary and setup the server ( "${BINPATH}/htsserver" "${DISTPATH}/" --ppid "$$" path "${HOME}/websites" lang "${LANGN}" "$@" echo SRVURL=error ) >"${TMPSRVFILE}" & # Find the generated SRVURL SRVURL= MAXCOUNT=60 while ! test -n "$SRVURL"; do MAXCOUNT=$((MAXCOUNT - 1)) test $MAXCOUNT -gt 0 || exit 1 test $MAXCOUNT -lt 50 && echo "waiting for server to reply.." SRVURL=$(grep -E URL= "${TMPSRVFILE}" | cut -f2- -d=) test ! "$SRVURL" = "error" || ! log "Could not spawn htsserver" || exit 1 test -n "$SRVURL" || sleep 1 done # Cleanup function # shellcheck disable=SC2120 # $1 is an optional "signal caught" marker; bare calls are intentional function cleanup { test -n "$1" && log "Nasty signal caught, cleaning up.." # Do not kill if browser exited (chrome bug issue) ; server will die itself test -n "$1" && test -f "${TMPSRVFILE}" && SRVPID=$(grep -E PID= "${TMPSRVFILE}" | cut -f2- -d=) test -n "${SRVPID}" && kill -9 "${SRVPID}" test -f "${TMPSRVFILE}" && rm "${TMPSRVFILE}" test -n "$1" && log "..Done" return 0 } # Cleanup in case of emergency trap "cleanup now; exit" HUP INT QUIT PIPE TERM # Got SRVURL, launch browser launch_browser "${BROWSEREXE}" "${SRVURL}" # That's all, folks! trap "" HUP INT QUIT PIPE TERM cleanup exit 0 httrack-3.49.14/src/httrack.h0000644000175000017500000000475415230602340011422 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsshow.c console progress info */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSTOOLS_DEFH #define HTSTOOLS_DEFH #include "htsglobal.h" #include "htscore.h" #include "htssafe.h" #ifndef HTS_DEF_FWSTRUCT_t_StatsBuffer #define HTS_DEF_FWSTRUCT_t_StatsBuffer typedef struct t_StatsBuffer t_StatsBuffer; #endif struct t_StatsBuffer { char name[1024]; char file[1024]; char state[256]; char BIGSTK url_sav[HTS_URLMAXSIZE * 2]; // pour cancel char BIGSTK url_adr[HTS_URLMAXSIZE * 2]; char BIGSTK url_fil[HTS_URLMAXSIZE * 2]; LLint size; LLint sizetot; int offset; // int back; // int actived; // pour disabled }; #ifndef HTS_DEF_FWSTRUCT_t_InpInfo #define HTS_DEF_FWSTRUCT_t_InpInfo typedef struct t_InpInfo t_InpInfo; #endif struct t_InpInfo { int ask_refresh; int refresh; LLint stat_bytes; int stat_time; int lien_n; int lien_tot; int stat_nsocket; int rate; int irate; int ft; LLint stat_written; int stat_updated; int stat_errors; int stat_warnings; int stat_infos; TStamp stat_timestart; int stat_back; }; int main(int argc, char **argv); #endif extern HTSEXT_API hts_stat_struct HTS_STAT; extern int _DEBUG_HEAD; extern FILE *ioinfo; httrack-3.49.14/src/httrack.c0000644000175000017500000007714515230602340011421 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsshow.c console progress info */ /* Only used on Linux & FreeBSD versions */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef _WIN32 #ifndef Sleep #define Sleep(a) { if (((a)*1000)%1000000) usleep(((a)*1000)%1000000); if (((a)*1000)/1000000) sleep(((a)*1000)/1000000); } #endif #endif #include "httrack-library.h" #include "htsglobal.h" #include "htsbase.h" #include "htsopt.h" #include "htsdefines.h" #include "httrack.h" #include "htslib.h" #include "htscharset.h" // after htslib.h: winsock2.h must precede windows.h /* Static definitions */ static int fexist(const char *s); static int linput(FILE * fp, char *s, int max); // htswrap_add #include "htswrap.h" /* specific definitions */ #include #include #include #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #include #if (defined(__linux) && defined(HAVE_EXECINFO_H)) #include #define USES_BACKTRACE #endif /* END specific definitions */ static void __cdecl htsshow_init(t_hts_callbackarg * carg); static void __cdecl htsshow_uninit(t_hts_callbackarg * carg); static int __cdecl htsshow_start(t_hts_callbackarg * carg, httrackp * opt); static int __cdecl htsshow_chopt(t_hts_callbackarg * carg, httrackp * opt); static int __cdecl htsshow_end(t_hts_callbackarg * carg, httrackp * opt); static int __cdecl htsshow_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); static int __cdecl htsshow_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); static int __cdecl htsshow_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file); static int __cdecl htsshow_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back * back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats); static const char *__cdecl htsshow_query(t_hts_callbackarg * carg, httrackp * opt, const char *question); static const char *__cdecl htsshow_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question); static const char *__cdecl htsshow_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question); static int __cdecl htsshow_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status); static int __cdecl htsshow_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status); static void __cdecl htsshow_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile); static void __cdecl htsshow_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file); static void __cdecl htsshow_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *save, int is_new, int is_modified, int not_updated); static int __cdecl htsshow_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link); static int __cdecl htsshow_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag); static int __cdecl htsshow_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, lien_back * back); static int __cdecl htsshow_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); static int __cdecl htsshow_sendheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing); static int __cdecl htsshow_receiveheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming); static void vt_clear(void); static void vt_home(void); // ISO VT100/220 definitions #define VT_COL_TEXT_BLACK "30" #define VT_COL_TEXT_RED "31" #define VT_COL_TEXT_GREEN "32" #define VT_COL_TEXT_YELLOW "33" #define VT_COL_TEXT_BLUE "34" #define VT_COL_TEXT_MAGENTA "35" #define VT_COL_TEXT_CYAN "36" #define VT_COL_TEXT_WHITE "37" #define VT_COL_BACK_BLACK "40" #define VT_COL_BACK_RED "41" #define VT_COL_BACK_GREEN "42" #define VT_COL_BACK_YELLOW "43" #define VT_COL_BACK_BLUE "44" #define VT_COL_BACK_MAGENTA "45" #define VT_COL_BACK_CYAN "46" #define VT_COL_BACK_WHITE "47" // #define VT_GOTOXY(X,Y) "\33["Y";"X"f" #define VT_COLOR(C) "\33["C"m" #define VT_RESET "\33[m" #define VT_REVERSE "\33[7m" #define VT_UNREVERSE "\33[27m" #define VT_BOLD "\33[1m" #define VT_UNBOLD "\33[22m" #define VT_BLINK "\33[5m" #define VT_UNBLINK "\33[25m" // #define VT_CLREOL "\33[K" #define VT_CLRSOL "\33[1K" #define VT_CLRLIN "\33[2K" #define VT_CLREOS "\33[J" #define VT_CLRSOS "\33[1J" #define VT_CLRSCR "\33[2J" // #define csi(X) printf(s_csi( X )); static void vt_clear(void) { printf("%s%s%s", VT_RESET, VT_CLRSCR, VT_GOTOXY("1", "0")); } static void vt_home(void) { printf("%s%s", VT_RESET, VT_GOTOXY("1", "0")); } // /* #define STYLE_STATVALUES VT_COLOR(VT_COL_TEXT_BLACK) #define STYLE_STATTEXT VT_COLOR(VT_COL_TEXT_BLUE) */ #define STYLE_STATVALUES VT_BOLD #define STYLE_STATTEXT VT_UNBOLD #define STYLE_STATRESET VT_UNBOLD #define NStatsBuffer 14 #define MAX_LEN_INPROGRESS 40 static int use_show; static httrackp *global_opt = NULL; static void signal_handlers(void); int main(int argc, char **argv) { int ret = 0; httrackp *opt; #ifdef _WIN32 hts_argv_utf8(&argc, &argv); { WORD wVersionRequested; // requested version WinSock API WSADATA wsadata; // Windows Sockets API data int stat; wVersionRequested = 0x0101; stat = WSAStartup(wVersionRequested, &wsadata); if (stat != 0) { printf("Winsock not found!\n"); return; } else if (LOBYTE(wsadata.wVersion) != 1 && HIBYTE(wsadata.wVersion) != 1) { printf("WINSOCK.DLL does not support version 1.1\n"); WSACleanup(); return; } } #endif signal_handlers(); hts_init(); // Check version compatibility if (hts_sizeof_opt() != sizeof(httrackp)) { fprintf(stderr, "incompatible current httrack library version %s, expected version %s", hts_version(), HTTRACK_VERSIONID); abortLog("incompatible httrack library version, please update both httrack and its library"); } opt = global_opt = hts_create_opt(); assert(opt->size_httrackp == sizeof(httrackp)); CHAIN_FUNCTION(opt, init, htsshow_init, NULL); CHAIN_FUNCTION(opt, uninit, htsshow_uninit, NULL); CHAIN_FUNCTION(opt, start, htsshow_start, NULL); CHAIN_FUNCTION(opt, end, htsshow_end, NULL); CHAIN_FUNCTION(opt, chopt, htsshow_chopt, NULL); CHAIN_FUNCTION(opt, preprocess, htsshow_preprocesshtml, NULL); CHAIN_FUNCTION(opt, postprocess, htsshow_postprocesshtml, NULL); CHAIN_FUNCTION(opt, check_html, htsshow_checkhtml, NULL); CHAIN_FUNCTION(opt, query, htsshow_query, NULL); CHAIN_FUNCTION(opt, query2, htsshow_query2, NULL); CHAIN_FUNCTION(opt, query3, htsshow_query3, NULL); CHAIN_FUNCTION(opt, loop, htsshow_loop, NULL); CHAIN_FUNCTION(opt, check_link, htsshow_check, NULL); CHAIN_FUNCTION(opt, check_mime, htsshow_check_mime, NULL); CHAIN_FUNCTION(opt, pause, htsshow_pause, NULL); CHAIN_FUNCTION(opt, filesave, htsshow_filesave, NULL); CHAIN_FUNCTION(opt, filesave2, htsshow_filesave2, NULL); CHAIN_FUNCTION(opt, linkdetected, htsshow_linkdetected, NULL); CHAIN_FUNCTION(opt, linkdetected2, htsshow_linkdetected2, NULL); CHAIN_FUNCTION(opt, xfrstatus, htsshow_xfrstatus, NULL); CHAIN_FUNCTION(opt, savename, htsshow_savename, NULL); CHAIN_FUNCTION(opt, sendhead, htsshow_sendheader, NULL); CHAIN_FUNCTION(opt, receivehead, htsshow_receiveheader, NULL); ret = hts_main2(argc, argv, opt); if (ret) { fprintf(stderr, "* %s\n", hts_errmsg(opt)); } global_opt = NULL; hts_free_opt(opt); htsthread_wait(); /* wait for pending threads */ hts_uninit(); #ifdef _WIN32 WSACleanup(); #endif return ret; } /* CALLBACK FUNCTIONS */ /* Initialize the Winsock */ static void __cdecl htsshow_init(t_hts_callbackarg * carg) { } static void __cdecl htsshow_uninit(t_hts_callbackarg * carg) { } static int __cdecl htsshow_start(t_hts_callbackarg * carg, httrackp * opt) { use_show = 0; if (opt->verbosedisplay == HTS_VERBOSE_FULL) { use_show = 1; vt_clear(); } return 1; } static int __cdecl htsshow_chopt(t_hts_callbackarg * carg, httrackp * opt) { return htsshow_start(carg, opt); } static int __cdecl htsshow_end(t_hts_callbackarg * carg, httrackp * opt) { return 1; } static int __cdecl htsshow_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { return 1; } static int __cdecl htsshow_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { return 1; } static int __cdecl htsshow_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file) { return 1; } static int __cdecl htsshow_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back * back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats) { // appelé à chaque boucle de HTTrack static TStamp prev_mytime = 0; /* ok */ static t_InpInfo SInfo; /* ok */ // TStamp mytime; long int rate = 0; char st[256]; // int stat_written = -1; int stat_updated = -1; int stat_errors = -1; int stat_warnings = -1; int stat_infos = -1; int nbk = -1; int stat_nsocket = -1; LLint stat_bytes = -1; LLint stat_bytes_recv = -1; int irate = -1; if (stats) { stat_written = stats->stat_files; stat_updated = stats->stat_updated_files; stat_errors = stats->stat_errors; stat_warnings = stats->stat_warnings; stat_infos = stats->stat_infos; nbk = stats->nbk; stat_nsocket = stats->stat_nsocket; irate = (int) stats->rate; stat_bytes = stats->nb; stat_bytes_recv = stats->HTS_TOTAL_RECV; } if (!use_show) return 1; mytime = mtime_local(); if ((stat_time > 0) && (stat_bytes_recv > 0)) rate = (int) (stat_bytes_recv / stat_time); else rate = 0; // pas d'infos /* Infos */ if (stat_bytes >= 0) SInfo.stat_bytes = stat_bytes; // bytes if (stat_time >= 0) SInfo.stat_time = stat_time; // time if (lien_tot >= 0) SInfo.lien_tot = lien_tot; // nb liens if (lien_n >= 0) SInfo.lien_n = lien_n; // scanned SInfo.stat_nsocket = stat_nsocket; // socks if (rate > 0) SInfo.rate = rate; // rate if (irate >= 0) SInfo.irate = irate; // irate if (SInfo.irate < 0) SInfo.irate = SInfo.rate; if (nbk >= 0) SInfo.stat_back = nbk; if (stat_written >= 0) SInfo.stat_written = stat_written; if (stat_updated >= 0) SInfo.stat_updated = stat_updated; if (stat_errors >= 0) SInfo.stat_errors = stat_errors; if (stat_warnings >= 0) SInfo.stat_warnings = stat_warnings; if (stat_infos >= 0) SInfo.stat_infos = stat_infos; if (((mytime - prev_mytime) > 100) || ((mytime - prev_mytime) < 0)) { strc_int2bytes2 strc, strc2, strc3; prev_mytime = mytime; st[0] = '\0'; qsec2str(st, stat_time); vt_home(); printf(VT_GOTOXY("1", "1") VT_CLREOL STYLE_STATTEXT "Bytes saved:" STYLE_STATVALUES " \t%s" "\t" VT_CLREOL VT_GOTOXY("40", "1") STYLE_STATTEXT "Links scanned:" STYLE_STATVALUES " \t%d/%d (+%d)" VT_CLREOL "\n" VT_CLREOL VT_GOTOXY("1", "2") STYLE_STATTEXT "Time:" " \t" STYLE_STATVALUES "%s" "\t" VT_CLREOL VT_GOTOXY("40", "2") STYLE_STATTEXT "Files written:" " \t" STYLE_STATVALUES "%d" VT_CLREOL "\n" VT_CLREOL VT_GOTOXY("1", "3") STYLE_STATTEXT "Transfer rate:" " \t" STYLE_STATVALUES "%s (%s)" "\t" VT_CLREOL VT_GOTOXY("40", "3") STYLE_STATTEXT "Files updated:" " \t" STYLE_STATVALUES "%d" VT_CLREOL "\n" VT_CLREOL VT_GOTOXY("1", "4") STYLE_STATTEXT "Active connections:" " \t" STYLE_STATVALUES "%d" "\t" VT_CLREOL VT_GOTOXY("40", "4") STYLE_STATTEXT "Errors:" STYLE_STATVALUES " \t" STYLE_STATVALUES "%d" VT_CLREOL "\n" STYLE_STATRESET, /* */ (char *) int2bytes(&strc, SInfo.stat_bytes), (int) lien_n, (int) SInfo.lien_tot, (int) nbk, (char *) st, (int) SInfo.stat_written, (char *) int2bytessec(&strc2, SInfo.irate), (char *) int2bytessec(&strc3, SInfo.rate), (int) SInfo.stat_updated, (int) SInfo.stat_nsocket, (int) SInfo.stat_errors /* */ ); // parcourir registre des liens if (back_index >= 0) { // seulement si index passé int j, k; int index = 0; int ok = 0; // idem int l; // idem // t_StatsBuffer StatsBuffer[NStatsBuffer]; { int i; for(i = 0; i < NStatsBuffer; i++) { strcpybuff(StatsBuffer[i].state, ""); strcpybuff(StatsBuffer[i].name, ""); strcpybuff(StatsBuffer[i].file, ""); strcpybuff(StatsBuffer[i].url_sav, ""); StatsBuffer[i].back = 0; StatsBuffer[i].size = 0; StatsBuffer[i].sizetot = 0; } } for(k = 0; k < 2; k++) { // 0: lien en cours 1: autres liens for(j = 0; (j < 3) && (index < NStatsBuffer); j++) { // passe de priorité int _i; for(_i = 0 + k; (_i < max(back_max * k, 1)) && (index < NStatsBuffer); _i++) { // no lien int i = (back_index + _i) % back_max; // commencer par le "premier" (l'actuel) if (back[i].status >= 0) { // signifie "lien actif" ok = 0; switch (j) { case 0: // prioritaire if ((back[i].status > 0) && (back[i].status < 99)) { strcpybuff(StatsBuffer[index].state, "receive"); ok = 1; } break; case 1: if (back[i].status == STATUS_WAIT_HEADERS) { strcpybuff(StatsBuffer[index].state, "request"); ok = 1; } else if (back[i].status == STATUS_CONNECTING) { strcpybuff(StatsBuffer[index].state, "connect"); ok = 1; } else if (back[i].status == STATUS_WAIT_DNS) { strcpybuff(StatsBuffer[index].state, "search"); ok = 1; } else if (back[i].status == STATUS_FTP_TRANSFER) { // ohh le beau ftp snprintf(StatsBuffer[index].state, sizeof(StatsBuffer[index].state), "ftp: %s", back[i].info); ok = 1; } break; default: if (back[i].status == STATUS_READY) { // prêt if (back[i].r.statuscode == 200) { strcpybuff(StatsBuffer[index].state, "ready"); ok = 1; } else if (back[i].r.statuscode >= 100 && back[i].r.statuscode <= 599) { char tempo[256]; tempo[0] = '\0'; infostatuscode(tempo, back[i].r.statuscode); strcpybuff(StatsBuffer[index].state, tempo); ok = 1; } else { strcpybuff(StatsBuffer[index].state, "error"); ok = 1; } } break; } if (ok) { char BIGSTK s[HTS_URLMAXSIZE * 2]; // StatsBuffer[index].back = i; // index pour + d'infos // s[0] = '\0'; strcpybuff(StatsBuffer[index].url_sav, back[i].url_sav); // pour cancel if (strcmp(back[i].url_adr, "file://")) strcatbuff(s, back[i].url_adr); else strcatbuff(s, "localhost"); if (back[i].url_fil[0] != '/') strcatbuff(s, "/"); strcatbuff(s, back[i].url_fil); StatsBuffer[index].file[0] = '\0'; { char *a = strrchr(s, '/'); if (a) { strncatbuff(StatsBuffer[index].file, a, 200); *a = '\0'; } } if ((l = (int) strlen(s)) < MAX_LEN_INPROGRESS) strcpybuff(StatsBuffer[index].name, s); else { // couper StatsBuffer[index].name[0] = '\0'; strncatbuff(StatsBuffer[index].name, s, MAX_LEN_INPROGRESS / 2 - 2); strcatbuff(StatsBuffer[index].name, "..."); strcatbuff(StatsBuffer[index].name, s + l - MAX_LEN_INPROGRESS / 2 + 2); } if (back[i].r.totalsize >= 0) { // taille prédéfinie StatsBuffer[index].sizetot = back[i].r.totalsize; StatsBuffer[index].size = back[i].r.size; } else { // pas de taille prédéfinie if (back[i].status == STATUS_READY) { // prêt StatsBuffer[index].sizetot = back[i].r.size; StatsBuffer[index].size = back[i].r.size; } else { StatsBuffer[index].sizetot = 8192; StatsBuffer[index].size = (back[i].r.size % 8192); } } index++; } } } } } /* LF */ printf("%s\n", VT_CLREOL); /* Display current job */ { int parsing = 0; printf("Current job: "); if (!(parsing = hts_is_parsing(opt, -1))) printf("receiving files"); else { switch (hts_is_testing(opt)) { case 0: printf("parsing HTML file (%d%%)", parsing); break; case 1: printf("parsing HTML file: testing links (%d%%)", parsing); break; case 2: printf("purging files"); break; case 3: printf("loading cache"); break; case 4: printf("waiting (scheduler)"); break; case 5: printf("waiting (throttle)"); break; } } printf("%s\n", VT_CLREOL); } /* Display background jobs */ { int i; for(i = 0; i < NStatsBuffer; i++) { if (strnotempty(StatsBuffer[i].state)) { printf(VT_CLREOL " %s - \t%s%s \t%s / \t%s", StatsBuffer[i].state, StatsBuffer[i].name, StatsBuffer[i].file, int2bytes(&strc, StatsBuffer [i]. size), int2bytes(&strc2, StatsBuffer[i].sizetot) ); } printf("%s\n", VT_CLREOL); } } } } return 1; } static const char *__cdecl htsshow_query(t_hts_callbackarg * carg, httrackp * opt, const char *question) { static char s[12] = ""; /* ok */ printf("%s\nPress to confirm, to abort\n", question); io_flush; linput(stdin, s, 4); return s; } static const char *__cdecl htsshow_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question) { static char s[12] = ""; /* ok */ printf("%s\nPress to confirm, to abort\n", question); io_flush; linput(stdin, s, 4); return s; } static const char *__cdecl htsshow_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question) { static char line[256]; /* ok */ printf("\n" "A link, %s, is located beyond this mirror scope.\n" "What should I do? (type in the choice + enter)\n\n" "* Ignore all further links and do not ask any more questions\n" "0 Ignore this link (default if empty entry)\n" "1 Ignore directory and lower structures\n" "2 Ignore all domain\n" "\n" "4 Get only this page/link, but not links inside this page\n" "5 Mirror this link (useful)\n" "6 Mirror all links located on the same domain as this link\n" "\n", question); do { printf(">> "); io_flush; linput(stdin, line, 200); } while(!strnotempty(line)); printf("ok..\n"); return line; } static int __cdecl htsshow_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status) { return -1; } static int __cdecl htsshow_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status) { return -1; } static void __cdecl htsshow_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile) { while(fexist(lockfile)) { Sleep(1000); } } static void __cdecl htsshow_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file) { } static void __cdecl htsshow_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *save, int is_new, int is_modified, int not_updated) { } static int __cdecl htsshow_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link) { return 1; } static int __cdecl htsshow_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag) { return 1; } static int __cdecl htsshow_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, lien_back * back) { return 1; } static int __cdecl htsshow_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { return 1; } static int __cdecl htsshow_sendheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing) { return 1; } static int __cdecl htsshow_receiveheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming) { return 1; } /* *** Various functions *** */ static int fexist(const char *s) { struct stat st; memset(&st, 0, sizeof(st)); if (stat(s, &st) == 0) { if (S_ISREG(st.st_mode)) { return 1; } } return 0; } static int linput(FILE * fp, char *s, int max) { int c; int j = 0; do { c = fgetc(fp); if (c != EOF) { switch (c) { case 13: break; // sauter CR case 10: c = -1; break; case 9: case 12: break; // sauter ces caractères default: s[j++] = (char) c; break; } } } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j] = '\0'; return j; } // routines de détournement de SIGHUP & co (Unix) // static void sig_ignore(int code) { // ignorer signal } static void sig_term(int code) { // quitter brutalement fprintf(stderr, "\nProgram terminated (signal %d)\n", code); exit(0); } static void sig_finish(int code) { // finir et quitter signal(code, sig_term); // quitter si encore if (global_opt != NULL) { global_opt->state.exit_xh = 1; } fprintf(stderr, "\nExit requested to engine (signal %d)\n", code); } #ifndef _WIN32 static void sig_doback(int blind); static void sig_back(int code) { // ignorer et mettre en backing if (global_opt != NULL && !global_opt->background_on_suspend) { signal(SIGTSTP, SIG_DFL); // ^Z printf("\nInterrupting the program.\n"); fflush(stdout); kill(getpid(), SIGTSTP); } else { // Background the process. signal(code, sig_ignore); sig_doback(0); } } static void sig_brpipe(int code) { // treat if necessary signal(code, sig_brpipe); } static void sig_doback(int blind) { // mettre en backing int out = -1; // printf("\nMoving into background to complete the mirror...\n"); fflush(stdout); if (global_opt != NULL) { // suppress logging and asking lousy questions global_opt->quiet = 1; global_opt->verbosedisplay = HTS_VERBOSE_NONE; } if (!blind) out = open("hts-nohup.out", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); if (out == -1) out = open("/dev/null", O_WRONLY, S_IRUSR | S_IWUSR); dup2(out, 0); dup2(out, 1); dup2(out, 2); // switch (fork()) { case 0: break; case -1: fprintf(stderr, "Error: can not fork process\n"); break; default: // pere _exit(0); break; } } #endif #undef FD_ERR #define FD_ERR 2 static void print_backtrace(void) { #ifdef USES_BACKTRACE void *stack[256]; const int size = backtrace(stack, sizeof(stack)/sizeof(stack[0])); if (size != 0) { backtrace_symbols_fd(stack, size, FD_ERR); } #else const char msg[] = "No stack trace available on this OS :(\n"; if (write(FD_ERR, msg, sizeof(msg) - 1) != sizeof(msg) - 1) { /* sorry GCC */ } #endif } static size_t print_num(char *buffer, int num) { size_t i, j; if (num < 0) { *(buffer++) = '-'; num = -num; } for(i = 0 ; num != 0 || i == 0 ; i++, num /= 10) { buffer[i] = '0' + ( num % 10 ); } for(j = 0 ; j < i ; j++) { const char c = buffer[i - j - 1]; buffer[i - j - 1] = buffer[j]; buffer[j] = c; } buffer[i] = '\0'; return i; } static void sig_fatal(int code) { const char msg[] = "\nCaught signal "; const char msgreport[] = "\nPlease report the problem at http://forum.httrack.com\n"; char buffer[256]; size_t size; signal(code, SIG_DFL); signal(SIGABRT, SIG_DFL); memcpy(buffer, msg, sizeof(msg) - 1); size = sizeof(msg) - 1; size += print_num(&buffer[size], code); buffer[size++] = '\n'; (void) (write(FD_ERR, buffer, size) == size); print_backtrace(); (void) (write(FD_ERR, msgreport, sizeof(msgreport) - 1) == sizeof(msgreport) - 1); abort(); } #undef FD_ERR static void sig_leave(int code) { if (global_opt != NULL && global_opt->state._hts_in_mirror) { signal(code, sig_term); // quitter si encore printf("\n** Finishing pending transfers.. press again ^C to quit.\n"); if (global_opt != NULL) { // ask for stop hts_log_print(global_opt, LOG_ERROR, "Exit requested by shell or user"); global_opt->state.stop = 1; } } else { sig_term(code); } } static void signal_handlers(void) { #ifdef _WIN32 signal(SIGINT, sig_leave); // ^C signal(SIGTERM, sig_finish); // kill #else signal(SIGTSTP, sig_back); // ^Z signal(SIGTERM, sig_finish); // kill signal(SIGINT, sig_leave); // ^C signal(SIGPIPE, sig_brpipe); // broken pipe (write into non-opened socket) signal(SIGCHLD, sig_ignore); // child change status #endif #ifdef SIGABRT signal(SIGABRT, sig_fatal); // abort #endif #ifdef SIGBUS signal(SIGBUS, sig_fatal); // bus error #endif #ifdef SIGILL signal(SIGILL, sig_fatal); // illegal instruction #endif #ifdef SIGSEGV signal(SIGSEGV, sig_fatal); // segmentation violation #endif } // fin routines de détournement de SIGHUP & co httrack-3.49.14/src/htsweb.h0000644000175000017500000001377315230602340011257 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: webhttrack.c routines */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef WEBHTTRACK_WBC #define WEBHTTRACK_WBC #include "htsglobal.h" #include "htscore.h" #define NStatsBuffer 14 #define MAX_LEN_INPROGRESS 40 typedef struct t_StatsBuffer { char name[1024]; char file[1024]; char state[256]; char url_sav[HTS_URLMAXSIZE * 2]; // pour cancel char url_adr[HTS_URLMAXSIZE * 2]; char url_fil[HTS_URLMAXSIZE * 2]; LLint size; LLint sizetot; int offset; // int back; // int actived; // pour disabled } t_StatsBuffer; typedef struct t_InpInfo { int ask_refresh; int refresh; LLint stat_bytes; int stat_time; int lien_n; int lien_tot; int stat_nsocket; int rate; int irate; int ft; LLint stat_written; int stat_updated; int stat_errors; int stat_warnings; int stat_infos; TStamp stat_timestart; int stat_back; } t_InpInfo; // wrappers void __cdecl htsshow_init(t_hts_callbackarg * carg); void __cdecl htsshow_uninit(t_hts_callbackarg * carg); int __cdecl htsshow_start(t_hts_callbackarg * carg, httrackp * opt); int __cdecl htsshow_chopt(t_hts_callbackarg * carg, httrackp * opt); int __cdecl htsshow_end(t_hts_callbackarg * carg, httrackp * opt); int __cdecl htsshow_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); int __cdecl htsshow_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file); int __cdecl htsshow_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file); int __cdecl htsshow_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back * back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats); const char *__cdecl htsshow_query(t_hts_callbackarg * carg, httrackp * opt, const char *question); const char *__cdecl htsshow_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question); const char *__cdecl htsshow_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question); int __cdecl htsshow_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status); int __cdecl htsshow_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status); void __cdecl htsshow_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile); void __cdecl htsshow_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file); void __cdecl htsshow_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *save, int is_new, int is_modified, int not_updated); int __cdecl htsshow_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link); int __cdecl htsshow_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag); int __cdecl htsshow_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, lien_back * back); int __cdecl htsshow_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); int __cdecl htsshow_sendheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing); int __cdecl htsshow_receiveheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming); int main(int argc, char **argv); void webhttrack_main(char *cmd); void webhttrack_lock(void); void webhttrack_release(void); #endif httrack-3.49.14/src/htsweb.c0000644000175000017500000006622615230602340011253 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: webhttrack.c routines */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include #include #include #include #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #include #ifndef _WIN32 #include #endif // htswrap_add #include "htsglobal.h" #include "htsbasenet.h" #include "htswrap.h" #include "httrack-library.h" #include "htsdefines.h" /* Threads */ #include "htsthread.h" /* External modules */ #include "coucal.c" #include "htsmd5.c" #include "md5.c" #include "htsserver.h" #include "htsurlport.h" #include "htsweb.h" #include "htscharset.h" #if USE_BEGINTHREAD==0 #error fatal: no threads support #endif #ifdef _WIN32 #ifndef __cplusplus // DOS #include /* _beginthread, _endthread */ #endif #else #endif #undef DEBUG #if 0 #define DEBUG(A) do { A; } while(0) #else #define DEBUG(A) do {} while(0) #endif static htsmutex refreshMutex = HTSMUTEX_INIT; static int help_server(char *dest_path, int defaultPort); extern int commandRunning; extern int commandEnd; extern int commandReturn; extern int commandEndRequested; extern char *commandReturnMsg; extern char *commandReturnCmdl; static void htsweb_sig_brpipe(int code) { /* ignore */ } /* Number of background threads */ static int background_threads = 0; /* Server/client ping handling */ static htsmutex pingMutex = HTSMUTEX_INIT; static unsigned int pingId = 0; static unsigned int getPingId(void) { unsigned int id; hts_mutexlock(&pingMutex); id = pingId; hts_mutexrelease(&pingMutex); return id; } static void ping(void) { hts_mutexlock(&pingMutex); pingId++; hts_mutexrelease(&pingMutex); } static void client_ping(void *pP) { #ifndef _WIN32 /* Timeout to 120s ; normally client pings every 30 second */ static int timeout = 120; /* Wait for parent to die (legacy browser mode). */ const pid_t ppid = (pid_t) (uintptr_t) pP; while (!kill(ppid, 0)) { sleep(1); } /* Parent (webhttrack script) is dead: is client pinging ? */ for(;;) { unsigned int id = getPingId(); sleep(timeout); if (getPingId() == id) { break; } } /* Die! */ fprintf(stderr, "Parent process %d died, and client did not ping for %ds: exiting!\n", (int) ppid, timeout); exit(EXIT_FAILURE); #endif } static void pingHandler(void*arg) { ping(); } int main(int argc, char *argv[]) { int i; int ret = 0; int defaultPort = 0; int parentPid = 0; printf("Initializing the server..\n"); #ifdef _WIN32 hts_argv_utf8(&argc, &argv); { WORD wVersionRequested; // requested version WinSock API WSADATA wsadata; // Windows Sockets API data int stat; wVersionRequested = 0x0101; stat = WSAStartup(wVersionRequested, &wsadata); if (stat != 0) { fprintf(stderr, "Winsock not found!\n"); return -1; } else if (LOBYTE(wsadata.wVersion) != 1 && HIBYTE(wsadata.wVersion) != 1) { fprintf(stderr, "WINSOCK.DLL does not support version 1.1\n"); WSACleanup(); return -1; } } #endif if (argc < 2 || (argc % 2) != 0) { fprintf(stderr, "** Warning: use the webhttrack frontend if available\n"); fprintf(stderr, "usage: %s [--port ] [--ppid parent-pid] [key value [key value]..]\n", argv[0]); fprintf(stderr, "example: %s /usr/share/httrack/\n", argv[0]); return 1; } /* init and launch */ hts_init(); htslang_init(); /* set general keys */ #ifdef HTS_ETCPATH smallserver_setkey("ETCPATH", HTS_ETCPATH); #endif #ifdef HTS_BINPATH smallserver_setkey("BINPATH", HTS_BINPATH); #endif #ifdef HTS_LIBPATH smallserver_setkey("LIBPATH", HTS_LIBPATH); #endif #ifdef HTS_PREFIX smallserver_setkey("PREFIX", HTS_PREFIX); #endif #ifdef HTS_HTTRACKCNF smallserver_setkey("HTTRACKCNF", HTS_HTTRACKCNF); #endif #ifdef HTS_HTTRACKDIR smallserver_setkey("HTTRACKDIR", HTS_HTTRACKDIR); #endif #ifdef HTS_INET6 smallserver_setkey("INET6", "1"); #endif #ifdef HTS_USEOPENSSL smallserver_setkey("USEOPENSSL", "1"); #endif #ifdef HTS_DLOPEN smallserver_setkey("DLOPEN", "1"); #endif #ifdef HTS_USESWF smallserver_setkey("USESWF", "1"); #endif #ifdef HTS_USEZLIB smallserver_setkey("USEZLIB", "1"); #endif #ifdef _WIN32 smallserver_setkey("WIN32", "1"); #endif smallserver_setkey("HTTRACK_VERSION", HTTRACK_VERSION); smallserver_setkey("HTTRACK_VERSIONID", HTTRACK_VERSIONID); smallserver_setkey("HTTRACK_AFF_VERSION", HTTRACK_AFF_VERSION); { char tmp[32]; snprintf(tmp, sizeof(tmp), "%d", -1); smallserver_setkey("HTS_PLATFORM", tmp); } smallserver_setkey("HTTRACK_WEB", HTTRACK_WEB); /* Check version compatibility */ if (hts_sizeof_opt() != sizeof(httrackp)) { fprintf(stderr, "** CRITICAL: incompatible current httrack library version %s, expected version %s", hts_version(), HTTRACK_VERSIONID); smallserver_setkey("HTTRACK_INCOMPATIBLE_VERSIONID", hts_version()); } /* protected session-id */ { char buff[1024]; char digest[32 + 2]; srand((unsigned int) time(NULL)); snprintf(buff, sizeof(buff), "%d-%d", (int) time(NULL), (int) rand()); domd5mem(buff, strlen(buff), digest, 1); smallserver_setkey("sid", digest); smallserver_setkey("_sid", digest); } /* set commandline keys */ for(i = 2; i < argc; i += 2) { if (strcmp(argv[i], "--port") == 0 && i + 1 < argc) { // the range check ran after sscanf("%d") had wrapped a huge value into a // plausible port, and listened there (#614). 0 (was the auto-pick) and // 65535 (was refused, off by one) now both mean what they say. if (!hts_parse_url_port(argv[i + 1], &defaultPort)) { fprintf(stderr, "couldn't set the port number to %s\n", argv[i + 1]); return -1; } } else if (strcmp(argv[i], "--ppid") == 0 && i + 1 < argc) { if (sscanf(argv[i + 1], "%u", &parentPid) != 1) { fprintf(stderr, "couldn't set the parent PID to %s\n", argv[i + 1]); return -1; } } else if (i + 1 < argc) { smallserver_setkey(argv[i], argv[i + 1]); } else { fprintf(stderr, "Error in commandline!\n"); return -1; } } /* sigpipe */ #ifndef _WIN32 signal(SIGPIPE, htsweb_sig_brpipe); // broken pipe (write into non-opened socket) #endif /* pinger */ if (parentPid > 0) { hts_newthread(client_ping, (void *) (uintptr_t) parentPid); background_threads++; /* Do not wait for this thread! */ smallserver_setpinghandler(pingHandler, NULL); } /* launch */ ret = help_server(argv[1], defaultPort); htsthread_wait_n(background_threads - 1); hts_uninit(); #ifdef _WIN32 WSACleanup(); #endif return ret; } static int webhttrack_runmain(httrackp * opt, int argc, char **argv); static void back_launch_cmd(void *pP) { char *cmd = (char *) pP; char **argv = (char **) malloct(1024 * sizeof(char *)); int argc = 0; int i = 0; int g = 0; // httrackp *opt; /* copy commandline */ if (commandReturnCmdl) free(commandReturnCmdl); commandReturnCmdl = strdup(cmd); /* split */ argv[0] = strdup("webhttrack"); argv[1] = cmd; argc++; i = 0; while(cmd[i]) { if (cmd[i] == '\t' || cmd[i] == '\r' || cmd[i] == '\n') { cmd[i] = ' '; } i++; } i = 0; while(cmd[i]) { if (cmd[i] == '\"') g = !g; if (cmd[i] == ' ') { if (!g) { cmd[i] = '\0'; argv[argc++] = cmd + i + 1; } } i++; } /* init */ hts_init(); global_opt = opt = hts_create_opt(); assert(opt->size_httrackp == sizeof(httrackp)); /* run */ commandReturn = webhttrack_runmain(opt, argc, argv); if (commandReturn) { if (commandReturnMsg) free(commandReturnMsg); commandReturnMsg = strdup(hts_errmsg(opt)); } /* free */ global_opt = NULL; hts_free_opt(opt); hts_uninit(); /* okay */ commandRunning = 0; /* finished */ commandEnd = 1; DEBUG(fprintf(stderr, "commandEnd=1\n")); /* free */ free(cmd); freet(argv); return; } void webhttrack_main(char *cmd) { commandRunning = 1; DEBUG(fprintf(stderr, "commandRunning=1\n")); hts_newthread(back_launch_cmd, (void *) strdup(cmd)); background_threads++; /* Do not wait for this thread! */ } void webhttrack_lock(void) { hts_mutexlock(&refreshMutex); } void webhttrack_release(void) { hts_mutexrelease(&refreshMutex); } static int webhttrack_runmain(httrackp * opt, int argc, char **argv) { int ret; CHAIN_FUNCTION(opt, init, htsshow_init, NULL); CHAIN_FUNCTION(opt, uninit, htsshow_uninit, NULL); CHAIN_FUNCTION(opt, start, htsshow_start, NULL); CHAIN_FUNCTION(opt, end, htsshow_end, NULL); CHAIN_FUNCTION(opt, chopt, htsshow_chopt, NULL); CHAIN_FUNCTION(opt, preprocess, htsshow_preprocesshtml, NULL); CHAIN_FUNCTION(opt, postprocess, htsshow_postprocesshtml, NULL); CHAIN_FUNCTION(opt, check_html, htsshow_checkhtml, NULL); CHAIN_FUNCTION(opt, query, htsshow_query, NULL); CHAIN_FUNCTION(opt, query2, htsshow_query2, NULL); CHAIN_FUNCTION(opt, query3, htsshow_query3, NULL); CHAIN_FUNCTION(opt, loop, htsshow_loop, NULL); CHAIN_FUNCTION(opt, check_link, htsshow_check, NULL); CHAIN_FUNCTION(opt, check_mime, htsshow_check_mime, NULL); CHAIN_FUNCTION(opt, pause, htsshow_pause, NULL); CHAIN_FUNCTION(opt, filesave, htsshow_filesave, NULL); CHAIN_FUNCTION(opt, filesave2, htsshow_filesave2, NULL); CHAIN_FUNCTION(opt, linkdetected, htsshow_linkdetected, NULL); CHAIN_FUNCTION(opt, linkdetected2, htsshow_linkdetected2, NULL); CHAIN_FUNCTION(opt, xfrstatus, htsshow_xfrstatus, NULL); CHAIN_FUNCTION(opt, savename, htsshow_savename, NULL); CHAIN_FUNCTION(opt, sendhead, htsshow_sendheader, NULL); CHAIN_FUNCTION(opt, receivehead, htsshow_receiveheader, NULL); /* Rock'in! */ ret = hts_main2(argc, argv, opt); /* Wait for pending threads to finish */ htsthread_wait_n(background_threads); return ret; } static int help_server(char *dest_path, int defaultPort) { int returncode = 0; char adr_prox[HTS_URLMAXSIZE * 2]; int port_prox; T_SOC soc = smallserver_init_std(&port_prox, adr_prox, defaultPort); if (soc != INVALID_SOCKET) { char url[HTS_URLMAXSIZE * 2]; char method[32]; char data[32768]; url[0] = method[0] = data[0] = '\0'; // printf("Okay, temporary server installed.\nThe URL is:\n"); printf("URL=http://%s:%d/\n", adr_prox, port_prox); #ifndef _WIN32 { pid_t pid = getpid(); printf("PID=%d\n", (int) pid); } #endif fflush(stdout); fflush(stderr); // if (!smallserver(soc, url, method, data, dest_path)) { int last_errno = errno; fprintf(stderr, "Unable to create the server: %s\n", strerror(last_errno)); #ifdef _WIN32 closesocket(soc); #else close(soc); #endif printf("Done\n"); returncode = 1; } else { returncode = 0; } } else { fprintf(stderr, "Unable to initialize a temporary server (no remaining port)\n"); returncode = 1; } printf("EXITED\n"); fflush(stdout); fflush(stderr); return returncode; } /* CALLBACK FUNCTIONS */ /* Initialize the Winsock */ void __cdecl htsshow_init(t_hts_callbackarg * carg) { } void __cdecl htsshow_uninit(t_hts_callbackarg * carg) { } int __cdecl htsshow_start(t_hts_callbackarg * carg, httrackp * opt) { DEBUG(fprintf(stderr, "htsshow_start()\n")); return 1; } int __cdecl htsshow_chopt(t_hts_callbackarg * carg, httrackp * opt) { return htsshow_start(carg, opt); } int __cdecl htsshow_end(t_hts_callbackarg * carg, httrackp * opt) { DEBUG(fprintf(stderr, "htsshow_end()\n")); return 1; } int __cdecl htsshow_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { return 1; } int __cdecl htsshow_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_address, const char *url_file) { return 1; } int __cdecl htsshow_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_address, const char *url_file) { return 1; } int __cdecl htsshow_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back * back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats) { // appelé à chaque boucle de HTTrack static TStamp prev_mytime = 0; /* ok */ static t_InpInfo SInfo; /* ok */ // TStamp mytime; long int rate = 0; // int stat_written = -1; int stat_updated = -1; int stat_errors = -1; int stat_warnings = -1; int stat_infos = -1; int nbk = -1; int stat_nsocket = -1; LLint stat_bytes = -1; LLint stat_bytes_recv = -1; int irate = -1; // char st[256]; /* Exit now */ if (commandEndRequested == 2) return 0; /* Lock */ webhttrack_lock(); if (stats) { stat_written = stats->stat_files; stat_updated = stats->stat_updated_files; stat_errors = stats->stat_errors; stat_warnings = stats->stat_warnings; stat_infos = stats->stat_infos; nbk = stats->nbk; stat_nsocket = stats->stat_nsocket; irate = (int) stats->rate; stat_bytes = stats->nb; stat_bytes_recv = stats->HTS_TOTAL_RECV; } mytime = mtime_local(); if ((stat_time > 0) && (stat_bytes_recv > 0)) rate = (int) (stat_bytes_recv / stat_time); else rate = 0; // pas d'infos /* Infos */ if (stat_bytes >= 0) SInfo.stat_bytes = stat_bytes; // bytes if (stat_time >= 0) SInfo.stat_time = stat_time; // time if (lien_tot >= 0) SInfo.lien_tot = lien_tot; // nb liens if (lien_n >= 0) SInfo.lien_n = lien_n; // scanned SInfo.stat_nsocket = stat_nsocket; // socks if (rate > 0) SInfo.rate = rate; // rate if (irate >= 0) SInfo.irate = irate; // irate if (SInfo.irate < 0) SInfo.irate = SInfo.rate; if (nbk >= 0) SInfo.stat_back = nbk; if (stat_written >= 0) SInfo.stat_written = stat_written; if (stat_updated >= 0) SInfo.stat_updated = stat_updated; if (stat_errors >= 0) SInfo.stat_errors = stat_errors; if (stat_warnings >= 0) SInfo.stat_warnings = stat_warnings; if (stat_infos >= 0) SInfo.stat_infos = stat_infos; st[0] = '\0'; qsec2str(st, stat_time); /* Set keys */ smallserver_setkeyint("info.stat_bytes", SInfo.stat_bytes); smallserver_setkeyint("info.stat_time", SInfo.stat_time); smallserver_setkeyint("info.lien_tot", SInfo.lien_tot); smallserver_setkeyint("info.lien_n", SInfo.lien_n); smallserver_setkeyint("info.stat_nsocket", SInfo.stat_nsocket); smallserver_setkeyint("info.rate", SInfo.rate); smallserver_setkeyint("info.irate", SInfo.irate); smallserver_setkeyint("info.stat_back", SInfo.stat_back); smallserver_setkeyint("info.stat_written", SInfo.stat_written); smallserver_setkeyint("info.stat_updated", SInfo.stat_updated); smallserver_setkeyint("info.stat_errors", SInfo.stat_errors); smallserver_setkeyint("info.stat_warnings", SInfo.stat_warnings); smallserver_setkeyint("info.stat_infos", SInfo.stat_infos); /* */ smallserver_setkey("info.stat_time_str", st); if (((mytime - prev_mytime) > 100) || ((mytime - prev_mytime) < 0)) { prev_mytime = mytime; // parcourir registre des liens if (back_index >= 0 && back_max > 0) { // seulement si index passé int j, k; int index = 0; int ok = 0; // idem int l; // idem // t_StatsBuffer StatsBuffer[NStatsBuffer]; { int i; for(i = 0; i < NStatsBuffer; i++) { strcpybuff(StatsBuffer[i].state, ""); strcpybuff(StatsBuffer[i].name, ""); strcpybuff(StatsBuffer[i].file, ""); strcpybuff(StatsBuffer[i].url_sav, ""); StatsBuffer[i].back = 0; StatsBuffer[i].size = 0; StatsBuffer[i].sizetot = 0; } } for(k = 0; k < 2; k++) { // 0: lien en cours 1: autres liens for(j = 0; (j < 3) && (index < NStatsBuffer); j++) { // passe de priorité int _i; for(_i = 0 + k; (_i < max(back_max * k, 1)) && (index < NStatsBuffer); _i++) { // no lien int i = (back_index + _i) % back_max; // commencer par le "premier" (l'actuel) if (back[i].status >= 0) { // signifie "lien actif" ok = 0; switch (j) { case 0: // prioritaire if ((back[i].status > 0) && (back[i].status < 99)) { strcpybuff(StatsBuffer[index].state, "receive"); ok = 1; } break; case 1: if (back[i].status == STATUS_WAIT_HEADERS) { strcpybuff(StatsBuffer[index].state, "request"); ok = 1; } else if (back[i].status == STATUS_CONNECTING) { strcpybuff(StatsBuffer[index].state, "connect"); ok = 1; } else if (back[i].status == STATUS_WAIT_DNS) { strcpybuff(StatsBuffer[index].state, "search"); ok = 1; } else if (back[i].status == STATUS_FTP_TRANSFER) { // ohh le beau ftp char proto[] = "ftp"; if (back[i].url_adr[0]) { char *ep = strchr(back[i].url_adr, ':'); char *eps = strchr(back[i].url_adr, '/'); int count; if (ep != NULL && ep < eps && (count = (int) (ep - back[i].url_adr)) < 4) { proto[0] = '\0'; strncat(proto, back[i].url_adr, count); } } snprintf(StatsBuffer[index].state, sizeof(StatsBuffer[index].state), "%s: %s", proto, back[i].info); ok = 1; } break; default: if (back[i].status == STATUS_READY) { // prêt if (back[i].r.statuscode == HTTP_OK) { strcpybuff(StatsBuffer[index].state, "ready"); ok = 1; } else if (back[i].r.statuscode >= 100 && back[i].r.statuscode <= 599) { char tempo[256]; tempo[0] = '\0'; infostatuscode(tempo, back[i].r.statuscode); strcpybuff(StatsBuffer[index].state, tempo); ok = 1; } else { strcpybuff(StatsBuffer[index].state, "error"); ok = 1; } } break; } if (ok) { char s[HTS_URLMAXSIZE * 2]; // StatsBuffer[index].back = i; // index pour + d'infos // s[0] = '\0'; strcpybuff(StatsBuffer[index].url_sav, back[i].url_sav); // pour cancel if (strcmp(back[i].url_adr, "file://")) strcatbuff(s, back[i].url_adr); else strcatbuff(s, "localhost"); if (back[i].url_fil[0] != '/') strcatbuff(s, "/"); strcatbuff(s, back[i].url_fil); StatsBuffer[index].file[0] = '\0'; { char *a = strrchr(s, '/'); if (a) { strncatbuff(StatsBuffer[index].file, a, 200); *a = '\0'; } } if ((l = (int) strlen(s)) < MAX_LEN_INPROGRESS) strcpybuff(StatsBuffer[index].name, s); else { // couper StatsBuffer[index].name[0] = '\0'; strncatbuff(StatsBuffer[index].name, s, MAX_LEN_INPROGRESS / 2 - 2); strcatbuff(StatsBuffer[index].name, "..."); strcatbuff(StatsBuffer[index].name, s + l - MAX_LEN_INPROGRESS / 2 + 2); } if (back[i].r.totalsize > 0) { // taille prédéfinie StatsBuffer[index].sizetot = back[i].r.totalsize; StatsBuffer[index].size = back[i].r.size; } else { // pas de taille prédéfinie if (back[i].status == STATUS_READY) { // prêt StatsBuffer[index].sizetot = back[i].r.size; StatsBuffer[index].size = back[i].r.size; } else { StatsBuffer[index].sizetot = 8192; StatsBuffer[index].size = (back[i].r.size % 8192); } } index++; } } } } } /* Display current job */ { int parsing = 0; if (commandEndRequested) smallserver_setkey("info.currentjob", "finishing pending transfers - Select [Cancel] to stop now!"); else if (!(parsing = hts_is_parsing(opt, -1))) smallserver_setkey("info.currentjob", "receiving files"); else { char tmp[1024]; tmp[0] = '\0'; switch (hts_is_testing(opt)) { case 0: snprintf(tmp, sizeof(tmp), "parsing HTML file (%d%%)", parsing); break; case 1: snprintf(tmp, sizeof(tmp), "parsing HTML file: testing links (%d%%)", parsing); break; case 2: snprintf(tmp, sizeof(tmp), "purging files"); break; case 3: snprintf(tmp, sizeof(tmp), "loading cache"); break; case 4: snprintf(tmp, sizeof(tmp), "waiting (scheduler)"); break; case 5: snprintf(tmp, sizeof(tmp), "waiting (throttle)"); break; } smallserver_setkey("info.currentjob", tmp); } } /* Display background jobs */ { int i; for(i = 0; i < NStatsBuffer; i++) { if (strnotempty(StatsBuffer[i].state)) { strc_int2bytes2 strc; smallserver_setkeyarr("info.state[", i, "]", StatsBuffer[i].state); smallserver_setkeyarr("info.name[", i, "]", StatsBuffer[i].name); smallserver_setkeyarr("info.file[", i, "]", StatsBuffer[i].file); smallserver_setkeyarr("info.size[", i, "]", int2bytes(&strc, StatsBuffer[i].size)); smallserver_setkeyarr("info.sizetot[", i, "]", int2bytes(&strc, StatsBuffer[i].sizetot)); smallserver_setkeyarr("info.url_adr[", i, "]", StatsBuffer[i].url_adr); smallserver_setkeyarr("info.url_fil[", i, "]", StatsBuffer[i].url_fil); smallserver_setkeyarr("info.url_sav[", i, "]", StatsBuffer[i].url_sav); } } } } } /* UnLock */ webhttrack_release(); return 1; } const char *__cdecl htsshow_query(t_hts_callbackarg * carg, httrackp * opt, const char *question) { static char s[] = ""; /* ok */ return s; } const char *__cdecl htsshow_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question) { static char s[] = ""; /* ok */ return s; } const char *__cdecl htsshow_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question) { static char s[] = ""; /* ok */ return s; } int __cdecl htsshow_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status) { return -1; } int __cdecl htsshow_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status) { return -1; } void __cdecl htsshow_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile) { } void __cdecl htsshow_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file) { } void __cdecl htsshow_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *save, int is_new, int is_modified, int not_updated) { } int __cdecl htsshow_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link) { return 1; } int __cdecl htsshow_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag) { return 1; } int __cdecl htsshow_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, lien_back * back) { return 1; } int __cdecl htsshow_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { return 1; } int __cdecl htsshow_sendheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing) { return 1; } int __cdecl htsshow_receiveheader(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming) { return 1; } httrack-3.49.14/src/htsserver.h0000644000175000017500000002071015230602340011775 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Mini-server */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ // Fichier intercepteur d'URL .h #ifndef HTS_SERVER_DEFH #define HTS_SERVER_DEFH #include #include "htsnet.h" /* String */ #include "htsstrings.h" // Fonctions void socinput(T_SOC soc, char *s, int max); T_SOC smallserver_init_std(int *port_prox, char *adr_prox, int defaultPort); T_SOC smallserver_init(int *port, char *adr); int smallserver(T_SOC soc, char *url, char *method, char *data, char *path); #define CATCH_RESPONSE \ "HTTP/1.0 200 OK\r\n"\ "Content-type: text/html\r\n"\ "\r\n"\ "\r\n"\ "\r\n"\ "Link caught!\r\n"\ "\r\n"\ "\r\n"\ "\r\n"\ "

Link captured into HTTrack Website Copier, you can now restore your proxy preferences!

\r\n"\ "

\r\n"\ "

Clic here to go back

\r\n"\ ""\ "\r\n"\ "\r\n"\ extern int NewLangStrSz; extern coucal NewLangStr; extern int NewLangStrKeysSz; extern coucal NewLangStrKeys; extern int NewLangListSz; extern coucal NewLangList; extern httrackp *global_opt; /* Spaces: CR,LF,TAB,FF */ #define is_space(c) ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') ) #define is_realspace(c) ( ((c)==' ') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) ) #define is_taborspace(c) ( ((c)==' ') || ((c)==9) ) #define is_quote(c) ( ((c)=='\"') || ((c)=='\'') ) #define is_retorsep(c) ( ((c)==10) || ((c)==13) || ((c)==9) ) #undef min #undef max #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) extern void smallserver_setpinghandler(void (*fun)(void*), void*arg); extern int smallserver_setkey(const char *key, const char *value); extern int smallserver_setkeyint(const char *key, LLint value); extern int smallserver_setkeyarr(const char *key, int id, const char *key2, const char *value); int htslang_init(void); int htslang_uninit(void); /* Static definitions */ HTS_UNUSED static const char *gethomedir(void); HTS_UNUSED static int linput_cpp(FILE * fp, char *s, int max); HTS_UNUSED static int linput_trim(FILE * fp, char *s, int max); HTS_UNUSED static int fexist(const char *s); HTS_UNUSED static int linput(FILE * fp, char *s, int max); HTS_UNUSED static int linputsoc(T_SOC soc, char *s, int max) { int c; int j = 0; do { unsigned char ch; if (recv(soc, &ch, 1, 0) == 1) { c = ch; } else { c = EOF; } if (c != EOF) { switch (c) { case 13: break; // sauter CR case 10: c = -1; break; case 9: case 12: break; // sauter ces caractères default: s[j++] = (char) c; break; } } } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j] = '\0'; return j; } HTS_UNUSED static int check_readinput_t(T_SOC soc, int timeout) { if (soc != INVALID_SOCKET) { fd_set fds; // poll structures struct timeval tv; // structure for select FD_ZERO(&fds); FD_SET(soc, &fds); tv.tv_sec = timeout; tv.tv_usec = 0; select((int) soc + 1, &fds, NULL, NULL, &tv); if (FD_ISSET(soc, &fds)) return 1; else return 0; } else return 0; } HTS_UNUSED static int linputsoc_t(T_SOC soc, char *s, int max, int timeout) { if (check_readinput_t(soc, timeout)) { return linputsoc(soc, s, max); } return -1; } /* Same contract as hts_gethome(), which is hidden and out of reach from here */ static const char *gethomedir(void) { const char *home = getenv("HOME"); /* An empty $HOME would put the base path and httrack.ini at the root */ return strnotempty(home) ? home : "."; } static int linput_cpp(FILE * fp, char *s, int max) { int rlen = 0; s[0] = '\0'; do { int ret; if (rlen > 0) if (s[rlen - 1] == '\\') s[--rlen] = '\0'; // couper \ final // lire ligne ret = linput_trim(fp, s + rlen, max - rlen); if (ret > 0) rlen += ret; } while((s[max(rlen - 1, 0)] == '\\') && (rlen < max)); return rlen; } static int fexist(const char *s) { struct stat st; memset(&st, 0, sizeof(st)); if (stat(s, &st) == 0) { if (S_ISREG(st.st_mode)) { return 1; } } return 0; } static int linput(FILE * fp, char *s, int max) { int c; int j = 0; do { c = fgetc(fp); if (c != EOF) { switch (c) { case 13: break; // sauter CR case 10: c = -1; break; case 0: case 9: case 12: break; // sauter ces caractères default: s[j++] = (char) c; break; } } } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j] = '\0'; return j; } static int linput_trim(FILE * fp, char *s, int max) { int rlen = 0; char *ls = (char *) malloc(max + 1); s[0] = '\0'; if (ls) { char *a; // lire ligne rlen = linput(fp, ls, max); if (rlen) { // sauter espaces et tabs en fin while((rlen > 0) && is_realspace(ls[max(rlen - 1, 0)])) ls[--rlen] = '\0'; // sauter espaces en début a = ls; while((rlen > 0) && ((*a == ' ') || (*a == '\t'))) { a++; rlen--; } if (rlen > 0) { memcpy(s, a, rlen); // can copy \0 chars s[rlen] = '\0'; } } // free(ls); } return rlen; } static int ehexh(char c) { if ((c >= '0') && (c <= '9')) return c - '0'; if ((c >= 'a') && (c <= 'f')) c -= ('a' - 'A'); if ((c >= 'A') && (c <= 'F')) return (c - 'A' + 10); return 0; } static int ehex(const char *s) { return 16 * ehexh(*s) + ehexh(*(s + 1)); } HTS_UNUSED static void unescapehttp(const char *s, String * tempo) { size_t i; for(i = 0; s[i] != '\0'; i++) { if (s[i] == '%' && s[i + 1] == '%') { i++; StringAddchar(*tempo, '%'); } else if (s[i] == '%') { char hc; i++; hc = (char) ehex(s + i); StringAddchar(*tempo, (char) hc); i++; // sauter 2 caractères finalement } else if (s[i] == '+') { StringAddchar(*tempo, ' '); } else StringAddchar(*tempo, s[i]); } } HTS_UNUSED static void unescapeini(char *s, String * tempo) { size_t i; char lastc = 0; for(i = 0; s[i] != '\0'; i++) { if (s[i] == '%' && s[i + 1] == '%') { i++; StringAddchar(*tempo, lastc = '%'); } else if (s[i] == '%') { char hc; i++; hc = (char) ehex(s + i); if (!is_retorsep(hc) || !is_retorsep(lastc)) { StringAddchar(*tempo, lastc = (char) hc); } i++; // sauter 2 caractères finalement } else StringAddchar(*tempo, lastc = s[i]); } } #endif httrack-3.49.14/src/htsserver.c0000644000175000017500000016264715230602340012010 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Mini-server */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* specific definitions */ /* specific definitions */ /* Bypass internal definition protection */ #define HTS_INTERNAL_BYTECODE #include "htsbase.h" #undef HTS_INTERNAL_BYTECODE #include "htsnet.h" #include "htslib.h" #include "htscharset.h" #include #include #include #include #include #ifdef _WIN32 #else #include #endif #ifndef _WIN32 #include #endif /* END specific definitions */ /* définitions globales */ #include "htsglobal.h" /* htslib */ /*#include "htslib.h"*/ /* HTTrack Website Copier Library */ #include "httrack-library.h" /* Language files */ /* Bypass internal definition protection */ #define HTS_INTERNAL_BYTECODE #include "coucal.h" #undef HTS_INTERNAL_BYTECODE int NewLangStrSz = 1024; coucal NewLangStr = NULL; int NewLangStrKeysSz = 1024; coucal NewLangStrKeys = NULL; int NewLangListSz = 1024; coucal NewLangList = NULL; /* Language files */ #include "htsserver.h" const char *gethomedir(void); int commandRunning = 0; int commandEndRequested = 0; int commandEnd = 0; int commandReturn = 0; char *commandReturnMsg = NULL; char *commandReturnCmdl = NULL; int commandReturnSet = 0; httrackp *global_opt = NULL; static void (*pingFun)(void*) = NULL; static void* pingFunArg = NULL; /* Extern */ extern void webhttrack_main(char *cmd); extern void webhttrack_lock(void); extern void webhttrack_release(void); static int is_image(const char *file) { return strstr(file, ".gif") != NULL || strstr(file, ".png") != NULL; } static int is_text(const char *file) { return ((strstr(file, ".txt") != NULL)); } static int is_html(const char *file) { return ((strstr(file, ".htm") != NULL)); } static int is_css(const char *file) { return ((strstr(file, ".css") != NULL)); } static int is_js(const char *file) { return ((strstr(file, ".js") != NULL)); } static void sig_brpipe(int code) { /* ignore */ } HTS_UNUSED static int check_readinput_t(T_SOC soc, int timeout); HTS_UNUSED static int recv_bl(T_SOC soc, void *buffer, size_t len, int timeout); HTS_UNUSED static int linputsoc(T_SOC soc, char *s, int max); HTS_UNUSED static int check_readinput(htsblk * r); HTS_UNUSED static int linputsoc_t(T_SOC soc, char *s, int max, int timeout); HTS_UNUSED static int linput(FILE * fp, char *s, int max); /* Language files */ HTS_UNUSED static int htslang_load(char *limit_to, size_t limit_size, const char *apppath); HTS_UNUSED static void conv_printf(const char *from, char *to); HTS_UNUSED static void LANG_DELETE(void); HTS_UNUSED static void LANG_INIT(const char *path); HTS_UNUSED static int LANG_T(const char *path, int l); HTS_UNUSED static int QLANG_T(int l); HTS_UNUSED static const char *LANGSEL(const char *name); HTS_UNUSED static const char *LANGINTKEY(const char *name); HTS_UNUSED static int LANG_SEARCH(const char *path, const char *iso); HTS_UNUSED static int LANG_LIST(const char *path, char *buffer, size_t size); // URL Link catcher // 0- Init the URL catcher with standard port // smallserver_init(&port,&return_host); T_SOC smallserver_init_std(int *port_prox, char *adr_prox, int defaultPort) { T_SOC soc; if (defaultPort <= 0) { int try_to_listen_to[] = { 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 32000, 32001, 32002, 32003, 32004, 32006, 32006, 32007, 32008, 32009, 42000, 42001, 42002, 42003, 42004, 42006, 42006, 42007, 42008, 42009, 0, -1 }; int i = 0; do { soc = smallserver_init(&try_to_listen_to[i], adr_prox); *port_prox = try_to_listen_to[i]; i++; } while((soc == INVALID_SOCKET) && (try_to_listen_to[i] >= 0)); } else { soc = smallserver_init(&defaultPort, adr_prox); *port_prox = defaultPort; } return soc; } // 1- Init the URL catcher // get hostname. return 1 upon success. static int gethost(const char *hostname, SOCaddr * server) { if (hostname != NULL && *hostname != '\0') { #if HTS_INET6==0 /* ipV4 resolver */ struct hostent *hp = gethostbyname(hostname); if (hp != NULL) { if (hp->h_length) { SOCaddr_copyaddr2(*server, hp->h_addr_list[0], hp->h_length); return 1; } } #else /* ipV6 resolver */ struct addrinfo *res = NULL; struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; if (getaddrinfo(hostname, NULL, &hints, &res) == 0) { if (res) { if ((res->ai_addr) && (res->ai_addrlen)) { SOCaddr_copyaddr2(*server, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); return 1; } } } if (res) { freeaddrinfo(res); } #endif } return 0; } static int my_getlocalhost(char *h_loc, size_t size) { SOCaddr addr; strcpy(h_loc, "localhost"); if (gethost(h_loc, &addr) == 1) { return 0; } // come on ... else { strcpy(h_loc, "127.0.0.1"); return 0; } } // get local hostname; falls back to "localhost" in case of error // always returns 0 static int my_gethostname(char *h_loc, size_t size) { h_loc[0] = '\0'; if (gethostname(h_loc, (int) size) == 0) { // host name SOCaddr addr; if (gethost(h_loc, &addr) == 1) { return 0; } else { return my_getlocalhost(h_loc, size); } } else { return my_getlocalhost(h_loc, size); } return 0; } // smallserver_init(&port,&return_host); T_SOC smallserver_init(int *port, char *adr) { T_SOC soc = INVALID_SOCKET; char h_loc[256 + 2]; commandRunning = commandEnd = commandReturn = commandReturnSet = commandEndRequested = 0; if (commandReturnMsg) free(commandReturnMsg); commandReturnMsg = NULL; if (commandReturnCmdl) free(commandReturnCmdl); commandReturnCmdl = NULL; if (my_gethostname(h_loc, 256) == 0) { // host name SOCaddr server; SOCaddr_initany(server); if ((soc = (T_SOC) socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0)) != INVALID_SOCKET) { SOCaddr_initport(server, *port); if (bind(soc, &SOCaddr_sockaddr(server), SOCaddr_size(server)) == 0) { if (listen(soc, 10) >= 0) { strcpy(adr, h_loc); } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } } return soc; } // 2 - Wait for URL // check if data is available // smallserver // returns 0 if error // url: buffer where URL must be stored - or ip:port in case of failure // data: 32Kb typedef struct { const char *name; int value; } initIntElt; typedef struct { const char *name; const char *value; } initStrElt; #define SET_ERROR(err) do { \ coucal_write(NewLangList, "error", (intptr_t)strdup(err)); \ error_redirect = "/server/error.html"; \ } while(0) int smallserver(T_SOC soc, char *url, char *method, char *data, char *path) { int timeout = 30; int retour = 0; int willexit = 0; int buffer_size = 32768; char *buffer = (char *) malloc(buffer_size); String headers = STRING_EMPTY; String output = STRING_EMPTY; String tmpbuff = STRING_EMPTY; String tmpbuff2 = STRING_EMPTY; String fspath = STRING_EMPTY; char catbuff[CATBUFF_SIZE]; /* Load strings */ htslang_init(); if (!htslang_load(NULL, 0, path)) { fprintf(stderr, "unable to find lang.def and/or lang/ strings in %s\n", path); return 0; } LANG_T(path, 0); /* Init various values */ { char pth[1024]; const char *initOn[] = { "parseall", "Cache", "ka", "cookies", "parsejava", "testall", "updhack", "urlhack", "index", NULL }; const initIntElt initInt[] = { {"filter", 4}, {"travel", 2}, {"travel2", 1}, {"travel3", 1}, /* */ {"connexion", 4}, /* */ {"maxrate", 100000}, /* */ {"build", 1}, /* */ {"checktype", 2}, {"robots", 3}, {NULL, 0} }; initStrElt initStr[] = { {"user", HTS_DEFAULT_USER_AGENT}, {"footer", ""}, {"url2", "+*.png +*.gif +*.jpg +*.jpeg +*.css +*.js -ad.doubleclick.net/*"}, {NULL, NULL}}; int i = 0; for(i = 0; initInt[i].name; i++) { char tmp[32]; sprintf(tmp, "%d", initInt[i].value); coucal_write(NewLangList, initInt[i].name, (intptr_t) strdup(tmp)); } for(i = 0; initOn[i]; i++) { coucal_write(NewLangList, initOn[i], (intptr_t) strdup("1")); /* "on" */ } for(i = 0; initStr[i].name; i++) { coucal_write(NewLangList, initStr[i].name, (intptr_t) strdup(initStr[i].value)); } strcpybuff(pth, gethomedir()); strcatbuff(pth, "/websites"); coucal_write(NewLangList, "path", (intptr_t) strdup(pth)); } /* Lock */ webhttrack_lock(); // connexion (accept) while(!willexit && buffer != NULL && soc != INVALID_SOCKET) { char line1[1024]; char line[8192]; char line2[1024]; T_SOC soc_c; LLint length = 0; const char *error_redirect = NULL; line[0] = '\0'; buffer[0] = '\0'; StringClear(headers); StringClear(output); StringClear(tmpbuff); StringClear(tmpbuff2); StringClear(fspath); StringCat(headers, ""); StringCat(output, ""); StringCat(tmpbuff, ""); StringCat(tmpbuff2, ""); StringCat(fspath, ""); /* UnLock */ webhttrack_release(); /* sigpipe */ #ifndef _WIN32 signal(SIGPIPE, sig_brpipe); #endif /* Accept */ while((soc_c = (T_SOC) accept(soc, NULL, NULL)) == INVALID_SOCKET) ; /* Ping */ if (pingFun != NULL) { pingFun(pingFunArg); } /* Lock */ webhttrack_lock(); if (linputsoc_t(soc_c, line1, sizeof(line1) - 2, timeout) > 0) { int meth = 0; if (strfield(line1, "get ")) { meth = 1; } else if (strfield(line1, "post ")) { meth = 2; } else if (strfield(line1, "head ")) { /* yes, we can do that */ meth = 10; } else { #ifdef _DEBUG #endif } if (meth) { /* Flush headers */ length = buffer_size - 2; while(linputsoc_t(soc_c, line, sizeof(line) - 2, timeout) > 0) { int p; if ((p = strfield(line, "Content-length:")) != 0) { sscanf(line + p, LLintP, &(length)); } else if ((p = strfield(line, "Accept-language:")) != 0) { char tmp[32]; char *s = line + p; /*int l; */ while(*s == ' ') s++; tmp[0] = '\0'; strncatbuff(tmp, s, 2); /*l = LANG_SEARCH(path, tmp); */ } } if (meth == 2) { int sz = 0; if (length > buffer_size - 2) { length = buffer_size - 2; } if (length > 0 && (sz = recv_bl(soc_c, buffer, (int) length, timeout)) < 0) { meth = 0; } else { buffer[sz] = '\0'; } } } /* Generated variables */ if (commandEnd && !commandReturnSet) { commandReturnSet = 1; if (commandReturn) { char tmp[32]; sprintf(tmp, "%d", commandReturn); coucal_write(NewLangList, "commandReturn", (intptr_t) strdup(tmp)); coucal_write(NewLangList, "commandReturnMsg", (intptr_t) commandReturnMsg); coucal_write(NewLangList, "commandReturnCmdl", (intptr_t) commandReturnCmdl); } else { coucal_write(NewLangList, "commandReturn", (intptr_t) NULL); coucal_write(NewLangList, "commandReturnMsg", (intptr_t) NULL); coucal_write(NewLangList, "commandReturnCmdl", (intptr_t) NULL); } } /* SID check */ { intptr_t adr = 0; if (coucal_readptr(NewLangList, "_sid", &adr)) { if (coucal_write (NewLangList, "sid", (intptr_t) strdup((char *) adr))) { } } } /* check variables */ if (meth && buffer[0]) { char *s = buffer; char *e, *f; strlcatbuff(buffer, "&", buffer_size); while(s && (e = strchr(s, '=')) && (f = strchr(s, '&'))) { const char *ua; String sua = STRING_EMPTY; *e = *f = '\0'; ua = e + 1; if (strfield2(ua, "on")) /* hack : "on" == 1 */ ua = "1"; unescapehttp(ua, &sua); coucal_write(NewLangList, s, (intptr_t) StringAcquire(&sua)); s = f + 1; } } /* Error check */ { intptr_t adr = 0; intptr_t adr2 = 0; if (coucal_readptr(NewLangList, "sid", &adr)) { if (coucal_readptr(NewLangList, "_sid", &adr2)) { if (strcmp((char *) adr, (char *) adr2) != 0) { meth = 0; } } } } /* Check variables (internal) */ if (meth) { int doLoad = 0; intptr_t adr = 0; if (coucal_readptr(NewLangList, "lang", &adr)) { int n = 0; if (sscanf((char *) adr, "%d", &n) == 1 && n > 0 && n - 1 != LANG_T(path, -1)) { LANG_T(path, n - 1); /* make a backup, because the GUI will override it */ coucal_write(NewLangList, "lang_", (intptr_t) strdup((char *) adr)); } } /* Load existing project settings */ if (coucal_readptr(NewLangList, "loadprojname", &adr)) { char *pname = (char *) adr; if (*pname) { coucal_write(NewLangList, "projname", (intptr_t) strdup(pname)); } coucal_write(NewLangList, "loadprojname", (intptr_t) NULL); doLoad = 1; } else if (coucal_readptr(NewLangList, "loadprojcateg", &adr)) { char *pname = (char *) adr; if (*pname) { coucal_write(NewLangList, "projcateg", (intptr_t) strdup(pname)); } coucal_write(NewLangList, "loadprojcateg", (intptr_t) NULL); } /* intial configuration */ { if (!coucal_read(NewLangList, "conf_file_loaded", NULL)) { coucal_write(NewLangList, "conf_file_loaded", (intptr_t) strdup("true")); doLoad = 2; } } /* path : / */ if (!commandRunning) { intptr_t adrpath = 0, adrprojname = 0; if (coucal_readptr(NewLangList, "path", &adrpath) && coucal_readptr(NewLangList, "projname", &adrprojname)) { StringClear(fspath); StringCat(fspath, (char *) adrpath); StringCat(fspath, "/"); StringCat(fspath, (char *) adrprojname); } } /* Load existing project settings */ if (doLoad) { FILE *fp; if (doLoad == 1) { StringCat(fspath, "/hts-cache/winprofile.ini"); } else if (doLoad == 2) { StringCopy(fspath, gethomedir()); #ifdef _WIN32 StringCat(fspath, "/httrack.ini"); #else StringCat(fspath, "/.httrack.ini"); #endif } fp = fopen(StringBuff(fspath), "rb"); if (fp) { /* Read file */ while(!feof(fp)) { char *str = line; char *pos; if (!linput(fp, line, sizeof(line) - 2)) { *str = '\0'; } pos = strchr(line, '='); if (pos) { String escline = STRING_EMPTY; *pos++ = '\0'; if (pos[0] == '0' && pos[1] == '\0') *pos = '\0'; /* 0 => empty */ unescapeini(pos, &escline); coucal_write(NewLangList, line, (intptr_t) StringAcquire(&escline)); } } fclose(fp); } } } /* Execute command */ { intptr_t adr = 0; int p = 0; if (coucal_readptr(NewLangList, "command", &adr)) { if (strcmp((char *) adr, "cancel") == 0) { if (commandRunning) { if (!commandEndRequested) { commandEndRequested = 1; hts_request_stop(global_opt, 0); } else { hts_request_stop(global_opt, 1); /* note: the force flag does not have anyeffect yet */ commandEndRequested = 2; /* will break the loop() callback */ } } } else if ((p = strfield((char *) adr, "cancel-file="))) { if (commandRunning) { hts_cancel_file_push(global_opt, (char *) adr + p); } } else if (strcmp((char *) adr, "cancel-parsing") == 0) { if (commandRunning) { hts_cancel_parsing(global_opt); } } else if ((p = strfield((char *) adr, "pause="))) { if (commandRunning) { hts_setpause(global_opt, 1); } } else if ((p = strfield((char *) adr, "unpause"))) { if (commandRunning) { hts_setpause(global_opt, 0); } } else if (strcmp((char *) adr, "abort") == 0) { if (commandRunning) { hts_request_stop(global_opt, 1); commandEndRequested = 2; /* will break the loop() callback */ } } else if ((p = strfield((char *) adr, "add-url="))) { if (commandRunning) { char *ptraddr[2]; ptraddr[0] = (char *) adr + p; ptraddr[1] = NULL; hts_addurl(global_opt, ptraddr); } } else if ((p = strfield((char *) adr, "httrack"))) { if (!commandRunning) { intptr_t adrcd = 0; if (coucal_readptr(NewLangList, "command_do", &adrcd)) { intptr_t adrw = 0; if (coucal_readptr(NewLangList, "winprofile", &adrw)) { /* User general profile */ intptr_t adruserprofile = 0; if (coucal_readptr (NewLangList, "userprofile", &adruserprofile) && adruserprofile != 0) { int count = (int) strlen((char *) adruserprofile); if (count > 0) { FILE *fp; StringClear(tmpbuff); StringCopy(tmpbuff, gethomedir()); #ifdef _WIN32 StringCat(tmpbuff, "/httrack.ini"); #else StringCat(tmpbuff, "/.httrack.ini"); #endif fp = fopen(StringBuff(tmpbuff), "wb"); if (fp != NULL) { (void) ((int) fwrite((void *) adruserprofile, 1, count, fp)); fclose(fp); } } } /* Profile */ StringClear(tmpbuff); StringCat(tmpbuff, StringBuff(fspath)); StringCat(tmpbuff, "/hts-cache/"); /* Create minimal directory structure */ if (!structcheck(StringBuff(tmpbuff))) { FILE *fp; StringCat(tmpbuff, "winprofile.ini"); fp = fopen(StringBuff(tmpbuff), "wb"); if (fp != NULL) { int count = (int) strlen((char *) adrw); if ((int) fwrite((void *) adrw, 1, count, fp) == count) { /* Wipe the doit.log file, useless here (all options are replicated) and even a bit annoying (duplicate/ghost options) The behaviour is exactly the same as in WinHTTrack */ StringClear(tmpbuff); StringCat(tmpbuff, StringBuff(fspath)); StringCat(tmpbuff, "/hts-cache/doit.log"); remove(StringBuff(tmpbuff)); /* RUN THE SERVER */ if (strcmp((char *) adrcd, "start") == 0) { /* POST body is in the form's charset, not the UTF-8 argv the engine now assumes (#629). */ char *const cmdl = (char *) adr + p; char *cmdlUtf8 = hts_convertStringToUTF8( cmdl, strlen(cmdl), LANGSEL("LANGUAGE_CHARSET")); webhttrack_main(cmdlUtf8 != NULL ? cmdlUtf8 : cmdl); freet(cmdlUtf8); } else { commandRunning = 0; commandEnd = 1; } } else { char tmp[1024]; sprintf(tmp, "Unable to write %d bytes in the the init file %s", count, StringBuff(fspath)); SET_ERROR(tmp); } fclose(fp); } else { char tmp[1024]; sprintf(tmp, "Unable to create the init file %s", StringBuff(fspath)); SET_ERROR(tmp); } } else { char tmp[1024]; sprintf(tmp, "Unable to create the directory structure in %s", StringBuff(fspath)); SET_ERROR(tmp); } } else { SET_ERROR ("Internal server error: unable to fetch project name or path"); } } } } else if (strcmp((char *) adr, "quit") == 0) { willexit = 1; } coucal_write(NewLangList, "command", (intptr_t) NULL); } } /* Response */ if (meth) { int virtualpath = 0; char *pos; char *url = strchr(line1, ' '); if (url && *++url == '/' && (pos = strchr(url, ' ')) && !(*pos = '\0')) { char fsfile[1024]; const char *file; FILE *fp; char *qpos; /* get the URL */ if (error_redirect == NULL) { if ((qpos = strchr(url, '?'))) { *qpos = '\0'; } fsfile[0] = '\0'; if (strcmp(url, "/") == 0) { file = "/server/index.html"; meth = 2; } else { file = url; } } else { file = error_redirect; meth = 2; } if (strncmp(file, "/website/", 9) == 0) { virtualpath = 1; } /* override */ if (commandRunning) { if (is_html(file)) { file = "/server/refresh.html"; } } else if (commandEnd && !virtualpath && !willexit) { if (is_html(file)) { file = "/server/finished.html"; } } if (strlen(path) + strlen(file) + 32 < sizeof(fsfile)) { if (strncmp(file, "/website/", 9) != 0) { sprintf(fsfile, "%shtml%s", path, file); } else { intptr_t adr = 0; if (coucal_readptr(NewLangList, "projpath", &adr)) { sprintf(fsfile, "%s%s", (char *) adr, file + 9); } } } if (fsfile[0] && strstr(file, "..") == NULL && (fp = fopen(fsfile, "rb"))) { char ok[] = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Server: httrack-small-server\r\n" "Content-type: text/html\r\n" "Cache-Control: no-cache, must-revalidate, private\r\n" "Pragma: no-cache\r\n"; char ok_img[] = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Server: httrack small server\r\n" "Content-type: image/gif\r\n"; char ok_js[] = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Server: httrack small server\r\n" "Content-type: text/javascript\r\n"; char ok_css[] = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Server: httrack small server\r\n" "Content-type: text/css\r\n"; char ok_text[] = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Server: httrack small server\r\n" "Content-type: text/plain\r\n"; char ok_unknown[] = "HTTP/1.0 200 OK\r\n" "Connection: close\r\n" "Server: httrack small server\r\n" "Content-type: application/octet-stream\r\n"; /* register current page */ coucal_write(NewLangList, "thisfile", (intptr_t) strdup(file)); /* Force GET for the last request */ if (meth == 2 && willexit) { meth = 1; } /* posted data are redirected to get protocol */ if (meth == 2) { char redir[] = "HTTP/1.0 302 Redirect\r\n" "Connection: close\r\n" "Server: httrack-small-server\r\n"; intptr_t adr = 0; const char *newfile = file; if (coucal_readptr(NewLangList, "redirect", &adr) && adr != 0) { const char *newadr = (char *) adr; if (*newadr) { newfile = newadr; } } StringMemcat(headers, redir, strlen(redir)); { char tmp[256]; if (strlen(file) < sizeof(tmp) - 32) { sprintf(tmp, "Location: %s\r\n", newfile); StringMemcat(headers, tmp, strlen(tmp)); } } coucal_write(NewLangList, "redirect", (intptr_t) NULL); } else if (is_html(file)) { int outputmode = 0; StringMemcat(headers, ok, sizeof(ok) - 1); while(!feof(fp)) { char *str = line; int prevlen = (int) StringLength(output); int nocr = 0; if (!linput(fp, line, sizeof(line) - 2)) { *str = '\0'; } if (*str && str[strlen(str) - 1] == '\\') { nocr = 1; str[strlen(str) - 1] = '\0'; } while(*str) { char *pos; size_t n; if (*str == '$' && *++str == '{' && (pos = strchr(++str, '}')) && (n = (pos - str)) && n < 1024) { char name_[1024 + 2]; char *name = name_; const char *langstr = NULL; int p; int format = 0; int listDefault = 0; name[0] = '\0'; strlncatbuff(name, str, sizeof(name_), n); if (strncmp(name, "/*", 2) == 0) { /* comments */ } else if ((p = strfield(name, "html:"))) { name += p; format = 1; } else if ((p = strfield(name, "list:"))) { name += p; format = 2; } else if ((p = strfield(name, "liststr:"))) { name += p; format = -2; } else if ((p = strfield(name, "file-exists:"))) { char *pos2; name += p; format = 0; pos2 = strchr(name, ':'); langstr = ""; if (pos2 != NULL) { *pos2 = '\0'; if (strstr(name, "..") == NULL) { if (fexist(fconcat(catbuff, sizeof(catbuff), path, name))) { langstr = pos2 + 1; } } } } else if ((p = strfield(name, "do:"))) { char *pos2; char empty[2] = ""; name += p; format = 1; pos2 = strchr(name, ':'); langstr = ""; if (pos2 != NULL) { *pos2 = '\0'; pos2++; } else { pos2 = empty; } if (strcmp(name, "output-mode") == 0) { if (strcmp(pos2, "html") == 0) { outputmode = 1; } else if (strcmp(pos2, "inifile") == 0) { outputmode = 2; } else if (strcmp(pos2, "html-urlescaped") == 0) { outputmode = 3; } else { outputmode = 0; } } else if (strcmp(name, "if-file-exists") == 0) { if (strstr(pos2, "..") == NULL) { if (!fexist(fconcat(catbuff, sizeof(catbuff), path, pos2))) { outputmode = -1; } } } else if (strcmp(name, "if-project-file-exists") == 0) { if (strstr(pos2, "..") == NULL) { if (!fexist (fconcat(catbuff, sizeof(catbuff), StringBuff(fspath), pos2))) { outputmode = -1; } } } else if (strcmp(name, "if-file-do-not-exists") == 0) { if (strstr(pos2, "..") == NULL) { if (fexist(fconcat(catbuff, sizeof(catbuff), path, pos2))) { outputmode = -1; } } } else if (strcmp(name, "if-not-empty") == 0) { intptr_t adr = 0; if (!coucal_readptr(NewLangList, pos2, &adr) || *((char *) adr) == 0) { outputmode = -1; } } else if (strcmp(name, "if-empty") == 0) { intptr_t adr = 0; if (coucal_readptr(NewLangList, pos2, &adr) && *((char *) adr) != 0) { outputmode = -1; } } else if (strcmp(name, "end-if") == 0) { outputmode = 0; } else if (strcmp(name, "loadhash") == 0) { intptr_t adr = 0; if (coucal_readptr(NewLangList, "path", &adr)) { char *rpath = (char *) adr; //find_handle h; if (rpath[0]) { if (rpath[strlen(rpath) - 1] == '/') { rpath[strlen(rpath) - 1] = '\0'; /* note: patching stored (inhash) value */ } } { const char *profiles = hts_getcategories(rpath, 0); const char *categ = hts_getcategories(rpath, 1); coucal_write(NewLangList, "winprofile", (intptr_t) profiles); coucal_write(NewLangList, "wincateg", (intptr_t) categ); } } } else if (strcmp(name, "copy") == 0) { if (*pos2) { char *pos3 = strchr(pos2, ':'); if (pos3 && *(pos3 + 1)) { intptr_t adr = 0; *pos3++ = '\0'; if (coucal_readptr(NewLangList, pos2, &adr)) { coucal_write(NewLangList, pos3, (intptr_t) strdup((char *) adr)); coucal_write(NewLangList, pos2, (intptr_t) NULL); } } } } else if (strcmp(name, "set") == 0) { if (*pos2) { char *pos3 = strchr(pos2, ':'); if (pos3) { *pos3++ = '\0'; coucal_write(NewLangList, pos2, (intptr_t) strdup(pos3)); } else { coucal_write(NewLangList, pos2, (intptr_t) NULL); } } } } /* test: test:::.. ztest:::.. */ else if ((p = strfield(name, "test:")) || (p = strfield(name, "ztest:"))) { intptr_t adr = 0; char *pos2; int ztest = (name[0] == 'z'); langstr = ""; name += p; pos2 = strchr(name, ':'); if (pos2 != NULL) { *pos2 = '\0'; if (coucal_readptr(NewLangList, name, &adr) || ztest) { const char *newadr = (char *) adr; if (!newadr) newadr = ""; if (*newadr || ztest) { int npos = 0; name = pos2 + 1; format = 4; if (strchr(name, ':') == NULL) { npos = 0; /* first is good if only one : */ format = 0; } else { if (sscanf(newadr, "%d", &npos) != 1) { if (strfield(newadr, "on")) { npos = 1; } else { npos = 0; /* first one will be ok */ format = 0; } } } while(*name && *name != '}' && npos >= 0) { int end = 0; char *fpos = strchr(name, ':'); int n2; if (fpos == NULL) { fpos = name + strlen(name); end = 1; } n2 = (int) (fpos - name); if (npos == 0) { langstr = name; *fpos = '\0'; } else if (end) { npos = 0; } name += n2 + 1; npos--; } } } } } else if ((p = strfield(name, "listid:"))) { char *pos2; name += p; format = 2; pos2 = strchr(name, ':'); if (pos2) { char dname[32]; int n2 = (int) (pos2 - name); if (n2 > 0 && n2 < sizeof(dname) - 2) { intptr_t adr = 0; dname[0] = '\0'; strncatbuff(dname, name, n2); if (coucal_readptr(NewLangList, dname, &adr)) { int n = 0; if (sscanf((char *) adr, "%d", &n) == 1) { listDefault = n; } } name += n2 + 1; } } } else if ((p = strfield(name, "checked:"))) { name += p; format = 3; } if (langstr == NULL) { if (strfield2(name, "#iso")) { langstr = line2; line2[0] = '\0'; LANG_LIST(path, line2, sizeof(line2)); assertf(strlen(langstr) < sizeof(line2) - 2); } else { langstr = LANGSEL(name); if (langstr == NULL || *langstr == '\0') { intptr_t adr = 0; if (coucal_readptr(NewLangList, name, &adr)) { char *newadr = (char *) adr; langstr = newadr; } } } } if (langstr && outputmode != -1) { switch (format) { case 0: { const char *a = langstr; while(*a) { if (a[0] == '\\' && isxdigit(a[1]) && isxdigit(a[2])) { int n; char c; if (sscanf(a + 1, "%x", &n) == 1) { c = (char) n; StringMemcat(output, &c, 1); } a += 2; } else if (outputmode && a[0] == '<') { StringCat(output, "<"); } else if (outputmode && a[0] == '>') { StringCat(output, ">"); } else if (outputmode && a[0] == '&') { StringCat(output, "&"); } else if (outputmode && a[0] == '\'') { StringCat(output, "'"); } else if (outputmode == 3 && a[0] == ' ') { StringCat(output, "%20"); } else if (outputmode >= 2 && ((unsigned char) a[0]) < 32) { char tmp[32]; sprintf(tmp, "%%%02x", (unsigned char) a[0]); StringCat(output, tmp); } else if (outputmode == 2 && a[0] == '%') { StringCat(output, "%%"); } else if (outputmode == 3 && a[0] == '%') { StringCat(output, "%25"); } else { StringMemcat(output, a, 1); } a++; } } break; case 3: if (*langstr) { StringCat(output, "checked"); } break; default: if (*langstr) { int id = 1; const char *fstr = langstr; StringClear(tmpbuff); if (format == 2) { StringCat(output, "\r\n"); StringCat(output, ""); } else if (format == -2) { StringCat(output, StringBuff(tmpbuff)); StringCat(output, "\">"); StringCat(output, StringBuff(tmpbuff)); StringCat(output, ""); } else { StringCat(output, StringBuff(tmpbuff)); } StringClear(tmpbuff); } } } str = pos; } else { if (outputmode != -1) { StringMemcat(output, str, 1); } } str++; } if (!nocr && prevlen != StringLength(output)) { StringCat(output, "\r\n"); } } #ifdef _DEBUG { int len = (int) strlen((char *) StringBuff(output)); assert(len == (int) StringLength(output)); } #endif } else { if (is_text(file)) { StringMemcat(headers, ok_text, sizeof(ok_text) - 1); } else if (is_js(file)) { StringMemcat(headers, ok_js, sizeof(ok_js) - 1); } else if (is_css(file)) { StringMemcat(headers, ok_css, sizeof(ok_css) - 1); } else if (is_image(file)) { StringMemcat(headers, ok_img, sizeof(ok_img) - 1); } else { StringMemcat(headers, ok_unknown, sizeof(ok_unknown) - 1); } while(!feof(fp)) { int n = (int) fread(line, 1, sizeof(line) - 2, fp); if (n > 0) { StringMemcat(output, line, n); } } } fclose(fp); } else if (strcmp(file, "/ping") == 0 || strncmp(file, "/ping?", 6) == 0) { char error_hdr[] = "HTTP/1.0 200 Pong\r\n" "Server: httrack small server\r\n" "Content-type: text/html\r\n"; StringCat(headers, error_hdr); } else { char error_hdr[] = "HTTP/1.0 404 Not Found\r\n" "Server: httrack small server\r\n" "Content-type: text/html\r\n"; char error[] = "Page not found.\r\n"; StringCat(headers, error_hdr); StringCat(output, error); } } } else { #ifdef _DEBUG char error_hdr[] = "HTTP/1.0 500 Server Error\r\n" "Server: httrack small server\r\n" "Content-type: text/html\r\n"; char error[] = "Server error.\r\n"; StringCat(headers, error_hdr); StringCat(output, error); #endif } { char tmp[256]; sprintf(tmp, "Content-length: %d\r\n", (int) StringLength(output)); StringCat(headers, tmp); } StringCat(headers, "\r\n"); if ((send(soc_c, StringBuff(headers), (int) StringLength(headers), 0) != StringLength(headers)) || ((meth == 1) && (send(soc_c, StringBuff(output), (int) StringLength(output), 0) != StringLength(output))) ) { #ifdef _DEBUG #endif } } else { #ifdef _DEBUG #endif } /* Shutdown (FIN) and wait until confirmed */ { char c; #ifdef _WIN32 shutdown(soc_c, SD_SEND); #else shutdown(soc_c, 1); #endif /* This is necessary as IE sometimes (!) sends an additional CRLF after POST data */ while(recv(soc_c, ((char *) &c), 1, 0) > 0) ; } #ifdef _WIN32 closesocket(soc_c); #else close(soc_c); #endif } if (soc != INVALID_SOCKET) { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif } StringFree(headers); StringFree(output); StringFree(tmpbuff); StringFree(tmpbuff2); StringFree(fspath); if (buffer) free(buffer); if (commandReturnMsg) free(commandReturnMsg); commandReturnMsg = NULL; if (commandReturnCmdl) free(commandReturnCmdl); commandReturnCmdl = NULL; /* Unlock */ webhttrack_release(); return retour; } /* Language files */ int htslang_init(void) { if (NewLangList == NULL) { NewLangList = coucal_new(0); coucal_set_name(NewLangList, "NewLangList"); if (NewLangList == NULL) { abortLog("Error in lang.h: not enough memory"); } else { coucal_value_is_malloc(NewLangList, 1); } } return 1; } int htslang_uninit(void) { if (NewLangList != NULL) { coucal_delete(&NewLangList); } return 1; } void smallserver_setpinghandler(void (*fun)(void*), void*arg) { pingFun = fun; pingFunArg = arg; } int smallserver_setkey(const char *key, const char *value) { return coucal_write(NewLangList, key, (intptr_t) strdup(value)); } int smallserver_setkeyint(const char *key, LLint value) { char tmp[256]; snprintf(tmp, sizeof(tmp), LLintP, value); return coucal_write(NewLangList, key, (intptr_t) strdup(tmp)); } int smallserver_setkeyarr(const char *key, int id, const char *key2, const char *value) { char tmp[256]; snprintf(tmp, sizeof(tmp), "%s%d%s", key, id, key2); return coucal_write(NewLangList, tmp, (intptr_t) strdup(value)); } static int htslang_load(char *limit_to, size_t limit_size, const char *path) { const char *hashname; char catbuff[CATBUFF_SIZE]; // int selected_lang = LANG_T(path, -1); // if (!limit_to) { LANG_DELETE(); NewLangStr = coucal_new(0); NewLangStrKeys = coucal_new(0); coucal_set_name(NewLangStr, "NewLangStr"); coucal_set_name(NewLangStrKeys, "NewLangStrKeys"); if ((NewLangStr == NULL) || (NewLangStrKeys == NULL)) { abortLog("Error in lang.h: not enough memory"); } else { coucal_value_is_malloc(NewLangStr, 1); coucal_value_is_malloc(NewLangStrKeys, 1); } } /* Load master file (list of keys and internal keys) */ if (!limit_to) { const char *mname = "lang.def"; FILE *fp = fopen(fconcat(catbuff, sizeof(catbuff), path, mname), "rb"); if (fp) { char intkey[8192]; char key[8192]; while(!feof(fp)) { linput_cpp(fp, intkey, 8000); linput_cpp(fp, key, 8000); if (strnotempty(intkey) && strnotempty(key)) { const char *test = LANGINTKEY(key); /* Increment for multiple definitions */ if (strnotempty(test)) { int increment = 0; size_t pos = strlen(key); do { increment++; sprintf(key + pos, "%d", increment); test = LANGINTKEY(key); } while(strnotempty(test)); } if (!strnotempty(test)) { // éviter doublons const size_t len = strlen(intkey); char *const buff = (char *) malloc(len + 1); if (buff) { strlcpybuff(buff, intkey, len + 1); coucal_add(NewLangStrKeys, key, (intptr_t) buff); } } } // if } // while fclose(fp); } else { return 0; } } /* Language Name? */ { char name[256]; sprintf(name, "LANGUAGE_%d", selected_lang + 1); hashname = LANGINTKEY(name); } /* Get only language name */ if (limit_to) { if (hashname) strlcpybuff(limit_to, hashname, limit_size); else strlcpybuff(limit_to, "???", limit_size); return 0; } /* Error */ if (!hashname) return 0; /* Load specific language file */ { int loops; // 2nd loop: load undefined strings for(loops = 0; loops < 2; loops++) { FILE *fp; char lbasename[1024]; { char name[256]; sprintf(name, "LANGUAGE_%d", (loops == 0) ? (selected_lang + 1) : 1); hashname = LANGINTKEY(name); } sprintf(lbasename, "lang/%s.txt", hashname); fp = fopen(fconcat(catbuff, sizeof(catbuff), path, lbasename), "rb"); if (fp) { char extkey[8192]; char value[8192]; while(!feof(fp)) { linput_cpp(fp, extkey, 8000); linput_cpp(fp, value, 8000); if (strnotempty(extkey) && strnotempty(value)) { const char *intkey; intkey = LANGINTKEY(extkey); if (strnotempty(intkey)) { /* Increment for multiple definitions */ { const char *test = LANGSEL(intkey); if (strnotempty(test)) { if (loops == 0) { int increment = 0; size_t pos = strlen(extkey); do { increment++; sprintf(extkey + pos, "%d", increment); intkey = LANGINTKEY(extkey); if (strnotempty(intkey)) test = LANGSEL(intkey); else test = ""; } while(strnotempty(test)); } else intkey = ""; } else { if (loops > 0) { } } } /* Add key */ if (strnotempty(intkey)) { const size_t len = strlen(value); char *const buff = (char *) malloc(len + 1); if (buff) { conv_printf(value, buff); coucal_add(NewLangStr, intkey, (intptr_t) buff); } } } } // if } // while fclose(fp); } else { return 0; } } } // Control limit_to if (limit_to) limit_to[0] = '\0'; return 1; } /* NOTE : also contains the "webhttrack" hack */ static void conv_printf(const char *from, char *to) { int i = 0, j = 0, len; len = (int) strlen(from); while(i < len) { switch (from[i]) { case '\\': i++; switch (from[i]) { case 'a': to[j] = '\a'; break; case 'b': to[j] = '\b'; break; case 'f': to[j] = '\f'; break; case 'n': to[j] = '\n'; break; case 'r': to[j] = '\r'; break; case 't': to[j] = '\t'; break; case 'v': to[j] = '\v'; break; case '\'': to[j] = '\''; break; case '\"': to[j] = '\"'; break; case '\\': to[j] = '\\'; break; case '?': to[j] = '\?'; break; default: to[j] = from[i]; break; } break; default: to[j] = from[i]; break; } i++; j++; } to[j++] = '\0'; /* Dirty hack */ { char *a = to; while((a = strstr(a, "WinHTTrack"))) { a[0] = 'W'; a[1] = 'e'; a[2] = 'b'; a++; } } } static void LANG_DELETE(void) { coucal_delete(&NewLangStr); coucal_delete(&NewLangStrKeys); } // sélection de la langue static void LANG_INIT(const char *path) { LANG_T(path, 0); } static int LANG_T(const char *path, int l) { if (l >= 0) { QLANG_T(l); htslang_load(NULL, 0, path); } return QLANG_T(-1); // 0=default (english) } static int LANG_SEARCH(const char *path, const char *iso) { char lang_str[1024]; int i = 0; int curr_lng = LANG_T(path, -1); int found = 0; do { QLANG_T(i); strcpybuff(lang_str, "LANGUAGE_ISO"); htslang_load(lang_str, sizeof(lang_str), path); if (strfield(iso, lang_str)) { found = i; } i++; } while(strlen(lang_str) > 0); QLANG_T(curr_lng); return found; } static int LANG_LIST(const char *path, char *buffer, size_t buffer_size) { char lang_str[1024]; int i = 0; int curr_lng = LANG_T(path, -1); buffer[0] = '\0'; do { QLANG_T(i); strlcpybuff(lang_str, "LANGUAGE_NAME", sizeof(lang_str)); htslang_load(lang_str, sizeof(lang_str), path); if (strlen(lang_str) > 0) { if (buffer[0]) strlcatbuff(buffer, "\n", buffer_size); strlcatbuff(buffer, lang_str, buffer_size); } i++; } while(strlen(lang_str) > 0); QLANG_T(curr_lng); return i; } static int QLANG_T(int l) { static int lng = 0; if (l >= 0) { lng = l; } return lng; // 0=default (english) } const char* LANGSEL(const char* name) { coucal_value value; if (NewLangStr != NULL && coucal_read_value(NewLangStr, name, &value) != 0 && value.ptr != NULL) { return (char*) value.ptr; } else { return ""; } } const char* LANGINTKEY(const char* name) { coucal_value value; if (NewLangStrKeys != NULL && coucal_read_value(NewLangStrKeys, name, &value) != 0 && value.ptr != NULL) { return (char*) value.ptr; } else { return ""; } } /* *** Various functions *** */ static int recv_bl(T_SOC soc, void *buffer, size_t len, int timeout) { if (check_readinput_t(soc, timeout)) { int n = 1; size_t size = len; size_t offs = 0; while(n > 0 && size > 0) { n = recv(soc, ((char *) buffer) + offs, (int) size, 0); if (n > 0) { offs += n; size -= n; } } return (int) offs; } return -1; } // check if data is available static int check_readinput(htsblk * r) { if (r->soc != INVALID_SOCKET) { fd_set fds; // poll structures struct timeval tv; // structure for select FD_ZERO(&fds); FD_SET(r->soc, &fds); tv.tv_sec = 0; tv.tv_usec = 0; select((int) r->soc + 1, &fds, NULL, NULL, &tv); if (FD_ISSET(r->soc, &fds)) return 1; else return 0; } else return 0; } /*int strfield(const char* f,const char* s) { int r=0; while (streql(*f,*s) && ((*f)!=0) && ((*s)!=0)) { f++; s++; r++; } if (*s==0) return r; else return 0; }*/ /* same, except + */ httrack-3.49.14/src/md5.h0000644000175000017500000000215215230602340010435 #ifndef MD5_H #define MD5_H #include /* Exact 32-bit type for the MD5 state. uint32_t replaces a SIZEOF_LONG-derived type so config.h stays architecture-independent (Debian #1133728). */ typedef uint32_t uint32; struct MD5Context { union { unsigned char ui8[64]; uint32 ui32[16]; } in; uint32 buf[4]; uint32 bits[2]; int doByteReverse; }; void MD5Init(struct MD5Context *context, int brokenEndian); void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len); void MD5Final(unsigned char digest[16], struct MD5Context *context); void MD5Transform(uint32 buf[4], uint32 const in[16]); int mdfile(char *fn, unsigned char *digest); int mdbinfile(char *fn, unsigned char *bindigest); /* These assume a little endian machine and return incorrect results! They are here for compatibility with old (broken) versions of RPM */ int mdfileBroken(char *fn, unsigned char *digest); int mdbinfileBroken(char *fn, unsigned char *bindigest); /* * This is needed to make RSAREF happy on some MS-DOS compilers. */ typedef struct MD5Context MD5CTX; #endif /* !MD5_H */ httrack-3.49.14/src/htscodepages.h0000644000175000017500000032746215230602340012437 /** GENERATED FILE (/temp/httrack-3.47.21/src/htsbasiccharsets.sh), DO NOT EDIT **/ /* Table for 8859-10.TXT */ static const hts_UCS4 table_iso_8859_10[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138 }; /* Table for 8859-11.TXT */ static const hts_UCS4 table_iso_8859_11[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000 }; /* Table for 8859-13.TXT */ static const hts_UCS4 table_iso_8859_13[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019 }; /* Table for 8859-14.TXT */ static const hts_UCS4 table_iso_8859_14[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff }; /* Table for 8859-15.TXT */ static const hts_UCS4 table_iso_8859_15[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff }; /* Table for 8859-16.TXT */ static const hts_UCS4 table_iso_8859_16[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff }; /* Table for 8859-1.TXT */ static const hts_UCS4 table_iso_8859_1[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff }; /* Table for 8859-2.TXT */ static const hts_UCS4 table_iso_8859_2[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 }; /* Table for 8859-3.TXT */ static const hts_UCS4 table_iso_8859_3[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9 }; /* Table for 8859-4.TXT */ static const hts_UCS4 table_iso_8859_4[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9 }; /* Table for 8859-5.TXT */ static const hts_UCS4 table_iso_8859_5[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f }; /* Table for 8859-6.TXT */ static const hts_UCS4 table_iso_8859_6[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; /* Table for 8859-7.TXT */ static const hts_UCS4 table_iso_8859_7[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000 }; /* Table for 8859-8.TXT */ static const hts_UCS4 table_iso_8859_8[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000 }; /* Table for 8859-9.TXT */ static const hts_UCS4 table_iso_8859_9[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff }; /* Table for CP037.TXT */ static const hts_UCS4 table_cp037[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x009c, 0x0009, 0x0086, 0x007f, 0x0097, 0x008d, 0x008e, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x009d, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, 0x008f, 0x001c, 0x001d, 0x001e, 0x001f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000a, 0x0017, 0x001b, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, 0x0098, 0x0099, 0x009a, 0x009b, 0x0014, 0x0015, 0x009e, 0x001a, 0x0020, 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005b, 0x005d, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da, 0x009f }; /* Table for CP1006.TXT */ static const hts_UCS4 table_cp1006[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, 0x06f8, 0x06f9, 0x060c, 0x061b, 0x00ad, 0x061f, 0xfe81, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe91, 0xfb56, 0xfb58, 0xfe93, 0xfe95, 0xfe97, 0xfb66, 0xfb68, 0xfe99, 0xfe9b, 0xfe9d, 0xfe9f, 0xfb7a, 0xfb7c, 0xfea1, 0xfea3, 0xfea5, 0xfea7, 0xfea9, 0xfb84, 0xfeab, 0xfead, 0xfb8c, 0xfeaf, 0xfb8a, 0xfeb1, 0xfeb3, 0xfeb5, 0xfeb7, 0xfeb9, 0xfebb, 0xfebd, 0xfebf, 0xfec1, 0xfec5, 0xfec9, 0xfeca, 0xfecb, 0xfecc, 0xfecd, 0xfece, 0xfecf, 0xfed0, 0xfed1, 0xfed3, 0xfed5, 0xfed7, 0xfed9, 0xfedb, 0xfb92, 0xfb94, 0xfedd, 0xfedf, 0xfee0, 0xfee1, 0xfee3, 0xfb9e, 0xfee5, 0xfee7, 0xfe85, 0xfeed, 0xfba6, 0xfba8, 0xfba9, 0xfbaa, 0xfe80, 0xfe89, 0xfe8a, 0xfe8b, 0xfef1, 0xfef2, 0xfef3, 0xfbb0, 0xfbae, 0xfe7c, 0xfe7d }; /* Table for CP1026.TXT */ static const hts_UCS4 table_cp1026[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x009c, 0x0009, 0x0086, 0x007f, 0x0097, 0x008d, 0x008e, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x009d, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, 0x008f, 0x001c, 0x001d, 0x001e, 0x001f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000a, 0x0017, 0x001b, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, 0x0098, 0x0099, 0x009a, 0x009b, 0x0014, 0x0015, 0x009e, 0x001a, 0x0020, 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x007b, 0x00f1, 0x00c7, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x011e, 0x0130, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x005b, 0x00d1, 0x015f, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0131, 0x003a, 0x00d6, 0x015e, 0x0027, 0x003d, 0x00dc, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x007d, 0x0060, 0x00a6, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x00f6, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x005d, 0x0024, 0x0040, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x00e7, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x007e, 0x00f2, 0x00f3, 0x00f5, 0x011f, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x005c, 0x00f9, 0x00fa, 0x00ff, 0x00fc, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x0023, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x0022, 0x00d9, 0x00da, 0x009f }; /* Table for CP1250.TXT */ static const hts_UCS4 table_cp1250[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0083, 0x201e, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 }; /* Table for CP1251.TXT */ static const hts_UCS4 table_cp1251[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f }; /* Table for CP1252.TXT */ static const hts_UCS4 table_cp1252[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff }; /* Table for CP1253.TXT */ static const hts_UCS4 table_cp1253[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008a, 0x2039, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x009a, 0x203a, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x00d2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x00ff }; /* Table for CP1254.TXT */ static const hts_UCS4 table_cp1254[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff }; /* Table for CP1255.TXT */ static const hts_UCS4 table_cp1255[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x008a, 0x2039, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x009a, 0x203a, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0x00ca, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x00ff }; /* Table for CP1256.TXT */ static const hts_UCS4 table_cp1256[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2 }; /* Table for CP1257.TXT */ static const hts_UCS4 table_cp1257[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0083, 0x201e, 0x2026, 0x2020, 0x2021, 0x0088, 0x2030, 0x008a, 0x2039, 0x008c, 0x00a8, 0x02c7, 0x00b8, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0098, 0x2122, 0x009a, 0x203a, 0x009c, 0x00af, 0x02db, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9 }; /* Table for CP1258.TXT */ static const hts_UCS4 table_cp1258[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x008a, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x009a, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff }; /* Table for CP424.TXT */ static const hts_UCS4 table_cp424[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x009c, 0x0009, 0x0086, 0x007f, 0x0097, 0x008d, 0x008e, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x009d, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, 0x008f, 0x001c, 0x001d, 0x001e, 0x001f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000a, 0x0017, 0x001b, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, 0x0098, 0x0099, 0x009a, 0x009b, 0x0014, 0x0015, 0x009e, 0x001a, 0x0020, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x00a2, 0x002e, 0x003c, 0x0028, 0x002b, 0x007c, 0x0026, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x0021, 0x0024, 0x002a, 0x0029, 0x003b, 0x00ac, 0x002d, 0x002f, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x0070, 0x05ea, 0x0072, 0x0073, 0x00a0, 0x0075, 0x0076, 0x0077, 0x2017, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0080, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x008c, 0x008d, 0x008e, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x009a, 0x009b, 0x009c, 0x00b8, 0x009e, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00ae, 0x005e, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x005b, 0x005d, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x009f }; /* Table for CP437.TXT */ static const hts_UCS4 table_cp437[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP500.TXT */ static const hts_UCS4 table_cp500[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x009c, 0x0009, 0x0086, 0x007f, 0x0097, 0x008d, 0x008e, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x009d, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, 0x008f, 0x001c, 0x001d, 0x001e, 0x001f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000a, 0x0017, 0x001b, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, 0x0098, 0x0099, 0x009a, 0x009b, 0x0014, 0x0015, 0x009e, 0x001a, 0x0020, 0x00a0, 0x00e2, 0x00e4, 0x00e0, 0x00e1, 0x00e3, 0x00e5, 0x00e7, 0x00f1, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x00e9, 0x00ea, 0x00eb, 0x00e8, 0x00ed, 0x00ee, 0x00ef, 0x00ec, 0x00df, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x00c2, 0x00c4, 0x00c0, 0x00c1, 0x00c3, 0x00c5, 0x00c7, 0x00d1, 0x00a6, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00f8, 0x00c9, 0x00ca, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x00d8, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x00ab, 0x00bb, 0x00f0, 0x00fd, 0x00fe, 0x00b1, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x00aa, 0x00ba, 0x00e6, 0x00b8, 0x00c6, 0x00a4, 0x00b5, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x00a1, 0x00bf, 0x00d0, 0x00dd, 0x00de, 0x00ae, 0x00a2, 0x00a3, 0x00a5, 0x00b7, 0x00a9, 0x00a7, 0x00b6, 0x00bc, 0x00bd, 0x00be, 0x00ac, 0x007c, 0x00af, 0x00a8, 0x00b4, 0x00d7, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x00f4, 0x00f6, 0x00f2, 0x00f3, 0x00f5, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b9, 0x00fb, 0x00fc, 0x00f9, 0x00fa, 0x00ff, 0x005c, 0x00f7, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00d4, 0x00d6, 0x00d2, 0x00d3, 0x00d5, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00db, 0x00dc, 0x00d9, 0x00da, 0x009f }; /* Table for CP737.TXT */ static const hts_UCS4 table_cp737[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03c9, 0x03ac, 0x03ad, 0x03ae, 0x03ca, 0x03af, 0x03cc, 0x03cd, 0x03cb, 0x03ce, 0x0386, 0x0388, 0x0389, 0x038a, 0x038c, 0x038e, 0x038f, 0x00b1, 0x2265, 0x2264, 0x03aa, 0x03ab, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP775.TXT */ static const hts_UCS4 table_cp775[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0106, 0x00fc, 0x00e9, 0x0101, 0x00e4, 0x0123, 0x00e5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012b, 0x0179, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x014d, 0x00f6, 0x0122, 0x00a2, 0x015a, 0x015b, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x00a4, 0x0100, 0x012a, 0x00f3, 0x017b, 0x017c, 0x017a, 0x201d, 0x00a6, 0x00a9, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x0141, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010c, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255d, 0x012e, 0x0160, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0172, 0x016a, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x017d, 0x0105, 0x010d, 0x0119, 0x0117, 0x012f, 0x0161, 0x0173, 0x016b, 0x017e, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x00d3, 0x00df, 0x014c, 0x0143, 0x00f5, 0x00d5, 0x00b5, 0x0144, 0x0136, 0x0137, 0x013b, 0x013c, 0x0146, 0x0112, 0x0145, 0x2019, 0x00ad, 0x00b1, 0x201c, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x201e, 0x00b0, 0x2219, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP850.TXT */ static const hts_UCS4 table_cp850[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP852.TXT */ static const hts_UCS4 table_cp852[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x016f, 0x0107, 0x00e7, 0x0142, 0x00eb, 0x0150, 0x0151, 0x00ee, 0x0179, 0x00c4, 0x0106, 0x00c9, 0x0139, 0x013a, 0x00f4, 0x00f6, 0x013d, 0x013e, 0x015a, 0x015b, 0x00d6, 0x00dc, 0x0164, 0x0165, 0x0141, 0x00d7, 0x010d, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x0104, 0x0105, 0x017d, 0x017e, 0x0118, 0x0119, 0x00ac, 0x017a, 0x010c, 0x015f, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x011a, 0x015e, 0x2563, 0x2551, 0x2557, 0x255d, 0x017b, 0x017c, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0102, 0x0103, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, 0x0111, 0x0110, 0x010e, 0x00cb, 0x010f, 0x0147, 0x00cd, 0x00ce, 0x011b, 0x2518, 0x250c, 0x2588, 0x2584, 0x0162, 0x016e, 0x2580, 0x00d3, 0x00df, 0x00d4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00da, 0x0155, 0x0170, 0x00fd, 0x00dd, 0x0163, 0x00b4, 0x00ad, 0x02dd, 0x02db, 0x02c7, 0x02d8, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x02d9, 0x0171, 0x0158, 0x0159, 0x25a0, 0x00a0 }; /* Table for CP855.TXT */ static const hts_UCS4 table_cp855[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, 0x0459, 0x0409, 0x045a, 0x040a, 0x045b, 0x040b, 0x045c, 0x040c, 0x045e, 0x040e, 0x045f, 0x040f, 0x044e, 0x042e, 0x044a, 0x042a, 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255d, 0x0439, 0x0419, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x043a, 0x041a, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, 0x043b, 0x041b, 0x043c, 0x041c, 0x043d, 0x041d, 0x043e, 0x041e, 0x043f, 0x2518, 0x250c, 0x2588, 0x2584, 0x041f, 0x044f, 0x2580, 0x042f, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044c, 0x042c, 0x2116, 0x00ad, 0x044b, 0x042b, 0x0437, 0x0417, 0x0448, 0x0428, 0x044d, 0x042d, 0x0449, 0x0429, 0x0447, 0x0427, 0x00a7, 0x25a0, 0x00a0 }; /* Table for CP856.TXT */ static const hts_UCS4 table_cp856[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x009b, 0x00a3, 0x009d, 0x00d7, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00ad, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00b5, 0x00b6, 0x00b7, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00c6, 0x00c7, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00de, 0x2580, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00b5, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00af, 0x00b4, 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP857.TXT */ static const hts_UCS4 table_cp857[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x0131, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x0130, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x015e, 0x015f, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x011e, 0x011f, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, 0x00ba, 0x00aa, 0x00ca, 0x00cb, 0x00c8, 0x00d5, 0x00cd, 0x00ce, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00e7, 0x00d7, 0x00da, 0x00db, 0x00d9, 0x00ec, 0x00ff, 0x00af, 0x00b4, 0x00ad, 0x00b1, 0x00f2, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP860.TXT */ static const hts_UCS4 table_cp860[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e3, 0x00e0, 0x00c1, 0x00e7, 0x00ea, 0x00ca, 0x00e8, 0x00cd, 0x00d4, 0x00ec, 0x00c3, 0x00c2, 0x00c9, 0x00c0, 0x00c8, 0x00f4, 0x00f5, 0x00f2, 0x00da, 0x00f9, 0x00cc, 0x00d5, 0x00dc, 0x00a2, 0x00a3, 0x00d9, 0x20a7, 0x00d3, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00d2, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP861.TXT */ static const hts_UCS4 table_cp861[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00d0, 0x00f0, 0x00de, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00fe, 0x00fb, 0x00dd, 0x00fd, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00c1, 0x00cd, 0x00d3, 0x00da, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP862.TXT */ static const hts_UCS4 table_cp862[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP863.TXT */ static const hts_UCS4 table_cp863[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00c2, 0x00e0, 0x00b6, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x2017, 0x00c0, 0x00a7, 0x00c9, 0x00c8, 0x00ca, 0x00f4, 0x00cb, 0x00cf, 0x00fb, 0x00f9, 0x00a4, 0x00d4, 0x00dc, 0x00a2, 0x00a3, 0x00d9, 0x00db, 0x0192, 0x00a6, 0x00b4, 0x00f3, 0x00fa, 0x00a8, 0x00b8, 0x00b3, 0x00af, 0x00ce, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00be, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP864.TXT */ static const hts_UCS4 table_cp864[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00b0, 0x00b7, 0x2219, 0x221a, 0x2592, 0x2500, 0x2502, 0x253c, 0x2524, 0x252c, 0x251c, 0x2534, 0x2510, 0x250c, 0x2514, 0x2518, 0x03b2, 0x221e, 0x03c6, 0x00b1, 0x00bd, 0x00bc, 0x2248, 0x00ab, 0x00bb, 0xfef7, 0xfef8, 0x009b, 0x009c, 0xfefb, 0xfefc, 0x009f, 0x00a0, 0x00ad, 0xfe82, 0x00a3, 0x00a4, 0xfe84, 0x00a6, 0x00a7, 0xfe8e, 0xfe8f, 0xfe95, 0xfe99, 0x060c, 0xfe9d, 0xfea1, 0xfea5, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xfed1, 0x061b, 0xfeb1, 0xfeb5, 0xfeb9, 0x061f, 0x00a2, 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfeca, 0xfe8b, 0xfe8d, 0xfe91, 0xfe93, 0xfe97, 0xfe9b, 0xfe9f, 0xfea3, 0xfea7, 0xfea9, 0xfeab, 0xfead, 0xfeaf, 0xfeb3, 0xfeb7, 0xfebb, 0xfebf, 0xfec1, 0xfec5, 0xfecb, 0xfecf, 0x00a6, 0x00ac, 0x00f7, 0x00d7, 0xfec9, 0x0640, 0xfed3, 0xfed7, 0xfedb, 0xfedf, 0xfee3, 0xfee7, 0xfeeb, 0xfeed, 0xfeef, 0xfef3, 0xfebd, 0xfecc, 0xfece, 0xfecd, 0xfee1, 0xfe7d, 0x0651, 0xfee5, 0xfee9, 0xfeec, 0xfef0, 0xfef2, 0xfed0, 0xfed5, 0xfef5, 0xfef6, 0xfedd, 0xfed9, 0xfef1, 0x25a0, 0x00ff }; /* Table for CP865.TXT */ static const hts_UCS4 table_cp865[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x20a7, 0x0192, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00a4, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229, 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0 }; /* Table for CP866.TXT */ static const hts_UCS4 table_cp866[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0 }; /* Table for CP869.TXT */ static const hts_UCS4 table_cp869[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0386, 0x0087, 0x00b7, 0x00ac, 0x00a6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, 0x038a, 0x03aa, 0x038c, 0x0093, 0x0094, 0x038e, 0x03ab, 0x00a9, 0x038f, 0x00b2, 0x00b3, 0x03ac, 0x00a3, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, 0x03cd, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00bd, 0x0398, 0x0399, 0x00ab, 0x00bb, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039a, 0x039b, 0x039c, 0x039d, 0x2563, 0x2551, 0x2557, 0x255d, 0x039e, 0x039f, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x03a0, 0x03a1, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x2518, 0x250c, 0x2588, 0x2584, 0x03b4, 0x03b5, 0x2580, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x0384, 0x00ad, 0x00b1, 0x03c5, 0x03c6, 0x03c7, 0x00a7, 0x03c8, 0x0385, 0x00b0, 0x00a8, 0x03c9, 0x03cb, 0x03b0, 0x03ce, 0x25a0, 0x00a0 }; /* Table for CP874.TXT */ static const hts_UCS4 table_cp874[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x20ac, 0x0081, 0x0082, 0x0083, 0x0084, 0x2026, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x0e3f, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x00fc, 0x00fd, 0x00fe, 0x00ff }; /* Table for CP875.TXT */ static const hts_UCS4 table_cp875[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x009c, 0x0009, 0x0086, 0x007f, 0x0097, 0x008d, 0x008e, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x009d, 0x0085, 0x0008, 0x0087, 0x0018, 0x0019, 0x0092, 0x008f, 0x001c, 0x001d, 0x001e, 0x001f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x000a, 0x0017, 0x001b, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x0005, 0x0006, 0x0007, 0x0090, 0x0091, 0x0016, 0x0093, 0x0094, 0x0095, 0x0096, 0x0004, 0x0098, 0x0099, 0x009a, 0x009b, 0x0014, 0x0015, 0x009e, 0x001a, 0x0020, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x005b, 0x002e, 0x003c, 0x0028, 0x002b, 0x0021, 0x0026, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x005d, 0x0024, 0x002a, 0x0029, 0x003b, 0x005e, 0x002d, 0x002f, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x007c, 0x002c, 0x0025, 0x005f, 0x003e, 0x003f, 0x00a8, 0x0386, 0x0388, 0x0389, 0x00a0, 0x038a, 0x038c, 0x038e, 0x038f, 0x0060, 0x003a, 0x0023, 0x0040, 0x0027, 0x003d, 0x0022, 0x0385, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x00b0, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x00b4, 0x007e, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x00a3, 0x03ac, 0x03ad, 0x03ae, 0x03ca, 0x03af, 0x03cc, 0x03cd, 0x03cb, 0x03ce, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x007b, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x00ad, 0x03c9, 0x0390, 0x03b0, 0x2018, 0x2015, 0x007d, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x00b1, 0x00bd, 0x001a, 0x0387, 0x2019, 0x00a6, 0x005c, 0x001a, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x00b2, 0x00a7, 0x001a, 0x001a, 0x00ab, 0x00ac, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00b3, 0x00a9, 0x001a, 0x001a, 0x00bb, 0x009f }; /* Table for KOI8-R.TXT */ static const hts_UCS4 table_koi8_r[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a }; /* Table for KOI8-U.TXT */ static const hts_UCS4 table_koi8_u[256] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a }; static const struct { const char *name; const hts_UCS4 *table; } table_mappings[] = { { "iso885910", table_iso_8859_10 }, { "iso885911", table_iso_8859_11 }, { "iso885913", table_iso_8859_13 }, { "iso885914", table_iso_8859_14 }, { "iso885915", table_iso_8859_15 }, { "iso885916", table_iso_8859_16 }, { "iso88591", table_iso_8859_1 }, { "iso88592", table_iso_8859_2 }, { "iso88593", table_iso_8859_3 }, { "iso88594", table_iso_8859_4 }, { "iso88595", table_iso_8859_5 }, { "iso88596", table_iso_8859_6 }, { "iso88597", table_iso_8859_7 }, { "iso88598", table_iso_8859_8 }, { "iso88599", table_iso_8859_9 }, { "cp037", table_cp037 }, { "cp1006", table_cp1006 }, { "cp1026", table_cp1026 }, { "cp1250", table_cp1250 }, { "cp1251", table_cp1251 }, { "cp1252", table_cp1252 }, { "cp1253", table_cp1253 }, { "cp1254", table_cp1254 }, { "cp1255", table_cp1255 }, { "cp1256", table_cp1256 }, { "cp1257", table_cp1257 }, { "cp1258", table_cp1258 }, { "cp424", table_cp424 }, { "cp437", table_cp437 }, { "cp500", table_cp500 }, { "cp737", table_cp737 }, { "cp775", table_cp775 }, { "cp850", table_cp850 }, { "cp852", table_cp852 }, { "cp855", table_cp855 }, { "cp856", table_cp856 }, { "cp857", table_cp857 }, { "cp860", table_cp860 }, { "cp861", table_cp861 }, { "cp862", table_cp862 }, { "cp863", table_cp863 }, { "cp864", table_cp864 }, { "cp865", table_cp865 }, { "cp866", table_cp866 }, { "cp869", table_cp869 }, { "cp874", table_cp874 }, { "cp875", table_cp875 }, { "koi8r", table_koi8_r }, { "koi8u", table_koi8_u }, { NULL, NULL } }; httrack-3.49.14/src/htsbasiccharsets.sh0000755000175000017500000000476715230602340013511 #!/bin/bash # # Change this to download files if false; then echo "mget https://www.unicode.org/Public/MAPPINGS/ISO8859/8859-*.TXT" | lftp echo "mget https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP*.TXT" | lftp echo "mget https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP*.TXT" | lftp echo "mget https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/EBCDIC/CP*.TXT" | lftp echo "mget https://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/CP*.TXT" | lftp echo "mget https://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8*.TXT" | lftp rm -f CP932.TXT CP936.TXT CP949.TXT CP950.TXT fi # Produce code printf '/** GENERATED FILE (%s), DO NOT EDIT **/\n\n' "$0" for i in *.TXT; do echo "processing $i" >&2 grep -vE "^(#|$)" "$i" | grep -E "^0x" | sed -e 's/[[:space:]]/ /g' | cut -f1,2 -d' ' | ( unset arr while read -r LINE; do from=$(($(echo "$LINE" | cut -f1 -d' '))) if ! test -n "$from"; then echo "error with $i" >&2 exit 1 elif test $from -ge 256; then echo "out-of-range ($LINE) with $i" >&2 exit 1 fi to=$(echo "$LINE" | cut -f2 -d' ') arr[from]=$to done # shellcheck disable=SC2018,SC2019 # charset filenames are ASCII; keep C-locale A-Z/a-z name=$(echo "$i" | tr 'A-Z' 'a-z' | tr '-' '_' | sed -e 's/\.txt//' -e 's/8859/iso_8859/') printf '/* Table for %s */\nstatic const hts_UCS4 table_%s[256] = {\n ' "$i" "$name" idx=0 while test "$idx" -lt 256; do if test "$idx" -gt 0; then printf ", " if test $((idx % 8)) -eq 0; then printf "\n " fi fi value=${arr[$idx]:-0} printf "0x%04x" "$value" idx=$((idx + 1)) done printf " };\n\n" ) echo "processed $i" >&2 done # Indexes printf "static const struct {\n const char *name;\n const hts_UCS4 *table;\n} table_mappings[] = {\n" for i in *.TXT; do # shellcheck disable=SC2018,SC2019 # charset filenames are ASCII; keep C-locale A-Z/a-z name=$(echo "$i" | tr 'A-Z' 'a-z' | tr '-' '_' | sed -e 's/\.txt//' -e 's/8859/iso_8859/') printf ' { "%s", table_%s },\n' "$(echo "$name" | tr -d '_')" "$name" done printf " { NULL, NULL }\n};\n" httrack-3.49.14/src/htsentities.sh0000755000175000017500000000565615230602340012515 #!/bin/bash # # Regenerate htsentities.h from the WHATWG named character references. set -euo pipefail src=entities.json url=https://html.spec.whatwg.org/entities.json dest=htsentities.h # 64-bit FNV-1a of $1, printed as a C constant. Must match the hash in # htsencoding.c. The offset basis is stored as its wrapped (signed) bit pattern; # bash arithmetic is 64-bit two's complement, so the result is bit-exact. fnv1a() { local s=$1 i c h=$((0xcbf29ce484222325)) for ((i = 0; i < ${#s}; i++)); do printf -v c '%d' "'${s:i:1}" h=$(((h ^ (c & 0xff)) * 0x100000001b3)) done printf '0x%016xULL' "$h" } if [ ! -f "$src" ]; then curl -fsS "$url" -o "$src" fi # Keep ';'-terminated single-codepoint names; the ~93 multi-codepoint refs can't # fit decode_entity's single-codepoint return and are skipped (left verbatim). pairs=$(jq -r ' to_entries | map(select((.key | endswith(";")) and (.value.codepoints | length == 1))) | sort_by(.key) | .[] | "\(.key | ltrimstr("&") | rtrimstr(";"))\t\(.value.codepoints[0])"' "$src") # Skipped multi-codepoint names, kept to prove none aliases an emitted hash. skipped=$(jq -r ' to_entries | map(select((.key | endswith(";")) and (.value.codepoints | length > 1))) | .[] | .key | ltrimstr("&") | rtrimstr(";")' "$src") cases="" emit_hashes="" while IFS=$'\t' read -r name cp; do hash=$(fnv1a "$name") cases+=" /* $name */"$'\n' cases+=" case $hash:"$'\n' cases+=" if (len == ${#name}) {"$'\n' cases+=" return $cp;"$'\n' cases+=" }"$'\n' cases+=" break;"$'\n' emit_hashes+="$hash"$'\n' done <<<"$pairs" skip_hashes="" while IFS= read -r name; do [ -n "$name" ] && skip_hashes+="$(fnv1a "$name")"$'\n' done <<<"$skipped" # The switch keys on the hash alone, so the dispatch is correct only while every # emitted name hashes uniquely; prove it here, no runtime name compare needed. dups=$(printf '%s' "$emit_hashes" | sort | uniq -d || true) if [ -n "$dups" ]; then echo "FATAL: two entity names share a hash (duplicate switch case); change the hash:" >&2 echo "$dups" >&2 exit 1 fi # A skipped name colliding with an emitted hash would mis-decode instead of # staying verbatim; forbid that too. aliased=$(comm -12 <(printf '%s' "$emit_hashes" | sort -u) <(printf '%s' "$skip_hashes" | sort -u) || true) if [ -n "$aliased" ]; then echo "FATAL: a skipped multi-codepoint name aliases an emitted hash:" >&2 echo "$aliased" >&2 exit 1 fi cat >"$dest" < static int decode_entity(const uint64_t hash, const size_t len) { switch(hash) { ${cases} } /* unknown */ return -1; } EOF echo "wrote $dest ($(grep -c '^ case ' "$dest") entities)" >&2 httrack-3.49.14/src/htsentities.h0000644000175000017500000063473015230602340012330 /* GENERATED by htsentities.sh from the WHATWG named character references (https://html.spec.whatwg.org/entities.json). DO NOT EDIT. Dispatch keys on a 64-bit FNV-1a hash of the entity name; the generator aborts on any hash collision, so no runtime name compare is needed. */ #include static int decode_entity(const uint64_t hash, const size_t len) { switch(hash) { /* AElig */ case 0x18394e1ff5776859ULL: if (len == 5) { return 198; } break; /* AMP */ case 0xfa03a519a04ea059ULL: if (len == 3) { return 38; } break; /* Aacute */ case 0x2409a9c702169658ULL: if (len == 6) { return 193; } break; /* Abreve */ case 0x78d7c9535a197302ULL: if (len == 6) { return 258; } break; /* Acirc */ case 0x56bc5044a5cc4f2bULL: if (len == 5) { return 194; } break; /* Acy */ case 0xf9c5d019a019884cULL: if (len == 3) { return 1040; } break; /* Afr */ case 0xf9b4d919a00b2464ULL: if (len == 3) { return 120068; } break; /* Agrave */ case 0x752278feab81816dULL: if (len == 6) { return 192; } break; /* Alpha */ case 0x4fda04cbc245e18bULL: if (len == 5) { return 913; } break; /* Amacr */ case 0x32167cd28afa9067ULL: if (len == 5) { return 256; } break; /* And */ case 0xf999b7199ff422e6ULL: if (len == 3) { return 10835; } break; /* Aogon */ case 0xd20842e4903aab13ULL: if (len == 5) { return 260; } break; /* Aopf */ case 0x1f61db8ad2c66497ULL: if (len == 4) { return 120120; } break; /* ApplyFunction */ case 0x8ca35dcd7fa3cafbULL: if (len == 13) { return 8289; } break; /* Aring */ case 0xc8c1a0c1bd9dc5c6ULL: if (len == 5) { return 197; } break; /* Ascr */ case 0x114c618b5b9fe568ULL: if (len == 4) { return 119964; } break; /* Assign */ case 0xc92c1a54034e21ccULL: if (len == 6) { return 8788; } break; /* Atilde */ case 0x3f5a954e8956508aULL: if (len == 6) { return 195; } break; /* Auml */ case 0xdb8b598b3cabbc4aULL: if (len == 4) { return 196; } break; /* Backslash */ case 0x2e51bac8425c11b7ULL: if (len == 9) { return 8726; } break; /* Barv */ case 0xc1a0f3a7a8de4164ULL: if (len == 4) { return 10983; } break; /* Barwed */ case 0xfe3cb353a84b12d6ULL: if (len == 6) { return 8966; } break; /* Bcy */ case 0x16484719b0f6a811ULL: if (len == 3) { return 1041; } break; /* Because */ case 0xa966b5956e468a1bULL: if (len == 7) { return 8757; } break; /* Bernoullis */ case 0xd2ae2f19d7112f40ULL: if (len == 10) { return 8492; } break; /* Beta */ case 0xa0b562a796b69487ULL: if (len == 4) { return 914; } break; /* Bfr */ case 0x163e4e19b0ee5f71ULL: if (len == 3) { return 120069; } break; /* Bopf */ case 0xf7b2d9a7c81687e4ULL: if (len == 4) { return 120121; } break; /* Breve */ case 0x4feb5e845ad95b55ULL: if (len == 5) { return 728; } break; /* Bscr */ case 0x5fd7c3a803221213ULL: if (len == 4) { return 8492; } break; /* Bumpeq */ case 0xc372a340673c7953ULL: if (len == 6) { return 8782; } break; /* CHcy */ case 0x07216d9c6f0c7baaULL: if (len == 4) { return 1063; } break; /* COPY */ case 0x2011c49c7ce10124ULL: if (len == 4) { return 169; } break; /* Cacute */ case 0x5f62ead6c2dfa02eULL: if (len == 6) { return 262; } break; /* Cap */ case 0x0bec2319aa9da8bbULL: if (len == 3) { return 8914; } break; /* CapitalDifferentialD */ case 0x259b2e059cfe5452ULL: if (len == 20) { return 8517; } break; /* Cayleys */ case 0x72d086c7441f4827ULL: if (len == 7) { return 8493; } break; /* Ccaron */ case 0xfbc31a5af710a9a5ULL: if (len == 6) { return 268; } break; /* Ccedil */ case 0x7bbc767e947c3727ULL: if (len == 6) { return 199; } break; /* Ccirc */ case 0xa49cc48f5e302fc5ULL: if (len == 5) { return 264; } break; /* Cconint */ case 0x6be9c6f80d3187afULL: if (len == 7) { return 8752; } break; /* Cdot */ case 0xf8f9de9cf7d5b299ULL: if (len == 4) { return 266; } break; /* Cedilla */ case 0x14fd3053685d065dULL: if (len == 7) { return 184; } break; /* CenterDot */ case 0x526bfb3a65a4da8bULL: if (len == 9) { return 183; } break; /* Cfr */ case 0x0bef2b19aa9fec2aULL: if (len == 3) { return 8493; } break; /* Chi */ case 0x0c041619aab22485ULL: if (len == 3) { return 935; } break; /* CircleDot */ case 0x9c35f65c65d93bb4ULL: if (len == 9) { return 8857; } break; /* CircleMinus */ case 0xf5c0f0dddd1e9163ULL: if (len == 11) { return 8854; } break; /* CirclePlus */ case 0xc657d9663aedb929ULL: if (len == 10) { return 8853; } break; /* CircleTimes */ case 0x7cb9857a413b6649ULL: if (len == 11) { return 8855; } break; /* ClockwiseContourIntegral */ case 0x4ceca49e8cb0a701ULL: if (len == 24) { return 8754; } break; /* CloseCurlyDoubleQuote */ case 0x0b6335f2463cae57ULL: if (len == 21) { return 8221; } break; /* CloseCurlyQuote */ case 0x90ce96f2eab07a8cULL: if (len == 15) { return 8217; } break; /* Colon */ case 0x344eb4f4939cf0fcULL: if (len == 5) { return 8759; } break; /* Colone */ case 0x7eae1496d3acd3fbULL: if (len == 6) { return 10868; } break; /* Congruent */ case 0x3f9ce4a5b87c9c4aULL: if (len == 9) { return 8801; } break; /* Conint */ case 0x01ec91896b92baa4ULL: if (len == 6) { return 8751; } break; /* ContourIntegral */ case 0xbcef3cb5d2f74ed1ULL: if (len == 15) { return 8750; } break; /* Copf */ case 0x36870b9d1af56ea9ULL: if (len == 4) { return 8450; } break; /* Coproduct */ case 0x01a44e62517ef6b6ULL: if (len == 9) { return 8720; } break; /* CounterClockwiseContourIntegral */ case 0x1811b86e5419cf3fULL: if (len == 31) { return 8755; } break; /* Cross */ case 0x1f152e00912ee85bULL: if (len == 5) { return 10799; } break; /* Cscr */ case 0x4496799c92176dc6ULL: if (len == 4) { return 119966; } break; /* Cup */ case 0x0bc31b19aa7a960fULL: if (len == 3) { return 8915; } break; /* CupCap */ case 0xc9dc0a414ff5303dULL: if (len == 6) { return 8781; } break; /* DD */ case 0x08fe3407b5984795ULL: if (len == 2) { return 8517; } break; /* DDotrahd */ case 0x901265414c8afab3ULL: if (len == 8) { return 10513; } break; /* DJcy */ case 0xd42f6172b4b89343ULL: if (len == 4) { return 1026; } break; /* DScy */ case 0xfe4360723c4c9940ULL: if (len == 4) { return 1029; } break; /* DZcy */ case 0x4a70d17266f0cfb3ULL: if (len == 4) { return 1039; } break; /* Dagger */ case 0x9357e823f15b88bbULL: if (len == 6) { return 8225; } break; /* Darr */ case 0xac8973732f3531daULL: if (len == 4) { return 8609; } break; /* Dashv */ case 0x6a38f3b93b485c39ULL: if (len == 5) { return 10980; } break; /* Dcaron */ case 0x276eaf4593a8149eULL: if (len == 6) { return 270; } break; /* Dcy */ case 0xe08f4d19920a686bULL: if (len == 3) { return 1044; } break; /* Del */ case 0xe0a34419921b022aULL: if (len == 3) { return 8711; } break; /* Delta */ case 0x11c74ddc5e28f321ULL: if (len == 5) { return 916; } break; /* Dfr */ case 0xe0a060199218fbe7ULL: if (len == 3) { return 120071; } break; /* DiacriticalAcute */ case 0x3da5cc0bd8f135acULL: if (len == 16) { return 180; } break; /* DiacriticalDot */ case 0x2fca11ea37b686a7ULL: if (len == 14) { return 729; } break; /* DiacriticalDoubleAcute */ case 0x697966d35e56545bULL: if (len == 22) { return 733; } break; /* DiacriticalGrave */ case 0xe697b4ef50298271ULL: if (len == 16) { return 96; } break; /* DiacriticalTilde */ case 0xa5ac81d49b3b7a76ULL: if (len == 16) { return 732; } break; /* Diamond */ case 0x469d5c53c3a49087ULL: if (len == 7) { return 8900; } break; /* DifferentialD */ case 0xafd6823df46bd190ULL: if (len == 13) { return 8518; } break; /* Dopf */ case 0x032ef973604ac8deULL: if (len == 4) { return 120123; } break; /* Dot */ case 0xe0b74819922bb200ULL: if (len == 3) { return 168; } break; /* DotDot */ case 0x38048652ea66e057ULL: if (len == 6) { return 8412; } break; /* DotEqual */ case 0xfcd861c29dcf7b78ULL: if (len == 8) { return 8784; } break; /* DoubleContourIntegral */ case 0x38d735568019cffeULL: if (len == 21) { return 8751; } break; /* DoubleDot */ case 0x3b02db5e0cf064ffULL: if (len == 9) { return 168; } break; /* DoubleDownArrow */ case 0xfcd66c821474ff95ULL: if (len == 15) { return 8659; } break; /* DoubleLeftArrow */ case 0xd2280f2631444542ULL: if (len == 15) { return 8656; } break; /* DoubleLeftRightArrow */ case 0xed379a75ef7ba4eaULL: if (len == 20) { return 8660; } break; /* DoubleLeftTee */ case 0xc5d69da98539f2a9ULL: if (len == 13) { return 10980; } break; /* DoubleLongLeftArrow */ case 0xdab5e8fffc2e1428ULL: if (len == 19) { return 10232; } break; /* DoubleLongLeftRightArrow */ case 0xecd240b222683554ULL: if (len == 24) { return 10234; } break; /* DoubleLongRightArrow */ case 0x00b22dbb0394e83dULL: if (len == 20) { return 10233; } break; /* DoubleRightArrow */ case 0x9b535f4bac8cb587ULL: if (len == 16) { return 8658; } break; /* DoubleRightTee */ case 0x124d249f38917d28ULL: if (len == 14) { return 8872; } break; /* DoubleUpArrow */ case 0x67ad3d3178b57a76ULL: if (len == 13) { return 8657; } break; /* DoubleUpDownArrow */ case 0x10af8b1fbdae0666ULL: if (len == 17) { return 8661; } break; /* DoubleVerticalBar */ case 0x2e053385b30ff243ULL: if (len == 17) { return 8741; } break; /* DownArrow */ case 0x26d4481d1ebb7cf6ULL: if (len == 9) { return 8595; } break; /* DownArrowBar */ case 0x1d700911e309b06fULL: if (len == 12) { return 10515; } break; /* DownArrowUpArrow */ case 0x660c8d2a95771820ULL: if (len == 16) { return 8693; } break; /* DownBreve */ case 0xfead7089204461c5ULL: if (len == 9) { return 785; } break; /* DownLeftRightVector */ case 0xd23f54705228a8c9ULL: if (len == 19) { return 10576; } break; /* DownLeftTeeVector */ case 0xd44f1c23bb48b291ULL: if (len == 17) { return 10590; } break; /* DownLeftVector */ case 0xdc3caa672ac6218fULL: if (len == 14) { return 8637; } break; /* DownLeftVectorBar */ case 0x977d27a9db7d9310ULL: if (len == 17) { return 10582; } break; /* DownRightTeeVector */ case 0x855c623a4ac07ce2ULL: if (len == 18) { return 10591; } break; /* DownRightVector */ case 0x018b1d823c40a8f2ULL: if (len == 15) { return 8641; } break; /* DownRightVectorBar */ case 0xa72ff2c15e781b03ULL: if (len == 18) { return 10583; } break; /* DownTee */ case 0x86f46e3bb2ad2a45ULL: if (len == 7) { return 8868; } break; /* DownTeeArrow */ case 0xba1fb3380a414a86ULL: if (len == 12) { return 8615; } break; /* Downarrow */ case 0x108f60bb94a4d596ULL: if (len == 9) { return 8659; } break; /* Dscr */ case 0x10e68b72d7228f51ULL: if (len == 4) { return 119967; } break; /* Dstrok */ case 0xcc9161f743672e5cULL: if (len == 6) { return 272; } break; /* ENG */ case 0xd96542198e67aff7ULL: if (len == 3) { return 330; } break; /* ETH */ case 0xd97a1b198e79c9bcULL: if (len == 3) { return 208; } break; /* Eacute */ case 0x293857f837f4d6fcULL: if (len == 6) { return 201; } break; /* Ecaron */ case 0x7aceb873f959a987ULL: if (len == 6) { return 282; } break; /* Ecirc */ case 0x4e4287c70797d11fULL: if (len == 5) { return 202; } break; /* Ecy */ case 0xd8d324198deb8ee0ULL: if (len == 3) { return 1069; } break; /* Edot */ case 0x64e8266c2dcbae57ULL: if (len == 4) { return 278; } break; /* Efr */ case 0xd8dd1d198df3d780ULL: if (len == 3) { return 120072; } break; /* Egrave */ case 0xbda55fd04b75bc41ULL: if (len == 6) { return 200; } break; /* Element */ case 0x190747c04bd639f7ULL: if (len == 7) { return 8712; } break; /* Emacr */ case 0xd1d2351a8ba4fbd3ULL: if (len == 5) { return 274; } break; /* EmptySmallSquare */ case 0x0f15f0a793f57d6eULL: if (len == 16) { return 9723; } break; /* EmptyVerySmallSquare */ case 0xf5944636ac261c32ULL: if (len == 20) { return 9643; } break; /* Eogon */ case 0x29d0eb2c67647507ULL: if (len == 5) { return 280; } break; /* Eopf */ case 0xc33eeb6c62f63cc3ULL: if (len == 4) { return 120124; } break; /* Epsilon */ case 0x970db63fbdff8cfdULL: if (len == 7) { return 917; } break; /* Equal */ case 0x2a391b3d81594d0fULL: if (len == 5) { return 10869; } break; /* EqualTilde */ case 0xd0799ddebecdcf57ULL: if (len == 10) { return 8770; } break; /* Equilibrium */ case 0x2f8809ed80bedfb7ULL: if (len == 11) { return 8652; } break; /* Escr */ case 0xe6f8916c7780dc84ULL: if (len == 4) { return 8496; } break; /* Esim */ case 0xe6d6746c7763c4d7ULL: if (len == 4) { return 10867; } break; /* Eta */ case 0xd90d44198e1d3d87ULL: if (len == 3) { return 919; } break; /* Euml */ case 0xf58ec96c7efcedfeULL: if (len == 4) { return 203; } break; /* Exists */ case 0x582f5ee767500efdULL: if (len == 6) { return 8707; } break; /* ExponentialE */ case 0x6964bde464e30f97ULL: if (len == 12) { return 8519; } break; /* Fcy */ case 0xf2c8ab199c9d9195ULL: if (len == 3) { return 1060; } break; /* Ffr */ case 0xf2d9b2199cac10adULL: if (len == 3) { return 120073; } break; /* FilledSmallSquare */ case 0xecddc2fcdbf0d53fULL: if (len == 17) { return 9724; } break; /* FilledVerySmallSquare */ case 0xd431c42516c4124bULL: if (len == 21) { return 9642; } break; /* Fopf */ case 0x07b109850da3ef90ULL: if (len == 4) { return 120125; } break; /* ForAll */ case 0x51327d9e4480ac43ULL: if (len == 6) { return 8704; } break; /* Fouriertrf */ case 0x046c2d05614647c9ULL: if (len == 10) { return 8497; } break; /* Fscr */ case 0x9f861384d293e54fULL: if (len == 4) { return 8497; } break; /* GJcy */ case 0xcaaf3f7d80711154ULL: if (len == 4) { return 1027; } break; /* GT */ case 0x09022207b59c11d6ULL: if (len == 2) { return 62; } break; /* Gamma */ case 0xe2505e23917f48caULL: if (len == 5) { return 915; } break; /* Gammad */ case 0x0dd8a4703b487faaULL: if (len == 6) { return 988; } break; /* Gbreve */ case 0x3def9a2add10cf0cULL: if (len == 6) { return 286; } break; /* Gcedil */ case 0xc2621ed750bb277bULL: if (len == 6) { return 290; } break; /* Gcirc */ case 0x3b7ccc12ab1e3329ULL: if (len == 5) { return 284; } break; /* Gcy */ case 0xeaf282199869a352ULL: if (len == 3) { return 1043; } break; /* Gdot */ case 0x8a18ce7ded18dfadULL: if (len == 4) { return 288; } break; /* Gfr */ case 0xeae16f19985b0fd6ULL: if (len == 3) { return 120074; } break; /* Gg */ case 0x09023107b59c2b53ULL: if (len == 2) { return 8921; } break; /* Gopf */ case 0xc45acb7e0d6be8e5ULL: if (len == 4) { return 120126; } break; /* GreaterEqual */ case 0xa3dd70537b7792f3ULL: if (len == 12) { return 8805; } break; /* GreaterEqualLess */ case 0xf2066efc08b70866ULL: if (len == 16) { return 8923; } break; /* GreaterFullEqual */ case 0xc5889a1887e94e18ULL: if (len == 16) { return 8807; } break; /* GreaterGreater */ case 0x2413f0571e6356e5ULL: if (len == 14) { return 10914; } break; /* GreaterLess */ case 0x0fd0afb2c34a778cULL: if (len == 11) { return 8823; } break; /* GreaterSlantEqual */ case 0x60ebd069a99841b5ULL: if (len == 17) { return 10878; } break; /* GreaterTilde */ case 0x3874578ddfdf3b55ULL: if (len == 12) { return 8819; } break; /* Gscr */ case 0x2ce5c97e48ce4842ULL: if (len == 4) { return 119970; } break; /* Gt */ case 0x09024207b59c4836ULL: if (len == 2) { return 8811; } break; /* HARDcy */ case 0xb780824b09d5171cULL: if (len == 6) { return 1066; } break; /* Hacek */ case 0xe09086cf6b0e644bULL: if (len == 5) { return 711; } break; /* Hat */ case 0x49613819cda8aa22ULL: if (len == 3) { return 94; } break; /* Hcirc */ case 0x6cc7e4bea15311acULL: if (len == 5) { return 292; } break; /* Hfr */ case 0x49503419cd9a3023ULL: if (len == 3) { return 8460; } break; /* HilbertSpace */ case 0xa665d3b7c25fa4c9ULL: if (len == 12) { return 8459; } break; /* Hopf */ case 0x6afaf9d88015b9caULL: if (len == 4) { return 8461; } break; /* HorizontalLine */ case 0xa84633c21b088ef3ULL: if (len == 14) { return 9472; } break; /* Hscr */ case 0xbd91dbd81dd16f9dULL: if (len == 4) { return 8459; } break; /* Hstrok */ case 0x617004f852d7cec8ULL: if (len == 6) { return 294; } break; /* HumpDownHump */ case 0x8a0af290bf6e95d5ULL: if (len == 12) { return 8782; } break; /* HumpEqual */ case 0x098df57083159179ULL: if (len == 9) { return 8783; } break; /* IEcy */ case 0xbabd22d0b0df608bULL: if (len == 4) { return 1045; } break; /* IJlig */ case 0xc44cfa0c94d7db92ULL: if (len == 5) { return 306; } break; /* IOcy */ case 0x1169c8d0e1fb4c9dULL: if (len == 4) { return 1025; } break; /* Iacute */ case 0x611b2b3b32d7a900ULL: if (len == 6) { return 205; } break; /* Icirc */ case 0xc4e21fdd379b9753ULL: if (len == 5) { return 206; } break; /* Icy */ case 0x419f1819c9857434ULL: if (len == 3) { return 1048; } break; /* Idot */ case 0xc93326d14a9cae8bULL: if (len == 4) { return 304; } break; /* Ifr */ case 0x418e1119c976f51cULL: if (len == 3) { return 8465; } break; /* Igrave */ case 0xb233fa72dc429415ULL: if (len == 6) { return 204; } break; /* Im */ case 0x09243707b5b91bebULL: if (len == 2) { return 8465; } break; /* Imacr */ case 0x3da1dcea0c66200fULL: if (len == 5) { return 298; } break; /* ImaginaryI */ case 0x389428f9c96cd97dULL: if (len == 10) { return 8520; } break; /* Implies */ case 0x41612187d0b1f7daULL: if (len == 7) { return 8658; } break; /* Int */ case 0x41a91f19c98dd49eULL: if (len == 3) { return 8748; } break; /* Integral */ case 0x62e9d5a8014ff16dULL: if (len == 8) { return 8747; } break; /* Intersection */ case 0xdf10200e295b0108ULL: if (len == 12) { return 8898; } break; /* InvisibleComma */ case 0x75f617f5755dbcb3ULL: if (len == 14) { return 8291; } break; /* InvisibleTimes */ case 0x0120e653d0b4f90eULL: if (len == 14) { return 8290; } break; /* Iogon */ case 0xdcf0d2fc111c2afbULL: if (len == 5) { return 302; } break; /* Iopf */ case 0x2738ebd17f82e5cfULL: if (len == 4) { return 120128; } break; /* Iota */ case 0x274600d17f8d93daULL: if (len == 4) { return 921; } break; /* Iscr */ case 0x903dc1d1bb4c5d70ULL: if (len == 4) { return 8464; } break; /* Itilde */ case 0xc6b3a746949731b2ULL: if (len == 6) { return 296; } break; /* Iukcy */ case 0xf24d40308b009a08ULL: if (len == 5) { return 1030; } break; /* Iuml */ case 0x5d3fc9d19eb11732ULL: if (len == 4) { return 207; } break; /* Jcirc */ case 0x2f27794bbc42ce66ULL: if (len == 5) { return 308; } break; /* Jcy */ case 0x5b948f19d8375bb9ULL: if (len == 3) { return 1049; } break; /* Jfr */ case 0x5b8a8619d82ef7e9ULL: if (len == 3) { return 120077; } break; /* Jopf */ case 0x6c1709ea2a8bb77cULL: if (len == 4) { return 120129; } break; /* Jscr */ case 0x47f163ea15a5f8dbULL: if (len == 4) { return 119973; } break; /* Jsercy */ case 0x0682822bd5c4db99ULL: if (len == 6) { return 1032; } break; /* Jukcy */ case 0x58e44893256f5305ULL: if (len == 5) { return 1028; } break; /* KHcy */ case 0x7b858dded1819012ULL: if (len == 4) { return 1061; } break; /* KJcy */ case 0x69672fdec7052ea0ULL: if (len == 4) { return 1036; } break; /* Kappa */ case 0xadb0aedf301d6fe8ULL: if (len == 5) { return 922; } break; /* Kcedil */ case 0x0a21dd757602446fULL: if (len == 6) { return 310; } break; /* Kcy */ case 0x50576619d11e9176ULL: if (len == 3) { return 1050; } break; /* Kfr */ case 0x50616319d126e0e2ULL: if (len == 3) { return 120078; } break; /* Kopf */ case 0x7f45fbde42555761ULL: if (len == 4) { return 120130; } break; /* Kscr */ case 0x2cb019dea49b548eULL: if (len == 4) { return 119974; } break; /* LJcy */ case 0x4bf981b51a10d0abULL: if (len == 4) { return 1033; } break; /* LT */ case 0x09197407b5af7c0dULL: if (len == 2) { return 60; } break; /* Lacute */ case 0x4c26a63ed00adb19ULL: if (len == 6) { return 313; } break; /* Lambda */ case 0xc144eceb4839a42aULL: if (len == 6) { return 923; } break; /* Lang */ case 0x820de0b4a6ef5255ULL: if (len == 4) { return 10218; } break; /* Laplacetrf */ case 0x3d864e2a46103cd3ULL: if (len == 10) { return 8466; } break; /* Larr */ case 0x81ffd3b4a6e2fee2ULL: if (len == 4) { return 8606; } break; /* Lcaron */ case 0xc876363d10025246ULL: if (len == 6) { return 317; } break; /* Lcedil */ case 0x450f2a5b01aeef74ULL: if (len == 6) { return 315; } break; /* Lcy */ case 0x25019519b8917853ULL: if (len == 3) { return 1051; } break; /* LeftAngleBracket */ case 0x2968f74168def26dULL: if (len == 16) { return 10216; } break; /* LeftArrow */ case 0xf830c8e6a80dc009ULL: if (len == 9) { return 8592; } break; /* LeftArrowBar */ case 0xf64a5d39948ee826ULL: if (len == 12) { return 8676; } break; /* LeftArrowRightArrow */ case 0xa6f861bae44cb51aULL: if (len == 19) { return 8646; } break; /* LeftCeiling */ case 0x0ad1cd518ce1efdfULL: if (len == 11) { return 8968; } break; /* LeftDoubleBracket */ case 0xeb1999ad476605ebULL: if (len == 17) { return 10214; } break; /* LeftDownTeeVector */ case 0xbef8934c07775ccdULL: if (len == 17) { return 10593; } break; /* LeftDownVector */ case 0x99f1bb94710f7e2bULL: if (len == 14) { return 8643; } break; /* LeftDownVectorBar */ case 0x6d0f3249986bc9e4ULL: if (len == 17) { return 10585; } break; /* LeftFloor */ case 0x7df812ab4b69ff46ULL: if (len == 9) { return 8970; } break; /* LeftRightArrow */ case 0xec367f1888d4875fULL: if (len == 14) { return 8596; } break; /* LeftRightVector */ case 0xa5dcb09d5e448b19ULL: if (len == 15) { return 10574; } break; /* LeftTee */ case 0x866621b196a0d9caULL: if (len == 7) { return 8867; } break; /* LeftTeeArrow */ case 0xca2f474b0a7f73b7ULL: if (len == 12) { return 8612; } break; /* LeftTeeVector */ case 0x59969fdd10bd2781ULL: if (len == 13) { return 10586; } break; /* LeftTriangle */ case 0x83b891b0a5486ae4ULL: if (len == 12) { return 8882; } break; /* LeftTriangleBar */ case 0xb9edf4ff16117ee1ULL: if (len == 15) { return 10703; } break; /* LeftTriangleEqual */ case 0xfa0246281c1c0f9cULL: if (len == 17) { return 8884; } break; /* LeftUpDownVector */ case 0xb2a0ac3a1b8fb2daULL: if (len == 16) { return 10577; } break; /* LeftUpTeeVector */ case 0xa1fdb8f5c67812caULL: if (len == 15) { return 10592; } break; /* LeftUpVector */ case 0xdae7e8806f02e76aULL: if (len == 12) { return 8639; } break; /* LeftUpVectorBar */ case 0x5c6cdf2a3c4f09cbULL: if (len == 15) { return 10584; } break; /* LeftVector */ case 0xedfacdace3d35e3fULL: if (len == 10) { return 8636; } break; /* LeftVectorBar */ case 0xeecb44bc1ba328c0ULL: if (len == 13) { return 10578; } break; /* Leftarrow */ case 0xb7f0b04d1a231269ULL: if (len == 9) { return 8656; } break; /* Leftrightarrow */ case 0xaa360dd070bc6edfULL: if (len == 14) { return 8660; } break; /* LessEqualGreater */ case 0x30ba5df908994bf6ULL: if (len == 16) { return 8922; } break; /* LessFullEqual */ case 0x69a448427cd9ebc7ULL: if (len == 13) { return 8806; } break; /* LessGreater */ case 0x3f38c31da2d1d88eULL: if (len == 11) { return 8822; } break; /* LessLess */ case 0x592aca48ff441331ULL: if (len == 8) { return 10913; } break; /* LessSlantEqual */ case 0x80ac2b7de90da398ULL: if (len == 14) { return 10877; } break; /* LessTilde */ case 0x7f26901917bec0aeULL: if (len == 9) { return 8818; } break; /* Lfr */ case 0x25129819b89ff09fULL: if (len == 3) { return 120079; } break; /* Ll */ case 0x09193c07b5af1ce5ULL: if (len == 2) { return 8920; } break; /* Lleftarrow */ case 0x48037d8511cb5f9fULL: if (len == 10) { return 8666; } break; /* Lmidot */ case 0x460c2e146cec80ccULL: if (len == 6) { return 319; } break; /* LongLeftArrow */ case 0xc12897a053fb7097ULL: if (len == 13) { return 10229; } break; /* LongLeftRightArrow */ case 0x26f0b9fb3e33d3d1ULL: if (len == 18) { return 10231; } break; /* LongRightArrow */ case 0x66102cc8d047ee34ULL: if (len == 14) { return 10230; } break; /* Longleftarrow */ case 0x14599cf578e73897ULL: if (len == 13) { return 10232; } break; /* Longleftrightarrow */ case 0xfb4d47fe6563f731ULL: if (len == 18) { return 10234; } break; /* Longrightarrow */ case 0xa431fff6dda41874ULL: if (len == 14) { return 10233; } break; /* Lopf */ case 0x4f53e9b48a8dda96ULL: if (len == 4) { return 120131; } break; /* LowerLeftArrow */ case 0xa357b8935751a8b4ULL: if (len == 14) { return 8601; } break; /* LowerRightArrow */ case 0xfc66572c16fdd701ULL: if (len == 15) { return 8600; } break; /* Lscr */ case 0xfc660bb4ec8968b9ULL: if (len == 4) { return 8466; } break; /* Lsh */ case 0x25378419b8beeae0ULL: if (len == 3) { return 8624; } break; /* Lstrok */ case 0x1b239054975f2984ULL: if (len == 6) { return 321; } break; /* Lt */ case 0x09195407b5af45adULL: if (len == 2) { return 8810; } break; /* Map */ case 0x1e187919b52639f1ULL: if (len == 3) { return 10501; } break; /* Mcy */ case 0x1e1f6c19b52c4288ULL: if (len == 3) { return 1052; } break; /* MediumSpace */ case 0xd60de09388a69ab0ULL: if (len == 11) { return 8287; } break; /* Mellintrf */ case 0x22898c79c7454538ULL: if (len == 9) { return 8499; } break; /* Mfr */ case 0x1e297519b534a658ULL: if (len == 3) { return 120080; } break; /* MinusPlus */ case 0xb534b986d10ae4b3ULL: if (len == 9) { return 8723; } break; /* Mopf */ case 0x37a31baec56b6c5bULL: if (len == 4) { return 120132; } break; /* Mscr */ case 0xcf1211ae8a048cecULL: if (len == 4) { return 8499; } break; /* Mu */ case 0x09164f07b5ad0757ULL: if (len == 2) { return 924; } break; /* NJcy */ case 0x36ad6dc6267d26adULL: if (len == 4) { return 1034; } break; /* Nacute */ case 0xca720fa4f058efbfULL: if (len == 6) { return 323; } break; /* Ncaron */ case 0x0971ffaba29e8650ULL: if (len == 6) { return 327; } break; /* Ncedil */ case 0xce2e0b882bf258e2ULL: if (len == 6) { return 325; } break; /* Ncy */ case 0x373af319c324a17dULL: if (len == 3) { return 1053; } break; /* NegativeMediumSpace */ case 0x19debba8c9847c49ULL: if (len == 19) { return 8203; } break; /* NegativeThickSpace */ case 0xe26781d0fb9f116fULL: if (len == 18) { return 8203; } break; /* NegativeThinSpace */ case 0x0ea5c203b7089559ULL: if (len == 17) { return 8203; } break; /* NegativeVeryThinSpace */ case 0xb579544e957d24bdULL: if (len == 21) { return 8203; } break; /* NestedGreaterGreater */ case 0x5758e6986106b41eULL: if (len == 20) { return 8811; } break; /* NestedLessLess */ case 0x7e6e4d869e6055a6ULL: if (len == 14) { return 8810; } break; /* NewLine */ case 0xfad6d57bb600f52bULL: if (len == 7) { return 10; } break; /* Nfr */ case 0x374bea19c3330565ULL: if (len == 3) { return 120081; } break; /* NoBreak */ case 0x2d456cb830009081ULL: if (len == 7) { return 8288; } break; /* NonBreakingSpace */ case 0x7b31cce93cea6eedULL: if (len == 16) { return 160; } break; /* Nopf */ case 0x667919c6d2bce4a8ULL: if (len == 4) { return 8469; } break; /* Not */ case 0x3763f619c347abaaULL: if (len == 3) { return 10988; } break; /* NotCongruent */ case 0x4351c2813b6a656fULL: if (len == 12) { return 8802; } break; /* NotCupCap */ case 0x466b9878ce5017e6ULL: if (len == 9) { return 8813; } break; /* NotDoubleVerticalBar */ case 0x853c3fab883e22f6ULL: if (len == 20) { return 8742; } break; /* NotElement */ case 0x903ba6121033d1a2ULL: if (len == 10) { return 8713; } break; /* NotEqual */ case 0x0d4ceeaea619091eULL: if (len == 8) { return 8800; } break; /* NotExists */ case 0x253dd2e3b56e9af2ULL: if (len == 9) { return 8708; } break; /* NotGreater */ case 0xa309559f8de4c088ULL: if (len == 10) { return 8815; } break; /* NotGreaterEqual */ case 0x46f6693b515e7d00ULL: if (len == 15) { return 8817; } break; /* NotGreaterLess */ case 0xc7672ad2e40ce6c1ULL: if (len == 14) { return 8825; } break; /* NotGreaterTilde */ case 0x99bfab9077f8173eULL: if (len == 15) { return 8821; } break; /* NotLeftTriangle */ case 0xb6d07c58c6cacd7bULL: if (len == 15) { return 8938; } break; /* NotLeftTriangleEqual */ case 0x06a5b31737d35b81ULL: if (len == 20) { return 8940; } break; /* NotLess */ case 0x724794c592bb03f3ULL: if (len == 7) { return 8814; } break; /* NotLessEqual */ case 0x853d540f1dbe87b9ULL: if (len == 12) { return 8816; } break; /* NotLessGreater */ case 0x12c3e7b8bbc52e97ULL: if (len == 14) { return 8824; } break; /* NotLessTilde */ case 0xda17123ce3b64603ULL: if (len == 12) { return 8820; } break; /* NotPrecedes */ case 0xc59399a1c2ef102dULL: if (len == 11) { return 8832; } break; /* NotPrecedesSlantEqual */ case 0x239b8f4946764e99ULL: if (len == 21) { return 8928; } break; /* NotReverseElement */ case 0xf96d9dec557a2b3cULL: if (len == 17) { return 8716; } break; /* NotRightTriangle */ case 0xe8122021d906fb1cULL: if (len == 16) { return 8939; } break; /* NotRightTriangleEqual */ case 0x4f3fd3ed231340d4ULL: if (len == 21) { return 8941; } break; /* NotSquareSubsetEqual */ case 0xcacbb1171b5c0d45ULL: if (len == 20) { return 8930; } break; /* NotSquareSupersetEqual */ case 0xf8c7805b376606d8ULL: if (len == 22) { return 8931; } break; /* NotSubsetEqual */ case 0xd44a0592c59fa290ULL: if (len == 14) { return 8840; } break; /* NotSucceeds */ case 0x09d693ed0d95f60fULL: if (len == 11) { return 8833; } break; /* NotSucceedsSlantEqual */ case 0x9e993f5a9f37526bULL: if (len == 21) { return 8929; } break; /* NotSupersetEqual */ case 0x3afee4d81ada51b5ULL: if (len == 16) { return 8841; } break; /* NotTilde */ case 0xf662187b583e68ccULL: if (len == 8) { return 8769; } break; /* NotTildeEqual */ case 0x0a0cd8787cfaa724ULL: if (len == 13) { return 8772; } break; /* NotTildeFullEqual */ case 0x36649eef7d4cf96bULL: if (len == 17) { return 8775; } break; /* NotTildeTilde */ case 0xfe5aa93e65a1628aULL: if (len == 13) { return 8777; } break; /* NotVerticalBar */ case 0xfe4e4f0b8ac8c825ULL: if (len == 14) { return 8740; } break; /* Nscr */ case 0x742293c6498844f7ULL: if (len == 4) { return 119977; } break; /* Ntilde */ case 0xaf0ceb437fc0e09dULL: if (len == 6) { return 209; } break; /* Nu */ case 0x09203f07b5b540acULL: if (len == 2) { return 925; } break; /* OElig */ case 0xeb66994a4df8e9a7ULL: if (len == 5) { return 338; } break; /* Oacute */ case 0x854fdecc5971ea7aULL: if (len == 6) { return 211; } break; /* Ocirc */ case 0xaabc956334a948f1ULL: if (len == 5) { return 212; } break; /* Ocy */ case 0x303dca19bfa8a3faULL: if (len == 3) { return 1054; } break; /* Odblac */ case 0xa83017dd56bc3fc8ULL: if (len == 6) { return 336; } break; /* Ofr */ case 0x302cc719bf9a2baeULL: if (len == 3) { return 120082; } break; /* Ograve */ case 0x4330ef573e269be7ULL: if (len == 6) { return 210; } break; /* Omacr */ case 0x2733f20fb0a24de9ULL: if (len == 5) { return 332; } break; /* Omega */ case 0x473fb30fc20c3ce8ULL: if (len == 5) { return 937; } break; /* Omicron */ case 0x29bb34120e7aee7cULL: if (len == 7) { return 927; } break; /* Oopf */ case 0x3c24fbc072c4417dULL: if (len == 4) { return 120134; } break; /* OpenCurlyDoubleQuote */ case 0xb8f3fa15f40b9819ULL: if (len == 20) { return 8220; } break; /* OpenCurlyQuote */ case 0xa9cba54b4c7c2c7eULL: if (len == 14) { return 8216; } break; /* Or */ case 0x091d5407b5b32e84ULL: if (len == 2) { return 10836; } break; /* Oscr */ case 0x186569c05e35580aULL: if (len == 4) { return 119978; } break; /* Oslash */ case 0xc20018fdaecaadf3ULL: if (len == 6) { return 216; } break; /* Otilde */ case 0xe6ce7d3829111898ULL: if (len == 6) { return 213; } break; /* Otimes */ case 0xdf025a3824e5890cULL: if (len == 6) { return 10807; } break; /* Ouml */ case 0x066819c053d441c8ULL: if (len == 4) { return 214; } break; /* OverBar */ case 0xc2cdafcd715751d0ULL: if (len == 7) { return 8254; } break; /* OverBrace */ case 0x9527b18836110d1aULL: if (len == 9) { return 9182; } break; /* OverBracket */ case 0xf1bdeee39c8ffc01ULL: if (len == 11) { return 9140; } break; /* OverParenthesis */ case 0x7618c7f63e9d74d9ULL: if (len == 15) { return 9180; } break; /* PartialD */ case 0x1f8f2cf03079987aULL: if (len == 8) { return 8706; } break; /* Pcy */ case 0x8dcc8919f429aaa7ULL: if (len == 3) { return 1055; } break; /* Pfr */ case 0x8dc28c19f4215b3bULL: if (len == 3) { return 120083; } break; /* Phi */ case 0x8dbb7919f41b1c44ULL: if (len == 3) { return 934; } break; /* Pi */ case 0x09423f07b5d22712ULL: if (len == 2) { return 928; } break; /* PlusMinus */ case 0x78b6deb8a3f643dfULL: if (len == 9) { return 177; } break; /* Poincareplane */ case 0x44c38a761dd36498ULL: if (len == 13) { return 8460; } break; /* Popf */ case 0xb34dea19a71a83a2ULL: if (len == 4) { return 8473; } break; /* Pr */ case 0x09425607b5d24e27ULL: if (len == 2) { return 10939; } break; /* Precedes */ case 0xc04ee6af43076416ULL: if (len == 8) { return 8826; } break; /* PrecedesEqual */ case 0x4307f60668f9c01aULL: if (len == 13) { return 10927; } break; /* PrecedesSlantEqual */ case 0x40c9f699f436b596ULL: if (len == 18) { return 8828; } break; /* PrecedesTilde */ case 0xe4aea7ee56e051c0ULL: if (len == 13) { return 8830; } break; /* Prime */ case 0xeed15a8afe9ad2a0ULL: if (len == 5) { return 8243; } break; /* Product */ case 0xde1f02481331134cULL: if (len == 7) { return 8719; } break; /* Proportion */ case 0x34e42f621c04b4b7ULL: if (len == 10) { return 8759; } break; /* Proportional */ case 0x2be33d9812c7030aULL: if (len == 12) { return 8733; } break; /* Pscr */ case 0xa5ab5c1a30552005ULL: if (len == 4) { return 119979; } break; /* Psi */ case 0x8e029919f4575547ULL: if (len == 3) { return 936; } break; /* QUOT */ case 0x320d2e1315d01e08ULL: if (len == 4) { return 34; } break; /* Qfr */ case 0x86d96919f0b610f4ULL: if (len == 3) { return 120084; } break; /* Qopf */ case 0x9c091c13e2533447ULL: if (len == 4) { return 8474; } break; /* Qscr */ case 0x7bbd6213d0b36d38ULL: if (len == 4) { return 119980; } break; /* RBarr */ case 0x4024ec9c1ac324e8ULL: if (len == 5) { return 10512; } break; /* REG */ case 0xa05ec119ff08bc15ULL: if (len == 3) { return 174; } break; /* Racute */ case 0x08151a91b5dabc63ULL: if (len == 6) { return 340; } break; /* Rang */ case 0x9841152bd35b97c3ULL: if (len == 4) { return 10219; } break; /* Rarr */ case 0x9834102bd35104e8ULL: if (len == 4) { return 8608; } break; /* Rarrtl */ case 0x00afa607b848bae8ULL: if (len == 6) { return 10518; } break; /* Rcaron */ case 0x34eb38d6c4c4839cULL: if (len == 6) { return 344; } break; /* Rcedil */ case 0x33324cf9866eeaa6ULL: if (len == 6) { return 342; } break; /* Rcy */ case 0xa006d719febe6ba1ULL: if (len == 3) { return 1056; } break; /* Re */ case 0x09494f07b5d860f0ULL: if (len == 2) { return 8476; } break; /* ReverseElement */ case 0xcdb39da871c9c157ULL: if (len == 14) { return 8715; } break; /* ReverseEquilibrium */ case 0xa63e1645e61f6017ULL: if (len == 18) { return 8651; } break; /* ReverseUpEquilibrium */ case 0xe3fc919d62400f1cULL: if (len == 20) { return 10607; } break; /* Rfr */ case 0x9ffcde19feb62301ULL: if (len == 3) { return 8476; } break; /* Rho */ case 0xa01ec919fed2e5b8ULL: if (len == 3) { return 929; } break; /* RightAngleBracket */ case 0x18a6b3e3b0857994ULL: if (len == 17) { return 10217; } break; /* RightArrow */ case 0xb5425055fee5b0e6ULL: if (len == 10) { return 8594; } break; /* RightArrowBar */ case 0xcd28545e1d0aa8dfULL: if (len == 13) { return 8677; } break; /* RightArrowLeftArrow */ case 0x27472ba8417a65f8ULL: if (len == 19) { return 8644; } break; /* RightCeiling */ case 0xa1d4122384f82fe0ULL: if (len == 12) { return 8969; } break; /* RightDoubleBracket */ case 0x52ba4ef5a4b437e4ULL: if (len == 18) { return 10215; } break; /* RightDownTeeVector */ case 0x88a6c3c17f791402ULL: if (len == 18) { return 10589; } break; /* RightDownVector */ case 0xabee0bb46680af52ULL: if (len == 15) { return 8642; } break; /* RightDownVectorBar */ case 0x4f1e540e5d766623ULL: if (len == 18) { return 10581; } break; /* RightFloor */ case 0x05e5b6490d006d5dULL: if (len == 10) { return 8971; } break; /* RightTee */ case 0x251f340fd52e2bb5ULL: if (len == 8) { return 8866; } break; /* RightTeeArrow */ case 0xc49012cc4de17276ULL: if (len == 13) { return 8614; } break; /* RightTeeVector */ case 0x38e881b1ca083492ULL: if (len == 14) { return 10587; } break; /* RightTriangle */ case 0x8c610a365331b525ULL: if (len == 13) { return 8883; } break; /* RightTriangleBar */ case 0xf9af9a853133257aULL: if (len == 16) { return 10704; } break; /* RightTriangleEqual */ case 0xff8eb5b514d2c30fULL: if (len == 18) { return 8885; } break; /* RightUpDownVector */ case 0x648ebeae3a7b977bULL: if (len == 17) { return 10575; } break; /* RightUpTeeVector */ case 0xb7b38e76f29e7bf1ULL: if (len == 16) { return 10588; } break; /* RightUpVector */ case 0x498d9e788bebc62fULL: if (len == 13) { return 8638; } break; /* RightUpVectorBar */ case 0x347f4d33261280f0ULL: if (len == 16) { return 10580; } break; /* RightVector */ case 0xd08c6d4f47c1cba2ULL: if (len == 11) { return 8640; } break; /* RightVectorBar */ case 0x362ec835ae39f533ULL: if (len == 14) { return 10579; } break; /* Rightarrow */ case 0xf58368ef8cd21186ULL: if (len == 10) { return 8658; } break; /* Ropf */ case 0xcadf1a2befa4ac94ULL: if (len == 4) { return 8477; } break; /* RoundImplies */ case 0xed8d96dd2b116e98ULL: if (len == 12) { return 10608; } break; /* Rrightarrow */ case 0x01a97e4106c767d6ULL: if (len == 11) { return 8667; } break; /* Rscr */ case 0x1d67c42b8d53c5e3ULL: if (len == 4) { return 8475; } break; /* Rsh */ case 0x9fcfe619fe8f42aeULL: if (len == 3) { return 8625; } break; /* RuleDelayed */ case 0x2f8aa750c9d2eab3ULL: if (len == 11) { return 10740; } break; /* SHCHcy */ case 0xadde7216d592e7f9ULL: if (len == 6) { return 1065; } break; /* SHcy */ case 0x5b8a4e244668aa1aULL: if (len == 4) { return 1064; } break; /* SOFTcy */ case 0x1dc7ef41bdbd3a61ULL: if (len == 6) { return 1068; } break; /* Sacute */ case 0x4119e342730ef3beULL: if (len == 6) { return 346; } break; /* Sc */ case 0x09462d07b5d5f153ULL: if (len == 2) { return 10940; } break; /* Scaron */ case 0xdd0c52c6a6e1e515ULL: if (len == 6) { return 352; } break; /* Scedil */ case 0x47d74ee9a74f5037ULL: if (len == 6) { return 350; } break; /* Scirc */ case 0x6f00fb624fd384d5ULL: if (len == 5) { return 348; } break; /* Scy */ case 0x982fae19fa88ca5eULL: if (len == 3) { return 1057; } break; /* Sfr */ case 0x9839bb19fa9134faULL: if (len == 3) { return 120086; } break; /* ShortDownArrow */ case 0xfaa37870c3f79a66ULL: if (len == 14) { return 8595; } break; /* ShortLeftArrow */ case 0xe5e01429a53c1a79ULL: if (len == 14) { return 8592; } break; /* ShortRightArrow */ case 0xfc598140016b2fd6ULL: if (len == 15) { return 8594; } break; /* ShortUpArrow */ case 0x9f1b5e93d07e5129ULL: if (len == 12) { return 8593; } break; /* Sigma */ case 0x9bc213b5a2a7f9f4ULL: if (len == 5) { return 931; } break; /* SmallCircle */ case 0x61b6a822d983fc20ULL: if (len == 11) { return 8728; } break; /* Sopf */ case 0x8a82cc24f1f494d9ULL: if (len == 4) { return 120138; } break; /* Sqrt */ case 0xbd3bd0250e546fafULL: if (len == 4) { return 8730; } break; /* Square */ case 0x6641c258b0b51b26ULL: if (len == 6) { return 9633; } break; /* SquareIntersection */ case 0xde49b67dc69f881bULL: if (len == 18) { return 8851; } break; /* SquareSubset */ case 0x2ee213c52a70c2ccULL: if (len == 12) { return 8847; } break; /* SquareSubsetEqual */ case 0xc712ce8965b77524ULL: if (len == 17) { return 8849; } break; /* SquareSuperset */ case 0x04cc07079dd958dbULL: if (len == 14) { return 8848; } break; /* SquareSupersetEqual */ case 0xc40aacf4858424a1ULL: if (len == 19) { return 8850; } break; /* SquareUnion */ case 0x6cb56b6d3ca9d76dULL: if (len == 11) { return 8852; } break; /* Sscr */ case 0xae2e7a25067304d6ULL: if (len == 4) { return 119982; } break; /* Star */ case 0xd98b59251f065471ULL: if (len == 4) { return 8902; } break; /* Sub */ case 0x987abd19fac8cf55ULL: if (len == 3) { return 8912; } break; /* Subset */ case 0x18ed119d4617c5f3ULL: if (len == 6) { return 8912; } break; /* SubsetEqual */ case 0xdf506417c0f18db9ULL: if (len == 11) { return 8838; } break; /* Succeeds */ case 0x69c0d1f2cb4ace40ULL: if (len == 8) { return 8827; } break; /* SucceedsEqual */ case 0x0a5f3ce3592986b8ULL: if (len == 13) { return 10928; } break; /* SucceedsSlantEqual */ case 0xa9bfced333aad090ULL: if (len == 18) { return 8829; } break; /* SucceedsTilde */ case 0x134cdeb4a59e5626ULL: if (len == 13) { return 8831; } break; /* SuchThat */ case 0x8a2b64eac6476157ULL: if (len == 8) { return 8715; } break; /* Sum */ case 0x987abe19fac8d108ULL: if (len == 3) { return 8721; } break; /* Sup */ case 0x987aab19fac8b0bfULL: if (len == 3) { return 8913; } break; /* Superset */ case 0x5688dd461524eb3cULL: if (len == 8) { return 8835; } break; /* SupersetEqual */ case 0x897e6ca84a1c6334ULL: if (len == 13) { return 8839; } break; /* Supset */ case 0xe010a5085bdf8465ULL: if (len == 6) { return 8913; } break; /* THORN */ case 0xec4e33cd9cb871a2ULL: if (len == 5) { return 222; } break; /* TRADE */ case 0x89899501d2e44439ULL: if (len == 5) { return 8482; } break; /* TSHcy */ case 0xe2711ff7348ddd18ULL: if (len == 5) { return 1035; } break; /* TScy */ case 0x654e60faae7cf810ULL: if (len == 4) { return 1062; } break; /* Tab */ case 0x6ce0ce19e201b66cULL: if (len == 3) { return 9; } break; /* Tau */ case 0x6ce0dd19e201cfe9ULL: if (len == 3) { return 932; } break; /* Tcaron */ case 0xb475e59941520c0eULL: if (len == 6) { return 356; } break; /* Tcedil */ case 0x025bf9bd52d269dcULL: if (len == 6) { return 354; } break; /* Tcy */ case 0x6cd9dd19e1fbb13bULL: if (len == 3) { return 1058; } break; /* Tfr */ case 0x6ceaf019e20a44b7ULL: if (len == 3) { return 120087; } break; /* Therefore */ case 0x5dffcbfbc2221217ULL: if (len == 9) { return 8756; } break; /* Theta */ case 0xaa999dd8cfb57a7bULL: if (len == 5) { return 920; } break; /* ThinSpace */ case 0xdcde7f4e7c4cba5cULL: if (len == 9) { return 8201; } break; /* Tilde */ case 0xde7e58d2a4ce8a29ULL: if (len == 5) { return 8764; } break; /* TildeEqual */ case 0xdc2e936c5c4d3903ULL: if (len == 10) { return 8771; } break; /* TildeFullEqual */ case 0xdbd76c3107638a88ULL: if (len == 14) { return 8773; } break; /* TildeTilde */ case 0xf61bf8aa5e9d5985ULL: if (len == 10) { return 8776; } break; /* Topf */ case 0x5a90f9fb3a2d84ceULL: if (len == 4) { return 120139; } break; /* TripleDot */ case 0x2943db10714e24b0ULL: if (len == 9) { return 8411; } break; /* Tscr */ case 0x7b578bfb4c361721ULL: if (len == 4) { return 119983; } break; /* Tstrok */ case 0xed6140c24c952a4cULL: if (len == 6) { return 358; } break; /* Uacute */ case 0x866ff29b7a03848cULL: if (len == 6) { return 218; } break; /* Uarr */ case 0x1ed2b9f047406443ULL: if (len == 4) { return 8607; } break; /* Uarrocir */ case 0x1556e5c69b94ecc2ULL: if (len == 8) { return 10569; } break; /* Ubrcy */ case 0x00bd274f918076acULL: if (len == 5) { return 1038; } break; /* Ubreve */ case 0x8f539334210f3b06ULL: if (len == 6) { return 364; } break; /* Ucirc */ case 0x439d785a8808882fULL: if (len == 5) { return 219; } break; /* Ucy */ case 0x6291b419dbb35270ULL: if (len == 3) { return 1059; } break; /* Udblac */ case 0x1d3451455f7cd4aeULL: if (len == 6) { return 368; } break; /* Ufr */ case 0x629bad19dbbb9b10ULL: if (len == 3) { return 120088; } break; /* Ugrave */ case 0x34b5d328bb7f4051ULL: if (len == 6) { return 217; } break; /* Umacr */ case 0xc79a05ae0c724e63ULL: if (len == 5) { return 362; } break; /* UnderBar */ case 0x88da2ac69024fb52ULL: if (len == 8) { return 95; } break; /* UnderBrace */ case 0x35998778099657f0ULL: if (len == 10) { return 9183; } break; /* UnderBracket */ case 0x3041f9e6ce0818fbULL: if (len == 12) { return 9141; } break; /* UnderParenthesis */ case 0x335a3dc0551cd6f3ULL: if (len == 16) { return 9181; } break; /* Union */ case 0x0ae93fb50ca42f94ULL: if (len == 5) { return 8899; } break; /* UnionPlus */ case 0x6a922600145f0894ULL: if (len == 9) { return 8846; } break; /* Uogon */ case 0x22ff9bbfeb166d37ULL: if (len == 5) { return 370; } break; /* Uopf */ case 0x99d0ebf08d671db3ULL: if (len == 4) { return 120140; } break; /* UpArrow */ case 0xda23e4228bf4d3d9ULL: if (len == 7) { return 8593; } break; /* UpArrowBar */ case 0xe1650c29c242d1b6ULL: if (len == 10) { return 10514; } break; /* UpArrowDownArrow */ case 0x713760ad99e42112ULL: if (len == 16) { return 8645; } break; /* UpDownArrow */ case 0x34fbc7deb364c18dULL: if (len == 11) { return 8597; } break; /* UpEquilibrium */ case 0x7e89d9f79bfff97cULL: if (len == 13) { return 10606; } break; /* UpTee */ case 0x1f6068bad917b3daULL: if (len == 5) { return 8869; } break; /* UpTeeArrow */ case 0x5ce9d40c5717bc07ULL: if (len == 10) { return 8613; } break; /* Uparrow */ case 0x1a63fcbc19df8179ULL: if (len == 7) { return 8657; } break; /* Updownarrow */ case 0xf8eb0549c8dfe58dULL: if (len == 11) { return 8661; } break; /* UpperLeftArrow */ case 0x298c71afab8df2f3ULL: if (len == 14) { return 8598; } break; /* UpperRightArrow */ case 0xebfe1bd77ca04718ULL: if (len == 15) { return 8599; } break; /* Upsi */ case 0x8ac8f5eff32df960ULL: if (len == 4) { return 978; } break; /* Upsilon */ case 0xa1f7fceef5a297edULL: if (len == 7) { return 933; } break; /* Uring */ case 0x15254fcbec774b0aULL: if (len == 5) { return 366; } break; /* Uscr */ case 0xa48891f001b29054ULL: if (len == 4) { return 119984; } break; /* Utilde */ case 0x97f1a869244c7456ULL: if (len == 6) { return 360; } break; /* Uuml */ case 0xb684e9f00c12012eULL: if (len == 4) { return 220; } break; /* VDash */ case 0xf9f9fbd541f42d31ULL: if (len == 5) { return 8875; } break; /* Vbar */ case 0xddb3a3081556cc66ULL: if (len == 4) { return 10987; } break; /* Vcy */ case 0x7bad3b19e9abb165ULL: if (len == 3) { return 1042; } break; /* Vdash */ case 0x7c4dface2b674051ULL: if (len == 5) { return 8873; } break; /* Vdashl */ case 0x9fc16953c07227a7ULL: if (len == 6) { return 10982; } break; /* Vee */ case 0x7bb41b19e9b199b3ULL: if (len == 3) { return 8897; } break; /* Verbar */ case 0x6436f182ff56fc93ULL: if (len == 6) { return 8214; } break; /* Vert */ case 0xe4ead20819044c62ULL: if (len == 4) { return 8214; } break; /* VerticalBar */ case 0xad21ba66552dc534ULL: if (len == 11) { return 8739; } break; /* VerticalLine */ case 0x38f15cd0fd839411ULL: if (len == 12) { return 124; } break; /* VerticalSeparator */ case 0x1e098493b4b3b046ULL: if (len == 17) { return 10072; } break; /* VerticalTilde */ case 0xf060f1583b63cc1bULL: if (len == 13) { return 8768; } break; /* VeryThinSpace */ case 0x6013db4250691908ULL: if (len == 13) { return 8202; } break; /* Vfr */ case 0x7bbe4219e9ba307dULL: if (len == 3) { return 120089; } break; /* Vopf */ case 0xb231ca07fca46ac0ULL: if (len == 4) { return 120141; } break; /* Vscr */ case 0x5fa214085eef1e5fULL: if (len == 4) { return 119985; } break; /* Vvdash */ case 0x1a85f221b12f94edULL: if (len == 6) { return 8874; } break; /* Wcirc */ case 0x875d7ca143918579ULL: if (len == 5) { return 372; } break; /* Wedge */ case 0x3744c794850c54afULL: if (len == 5) { return 8896; } break; /* Wfr */ case 0x749eff19e6212066ULL: if (len == 3) { return 120090; } break; /* Wopf */ case 0x9aed0c0237dd3695ULL: if (len == 4) { return 120142; } break; /* Wscr */ case 0xeddbca01d5e32512ULL: if (len == 4) { return 119986; } break; /* Xfr */ case 0xd234c41a1aa84ff3ULL: if (len == 3) { return 120091; } break; /* Xi */ case 0x095d3f07b5e8eecaULL: if (len == 2) { return 926; } break; /* Xopf */ case 0x157bfa5b6f16a1baULL: if (len == 4) { return 120143; } break; /* Xscr */ case 0x7b21dc5ba803236dULL: if (len == 4) { return 119987; } break; /* YAcy */ case 0xdde72f562893b827ULL: if (len == 4) { return 1071; } break; /* YIcy */ case 0x225977564f1ac80fULL: if (len == 4) { return 1031; } break; /* YUcy */ case 0x30a9f355c67475ebULL: if (len == 4) { return 1070; } break; /* Yacute */ case 0xc3a6fd883f2a3250ULL: if (len == 6) { return 221; } break; /* Ycirc */ case 0x396e506d089c9323ULL: if (len == 5) { return 374; } break; /* Ycy */ case 0xcb5ca81a174b84c4ULL: if (len == 3) { return 1067; } break; /* Yfr */ case 0xcb4ba11a173d05acULL: if (len == 3) { return 120092; } break; /* Yopf */ case 0xfdcaec55a9f3c6bfULL: if (len == 4) { return 120144; } break; /* Yscr */ case 0x5059c25547a79680ULL: if (len == 4) { return 119988; } break; /* Yuml */ case 0x1acfea5528e30162ULL: if (len == 4) { return 376; } break; /* ZHcy */ case 0x1a4b406c8a557d37ULL: if (len == 4) { return 1046; } break; /* Zacute */ case 0xee096f757f340b4bULL: if (len == 6) { return 377; } break; /* Zcaron */ case 0xc3507fcda64a5a84ULL: if (len == 6) { return 381; } break; /* Zcy */ case 0xe4791f1a25457b89ULL: if (len == 3) { return 1047; } break; /* Zdot */ case 0x53c6076d3c5b7568ULL: if (len == 4) { return 379; } break; /* ZeroWidthSpace */ case 0x42d4a3cb0af63675ULL: if (len == 14) { return 8203; } break; /* Zeta */ case 0x4957c36d35f2197fULL: if (len == 4) { return 918; } break; /* Zfr */ case 0xe46f161a253d17b9ULL: if (len == 3) { return 8488; } break; /* Zopf */ case 0x1697ca6d198c32acULL: if (len == 4) { return 8484; } break; /* Zscr */ case 0x08e7646da2bad5abULL: if (len == 4) { return 119989; } break; /* aacute */ case 0xedea01307a28bc78ULL: if (len == 6) { return 225; } break; /* abreve */ case 0x3f5220bccf487022ULL: if (len == 6) { return 259; } break; /* ac */ case 0x089c4507b5459a1dULL: if (len == 2) { return 8766; } break; /* acd */ case 0xe723c51905457b9bULL: if (len == 3) { return 8767; } break; /* acirc */ case 0x3e897139545561cbULL: if (len == 5) { return 226; } break; /* acute */ case 0xd5c5773918c343f3ULL: if (len == 5) { return 180; } break; /* acy */ case 0xe723b019054557ecULL: if (len == 3) { return 1072; } break; /* aelig */ case 0x28976e03b7ae3319ULL: if (len == 5) { return 230; } break; /* af */ case 0x089c4007b545919eULL: if (len == 2) { return 8289; } break; /* afr */ case 0xe712b9190536f404ULL: if (len == 3) { return 120094; } break; /* agrave */ case 0x3b9cd06820b07e8dULL: if (len == 6) { return 224; } break; /* alefsym */ case 0x427dfe87cf9c5b9aULL: if (len == 7) { return 8501; } break; /* aleph */ case 0x2cdf83bb5121d4efULL: if (len == 5) { return 8501; } break; /* alpha */ case 0x8ac625bb85ed202bULL: if (len == 5) { return 945; } break; /* amacr */ case 0x6d029dc24ea1cf07ULL: if (len == 5) { return 257; } break; /* amalg */ case 0x6d1388c24eb01e8bULL: if (len == 5) { return 10815; } break; /* amp */ case 0xe6f3a519051c2179ULL: if (len == 3) { return 38; } break; /* and */ case 0xe6f79719051ff286ULL: if (len == 3) { return 8743; } break; /* andand */ case 0x9883656beaefc50fULL: if (len == 6) { return 10837; } break; /* andd */ case 0x96a8a183b549b606ULL: if (len == 4) { return 10844; } break; /* andslope */ case 0x9f0c6f0b18b522e9ULL: if (len == 8) { return 10840; } break; /* andv */ case 0x96a8af83b549cdd0ULL: if (len == 4) { return 10842; } break; /* ang */ case 0xe6f79619051ff0d3ULL: if (len == 3) { return 8736; } break; /* ange */ case 0x96a4c283b5460542ULL: if (len == 4) { return 10660; } break; /* angle */ case 0x401ab8cd06158638ULL: if (len == 5) { return 8736; } break; /* angmsd */ case 0xf8691d615017153dULL: if (len == 6) { return 8737; } break; /* angmsdaa */ case 0xab3c27c8765acb0fULL: if (len == 8) { return 10664; } break; /* angmsdab */ case 0xab3c28c8765accc2ULL: if (len == 8) { return 10665; } break; /* angmsdac */ case 0xab3c29c8765ace75ULL: if (len == 8) { return 10666; } break; /* angmsdad */ case 0xab3c22c8765ac290ULL: if (len == 8) { return 10667; } break; /* angmsdae */ case 0xab3c23c8765ac443ULL: if (len == 8) { return 10668; } break; /* angmsdaf */ case 0xab3c24c8765ac5f6ULL: if (len == 8) { return 10669; } break; /* angmsdag */ case 0xab3c25c8765ac7a9ULL: if (len == 8) { return 10670; } break; /* angmsdah */ case 0xab3c2ec8765ad6f4ULL: if (len == 8) { return 10671; } break; /* angrt */ case 0x3fb4bdcd05bedb85ULL: if (len == 5) { return 8735; } break; /* angrtvb */ case 0x9354b16be07f1331ULL: if (len == 7) { return 8894; } break; /* angrtvbd */ case 0xd7fccf4e77edd96fULL: if (len == 8) { return 10653; } break; /* angsph */ case 0xf4235d60bc8dc208ULL: if (len == 6) { return 8738; } break; /* angst */ case 0x3fb0b7cd05bae87cULL: if (len == 5) { return 197; } break; /* angzarr */ case 0xc6cdeaad8d1103a2ULL: if (len == 7) { return 9084; } break; /* aogon */ case 0x0cf463d453e1e9b3ULL: if (len == 5) { return 261; } break; /* aopf */ case 0x9e4fda83b9564eb7ULL: if (len == 4) { return 120146; } break; /* ap */ case 0x089c5207b545b034ULL: if (len == 2) { return 8776; } break; /* apE */ case 0xe74fd419056ad003ULL: if (len == 3) { return 10864; } break; /* apacir */ case 0x5f3cc1cd02de219fULL: if (len == 6) { return 10863; } break; /* ape */ case 0xe74fb419056a99a3ULL: if (len == 3) { return 8778; } break; /* apid */ case 0x7731cd8434465239ULL: if (len == 4) { return 8779; } break; /* apos */ case 0x772ad684344042d6ULL: if (len == 4) { return 39; } break; /* approx */ case 0xf6f732436054c575ULL: if (len == 6) { return 8776; } break; /* approxeq */ case 0x3963fcdf2270dc73ULL: if (len == 8) { return 8778; } break; /* aring */ case 0xad28c1b66943af66ULL: if (len == 5) { return 229; } break; /* ascr */ case 0x90396084422e1c88ULL: if (len == 4) { return 119990; } break; /* ast */ case 0xe759b5190572efdbULL: if (len == 3) { return 42; } break; /* asymp */ case 0x7265e4bc90c95ea9ULL: if (len == 5) { return 8776; } break; /* asympeq */ case 0xcdc771287ce765efULL: if (len == 7) { return 8781; } break; /* atilde */ case 0x05d4ecb7fe854daaULL: if (len == 6) { return 227; } break; /* auml */ case 0x5ddf5884261ecf6aULL: if (len == 4) { return 228; } break; /* awconint */ case 0x27feddaa36b56c30ULL: if (len == 8) { return 8755; } break; /* awint */ case 0x48310e9dacc4fc22ULL: if (len == 5) { return 10769; } break; /* bNot */ case 0xea87339c68299b2aULL: if (len == 4) { return 10989; } break; /* backcong */ case 0xf7a31fb4a5b9a90bULL: if (len == 8) { return 8780; } break; /* backepsilon */ case 0x1f86996fd8144d1cULL: if (len == 11) { return 1014; } break; /* backprime */ case 0x89ef4bffd15d8309ULL: if (len == 9) { return 8245; } break; /* backsim */ case 0xab5800f4f5168169ULL: if (len == 7) { return 8765; } break; /* backsimeq */ case 0xf669bfbb371fc8afULL: if (len == 9) { return 8909; } break; /* barvee */ case 0xb231c09ae7a186c2ULL: if (len == 6) { return 8893; } break; /* barwed */ case 0xb9fae89aebcae8f6ULL: if (len == 6) { return 8965; } break; /* barwedge */ case 0xa902e07a80d93432ULL: if (len == 8) { return 8965; } break; /* bbrk */ case 0xb39c7a9bb85128daULL: if (len == 4) { return 9141; } break; /* bbrktbrk */ case 0x70de54777288938fULL: if (len == 8) { return 9142; } break; /* bcong */ case 0x529afe8f454763a4ULL: if (len == 5) { return 8780; } break; /* bcy */ case 0x003f2719133d9bb1ULL: if (len == 3) { return 1073; } break; /* bdquo */ case 0x3f77cc650c415f12ULL: if (len == 5) { return 8222; } break; /* becaus */ case 0x128df4455afcabbcULL: if (len == 6) { return 8757; } break; /* because */ case 0x83e1ead99b5801bbULL: if (len == 7) { return 8757; } break; /* bemptyv */ case 0x2921ac040bcfdf88ULL: if (len == 7) { return 10672; } break; /* bepsi */ case 0xe9e9195e93d2d070ULL: if (len == 5) { return 1014; } break; /* bernou */ case 0x8bef73c2769abe90ULL: if (len == 6) { return 8492; } break; /* beta */ case 0x7627619b954620a7ULL: if (len == 4) { return 946; } break; /* beth */ case 0x7627589b9546115cULL: if (len == 4) { return 8502; } break; /* between */ case 0x13f5793e33ebda4fULL: if (len == 7) { return 8812; } break; /* bfr */ case 0x00352e1913355311ULL: if (len == 3) { return 120095; } break; /* bigcap */ case 0x66a1cd38b4559337ULL: if (len == 6) { return 8898; } break; /* bigcirc */ case 0x75aac35a468b94a2ULL: if (len == 7) { return 9711; } break; /* bigcup */ case 0x66cab538b4786f83ULL: if (len == 6) { return 8899; } break; /* bigodot */ case 0x00329d36af984149ULL: if (len == 7) { return 10752; } break; /* bigoplus */ case 0xb3fa774c9b5999d6ULL: if (len == 8) { return 10753; } break; /* bigotimes */ case 0x964677165af01df0ULL: if (len == 9) { return 10754; } break; /* bigsqcup */ case 0xcba3da4d7567bb77ULL: if (len == 8) { return 10758; } break; /* bigstar */ case 0xaebaced22dc666cdULL: if (len == 7) { return 9733; } break; /* bigtriangledown */ case 0x1fc10217e49907c1ULL: if (len == 15) { return 9661; } break; /* bigtriangleup */ case 0x22c381a2b4a5cb54ULL: if (len == 13) { return 9651; } break; /* biguplus */ case 0xd574b3a4a232e004ULL: if (len == 8) { return 10756; } break; /* bigvee */ case 0x0591f5387cda7157ULL: if (len == 6) { return 8897; } break; /* bigwedge */ case 0x7cb187b4d69a7c43ULL: if (len == 8) { return 8896; } break; /* bkarow */ case 0x3a1703b39d00232fULL: if (len == 6) { return 10509; } break; /* blacklozenge */ case 0xe140184056c4c19eULL: if (len == 12) { return 10731; } break; /* blacksquare */ case 0x326bda4e4b76ad43ULL: if (len == 11) { return 9642; } break; /* blacktriangle */ case 0x51a4d3c0f2e80080ULL: if (len == 13) { return 9652; } break; /* blacktriangledown */ case 0x5888191ebb113c4cULL: if (len == 17) { return 9662; } break; /* blacktriangleleft */ case 0x09ec9b6536e37281ULL: if (len == 17) { return 9666; } break; /* blacktriangleright */ case 0x352e04485c817ee2ULL: if (len == 18) { return 9656; } break; /* blank */ case 0x4b31e8abbc4aafc1ULL: if (len == 5) { return 9251; } break; /* blk12 */ case 0xf34977ab8a22afa3ULL: if (len == 5) { return 9618; } break; /* blk14 */ case 0xf3497dab8a22b9d5ULL: if (len == 5) { return 9617; } break; /* blk34 */ case 0xf35089ab8a28ece7ULL: if (len == 5) { return 9619; } break; /* block */ case 0x14e5faab9ce0e362ULL: if (len == 5) { return 9608; } break; /* bnot */ case 0xd47e139bca708ecaULL: if (len == 4) { return 8976; } break; /* bopf */ case 0xcd25d89bc6a7c704ULL: if (len == 4) { return 120147; } break; /* bot */ case 0x004d32191349ebbeULL: if (len == 3) { return 8869; } break; /* bottom */ case 0xe117b24625d0110aULL: if (len == 6) { return 8869; } break; /* bowtie */ case 0xc52b083fcd2c748bULL: if (len == 6) { return 8904; } break; /* boxDL */ case 0xf7b114b2660eaacaULL: if (len == 5) { return 9559; } break; /* boxDR */ case 0xf7b116b2660eae30ULL: if (len == 5) { return 9556; } break; /* boxDl */ case 0xf7b134b2660ee12aULL: if (len == 5) { return 9558; } break; /* boxDr */ case 0xf7b136b2660ee490ULL: if (len == 5) { return 9555; } break; /* boxH */ case 0xcd0a0e9bc68fa80eULL: if (len == 4) { return 9552; } break; /* boxHD */ case 0xf7bf1cb2661af5beULL: if (len == 5) { return 9574; } break; /* boxHU */ case 0xf7bf2db2661b12a1ULL: if (len == 5) { return 9577; } break; /* boxHd */ case 0xf7bf3cb2661b2c1eULL: if (len == 5) { return 9572; } break; /* boxHu */ case 0xf7bf4db2661b4901ULL: if (len == 5) { return 9575; } break; /* boxUL */ case 0xf77e12b265e34dcbULL: if (len == 5) { return 9565; } break; /* boxUR */ case 0xf77e20b265e36595ULL: if (len == 5) { return 9562; } break; /* boxUl */ case 0xf77e32b265e3842bULL: if (len == 5) { return 9564; } break; /* boxUr */ case 0xf77e40b265e39bf5ULL: if (len == 5) { return 9561; } break; /* boxV */ case 0xcd09f89bc68f82acULL: if (len == 4) { return 9553; } break; /* boxVH */ case 0xf77454b265db696cULL: if (len == 5) { return 9580; } break; /* boxVL */ case 0xf77450b265db62a0ULL: if (len == 5) { return 9571; } break; /* boxVR */ case 0xf7746eb265db959aULL: if (len == 5) { return 9568; } break; /* boxVh */ case 0xf77434b265db330cULL: if (len == 5) { return 9579; } break; /* boxVl */ case 0xf77430b265db2c40ULL: if (len == 5) { return 9570; } break; /* boxVr */ case 0xf7744eb265db5f3aULL: if (len == 5) { return 9567; } break; /* boxbox */ case 0xa8b8cd22b199ab2fULL: if (len == 6) { return 10697; } break; /* boxdL */ case 0xf74454b265b245aaULL: if (len == 5) { return 9557; } break; /* boxdR */ case 0xf74456b265b24910ULL: if (len == 5) { return 9554; } break; /* boxdl */ case 0xf74434b265b20f4aULL: if (len == 5) { return 9488; } break; /* boxdr */ case 0xf74436b265b212b0ULL: if (len == 5) { return 9484; } break; /* boxh */ case 0xcd09ee9bc68f71aeULL: if (len == 4) { return 9472; } break; /* boxhD */ case 0xf7525cb265be909eULL: if (len == 5) { return 9573; } break; /* boxhU */ case 0xf7526db265bead81ULL: if (len == 5) { return 9576; } break; /* boxhd */ case 0xf7523cb265be5a3eULL: if (len == 5) { return 9516; } break; /* boxhu */ case 0xf7524db265be7721ULL: if (len == 5) { return 9524; } break; /* boxminus */ case 0x5ce8a2f5a44bf02eULL: if (len == 8) { return 8863; } break; /* boxplus */ case 0xd798de7c66e871a6ULL: if (len == 7) { return 8862; } break; /* boxtimes */ case 0xe9ecdf64a372ce00ULL: if (len == 8) { return 8864; } break; /* boxuL */ case 0xf71152b26586e8abULL: if (len == 5) { return 9563; } break; /* boxuR */ case 0xf71160b265870075ULL: if (len == 5) { return 9560; } break; /* boxul */ case 0xf71132b26586b24bULL: if (len == 5) { return 9496; } break; /* boxur */ case 0xf71140b26586ca15ULL: if (len == 5) { return 9492; } break; /* boxv */ case 0xcd09d89bc68f4c4cULL: if (len == 4) { return 9474; } break; /* boxvH */ case 0xf70714b2657e2accULL: if (len == 5) { return 9578; } break; /* boxvL */ case 0xf70710b2657e2400ULL: if (len == 5) { return 9569; } break; /* boxvR */ case 0xf7072eb2657e56faULL: if (len == 5) { return 9566; } break; /* boxvh */ case 0xf70734b2657e612cULL: if (len == 5) { return 9532; } break; /* boxvl */ case 0xf70730b2657e5a60ULL: if (len == 5) { return 9508; } break; /* boxvr */ case 0xf7074eb2657e8d5aULL: if (len == 5) { return 9500; } break; /* bprime */ case 0x6e336f092b135bc0ULL: if (len == 6) { return 8245; } break; /* breve */ case 0x9391771deba731f5ULL: if (len == 5) { return 728; } break; /* brvbar */ case 0x2f8cb2679876e436ULL: if (len == 6) { return 166; } break; /* bscr */ case 0x3549c29c01b19e33ULL: if (len == 4) { return 119991; } break; /* bsemi */ case 0x73e6fb16ffedbd43ULL: if (len == 5) { return 8271; } break; /* bsim */ case 0x356bdb9c01ceaf14ULL: if (len == 4) { return 8765; } break; /* bsime */ case 0x94f59b1712341d03ULL: if (len == 5) { return 8909; } break; /* bsol */ case 0x3572e09c01d4d641ULL: if (len == 4) { return 92; } break; /* bsolb */ case 0xa709cc171ca7dd79ULL: if (len == 5) { return 10693; } break; /* bsolhsub */ case 0xbcd9c3005169587fULL: if (len == 8) { return 10184; } break; /* bull */ case 0xffcae49be2f70668ULL: if (len == 4) { return 8226; } break; /* bullet */ case 0x27fd172670080039ULL: if (len == 6) { return 8226; } break; /* bump */ case 0xffcdd69be2f92475ULL: if (len == 4) { return 8782; } break; /* bumpE */ case 0xa3e7dae2ad587d90ULL: if (len == 5) { return 10926; } break; /* bumpe */ case 0xa3e7bae2ad584730ULL: if (len == 5) { return 8783; } break; /* bumpeq */ case 0xdb09d02c8d011373ULL: if (len == 6) { return 8783; } break; /* cacute */ case 0x7a6117c2eb89164eULL: if (len == 6) { return 263; } break; /* cap */ case 0xf5e303190ce49c5bULL: if (len == 3) { return 8745; } break; /* capand */ case 0x75f4cf4050f8e70cULL: if (len == 6) { return 10820; } break; /* capbrcup */ case 0xb08a1c9466fb22e5ULL: if (len == 8) { return 10825; } break; /* capcap */ case 0x63fb9f40469bf001ULL: if (len == 6) { return 10827; } break; /* capcup */ case 0x643f974046d5af35ULL: if (len == 6) { return 10823; } break; /* capdot */ case 0xa14eb040698a0436ULL: if (len == 6) { return 10816; } break; /* caret */ case 0xaf9aa53b09744808ULL: if (len == 5) { return 8257; } break; /* caron */ case 0xafbc8f3b0991090cULL: if (len == 5) { return 711; } break; /* ccaps */ case 0xa0049d28c53d27e3ULL: if (len == 5) { return 10829; } break; /* ccaron */ case 0x135a47471cd543c5ULL: if (len == 6) { return 269; } break; /* ccedil */ case 0x9353a36aba40d147ULL: if (len == 6) { return 231; } break; /* ccirc */ case 0xe4dcdd28ec1add65ULL: if (len == 5) { return 265; } break; /* ccups */ case 0x4d42d929275e1d1fULL: if (len == 5) { return 10828; } break; /* ccupssm */ case 0x3094013bfd0225ebULL: if (len == 7) { return 10832; } break; /* cdot */ case 0xce6cdd90f666f1b9ULL: if (len == 4) { return 267; } break; /* cedil */ case 0xc773035e6bd81236ULL: if (len == 5) { return 184; } break; /* cemptyv */ case 0xfdb3fba1f6c681d3ULL: if (len == 7) { return 10674; } break; /* cent */ case 0xd9920290fd6b234fULL: if (len == 4) { return 162; } break; /* centerdot */ case 0x2971ee7e30eab3cbULL: if (len == 9) { return 183; } break; /* cfr */ case 0xf5e60b190ce6dfcaULL: if (len == 3) { return 120096; } break; /* chcy */ case 0xf29c8c910b55142aULL: if (len == 4) { return 1095; } break; /* check */ case 0x830cf17637260a67ULL: if (len == 5) { return 10003; } break; /* checkmark */ case 0x851faf02ca753532ULL: if (len == 9) { return 10003; } break; /* chi */ case 0xf5faf6190cf91825ULL: if (len == 3) { return 967; } break; /* cir */ case 0xf5fdf5190cfb4c49ULL: if (len == 3) { return 9675; } break; /* cirE */ case 0xf9d385910f023864ULL: if (len == 4) { return 10691; } break; /* circ */ case 0xf9d3a3910f026b5eULL: if (len == 4) { return 710; } break; /* circeq */ case 0x2c7b618f62ee6090ULL: if (len == 6) { return 8791; } break; /* circlearrowleft */ case 0x31ffd7e3c08715ffULL: if (len == 15) { return 8634; } break; /* circlearrowright */ case 0x41c1836512521eb0ULL: if (len == 16) { return 8635; } break; /* circledR */ case 0x0013fe405e688f5fULL: if (len == 8) { return 174; } break; /* circledS */ case 0x0013fd405e688dacULL: if (len == 8) { return 9416; } break; /* circledast */ case 0x8e629bd6aa1be615ULL: if (len == 10) { return 8859; } break; /* circledcirc */ case 0x108df1b1f66d796cULL: if (len == 11) { return 8858; } break; /* circleddash */ case 0xccdbf0aaf5e77bbbULL: if (len == 11) { return 8861; } break; /* cire */ case 0xf9d3a5910f026ec4ULL: if (len == 4) { return 8791; } break; /* cirfnint */ case 0xa05ae627d40e3d3aULL: if (len == 8) { return 10768; } break; /* cirmid */ case 0xf94e948f462bf2a1ULL: if (len == 6) { return 10991; } break; /* cirscir */ case 0xea80eb2cfcdaf958ULL: if (len == 7) { return 10690; } break; /* clubs */ case 0x68f17994f4c0393aULL: if (len == 5) { return 9827; } break; /* clubsuit */ case 0x622806af27ce26d8ULL: if (len == 8) { return 9827; } break; /* colon */ case 0x77f5cd8e246c7a9cULL: if (len == 5) { return 58; } break; /* colone */ case 0x43274187e454f51bULL: if (len == 6) { return 8788; } break; /* coloneq */ case 0x70a9c3e8fc5d031eULL: if (len == 7) { return 8788; } break; /* comma */ case 0x6d47878e1dcd3758ULL: if (len == 5) { return 44; } break; /* commat */ case 0x7dc2827ca3b4bfc4ULL: if (len == 6) { return 64; } break; /* comp */ case 0x0bcd0e91195fc6aaULL: if (len == 4) { return 8705; } break; /* compfn */ case 0x527d9f7c8b35fb3eULL: if (len == 6) { return 8728; } break; /* complement */ case 0x8c359ee736a77e9dULL: if (len == 10) { return 8705; } break; /* complexes */ case 0x668e2fc28864ffdfULL: if (len == 9) { return 8450; } break; /* cong */ case 0x0bc9f991195d6d24ULL: if (len == 4) { return 8773; } break; /* congdot */ case 0xbe5eca19385c0babULL: if (len == 7) { return 10861; } break; /* conint */ case 0x1983be75915754c4ULL: if (len == 6) { return 8750; } break; /* copf */ case 0x0bf90a911984fac9ULL: if (len == 4) { return 120148; } break; /* coprod */ case 0x578339e7ba570baeULL: if (len == 6) { return 8720; } break; /* copy */ case 0x0bf903911984eee4ULL: if (len == 4) { return 169; } break; /* copysr */ case 0x8302eae7d308a685ULL: if (len == 6) { return 8471; } break; /* crarr */ case 0x9134f99ec3d24cd3ULL: if (len == 5) { return 8629; } break; /* cross */ case 0x0c36469f09fb69fbULL: if (len == 5) { return 10007; } break; /* cscr */ case 0x1a08789090a6f9e6ULL: if (len == 4) { return 119992; } break; /* csub */ case 0x19e68890908a2eb0ULL: if (len == 4) { return 10959; } break; /* csube */ case 0x8ce8e2a59acd93efULL: if (len == 5) { return 10961; } break; /* csup */ case 0x19e67a90908a16e6ULL: if (len == 4) { return 10960; } break; /* csupe */ case 0x8cb8c6a59aa44099ULL: if (len == 5) { return 10962; } break; /* ctdot */ case 0x41ee3ecf9ed8b279ULL: if (len == 5) { return 8943; } break; /* cudarrl */ case 0x6eeb40085784d622ULL: if (len == 7) { return 10552; } break; /* cudarrr */ case 0x6eeb32085784be58ULL: if (len == 7) { return 10549; } break; /* cuepr */ case 0x40209bd555ae69c6ULL: if (len == 5) { return 8926; } break; /* cuesc */ case 0x402a9cd555b6bffeULL: if (len == 5) { return 8927; } break; /* cularr */ case 0x5d964cc8d7ce7942ULL: if (len == 6) { return 8630; } break; /* cularrp */ case 0xd4ddab46b3d7eff6ULL: if (len == 7) { return 10557; } break; /* cup */ case 0xf5b9fb190cc189afULL: if (len == 3) { return 8746; } break; /* cupbrcap */ case 0x4bbd37fb2de18bedULL: if (len == 8) { return 10824; } break; /* cupcap */ case 0xf77c572e1372d6bdULL: if (len == 6) { return 10822; } break; /* cupcup */ case 0xf7a53f2e1395b309ULL: if (len == 6) { return 10826; } break; /* cupdot */ case 0xed48282e0d3b16caULL: if (len == 6) { return 8845; } break; /* cupor */ case 0xf4c4f8d5bba437f6ULL: if (len == 5) { return 10821; } break; /* curarr */ case 0x73c98940043acc48ULL: if (len == 6) { return 8631; } break; /* curarrm */ case 0xfa405cc72fe8e2dfULL: if (len == 7) { return 10556; } break; /* curlyeqprec */ case 0xd4946b2d9929ace6ULL: if (len == 11) { return 8926; } break; /* curlyeqsucc */ case 0x3c5e8e4a4ec3347aULL: if (len == 11) { return 8927; } break; /* curlyvee */ case 0xe0776ff2c16e341eULL: if (len == 8) { return 8910; } break; /* curlywedge */ case 0x034d5584beafd08eULL: if (len == 10) { return 8911; } break; /* curren */ case 0x034d603fc48db38aULL: if (len == 6) { return 164; } break; /* curvearrowleft */ case 0xe096fcdd7ac90920ULL: if (len == 14) { return 8630; } break; /* curvearrowright */ case 0xeb644e7c1e4767b5ULL: if (len == 15) { return 8631; } break; /* cuvee */ case 0xe2d599d5b14f4593ULL: if (len == 5) { return 8910; } break; /* cuwed */ case 0xdbca81d5adc72797ULL: if (len == 5) { return 8911; } break; /* cwconint */ case 0x1fa4b574d71d1d26ULL: if (len == 8) { return 8754; } break; /* cwint */ case 0xdae44dc4936703b0ULL: if (len == 5) { return 8753; } break; /* cylcty */ case 0xd07432e303656d43ULL: if (len == 6) { return 9005; } break; /* dArr */ case 0x98049267cb7dca5aULL: if (len == 4) { return 8659; } break; /* dHar */ case 0xe70ceb67f88f3196ULL: if (len == 4) { return 10597; } break; /* dagger */ case 0x4f161d6b34db5edbULL: if (len == 6) { return 8224; } break; /* daleth */ case 0x79f111b3b730c635ULL: if (len == 6) { return 8504; } break; /* darr */ case 0x8561726730a7e6faULL: if (len == 4) { return 8595; } break; /* dash */ case 0x85657e6730abe435ULL: if (len == 4) { return 8208; } break; /* dashv */ case 0x575a0c57b414ddd9ULL: if (len == 5) { return 8867; } break; /* dbkarow */ case 0x59140fc62fcc5041ULL: if (len == 7) { return 10511; } break; /* dblac */ case 0x3101ae4c3c126235ULL: if (len == 5) { return 733; } break; /* dcaron */ case 0x3f05dc31b96caebeULL: if (len == 6) { return 271; } break; /* dcy */ case 0xca862d18f4515c0bULL: if (len == 3) { return 1076; } break; /* dd */ case 0x08915407b53bac15ULL: if (len == 2) { return 8518; } break; /* ddagger */ case 0x43f215c694717be5ULL: if (len == 7) { return 8225; } break; /* ddarr */ case 0x01c25481b18f8148ULL: if (len == 5) { return 8650; } break; /* ddotseq */ case 0x08139206fa64c295ULL: if (len == 7) { return 10871; } break; /* deg */ case 0xca9a1b18f461e67fULL: if (len == 3) { return 176; } break; /* delta */ case 0x52076675ec13a0c1ULL: if (len == 5) { return 948; } break; /* demptyv */ case 0x61f7904a558f3a42ULL: if (len == 7) { return 10673; } break; /* dfisht */ case 0xdd5ed6afc1c66d6fULL: if (len == 6) { return 10623; } break; /* dfr */ case 0xca974018f45fef87ULL: if (len == 3) { return 120097; } break; /* dharl */ case 0x02fdfa9f5cc4a0eeULL: if (len == 5) { return 8643; } break; /* dharr */ case 0x02fde49f5cc47b8cULL: if (len == 5) { return 8642; } break; /* diam */ case 0xca14bd67576692f0ULL: if (len == 4) { return 8900; } break; /* diamond */ case 0x21189197f0b60827ULL: if (len == 7) { return 8900; } break; /* diamondsuit */ case 0x8c3c0ff1376040b6ULL: if (len == 11) { return 9830; } break; /* diams */ case 0xc7d05999834af499ULL: if (len == 5) { return 9830; } break; /* die */ case 0xcaa82d18f46e4271ULL: if (len == 3) { return 168; } break; /* digamma */ case 0xefae0e15c5d97df7ULL: if (len == 7) { return 989; } break; /* disin */ case 0x42329299c8ed774cULL: if (len == 5) { return 8946; } break; /* div */ case 0xcaa83a18f46e5888ULL: if (len == 3) { return 247; } break; /* divide */ case 0xd1376826789a1830ULL: if (len == 6) { return 247; } break; /* divideontimes */ case 0x94eb5ee6011de7b9ULL: if (len == 13) { return 8903; } break; /* divonx */ case 0x06ea53269781d2abULL: if (len == 6) { return 8903; } break; /* djcy */ case 0xbfaa806751012bc3ULL: if (len == 4) { return 1106; } break; /* dlcorn */ case 0x838d84afee467cbbULL: if (len == 6) { return 8990; } break; /* dlcrop */ case 0x25ce79b0498458afULL: if (len == 6) { return 8973; } break; /* dollar */ case 0xc4361a5b5c15e1ffULL: if (len == 6) { return 36; } break; /* dopf */ case 0xdc06f86761bd7dfeULL: if (len == 4) { return 120149; } break; /* dot */ case 0xcaaf2818f47458a0ULL: if (len == 3) { return 729; } break; /* doteq */ case 0x7c7b02ab02e3000aULL: if (len == 5) { return 8784; } break; /* doteqdot */ case 0x0fa6c3ef422c0931ULL: if (len == 8) { return 8785; } break; /* dotminus */ case 0xcb413af30fc40d08ULL: if (len == 8) { return 8760; } break; /* dotplus */ case 0x01c961128eed7a60ULL: if (len == 7) { return 8724; } break; /* dotsquare */ case 0x89734e93d2e87cbfULL: if (len == 9) { return 8865; } break; /* doublebarwedge */ case 0xc725363dc0b2c267ULL: if (len == 14) { return 8966; } break; /* downarrow */ case 0x6aa141120ec25e36ULL: if (len == 9) { return 8595; } break; /* downdownarrows */ case 0xb273ede722bd9f8fULL: if (len == 14) { return 8650; } break; /* downharpoonleft */ case 0x5c092b157f929fe9ULL: if (len == 15) { return 8643; } break; /* downharpoonright */ case 0x9f2be3bc337657caULL: if (len == 16) { return 8642; } break; /* drbkarow */ case 0xcc41d6af83396381ULL: if (len == 8) { return 10512; } break; /* drcorn */ case 0xb4e5dd9099f03199ULL: if (len == 6) { return 8991; } break; /* drcrop */ case 0xb7cd4e900a0c0d41ULL: if (len == 6) { return 8972; } break; /* dscr */ case 0xe9be8a66d8954471ULL: if (len == 4) { return 119993; } break; /* dscy */ case 0xe9be7f66d89531c0ULL: if (len == 4) { return 1109; } break; /* dsol */ case 0xe9e79466d8b85a83ULL: if (len == 4) { return 10742; } break; /* dstrok */ case 0x884f973e86e7047cULL: if (len == 6) { return 273; } break; /* dtdot */ case 0x6873aaf891068d60ULL: if (len == 5) { return 8945; } break; /* dtri */ case 0x2407b666f8eebc34ULL: if (len == 4) { return 9663; } break; /* dtrif */ case 0x27d742f8fda9ff56ULL: if (len == 5) { return 9662; } break; /* duarr */ case 0x497ea1f2c82c0069ULL: if (len == 5) { return 8693; } break; /* duhar */ case 0x8359d8f2e82705fdULL: if (len == 5) { return 10607; } break; /* dwangle */ case 0xea9155e9d88d0897ULL: if (len == 7) { return 10662; } break; /* dzcy */ case 0x35ebf06703396833ULL: if (len == 4) { return 1119; } break; /* dzigrarr */ case 0xcdb5ca26e18c475aULL: if (len == 8) { return 10239; } break; /* eDDot */ case 0x70ac2d5edb66aaf3ULL: if (len == 5) { return 10871; } break; /* eDot */ case 0x2451055f8ea22e17ULL: if (len == 4) { return 8785; } break; /* eacute */ case 0x3b7c8d3a9377b51cULL: if (len == 6) { return 233; } break; /* easter */ case 0x73c962b7031cbd0bULL: if (len == 6) { return 10862; } break; /* ecaron */ case 0x95cbe56022016ca7ULL: if (len == 6) { return 283; } break; /* ecir */ case 0x2ffde860260210a6ULL: if (len == 4) { return 8790; } break; /* ecirc */ case 0x8e82a06095827ebfULL: if (len == 5) { return 234; } break; /* ecolon */ case 0xf5e7034e1ccbacc3ULL: if (len == 6) { return 8789; } break; /* ecy */ case 0xc2ca0418f0328280ULL: if (len == 3) { return 1101; } break; /* edot */ case 0x3a5a25602c5b3a77ULL: if (len == 4) { return 279; } break; /* ee */ case 0x088e2f07b539375fULL: if (len == 2) { return 8519; } break; /* efDot */ case 0x494f667ce9326ff9ULL: if (len == 5) { return 8786; } break; /* efr */ case 0xc2d4fd18f03c7e20ULL: if (len == 3) { return 120098; } break; /* eg */ case 0x088e3107b5393ac5ULL: if (len == 2) { return 10906; } break; /* egrave */ case 0xd53c8cbc713a5661ULL: if (len == 6) { return 232; } break; /* egs */ case 0xc2d80618f03ec342ULL: if (len == 3) { return 10902; } break; /* egsdot */ case 0x8ddf24b5700a71c9ULL: if (len == 6) { return 10904; } break; /* el */ case 0x088e3607b5394344ULL: if (len == 2) { return 10905; } break; /* elinters */ case 0x2041a5a4388dfc67ULL: if (len == 8) { return 9191; } break; /* ell */ case 0xc2e8f718f04d1cf8ULL: if (len == 3) { return 8467; } break; /* els */ case 0xc2e90618f04d3675ULL: if (len == 3) { return 10901; } break; /* elsdot */ case 0x9b0108992b9339b0ULL: if (len == 6) { return 10903; } break; /* emacr */ case 0x12124db4198fa973ULL: if (len == 5) { return 275; } break; /* empty */ case 0x904fefb3d01cb2aeULL: if (len == 5) { return 8709; } break; /* emptyset */ case 0x96c59f49571536b6ULL: if (len == 8) { return 8709; } break; /* emptyv */ case 0x5487268aa0c3e508ULL: if (len == 6) { return 8709; } break; /* emsp13 */ case 0xc1f3cd72ec0cc8e4ULL: if (len == 6) { return 8196; } break; /* emsp14 */ case 0xc1f3cc72ec0cc731ULL: if (len == 6) { return 8197; } break; /* emsp */ case 0x867a986056f4e9f4ULL: if (len == 4) { return 8195; } break; /* eng */ case 0xc2f00218f0534e57ULL: if (len == 3) { return 331; } break; /* ensp */ case 0x914abf605db0def1ULL: if (len == 4) { return 8194; } break; /* eogon */ case 0x6d7703c5f8324ba7ULL: if (len == 5) { return 281; } break; /* eopf */ case 0x98b0ea606185c8e3ULL: if (len == 4) { return 120150; } break; /* epar */ case 0xa347ff606811da03ULL: if (len == 4) { return 8917; } break; /* eparsl */ case 0xa913bedc346d29f4ULL: if (len == 6) { return 10723; } break; /* eplus */ case 0xe32f23d10b348e80ULL: if (len == 5) { return 10865; } break; /* epsi */ case 0xa318146067e8d9f0ULL: if (len == 4) { return 949; } break; /* epsilon */ case 0x23d316013d60439dULL: if (len == 7) { return 949; } break; /* epsiv */ case 0x0ac425d090a99eb2ULL: if (len == 5) { return 1013; } break; /* eqcirc */ case 0x8c669db676119528ULL: if (len == 6) { return 8790; } break; /* eqcolon */ case 0x578cdd3aeafc98feULL: if (len == 7) { return 8789; } break; /* eqsim */ case 0x384f40d6f35df502ULL: if (len == 5) { return 8770; } break; /* eqslantgtr */ case 0xc9ccdf5419f4b7acULL: if (len == 10) { return 10902; } break; /* eqslantless */ case 0x17b17c2383c9b298ULL: if (len == 11) { return 10901; } break; /* equals */ case 0x2fedf26ef08343d4ULL: if (len == 6) { return 61; } break; /* equest */ case 0x53b4836f05184a42ULL: if (len == 6) { return 8799; } break; /* equiv */ case 0x6a951dd70f5c5005ULL: if (len == 5) { return 8801; } break; /* equivDD */ case 0x3fc242c8f1741775ULL: if (len == 7) { return 10872; } break; /* eqvparsl */ case 0xc0e0dfc5f1a4f0ddULL: if (len == 8) { return 10725; } break; /* erDot */ case 0x2d37b6de56eeeefdULL: if (len == 5) { return 8787; } break; /* erarr */ case 0x45ab55ddd471d535ULL: if (len == 5) { return 10609; } break; /* escr */ case 0xbc6a9060761068a4ULL: if (len == 4) { return 8495; } break; /* esdot */ case 0x52dfaee8ac1834d4ULL: if (len == 5) { return 8784; } break; /* esim */ case 0xbc48736075f350f7ULL: if (len == 4) { return 8770; } break; /* eta */ case 0xc3042418f0643127ULL: if (len == 3) { return 951; } break; /* eth */ case 0xc3041b18f06421dcULL: if (len == 3) { return 240; } break; /* euml */ case 0xce67c8608071561eULL: if (len == 4) { return 235; } break; /* euro */ case 0xcec2c76080be0018ULL: if (len == 4) { return 8364; } break; /* excl */ case 0xe7c061608e9d81c7ULL: if (len == 4) { return 33; } break; /* exist */ case 0x125f8a12243ad59cULL: if (len == 5) { return 8707; } break; /* expectation */ case 0x493c54823adf3ea5ULL: if (len == 11) { return 8496; } break; /* exponentiale */ case 0x68babbe189ad8717ULL: if (len == 12) { return 8519; } break; /* fallingdotseq */ case 0x8338af685a0a35e6ULL: if (len == 13) { return 8786; } break; /* fcy */ case 0xdcc08b18fee63835ULL: if (len == 3) { return 1092; } break; /* female */ case 0x1ba65229592c08d9ULL: if (len == 6) { return 9792; } break; /* ffilig */ case 0x1fd6b2748d740d64ULL: if (len == 6) { return 64259; } break; /* fflig */ case 0xf90d36fcaedd35ebULL: if (len == 5) { return 64256; } break; /* ffllig */ case 0x39ebc85d3a5e6631ULL: if (len == 6) { return 64260; } break; /* ffr */ case 0xdcd19218fef4b74dULL: if (len == 3) { return 120099; } break; /* filig */ case 0x6a20f480183596a0ULL: if (len == 5) { return 64257; } break; /* flat */ case 0xd5f2e179088c27faULL: if (len == 4) { return 9837; } break; /* fllig */ case 0xb9e4eaa9514d3e15ULL: if (len == 5) { return 64258; } break; /* fltns */ case 0x8af0c6a9c80971eaULL: if (len == 5) { return 9649; } break; /* fnof */ case 0xe4ce21791043c6d8ULL: if (len == 4) { return 402; } break; /* fopf */ case 0xdd2308790c337bb0ULL: if (len == 4) { return 120151; } break; /* forall */ case 0xffa28a8eb76fc103ULL: if (len == 6) { return 8704; } break; /* fork */ case 0xdd1d0d790c2f1881ULL: if (len == 4) { return 8916; } break; /* forkv */ case 0xe776dbafb4076bb5ULL: if (len == 5) { return 10969; } break; /* fpartint */ case 0x3e9cfc3ce84ad821ULL: if (len == 8) { return 10765; } break; /* frac12 */ case 0xccb13d66f725edceULL: if (len == 6) { return 189; } break; /* frac13 */ case 0xccb13e66f725ef81ULL: if (len == 6) { return 8531; } break; /* frac14 */ case 0xccb13f66f725f134ULL: if (len == 6) { return 188; } break; /* frac15 */ case 0xccb14066f725f2e7ULL: if (len == 6) { return 8533; } break; /* frac16 */ case 0xccb14166f725f49aULL: if (len == 6) { return 8537; } break; /* frac18 */ case 0xccb13366f725dcd0ULL: if (len == 6) { return 8539; } break; /* frac23 */ case 0xccbb2e66f72e28d6ULL: if (len == 6) { return 8532; } break; /* frac25 */ case 0xccbb3066f72e2c3cULL: if (len == 6) { return 8534; } break; /* frac34 */ case 0xccb7c366f72b3d2eULL: if (len == 6) { return 190; } break; /* frac35 */ case 0xccb7c466f72b3ee1ULL: if (len == 6) { return 8535; } break; /* frac38 */ case 0xccb7bf66f72b3662ULL: if (len == 6) { return 8540; } break; /* frac45 */ case 0xccc23466f73451b6ULL: if (len == 6) { return 8536; } break; /* frac56 */ case 0xccbeb166f7313d46ULL: if (len == 6) { return 8538; } break; /* frac58 */ case 0xccbebb66f7314e44ULL: if (len == 6) { return 8541; } break; /* frac78 */ case 0xccc53766f7368ca6ULL: if (len == 6) { return 8542; } break; /* frasl */ case 0xd87b58562867682fULL: if (len == 5) { return 8260; } break; /* frown */ case 0x537398566e89cdbbULL: if (len == 5) { return 8994; } break; /* fscr */ case 0x74f81278d123716fULL: if (len == 4) { return 119995; } break; /* gE */ case 0x08955307b53f9339ULL: if (len == 2) { return 8807; } break; /* gEl */ case 0xd54f6b18fb07596fULL: if (len == 3) { return 10892; } break; /* gacute */ case 0x76d58e4a54405232ULL: if (len == 6) { return 501; } break; /* gamma */ case 0x229176bd1f6ba96aULL: if (len == 5) { return 947; } break; /* gammad */ case 0x28d5d15c63f042caULL: if (len == 6) { return 989; } break; /* gap */ case 0xd4f05718fab6a2efULL: if (len == 3) { return 10886; } break; /* gbreve */ case 0xf9adcf722090a52cULL: if (len == 6) { return 287; } break; /* gcirc */ case 0x7bbce4ac3908e0c9ULL: if (len == 5) { return 285; } break; /* gcy */ case 0xd4e96218fab096f2ULL: if (len == 3) { return 1075; } break; /* gdot */ case 0x5f8bcd71ebaa1ecdULL: if (len == 4) { return 289; } break; /* ge */ case 0x08953307b53f5cd9ULL: if (len == 2) { return 8805; } break; /* gel */ case 0xd4e26b18faaa878fULL: if (len == 3) { return 8923; } break; /* geq */ case 0xd4e25e18faaa7178ULL: if (len == 3) { return 8805; } break; /* geqq */ case 0x6716ed71ef9e124bULL: if (len == 4) { return 8807; } break; /* geqslant */ case 0x9bf79a7d6730e500ULL: if (len == 8) { return 10878; } break; /* ges */ case 0xd4e26018faaa74deULL: if (len == 3) { return 10878; } break; /* gescc */ case 0xdc63ea9a344a7a8cULL: if (len == 5) { return 10921; } break; /* gesdot */ case 0xaefd1706cc71dfc5ULL: if (len == 6) { return 10880; } break; /* gesdoto */ case 0xc9edca8d657f0ddeULL: if (len == 7) { return 10882; } break; /* gesdotol */ case 0x9e1ce04376e44576ULL: if (len == 8) { return 10884; } break; /* gesles */ case 0x6746d806a3249c8eULL: if (len == 6) { return 10900; } break; /* gfr */ case 0xd4d84f18faa20376ULL: if (len == 3) { return 120100; } break; /* gg */ case 0x08953107b53f5973ULL: if (len == 2) { return 8811; } break; /* ggg */ case 0xd4db6418faa45cfcULL: if (len == 3) { return 8921; } break; /* gimel */ case 0x97108bff81f772d9ULL: if (len == 5) { return 8503; } break; /* gjcy */ case 0xb62a5e721cb9a9d4ULL: if (len == 4) { return 1107; } break; /* gl */ case 0x08953a07b53f68beULL: if (len == 2) { return 8823; } break; /* glE */ case 0xd4fa9618fabf6281ULL: if (len == 3) { return 10898; } break; /* gla */ case 0xd4fa7a18fabf32edULL: if (len == 3) { return 10917; } break; /* glj */ case 0xd4fa6f18fabf203cULL: if (len == 3) { return 10916; } break; /* gnE */ case 0xd4f35218fab8d047ULL: if (len == 3) { return 8809; } break; /* gnap */ case 0x92a3bf72085a6f91ULL: if (len == 4) { return 10890; } break; /* gnapprox */ case 0x97c4dd0ef0d731a4ULL: if (len == 8) { return 10890; } break; /* gne */ case 0xd4f37218fab906a7ULL: if (len == 3) { return 10888; } break; /* gneq */ case 0x92b1b67208669da2ULL: if (len == 4) { return 10888; } break; /* gneqq */ case 0xaa96d6c4465e2d89ULL: if (len == 5) { return 8809; } break; /* gnsim */ case 0x0f69ecc3eeaefaffULL: if (len == 5) { return 8935; } break; /* gopf */ case 0x9d33ca720ee05105ULL: if (len == 4) { return 120152; } break; /* grave */ case 0x32d86f2977ed63d2ULL: if (len == 5) { return 96; } break; /* gscr */ case 0x0257c872475dd462ULL: if (len == 4) { return 8458; } break; /* gsim */ case 0x0243df72474d526dULL: if (len == 4) { return 8819; } break; /* gsime */ case 0x26a6b72f28626398ULL: if (len == 5) { return 10894; } break; /* gsiml */ case 0x26a6b02f286257b3ULL: if (len == 5) { return 10896; } break; /* gt */ case 0x08954207b53f7656ULL: if (len == 2) { return 62; } break; /* gtcc */ case 0xe93c4e7239658b84ULL: if (len == 4) { return 10919; } break; /* gtcir */ case 0xb6f03a17877a6960ULL: if (len == 5) { return 10874; } break; /* gtdot */ case 0x9a8fd71776ba51fdULL: if (len == 5) { return 8919; } break; /* gtlPar */ case 0x38f95924c2a5c189ULL: if (len == 6) { return 10645; } break; /* gtquest */ case 0xb2ad0106bc673780ULL: if (len == 7) { return 10876; } break; /* gtrapprox */ case 0x288c1c73c4680620ULL: if (len == 9) { return 10886; } break; /* gtrarr */ case 0xe136856c727f7b77ULL: if (len == 6) { return 10616; } break; /* gtrdot */ case 0xb620a26c5a2827b3ULL: if (len == 6) { return 8919; } break; /* gtreqless */ case 0x2f310e1fab7cb517ULL: if (len == 9) { return 8923; } break; /* gtreqqless */ case 0x41f55d823d460c90ULL: if (len == 10) { return 10892; } break; /* gtrless */ case 0xd69c0bda9eb91ff5ULL: if (len == 7) { return 8823; } break; /* gtrsim */ case 0x7c66486cca30a193ULL: if (len == 6) { return 8819; } break; /* hArr */ case 0x183182cbd65f3ca6ULL: if (len == 4) { return 8660; } break; /* hairsp */ case 0x13d723b703d4860aULL: if (len == 6) { return 8202; } break; /* half */ case 0x2e33a6cc74123124ULL: if (len == 4) { return 189; } break; /* hamilt */ case 0x6984b0d600846eecULL: if (len == 6) { return 8459; } break; /* hardcy */ case 0xd0bda8e10c1d9a5cULL: if (len == 6) { return 1098; } break; /* harr */ case 0x2e3aa2cc74184906ULL: if (len == 4) { return 8596; } break; /* harrcir */ case 0x6f175bd1742a2a50ULL: if (len == 7) { return 10568; } break; /* harrw */ case 0xa5ec12694544cb03ULL: if (len == 5) { return 8621; } break; /* hbar */ case 0x271089cc707578c8ULL: if (len == 4) { return 8463; } break; /* hcirc */ case 0xb06dfd583220e84cULL: if (len == 5) { return 293; } break; /* hearts */ case 0xe3d0d3b4d0813150ULL: if (len == 6) { return 9829; } break; /* heartsuit */ case 0xe5735eff60fb13c2ULL: if (len == 9) { return 9829; } break; /* hellip */ case 0xa9d0fecca230a7d7ULL: if (len == 6) { return 8230; } break; /* hercon */ case 0x40b7c51448377048ULL: if (len == 6) { return 8889; } break; /* hfr */ case 0x334714192fe123c3ULL: if (len == 3) { return 120101; } break; /* hksearow */ case 0xb181ceba321c2d59ULL: if (len == 8) { return 10533; } break; /* hkswarow */ case 0xe1eb57b84e8cf00bULL: if (len == 8) { return 10534; } break; /* hoarr */ case 0xa003f67aec38a76bULL: if (len == 5) { return 8703; } break; /* homtht */ case 0x4c62e7bc28be06fdULL: if (len == 6) { return 8763; } break; /* hookleftarrow */ case 0x1ca4d2b41ededf24ULL: if (len == 13) { return 8617; } break; /* hookrightarrow */ case 0xbd40e943a0033a71ULL: if (len == 14) { return 8618; } break; /* hopf */ case 0x406df8cc7ea6f8eaULL: if (len == 4) { return 120153; } break; /* horbar */ case 0xb3085a691f62d117ULL: if (len == 6) { return 8213; } break; /* hscr */ case 0x9303dacc1c60fbbdULL: if (len == 4) { return 119997; } break; /* hslash */ case 0x3ca2c51e858bb458ULL: if (len == 6) { return 8463; } break; /* hstrok */ case 0x228331e9609cc6e8ULL: if (len == 6) { return 295; } break; /* hybull */ case 0x9111c71a8bf68117ULL: if (len == 6) { return 8259; } break; /* hyphen */ case 0xc20630af71eaeec1ULL: if (len == 6) { return 8208; } break; /* iacute */ case 0x7c1958275b811f20ULL: if (len == 6) { return 237; } break; /* ic */ case 0x08b73507b55c46a5ULL: if (len == 2) { return 8291; } break; /* icirc */ case 0x05223876c58644f3ULL: if (len == 5) { return 238; } break; /* icy */ case 0x2b95f8192bcc67d4ULL: if (len == 3) { return 1080; } break; /* iecy */ case 0xa63841c54d27f90bULL: if (len == 4) { return 1077; } break; /* iexcl */ case 0x6e5c7a42027b1e0eULL: if (len == 5) { return 161; } break; /* iff */ case 0x2b84dd192bbdc6c0ULL: if (len == 3) { return 8660; } break; /* ifr */ case 0x2b84f1192bbde8bcULL: if (len == 3) { return 120102; } break; /* igrave */ case 0x73472763ea078c35ULL: if (len == 6) { return 236; } break; /* ii */ case 0x08b73b07b55c50d7ULL: if (len == 2) { return 8520; } break; /* iiiint */ case 0x89ea38b950ea6123ULL: if (len == 6) { return 10764; } break; /* iiint */ case 0x99781da78fca6278ULL: if (len == 5) { return 8749; } break; /* iinfin */ case 0xb818f38fce1ff0ecULL: if (len == 6) { return 10716; } break; /* iiota */ case 0x66b12ca7735e6a8fULL: if (len == 5) { return 8489; } break; /* ijlig */ case 0x2f1b13b22432fd12ULL: if (len == 5) { return 307; } break; /* imacr */ case 0x2ac2f5888532a1afULL: if (len == 5) { return 299; } break; /* image */ case 0x2ab612888528489aULL: if (len == 5) { return 8465; } break; /* imagline */ case 0x1371a591387c7ad1ULL: if (len == 8) { return 8464; } break; /* imagpart */ case 0x2576142bcdeff2b6ULL: if (len == 8) { return 8465; } break; /* imath */ case 0x2a830d8884fce682ULL: if (len == 5) { return 305; } break; /* imof */ case 0xee0286c57685ef7eULL: if (len == 4) { return 8887; } break; /* imped */ case 0xbe11a688d8a5f918ULL: if (len == 5) { return 437; } break; /* in */ case 0x08b73807b55c4bbeULL: if (len == 2) { return 8712; } break; /* incare */ case 0xea592c0f4544ccffULL: if (len == 6) { return 8453; } break; /* infin */ case 0x74fb528f88cfcd27ULL: if (len == 5) { return 8734; } break; /* infintie */ case 0x3a0bf2562366f23fULL: if (len == 8) { return 10717; } break; /* inodot */ case 0x6cb1d3aa1a4426beULL: if (len == 6) { return 305; } break; /* int */ case 0x2b9fff192bd4c83eULL: if (len == 3) { return 8747; } break; /* intcal */ case 0xe24cb46fa6eb465aULL: if (len == 6) { return 8890; } break; /* integers */ case 0x7e2a5081098e6682ULL: if (len == 8) { return 8484; } break; /* intercal */ case 0xfa8dbdf104d24413ULL: if (len == 8) { return 8890; } break; /* intlarhk */ case 0xe698b8cb5c5abe34ULL: if (len == 8) { return 10775; } break; /* intprod */ case 0x94d5023bdd5b6d33ULL: if (len == 7) { return 10812; } break; /* iocy */ case 0xfce4e7c57e43e51dULL: if (len == 4) { return 1105; } break; /* iogon */ case 0x1d31eb959f088b9bULL: if (len == 5) { return 303; } break; /* iopf */ case 0xfcaaeac57e1271efULL: if (len == 4) { return 120154; } break; /* iota */ case 0xfcb7ffc57e1d1ffaULL: if (len == 4) { return 953; } break; /* iprod */ case 0x6f8170e2bfafbd81ULL: if (len == 5) { return 10812; } break; /* iquest */ case 0xbbc5fe1a52d53096ULL: if (len == 6) { return 191; } break; /* iscr */ case 0x65afc0c5b9dbe990ULL: if (len == 4) { return 119998; } break; /* isin */ case 0x65c3dcc5b9ecc22eULL: if (len == 4) { return 8712; } break; /* isinE */ case 0xd8928efaed4e5bd1ULL: if (len == 5) { return 8953; } break; /* isindot */ case 0xf0a7723892e867d5ULL: if (len == 7) { return 8949; } break; /* isins */ case 0xd89280faed4e4407ULL: if (len == 5) { return 8948; } break; /* isinsv */ case 0x4f359b613bfe4c03ULL: if (len == 6) { return 8947; } break; /* isinv */ case 0xd8927bfaed4e3b88ULL: if (len == 5) { return 8712; } break; /* it */ case 0x08b73e07b55c55f0ULL: if (len == 2) { return 8290; } break; /* itilde */ case 0xe1b1d432bd40a7d2ULL: if (len == 6) { return 297; } break; /* iukcy */ case 0x328d58ca18eb47a8ULL: if (len == 5) { return 1110; } break; /* iuml */ case 0x32b2c8c59d425652ULL: if (len == 4) { return 239; } break; /* jcirc */ case 0x72ce91e54d125806ULL: if (len == 5) { return 309; } break; /* jcy */ case 0x458b6f193a7e4f59ULL: if (len == 3) { return 1081; } break; /* jfr */ case 0x458166193a75eb89ULL: if (len == 3) { return 120103; } break; /* jmath */ case 0xa121d46e473e1b67ULL: if (len == 5) { return 567; } break; /* jopf */ case 0x418a08de291cf69cULL: if (len == 4) { return 120155; } break; /* jscr */ case 0x20c962de1718adfbULL: if (len == 4) { return 119999; } break; /* jsercy */ case 0xc5a7b7731c298db9ULL: if (len == 6) { return 1112; } break; /* jukcy */ case 0x9924612cb35a00a5ULL: if (len == 5) { return 1108; } break; /* kappa */ case 0xec02cfcef6a7d788ULL: if (len == 5) { return 954; } break; /* kappav */ case 0xb09f1aad1f34049aULL: if (len == 6) { return 1008; } break; /* kcedil */ case 0xd09c34deeb31418fULL: if (len == 6) { return 311; } break; /* kcy */ case 0x3db446193648ae16ULL: if (len == 3) { return 1082; } break; /* kfr */ case 0x3dbf43193652b082ULL: if (len == 3) { return 120104; } break; /* kgreen */ case 0xbbe20005f556f5edULL: if (len == 6) { return 312; } break; /* khcy */ case 0xe7d06cd71d3b96d2ULL: if (len == 4) { return 1093; } break; /* kjcy */ case 0xd5b10ed712bd8260ULL: if (len == 4) { return 1116; } break; /* kopf */ case 0x0199fad72bc86a81ULL: if (len == 4) { return 120156; } break; /* kscr */ case 0xaf0318d78e0cb4aeULL: if (len == 4) { return 120000; } break; /* lAarr */ case 0x28d490e09c97396dULL: if (len == 5) { return 8666; } break; /* lArr */ case 0xee4ab2acf29d05a2ULL: if (len == 4) { return 8656; } break; /* lAtail */ case 0x9848e4fd2165b3e0ULL: if (len == 6) { return 10523; } break; /* lBarr */ case 0xa3f816d978540402ULL: if (len == 5) { return 10510; } break; /* lE */ case 0x08ad2307b553d38aULL: if (len == 2) { return 8806; } break; /* lEg */ case 0x120673191d711bb7ULL: if (len == 3) { return 10891; } break; /* lHar */ case 0xb1089baccfbd5a6eULL: if (len == 4) { return 10594; } break; /* lacute */ case 0x10b405fe7ddb4539ULL: if (len == 6) { return 314; } break; /* laemptyv */ case 0x3d7d16b60cddbb7fULL: if (len == 8) { return 10676; } break; /* lagran */ case 0x1265ede042c69e30ULL: if (len == 6) { return 8466; } break; /* lambda */ case 0x826b4caaf325324aULL: if (len == 6) { return 955; } break; /* lang */ case 0x0460dfad9060b275ULL: if (len == 4) { return 10216; } break; /* langd */ case 0xd14e24ec544e92e3ULL: if (len == 5) { return 10641; } break; /* langle */ case 0xf6767393419a12faULL: if (len == 6) { return 10216; } break; /* lap */ case 0x126588191dc1d3eaULL: if (len == 3) { return 10885; } break; /* laquo */ case 0xc9f904ec50882ed5ULL: if (len == 5) { return 171; } break; /* larr */ case 0x0453d2ad90561202ULL: if (len == 4) { return 8592; } break; /* larrb */ case 0xb0815cec42413920ULL: if (len == 5) { return 8676; } break; /* larrbfs */ case 0x5c995818e4c67e33ULL: if (len == 7) { return 10527; } break; /* larrfs */ case 0x2d17507494df1b2dULL: if (len == 6) { return 10525; } break; /* larrhk */ case 0x2d2c587494f184cfULL: if (len == 6) { return 8617; } break; /* larrlp */ case 0x2d39497494fbf5aeULL: if (len == 6) { return 8619; } break; /* larrpl */ case 0x2d4755749508476eULL: if (len == 6) { return 10553; } break; /* larrsim */ case 0xf0b82f1938eb6569ULL: if (len == 7) { return 10611; } break; /* larrtl */ case 0x2d55357495144e6aULL: if (len == 6) { return 8610; } break; /* lat */ case 0x126584191dc1cd1eULL: if (len == 3) { return 10923; } break; /* latail */ case 0x5808cc63937b0640ULL: if (len == 6) { return 10521; } break; /* late */ case 0x044cf1ad90502801ULL: if (len == 4) { return 10925; } break; /* lbarr */ case 0x21a417e08ee0f0e2ULL: if (len == 5) { return 10508; } break; /* lbbrk */ case 0x1a40ffe08b0e5d10ULL: if (len == 5) { return 10098; } break; /* lbrace */ case 0xff28fd102a01bf76ULL: if (len == 6) { return 123; } break; /* lbrack */ case 0xff2907102a01d074ULL: if (len == 6) { return 91; } break; /* lbrke */ case 0xa3aa89e0d88dd66fULL: if (len == 5) { return 10635; } break; /* lbrksld */ case 0xecacbe23c8028751ULL: if (len == 7) { return 10639; } break; /* lbrkslu */ case 0xecaccd23c802a0ceULL: if (len == 7) { return 10637; } break; /* lcaron */ case 0x92568da688147866ULL: if (len == 6) { return 318; } break; /* lcedil */ case 0xb50481c95edc9794ULL: if (len == 6) { return 316; } break; /* lceil */ case 0x0d412ddacc8cea32ULL: if (len == 5) { return 8968; } break; /* lcub */ case 0xf23e92ad85e0850fULL: if (len == 4) { return 123; } break; /* lcy */ case 0x125e75191dbb94f3ULL: if (len == 3) { return 1083; } break; /* ldca */ case 0x2fe3baada914ca81ULL: if (len == 4) { return 10550; } break; /* ldquo */ case 0xd8ff4115f6278984ULL: if (len == 5) { return 8220; } break; /* ldquor */ case 0xe1458e51452f6d02ULL: if (len == 6) { return 8222; } break; /* ldrdhar */ case 0xe8f72809f82a5b1eULL: if (len == 7) { return 10599; } break; /* ldrushar */ case 0x5bbbe1df4b5a5cd4ULL: if (len == 8) { return 10571; } break; /* ldsh */ case 0x2fac91ada8e54266ULL: if (len == 4) { return 8626; } break; /* le */ case 0x08ad4307b55409eaULL: if (len == 2) { return 8804; } break; /* leftarrow */ case 0xb6e70f5cacd30509ULL: if (len == 9) { return 8592; } break; /* leftarrowtail */ case 0x7e147cd720fe1557ULL: if (len == 13) { return 8610; } break; /* leftharpoondown */ case 0x71d077df36ff1fcfULL: if (len == 15) { return 8637; } break; /* leftharpoonup */ case 0x0a689d5f0c27ce66ULL: if (len == 13) { return 8636; } break; /* leftleftarrows */ case 0xb1a647630f9dd08bULL: if (len == 14) { return 8647; } break; /* leftrightarrow */ case 0x5f6cd2e0e89ae3ffULL: if (len == 14) { return 8596; } break; /* leftrightarrows */ case 0xc0cde02b3f30a6e4ULL: if (len == 15) { return 8646; } break; /* leftrightharpoons */ case 0x36b4f8bd5549b0e6ULL: if (len == 17) { return 8651; } break; /* leftrightsquigarrow */ case 0x0a007d553d694ac6ULL: if (len == 19) { return 8621; } break; /* leftthreetimes */ case 0xf672d1e3ba5f7166ULL: if (len == 14) { return 8907; } break; /* leg */ case 0x127273191dcc3a97ULL: if (len == 3) { return 8922; } break; /* leq */ case 0x127281191dcc5261ULL: if (len == 3) { return 8804; } break; /* leqq */ case 0x24e36dada22f7130ULL: if (len == 4) { return 8806; } break; /* leqslant */ case 0xc7677c6251fa1687ULL: if (len == 8) { return 10877; } break; /* les */ case 0x12727f191dcc4efbULL: if (len == 3) { return 10877; } break; /* lescc */ case 0xcc544f0a8c992d11ULL: if (len == 5) { return 10920; } break; /* lesdot */ case 0x09bbd4ed0b303356ULL: if (len == 6) { return 10879; } break; /* lesdoto */ case 0xba5e07ca02e709dbULL: if (len == 7) { return 10881; } break; /* lesdotor */ case 0x94d0e542ee956a2bULL: if (len == 8) { return 10883; } break; /* lesges */ case 0xf0b454ecfd488950ULL: if (len == 6) { return 10899; } break; /* lessapprox */ case 0xa1bbd1807e113c64ULL: if (len == 10) { return 10885; } break; /* lessdot */ case 0x0714db0bc79cc96fULL: if (len == 7) { return 8918; } break; /* lesseqgtr */ case 0x50debe5bdd00a759ULL: if (len == 9) { return 8922; } break; /* lesseqqgtr */ case 0x2e39948ef41678d8ULL: if (len == 10) { return 10891; } break; /* lessgtr */ case 0x2048640bd5a9bdabULL: if (len == 7) { return 8822; } break; /* lesssim */ case 0x72fa190b737beebfULL: if (len == 7) { return 8818; } break; /* lfisht */ case 0x9a4798ad04c9e957ULL: if (len == 6) { return 10620; } break; /* lfloor */ case 0xbe3e6a94956197b7ULL: if (len == 6) { return 8970; } break; /* lfr */ case 0x126f78191dca0d3fULL: if (len == 3) { return 120105; } break; /* lg */ case 0x08ad4107b5540684ULL: if (len == 2) { return 8822; } break; /* lgE */ case 0x126c41191dc779f3ULL: if (len == 3) { return 10897; } break; /* lhard */ case 0xb98891b1003072deULL: if (len == 5) { return 8637; } break; /* lharu */ case 0xb988a2b100308fc1ULL: if (len == 5) { return 8636; } break; /* lharul */ case 0x73bc1fc3528422f7ULL: if (len == 6) { return 10602; } break; /* lhblk */ case 0xd29727b10e1e60f4ULL: if (len == 5) { return 9604; } break; /* ljcy */ case 0xb4de60ad62e7ae6bULL: if (len == 4) { return 1113; } break; /* ll */ case 0x08ad3c07b553fe05ULL: if (len == 2) { return 8810; } break; /* llarr */ case 0x614533d390dc2c98ULL: if (len == 5) { return 8647; } break; /* llcorner */ case 0x7f02df7a5d569ff0ULL: if (len == 8) { return 8990; } break; /* llhard */ case 0x76dc77cc4698337cULL: if (len == 6) { return 10603; } break; /* lltri */ case 0xd46033d3d2c45e1eULL: if (len == 5) { return 9722; } break; /* lmidot */ case 0x0c87857de21d30ecULL: if (len == 6) { return 320; } break; /* lmoust */ case 0xb376a68fead99e11ULL: if (len == 6) { return 9136; } break; /* lmoustache */ case 0x78f539c2b4c9d1e2ULL: if (len == 10) { return 9136; } break; /* lnE */ case 0x125475191db3406eULL: if (len == 3) { return 8808; } break; /* lnap */ case 0xd93e0fad77fef49eULL: if (len == 4) { return 10889; } break; /* lnapprox */ case 0x6d1dbedf49de9a27ULL: if (len == 8) { return 10889; } break; /* lne */ case 0x125495191db376ceULL: if (len == 3) { return 10887; } break; /* lneq */ case 0xd93018ad77f2c68dULL: if (len == 4) { return 10887; } break; /* lneqq */ case 0xff80eac2d1881e34ULL: if (len == 5) { return 8808; } break; /* lnsim */ case 0x87d3b4c28e322aeeULL: if (len == 5) { return 8934; } break; /* loang */ case 0x15e2d8b6ec0986b4ULL: if (len == 5) { return 10220; } break; /* loarr */ case 0x159ecdb6ebcfa737ULL: if (len == 5) { return 8701; } break; /* lobrk */ case 0x1d01d5b6efa21fd9ULL: if (len == 5) { return 10214; } break; /* longleftarrow */ case 0x345bae98c0330f37ULL: if (len == 13) { return 10229; } break; /* longleftrightarrow */ case 0x0728907578214051ULL: if (len == 18) { return 10231; } break; /* longmapsto */ case 0xa6cbff1b96f072f9ULL: if (len == 10) { return 10236; } break; /* longrightarrow */ case 0x58c54f5e14373c94ULL: if (len == 14) { return 10230; } break; /* looparrowleft */ case 0xc970d1e81f395521ULL: if (len == 13) { return 8619; } break; /* looparrowright */ case 0xa59b04be1154af02ULL: if (len == 14) { return 8620; } break; /* lopar */ case 0x97cd34b7359dcc27ULL: if (len == 5) { return 10629; } break; /* lopf */ case 0xce41e8ad711dc4b6ULL: if (len == 4) { return 120157; } break; /* loplus */ case 0xa8b7625029352ddcULL: if (len == 6) { return 10797; } break; /* lotimes */ case 0xff082808bf3b4fdaULL: if (len == 7) { return 10804; } break; /* lowast */ case 0x60d68a440e9caf47ULL: if (len == 6) { return 8727; } break; /* lowbar */ case 0x7a8f01441d1ae8aeULL: if (len == 6) { return 95; } break; /* loz */ case 0x12507e191daf66e2ULL: if (len == 3) { return 9674; } break; /* lozenge */ case 0xbb7a7cfe7a72c225ULL: if (len == 7) { return 9674; } break; /* lozf */ case 0xce2cc8ad710b324cULL: if (len == 4) { return 10731; } break; /* lpar */ case 0x97ce83ade3eea456ULL: if (len == 4) { return 40; } break; /* lparlt */ case 0x784f97d3654c72ceULL: if (len == 6) { return 10643; } break; /* lrarr */ case 0xa1b13869a150b332ULL: if (len == 5) { return 8646; } break; /* lrcorner */ case 0xd85219c581b04bfaULL: if (len == 8) { return 8991; } break; /* lrhar */ case 0x640321697e15e91eULL: if (len == 5) { return 8651; } break; /* lrhard */ case 0x073b40413f3bba4eULL: if (len == 6) { return 10605; } break; /* lrm */ case 0x12988d191ded3602ULL: if (len == 3) { return 8206; } break; /* lrtri */ case 0x43bd8c696c7acc9cULL: if (len == 5) { return 8895; } break; /* lsaquo */ case 0x53ada622aa502beaULL: if (len == 6) { return 8249; } break; /* lscr */ case 0x7b530aadd3179fd9ULL: if (len == 4) { return 120001; } break; /* lsh */ case 0x129464191de90780ULL: if (len == 3) { return 8624; } break; /* lsim */ case 0x7b3127add2faeabaULL: if (len == 4) { return 8818; } break; /* lsime */ case 0x4f714b5d805d18edULL: if (len == 5) { return 10893; } break; /* lsimg */ case 0x4f71495d805d1587ULL: if (len == 5) { return 10895; } break; /* lsqb */ case 0x7b822aadd33f46fbULL: if (len == 4) { return 91; } break; /* lsquo */ case 0x1d4ff95df4659adfULL: if (len == 5) { return 8216; } break; /* lsquor */ case 0x347f67a648a5d3f7ULL: if (len == 6) { return 8218; } break; /* lstrok */ case 0x8b18e7c2f48cd1a4ULL: if (len == 6) { return 322; } break; /* lt */ case 0x08ad5407b55426cdULL: if (len == 2) { return 60; } break; /* ltcc */ case 0xb8c828adf622b08bULL: if (len == 4) { return 10918; } break; /* ltcir */ case 0x1eb918993ce05b11ULL: if (len == 5) { return 10873; } break; /* ltdot */ case 0xf36a4b9924596768ULL: if (len == 5) { return 8918; } break; /* lthree */ case 0xeaae3b15f8c150e9ULL: if (len == 6) { return 8907; } break; /* ltimes */ case 0xb1cf2e0efef92763ULL: if (len == 6) { return 8905; } break; /* ltlarr */ case 0x54491cf7689dcc9aULL: if (len == 6) { return 10614; } break; /* ltquest */ case 0xa5dd420ba9b4fbd5ULL: if (len == 7) { return 10875; } break; /* ltrPar */ case 0x92cdb2f13a3ac2e0ULL: if (len == 6) { return 10646; } break; /* ltri */ case 0xb90226adf654256cULL: if (len == 4) { return 9667; } break; /* ltrie */ case 0xb2ccc29990faee4bULL: if (len == 5) { return 8884; } break; /* ltrif */ case 0xb2ccc39990faeffeULL: if (len == 5) { return 9666; } break; /* lurdshar */ case 0xb64630a0f47316b0ULL: if (len == 8) { return 10570; } break; /* luruhar */ case 0x7cec9409e7db2d02ULL: if (len == 7) { return 10598; } break; /* mDDot */ case 0x288ac6b537e55dbbULL: if (len == 5) { return 8762; } break; /* macr */ case 0x1f6e56a2ceaa4b6eULL: if (len == 4) { return 175; } break; /* male */ case 0x1f6a59a2cea667b0ULL: if (len == 4) { return 9794; } break; /* malt */ case 0x1f6a4aa2cea64e33ULL: if (len == 4) { return 10016; } break; /* maltese */ case 0xa539a41312f19772ULL: if (len == 7) { return 10016; } break; /* map */ case 0x080f5919176d2d91ULL: if (len == 3) { return 8614; } break; /* mapsto */ case 0x3756023ce999f2bbULL: if (len == 6) { return 8614; } break; /* mapstodown */ case 0x393de27982cbe417ULL: if (len == 10) { return 8615; } break; /* mapstoleft */ case 0x9a3c70382aaae882ULL: if (len == 10) { return 8612; } break; /* mapstoup */ case 0x5464b618d1914b4eULL: if (len == 8) { return 8613; } break; /* marker */ case 0xeddcb72b15486e77ULL: if (len == 6) { return 9646; } break; /* mcomma */ case 0xacb3f182a85c325bULL: if (len == 6) { return 10793; } break; /* mcy */ case 0x08164c1917733628ULL: if (len == 3) { return 1084; } break; /* mdash */ case 0xeaeebebd079118f4ULL: if (len == 5) { return 8212; } break; /* measuredangle */ case 0x64ca94fe280a160cULL: if (len == 13) { return 8737; } break; /* mfr */ case 0x08205519177b99f8ULL: if (len == 3) { return 120106; } break; /* mho */ case 0x07f1621917543f4dULL: if (len == 3) { return 8487; } break; /* micro */ case 0x1140a762783f5b1bULL: if (len == 5) { return 181; } break; /* mid */ case 0x07f43d1917563645ULL: if (len == 3) { return 8739; } break; /* midast */ case 0x7539668d8b5c947bULL: if (len == 6) { return 42; } break; /* midcir */ case 0x8744a68d95c9cce9ULL: if (len == 6) { return 10992; } break; /* middot */ case 0x5bf4d98d7d412640ULL: if (len == 6) { return 183; } break; /* minus */ case 0x8156a862b7957cafULL: if (len == 5) { return 8722; } break; /* minusb */ case 0x5bbcecbdf3031057ULL: if (len == 6) { return 8863; } break; /* minusd */ case 0x5bbceabdf3030cf1ULL: if (len == 6) { return 8760; } break; /* minusdu */ case 0xe50f64c3ee2e444cULL: if (len == 7) { return 10794; } break; /* mlcp */ case 0xf43391a2b6340e67ULL: if (len == 4) { return 10971; } break; /* mldr */ case 0xf41b89a2b61f6eeeULL: if (len == 4) { return 8230; } break; /* mnplus */ case 0x3540aec4e6e65cd6ULL: if (len == 6) { return 8723; } break; /* models */ case 0xbb021c3315a8cc0bULL: if (len == 6) { return 8871; } break; /* mopf */ case 0x0d151aa2c3faf87bULL: if (len == 4) { return 120158; } break; /* mp */ case 0x08a94a07b5502cf8ULL: if (len == 2) { return 8723; } break; /* mscr */ case 0xa7ea10a28b77420cULL: if (len == 4) { return 120002; } break; /* mstpos */ case 0xfa0e91367dccd2bfULL: if (len == 6) { return 8766; } break; /* mu */ case 0x08a94f07b5503577ULL: if (len == 2) { return 956; } break; /* multimap */ case 0x473b190659bc52bcULL: if (len == 8) { return 8888; } break; /* mumap */ case 0x9c6900400418a7d7ULL: if (len == 5) { return 8888; } break; /* nLeftarrow */ case 0x87adad457d2d347dULL: if (len == 10) { return 8653; } break; /* nLeftrightarrow */ case 0xf8dd537f87909debULL: if (len == 15) { return 8654; } break; /* nRightarrow */ case 0x9bbe79c1b36ba232ULL: if (len == 11) { return 8655; } break; /* nVDash */ case 0x78f3b70af3d01e75ULL: if (len == 6) { return 8879; } break; /* nVdash */ case 0xa381b816f5409255ULL: if (len == 6) { return 8878; } break; /* nabla */ case 0x4eda67ffbb18e01dULL: if (len == 5) { return 8711; } break; /* nacute */ case 0x8b843c95fe1c34dfULL: if (len == 6) { return 324; } break; /* nap */ case 0x212bbe19256705c0ULL: if (len == 3) { return 8777; } break; /* napos */ case 0xb31493ff62e7c62aULL: if (len == 5) { return 329; } break; /* napprox */ case 0xbfaa6b74b8644ec9ULL: if (len == 7) { return 8777; } break; /* natur */ case 0xd76730ff77f4636bULL: if (len == 5) { return 9838; } break; /* natural */ case 0xea8be030b0090316ULL: if (len == 7) { return 9838; } break; /* naturals */ case 0x94b157bb1f50c49fULL: if (len == 8) { return 8469; } break; /* nbsp */ case 0xdded4bba9c6dfd9aULL: if (len == 4) { return 160; } break; /* ncap */ case 0xd6c010ba98c8bdbfULL: if (len == 4) { return 10819; } break; /* ncaron */ case 0x1bb534edfe1fb170ULL: if (len == 6) { return 328; } break; /* ncedil */ case 0xe3d840ca8a586002ULL: if (len == 6) { return 326; } break; /* ncong */ case 0xc3687711a7bfd078ULL: if (len == 5) { return 8775; } break; /* ncup */ case 0xd67c18ba988efe8bULL: if (len == 4) { return 10818; } break; /* ncy */ case 0x2132d319256d481dULL: if (len == 3) { return 1085; } break; /* ndash */ case 0x569bac295cfedae9ULL: if (len == 5) { return 8211; } break; /* ne */ case 0x08b34f07b55889fcULL: if (len == 2) { return 8800; } break; /* neArr */ case 0x8788461f38dccd47ULL: if (len == 5) { return 8663; } break; /* nearhk */ case 0x01ea5201a0651e6aULL: if (len == 6) { return 10532; } break; /* nearr */ case 0x7180261e9b2573e7ULL: if (len == 5) { return 8599; } break; /* nearrow */ case 0x6230fbc3f581ac9dULL: if (len == 7) { return 8599; } break; /* nequiv */ case 0x280aeb7e0581c151ULL: if (len == 6) { return 8802; } break; /* nesear */ case 0x71ad638b50e540bbULL: if (len == 6) { return 10536; } break; /* nexist */ case 0xaaaf8f30cc8ba490ULL: if (len == 6) { return 8708; } break; /* nexists */ case 0x93f532eb91492db9ULL: if (len == 7) { return 8708; } break; /* nfr */ case 0x2143ca19257bac05ULL: if (len == 3) { return 120107; } break; /* nge */ case 0x213fb7192577a2e5ULL: if (len == 3) { return 8817; } break; /* ngeq */ case 0xf6e6b3baaa49417cULL: if (len == 4) { return 8817; } break; /* ngsim */ case 0x29c8152f8b726949ULL: if (len == 5) { return 8821; } break; /* ngt */ case 0x213fc6192577bc62ULL: if (len == 3) { return 8815; } break; /* ngtr */ case 0xf719acbaaa748f30ULL: if (len == 4) { return 8815; } break; /* nhArr */ case 0x96f49048ded2f2f2ULL: if (len == 5) { return 8654; } break; /* nharr */ case 0x80eb70484119e692ULL: if (len == 5) { return 8622; } break; /* nhpar */ case 0xfeca0147f7563e66ULL: if (len == 5) { return 10994; } break; /* ni */ case 0x08b35307b55890c8ULL: if (len == 2) { return 8715; } break; /* nis */ case 0x2146d119257dedc1ULL: if (len == 3) { return 8956; } break; /* nisd */ case 0x0942f2bab4facf5fULL: if (len == 4) { return 8954; } break; /* niv */ case 0x2146d419257df2daULL: if (len == 3) { return 8715; } break; /* njcy */ case 0x22288cbac2c5bf2dULL: if (len == 4) { return 1114; } break; /* nlArr */ case 0x1598e06a36947f76ULL: if (len == 5) { return 8653; } break; /* nlarr */ case 0x2ba2006ad44d8bd6ULL: if (len == 5) { return 8602; } break; /* nldr */ case 0x3443ddbacd3fd4b1ULL: if (len == 4) { return 8229; } break; /* nle */ case 0x2157b719258c34c6ULL: if (len == 3) { return 8816; } break; /* nleftarrow */ case 0x3559034f0893641dULL: if (len == 10) { return 8602; } break; /* nleftrightarrow */ case 0xfcad04050c077d0bULL: if (len == 15) { return 8622; } break; /* nleq */ case 0x3440d6bacd3d92f5ULL: if (len == 4) { return 8816; } break; /* nless */ case 0x07b9756abf9ba934ULL: if (len == 5) { return 8814; } break; /* nlsim */ case 0xa3593d6b17abdf86ULL: if (len == 5) { return 8820; } break; /* nlt */ case 0x2157c819258c51a9ULL: if (len == 3) { return 8814; } break; /* nltri */ case 0x9bde0c6b13c48f58ULL: if (len == 5) { return 8938; } break; /* nltrie */ case 0x9ede56f296ff64a7ULL: if (len == 6) { return 8940; } break; /* nmid */ case 0x2d799abac9ef0499ULL: if (len == 4) { return 8740; } break; /* nopf */ case 0x3beb18bad14c70c8ULL: if (len == 4) { return 120159; } break; /* not */ case 0x215ad619258e9f4aULL: if (len == 3) { return 172; } break; /* notin */ case 0x40677171b938df15ULL: if (len == 5) { return 8713; } break; /* notinva */ case 0x343705e5d6f6c488ULL: if (len == 7) { return 8713; } break; /* notinvb */ case 0x343708e5d6f6c9a1ULL: if (len == 7) { return 8951; } break; /* notinvc */ case 0x343707e5d6f6c7eeULL: if (len == 7) { return 8950; } break; /* notni */ case 0x406b5271b93c933fULL: if (len == 5) { return 8716; } break; /* notniva */ case 0xfcb8f2f087dff31eULL: if (len == 7) { return 8716; } break; /* notnivb */ case 0xfcb8f1f087dff16bULL: if (len == 7) { return 8958; } break; /* notnivc */ case 0xfcb8f0f087dfefb8ULL: if (len == 7) { return 8957; } break; /* npar */ case 0x429e57ba44a1d3acULL: if (len == 4) { return 8742; } break; /* nparallel */ case 0x7e3f7f8730674fceULL: if (len == 9) { return 8742; } break; /* npolint */ case 0x9ffdd639dfb8d529ULL: if (len == 7) { return 10772; } break; /* npr */ case 0x20f8c219253bb2f3ULL: if (len == 3) { return 8832; } break; /* nprcue */ case 0x7026ca657a37f66eULL: if (len == 6) { return 8928; } break; /* nprec */ case 0x410f0f824b15f733ULL: if (len == 5) { return 8832; } break; /* nrArr */ case 0x2c34bb93ea3f6374ULL: if (len == 5) { return 8655; } break; /* nrarr */ case 0x3ed7db94851546d4ULL: if (len == 5) { return 8603; } break; /* nrightarrow */ case 0x88556137f4662e52ULL: if (len == 11) { return 8603; } break; /* nrtri */ case 0xe0c823945026d122ULL: if (len == 5) { return 8939; } break; /* nrtrie */ case 0x1ae5bc0431f59ba5ULL: if (len == 6) { return 8941; } break; /* nsc */ case 0x20fbb919253dd97fULL: if (len == 3) { return 8833; } break; /* nsccue */ case 0x1fe32df296dbefc2ULL: if (len == 6) { return 8929; } break; /* nscr */ case 0x499492ba4817d117ULL: if (len == 4) { return 120003; } break; /* nshortmid */ case 0xc0a8a73826a97491ULL: if (len == 9) { return 8740; } break; /* nshortparallel */ case 0xa8e1dc07e7833806ULL: if (len == 14) { return 8742; } break; /* nsim */ case 0x49b693ba4834b930ULL: if (len == 4) { return 8769; } break; /* nsime */ case 0x75f65a88b196eb6fULL: if (len == 5) { return 8772; } break; /* nsimeq */ case 0x0886f445c37183faULL: if (len == 6) { return 8772; } break; /* nsmid */ case 0x5547a5889fa2af84ULL: if (len == 5) { return 8740; } break; /* nspar */ case 0xb2c87888d4179ad1ULL: if (len == 5) { return 8742; } break; /* nsqsube */ case 0x5c0e910d7853f560ULL: if (len == 7) { return 8930; } break; /* nsqsupe */ case 0x5c3ea50d787d3b1eULL: if (len == 7) { return 8931; } break; /* nsub */ case 0x49c47aba4840cc11ULL: if (len == 4) { return 8836; } break; /* nsube */ case 0x99a8fe88c61b691cULL: if (len == 5) { return 8840; } break; /* nsubseteq */ case 0x53d8e3db65277265ULL: if (len == 9) { return 8840; } break; /* nsucc */ case 0x99a51488c617a5a7ULL: if (len == 5) { return 8833; } break; /* nsup */ case 0x49c488ba4840e3dbULL: if (len == 4) { return 8837; } break; /* nsupe */ case 0x99d81288c642fbdaULL: if (len == 5) { return 8841; } break; /* nsupseteq */ case 0x8433aebd115f0eefULL: if (len == 9) { return 8841; } break; /* ntgl */ case 0x637cedba56befeacULL: if (len == 4) { return 8825; } break; /* ntilde */ case 0xc6a4182fa5857abdULL: if (len == 6) { return 241; } break; /* ntlg */ case 0x636bf8ba56b09e2aULL: if (len == 4) { return 8824; } break; /* ntriangleleft */ case 0x3a5eb3d207e91434ULL: if (len == 13) { return 8938; } break; /* ntrianglelefteq */ case 0xd54d8e7919fa63d6ULL: if (len == 15) { return 8940; } break; /* ntriangleright */ case 0xb385b5a00feea241ULL: if (len == 14) { return 8939; } break; /* ntrianglerighteq */ case 0xb6bdada06b463707ULL: if (len == 16) { return 8941; } break; /* nu */ case 0x08b33f07b5586eccULL: if (len == 2) { return 957; } break; /* num */ case 0x2102bb192543fb93ULL: if (len == 3) { return 35; } break; /* numero */ case 0xaba6920d8c9ee00dULL: if (len == 6) { return 8470; } break; /* numsp */ case 0x3584fd9a37fb4870ULL: if (len == 5) { return 8199; } break; /* nvDash */ case 0x0e4fd1bc849bb3d5ULL: if (len == 6) { return 8877; } break; /* nvHarr */ case 0x0da9f61ce0096da6ULL: if (len == 6) { return 10500; } break; /* nvdash */ case 0xe3c1d0b0832b3ff5ULL: if (len == 6) { return 8876; } break; /* nvinfin */ case 0x508b5cd0817cfce7ULL: if (len == 7) { return 10718; } break; /* nvlArr */ case 0xa32c04f15d1db662ULL: if (len == 6) { return 10498; } break; /* nvrArr */ case 0xb9604168898bbc68ULL: if (len == 6) { return 10499; } break; /* nwArr */ case 0x1aeaf9acf485d1c9ULL: if (len == 5) { return 8662; } break; /* nwarhk */ case 0xc548e1dc68b7b000ULL: if (len == 6) { return 10531; } break; /* nwarr */ case 0x0848d9ac59b1a169ULL: if (len == 5) { return 8598; } break; /* nwarrow */ case 0x4941da8621473c3fULL: if (len == 7) { return 8598; } break; /* nwnear */ case 0x58a31a2494091ddcULL: if (len == 6) { return 10535; } break; /* oS */ case 0x08b07507b55694b7ULL: if (len == 2) { return 9416; } break; /* oacute */ case 0xa04e0bb8821b609aULL: if (len == 6) { return 243; } break; /* oast */ case 0x892c48b4b49557caULL: if (len == 4) { return 8859; } break; /* ocir */ case 0x7a43f0b4acd305c8ULL: if (len == 4) { return 8858; } break; /* ocirc */ case 0x9477ae01aa92a191ULL: if (len == 5) { return 244; } break; /* ocy */ case 0x1a35aa1921f14a9aULL: if (len == 3) { return 1086; } break; /* odash */ case 0x010feee4dc2ea546ULL: if (len == 5) { return 8861; } break; /* odblac */ case 0xc32e44c97f65b5e8ULL: if (len == 6) { return 337; } break; /* odiv */ case 0x5d8b6bb49bc83ec9ULL: if (len == 4) { return 10808; } break; /* odot */ case 0x5d776db49bb79925ULL: if (len == 4) { return 8857; } break; /* odsold */ case 0x7097c1586204d3c8ULL: if (len == 6) { return 10684; } break; /* oelig */ case 0x5634b2efdd540b27ULL: if (len == 5) { return 339; } break; /* ofcir */ case 0x52ae6ad7e88b126eULL: if (len == 5) { return 10687; } break; /* ofr */ case 0x1a24a71921e2d24eULL: if (len == 3) { return 120108; } break; /* ogon */ case 0x569558b498528556ULL: if (len == 4) { return 731; } break; /* ograve */ case 0x07a91c484ecd0a07ULL: if (len == 6) { return 242; } break; /* ogt */ case 0x1a27af1921e515bdULL: if (len == 3) { return 10689; } break; /* ohbar */ case 0xbcf6a3c5e986d1d3ULL: if (len == 5) { return 10677; } break; /* ohm */ case 0x1a1d961921dc96bdULL: if (len == 3) { return 937; } break; /* oint */ case 0x4494eeb48def0d0fULL: if (len == 4) { return 8750; } break; /* olarr */ case 0x2b9c8ea364830e15ULL: if (len == 5) { return 8634; } break; /* olcir */ case 0x1ce732a35cec0ee0ULL: if (len == 5) { return 10686; } break; /* olcross */ case 0x1d96aa2633ba8546ULL: if (len == 7) { return 10683; } break; /* oline */ case 0x7382efa38df9aed4ULL: if (len == 5) { return 8254; } break; /* olt */ case 0x1a0f9d1921d06546ULL: if (len == 3) { return 10688; } break; /* omacr */ case 0x10ef0aae268ba689ULL: if (len == 5) { return 333; } break; /* omega */ case 0x3460cbae3ad8be88ULL: if (len == 5) { return 969; } break; /* omicron */ case 0xb68093d38ddba51cULL: if (len == 7) { return 959; } break; /* omid */ case 0x236f38b47b95a90cULL: if (len == 4) { return 10678; } break; /* ominus */ case 0xb22c3aa9045761daULL: if (len == 6) { return 8854; } break; /* oopf */ case 0x1197fab47155809dULL: if (len == 4) { return 120160; } break; /* opar */ case 0xf8417bb4632a03f9ULL: if (len == 4) { return 10679; } break; /* operp */ case 0x25a268849576d737ULL: if (len == 5) { return 10681; } break; /* oplus */ case 0xd603e88467e556c2ULL: if (len == 5) { return 8853; } break; /* or */ case 0x08b05407b5565ca4ULL: if (len == 2) { return 8744; } break; /* orarr */ case 0x97c0ca729aa684dfULL: if (len == 5) { return 8635; } break; /* ord */ case 0x19fb891921bf9a40ULL: if (len == 3) { return 10845; } break; /* order */ case 0x6be60d7281a829f7ULL: if (len == 5) { return 8500; } break; /* orderof */ case 0xde04299f3400452aULL: if (len == 7) { return 8500; } break; /* ordf */ case 0xe6041bb45892ee92ULL: if (len == 4) { return 170; } break; /* ordm */ case 0xe60422b45892fa77ULL: if (len == 4) { return 186; } break; /* origof */ case 0xb9feccfe786a9511ULL: if (len == 6) { return 8886; } break; /* oror */ case 0xe62929b458b22299ULL: if (len == 4) { return 10838; } break; /* orslope */ case 0xc1a7e068566cae13ULL: if (len == 7) { return 10839; } break; /* orv */ case 0x19fb9b1921bfb8d6ULL: if (len == 3) { return 10843; } break; /* oscr */ case 0xedd768b45cc4e42aULL: if (len == 4) { return 8500; } break; /* oslash */ case 0xd99745e9d48f4813ULL: if (len == 6) { return 248; } break; /* osol */ case 0xede54ab45cd0ee8cULL: if (len == 4) { return 8856; } break; /* otilde */ case 0xfe66aa244ed765b8ULL: if (len == 6) { return 245; } break; /* otimes */ case 0xf69987244aaa232cULL: if (len == 6) { return 8855; } break; /* otimesas */ case 0xe3abe359192697acULL: if (len == 8) { return 10806; } break; /* ouml */ case 0xdbdb18b4526580e8ULL: if (len == 4) { return 246; } break; /* ovbar */ case 0xf73b6b500da86d1dULL: if (len == 5) { return 9021; } break; /* par */ case 0x77ca6a195676bea8ULL: if (len == 3) { return 8741; } break; /* para */ case 0x03b1120debc62f8bULL: if (len == 4) { return 182; } break; /* parallel */ case 0xb292646184d47d92ULL: if (len == 8) { return 8741; } break; /* parsim */ case 0xe07b82d836bc260fULL: if (len == 6) { return 10995; } break; /* parsl */ case 0x0c4e90a7a1f70cd7ULL: if (len == 5) { return 11005; } break; /* part */ case 0x03b1250debc64fd4ULL: if (len == 4) { return 8706; } break; /* pcy */ case 0x77c3691956709e47ULL: if (len == 3) { return 1087; } break; /* percnt */ case 0xceb4140b29646bbfULL: if (len == 6) { return 37; } break; /* period */ case 0x0528080b48ef9464ULL: if (len == 6) { return 46; } break; /* permil */ case 0xe0ad600b33c1925eULL: if (len == 6) { return 8240; } break; /* perp */ case 0xdfc4750dd710457cULL: if (len == 4) { return 8869; } break; /* pertenk */ case 0x8a943844cb26f188ULL: if (len == 7) { return 8241; } break; /* pfr */ case 0x77b96c1956684edbULL: if (len == 3) { return 120109; } break; /* phi */ case 0x77b2591956620fe4ULL: if (len == 3) { return 966; } break; /* phiv */ case 0xc61cf80dc8a07516ULL: if (len == 4) { return 981; } break; /* phmmat */ case 0x141cbb3e5512773aULL: if (len == 6) { return 8499; } break; /* phone */ case 0x31fc9c6bde865d6fULL: if (len == 5) { return 9742; } break; /* pi */ case 0x08d53f07b5755532ULL: if (len == 2) { return 960; } break; /* pitchfork */ case 0x253c0933f6dcb76dULL: if (len == 9) { return 8916; } break; /* piv */ case 0x77af5e19565fe28cULL: if (len == 3) { return 982; } break; /* planck */ case 0xe7de30b006ecf758ULL: if (len == 6) { return 8463; } break; /* planckh */ case 0xeb83eb1bc4a80690ULL: if (len == 7) { return 8462; } break; /* plankv */ case 0xe7f94db00703f057ULL: if (len == 6) { return 8463; } break; /* plus */ case 0xa5c0590db6f268b5ULL: if (len == 4) { return 43; } break; /* plusacir */ case 0xfd7576263ab59ddaULL: if (len == 8) { return 10787; } break; /* plusb */ case 0x9840294ddde82555ULL: if (len == 5) { return 8862; } break; /* pluscir */ case 0x8042b00da9800199ULL: if (len == 7) { return 10786; } break; /* plusdo */ case 0x9d17495011666224ULL: if (len == 6) { return 8724; } break; /* plusdu */ case 0x9d17535011667322ULL: if (len == 6) { return 10789; } break; /* pluse */ case 0x9840224ddde81970ULL: if (len == 5) { return 10866; } break; /* plusmn */ case 0x9d2f4850117af252ULL: if (len == 6) { return 177; } break; /* plussim */ case 0xf3f8190d598eace4ULL: if (len == 7) { return 10790; } break; /* plustwo */ case 0xc8574e0d40c1b279ULL: if (len == 7) { return 10791; } break; /* pm */ case 0x08d53b07b5754e66ULL: if (len == 2) { return 177; } break; /* pointint */ case 0x2a85601a14b31592ULL: if (len == 8) { return 10773; } break; /* popf */ case 0x8c25e90da88d38c2ULL: if (len == 4) { return 120161; } break; /* pound */ case 0xdcaf9735804655b5ULL: if (len == 5) { return 163; } break; /* pr */ case 0x08d55607b5757c47ULL: if (len == 2) { return 8826; } break; /* prE */ case 0x77fd311956a1b766ULL: if (len == 3) { return 10931; } break; /* prap */ case 0x856c7c0e35331c06ULL: if (len == 4) { return 10935; } break; /* prcue */ case 0xd8a90d245ba3cdbaULL: if (len == 5) { return 8828; } break; /* pre */ case 0x77fd511956a1edc6ULL: if (len == 3) { return 10927; } break; /* prec */ case 0x855e730e3526cf5fULL: if (len == 4) { return 8826; } break; /* precapprox */ case 0xa762d7409317a5e7ULL: if (len == 10) { return 10935; } break; /* preccurlyeq */ case 0x2d60065e856c07beULL: if (len == 11) { return 8828; } break; /* preceq */ case 0xe681fdb58b6c5e4dULL: if (len == 6) { return 10927; } break; /* precnapprox */ case 0x2edef4f68048deb3ULL: if (len == 11) { return 10937; } break; /* precneqq */ case 0x05ef703f68ea76d8ULL: if (len == 8) { return 10933; } break; /* precnsim */ case 0x5ce01a3f9a403682ULL: if (len == 8) { return 8936; } break; /* precsim */ case 0xa02d217ba2eb03aeULL: if (len == 7) { return 8830; } break; /* prime */ case 0x2f1173248c858040ULL: if (len == 5) { return 8242; } break; /* primes */ case 0x8026da1ac6d8d6a9ULL: if (len == 6) { return 8473; } break; /* prnE */ case 0x8576a10e353baf6aULL: if (len == 4) { return 10933; } break; /* prnap */ case 0x03c8cd2474033a8aULL: if (len == 5) { return 10937; } break; /* prnsim */ case 0xebabd9f166ff08daULL: if (len == 6) { return 8936; } break; /* prod */ case 0x85729c0e3537be14ULL: if (len == 4) { return 8719; } break; /* profalar */ case 0xe350cd6187eeab50ULL: if (len == 8) { return 9006; } break; /* profline */ case 0xa8c7a737c99b1f18ULL: if (len == 8) { return 8978; } break; /* profsurf */ case 0x08c443ccd2db0c7aULL: if (len == 8) { return 8979; } break; /* prop */ case 0x8572880e35379c18ULL: if (len == 4) { return 8733; } break; /* propto */ case 0xfbb03ce60e748051ULL: if (len == 6) { return 8733; } break; /* prsim */ case 0x62237524a9318086ULL: if (len == 5) { return 8830; } break; /* prurel */ case 0x28934a396165c925ULL: if (len == 6) { return 8880; } break; /* pscr */ case 0x7e835b0e31c7d525ULL: if (len == 4) { return 120005; } break; /* psi */ case 0x77fa7919569ffbe7ULL: if (len == 3) { return 968; } break; /* puncsp */ case 0x40f9d900abd274caULL: if (len == 6) { return 8200; } break; /* qfr */ case 0x70d0491952fd0494ULL: if (len == 3) { return 120110; } break; /* qint */ case 0x83424f07eb1617a5ULL: if (len == 4) { return 10764; } break; /* qopf */ case 0x74e21b07e3c79c67ULL: if (len == 4) { return 120162; } break; /* qprime */ case 0xc369609d4ca94b03ULL: if (len == 6) { return 8279; } break; /* qscr */ case 0x512f6107cf42f958ULL: if (len == 4) { return 120006; } break; /* quaternions */ case 0x506137c3345d957aULL: if (len == 11) { return 8461; } break; /* quatint */ case 0x1c11594f9f34416fULL: if (len == 7) { return 10774; } break; /* quest */ case 0xb109a0146c47e97dULL: if (len == 5) { return 63; } break; /* questeq */ case 0x85cd18d8ed64835bULL: if (len == 7) { return 8799; } break; /* quot */ case 0x1df46d07b2740bc8ULL: if (len == 4) { return 34; } break; /* rAarr */ case 0x891d9d05e8bf1067ULL: if (len == 5) { return 8667; } break; /* rArr */ case 0x579cef1f342784a8ULL: if (len == 4) { return 8658; } break; /* rAtail */ case 0x80a6565d9e35a26eULL: if (len == 6) { return 10524; } break; /* rBarr */ case 0xd82a032290aebec8ULL: if (len == 5) { return 10511; } break; /* rHar */ case 0xa698501f612e6f20ULL: if (len == 4) { return 10596; } break; /* racute */ case 0xc9284782c39fb483ULL: if (len == 6) { return 341; } break; /* radic */ case 0x8813c811d16918b0ULL: if (len == 5) { return 8730; } break; /* raemptyv */ case 0x5ae2ca7f7cb82b21ULL: if (len == 8) { return 10675; } break; /* rang */ case 0x6db3141fd1eb23e3ULL: if (len == 4) { return 10217; } break; /* rangd */ case 0x526eb911b28d5e65ULL: if (len == 5) { return 10642; } break; /* range */ case 0x526eb811b28d5cb2ULL: if (len == 5) { return 10661; } break; /* rangle */ case 0x9f9da912664dd348ULL: if (len == 6) { return 10217; } break; /* raquo */ case 0x26e8f11199d730cbULL: if (len == 5) { return 187; } break; /* rarr */ case 0x6da60f1fd1e09108ULL: if (len == 4) { return 8594; } break; /* rarrap */ case 0x1b6bccf3e0b8dce1ULL: if (len == 6) { return 10613; } break; /* rarrb */ case 0x31bd1d11a097171eULL: if (len == 5) { return 8677; } break; /* rarrbfs */ case 0x5bf50d66e0f1a761ULL: if (len == 7) { return 10528; } break; /* rarrc */ case 0x31bd1e11a09718d1ULL: if (len == 5) { return 10547; } break; /* rarrfs */ case 0x1b7cc9f3e0c74afbULL: if (len == 6) { return 10526; } break; /* rarrhk */ case 0x1b4db1f3e09fb171ULL: if (len == 6) { return 8618; } break; /* rarrlp */ case 0x1b5acef3e0aa6d14ULL: if (len == 6) { return 8620; } break; /* rarrpl */ case 0x1b9eb2f3e0e40a4cULL: if (len == 6) { return 10565; } break; /* rarrsim */ case 0xef62d067347fcdefULL: if (len == 7) { return 10612; } break; /* rarrtl */ case 0x1bacd2f3e0f07e08ULL: if (len == 6) { return 8611; } break; /* rarrw */ case 0x31bd3211a0973acdULL: if (len == 5) { return 8605; } break; /* ratail */ case 0x93853dbf256920ceULL: if (len == 6) { return 10522; } break; /* ratio */ case 0xfbc924118177ade4ULL: if (len == 5) { return 8758; } break; /* rationals */ case 0x19014f5fafee1d80ULL: if (len == 9) { return 8474; } break; /* rbarr */ case 0x55d70429a73d5ea8ULL: if (len == 5) { return 10509; } break; /* rbbrk */ case 0x72607029b8208a6aULL: if (len == 5) { return 10099; } break; /* rbrace */ case 0x6a75b65b0c353128ULL: if (len == 6) { return 125; } break; /* rbrack */ case 0x6a75b45b0c352dc2ULL: if (len == 6) { return 93; } break; /* rbrke */ case 0xe589e62967b7c95dULL: if (len == 5) { return 10636; } break; /* rbrksld */ case 0xc2f58309575e0de3ULL: if (len == 7) { return 10638; } break; /* rbrkslu */ case 0xc2f57209575df100ULL: if (len == 7) { return 10640; } break; /* rcaron */ case 0x4c8265c2ea891dbcULL: if (len == 6) { return 345; } break; /* rcedil */ case 0x4e2f79e5af16adc6ULL: if (len == 6) { return 343; } break; /* rceil */ case 0x1554ce22a96ca078ULL: if (len == 5) { return 8969; } break; /* rcub */ case 0x7f6f6b1fdc14af15ULL: if (len == 4) { return 125; } break; /* rcy */ case 0x89fdb71961055f41ULL: if (len == 3) { return 1088; } break; /* rdca */ case 0x53ce731fc3476833ULL: if (len == 4) { return 10551; } break; /* rdldhar */ case 0x258527708e3d4e5eULL: if (len == 7) { return 10601; } break; /* rdquo */ case 0x4adcdcf92a6cd582ULL: if (len == 5) { return 8221; } break; /* rdquor */ case 0xa2216b6316ef86d0ULL: if (len == 6) { return 8221; } break; /* rdsh */ case 0x54059a1fc376ece8ULL: if (len == 4) { return 8627; } break; /* real */ case 0x4ce65b1fbfdde39dULL: if (len == 4) { return 8476; } break; /* realine */ case 0x5eac945bd387dd09ULL: if (len == 7) { return 8475; } break; /* realpart */ case 0x2b1259cd06bd15ccULL: if (len == 8) { return 8476; } break; /* reals */ case 0x8950c4f3060a4d6aULL: if (len == 5) { return 8477; } break; /* rect */ case 0x4cec6f1fbfe27147ULL: if (len == 4) { return 9645; } break; /* reg */ case 0x89e9c11960f4c735ULL: if (len == 3) { return 174; } break; /* rfisht */ case 0x2d45bd077d9a9de5ULL: if (len == 6) { return 10621; } break; /* rfloor */ case 0x4fa34b31bea9056dULL: if (len == 6) { return 8971; } break; /* rfr */ case 0x89f3be1960fd16a1ULL: if (len == 3) { return 120111; } break; /* rhard */ case 0x6a676a5e20745b6cULL: if (len == 5) { return 8641; } break; /* rharu */ case 0x6a677b5e2074784fULL: if (len == 5) { return 8640; } break; /* rharul */ case 0x424ec3f125e82379ULL: if (len == 6) { return 10604; } break; /* rho */ case 0x8a15a9196119d958ULL: if (len == 3) { return 961; } break; /* rhov */ case 0xbca7841ffeec092aULL: if (len == 4) { return 1009; } break; /* rightarrow */ case 0xc071503c76e89ca6ULL: if (len == 10) { return 8594; } break; /* rightarrowtail */ case 0xa993a3f8974ce4e8ULL: if (len == 14) { return 8611; } break; /* rightharpoondown */ case 0x42f6fa0544f46134ULL: if (len == 16) { return 8641; } break; /* rightharpoonup */ case 0xaee5b2fc3ec1cc15ULL: if (len == 14) { return 8640; } break; /* rightleftarrows */ case 0x251377195cd75f2eULL: if (len == 15) { return 8644; } break; /* rightleftharpoons */ case 0x847392a413f0da20ULL: if (len == 17) { return 8652; } break; /* rightrightarrows */ case 0x65d0a7589e0c4a4fULL: if (len == 16) { return 8649; } break; /* rightsquigarrow */ case 0xcb8fc84ce59e5d99ULL: if (len == 15) { return 8605; } break; /* rightthreetimes */ case 0x28d97b179436cd2bULL: if (len == 15) { return 8908; } break; /* ring */ case 0xb25c4c1ff8a15b0bULL: if (len == 4) { return 730; } break; /* risingdotseq */ case 0x97f5bbc58d91b14dULL: if (len == 12) { return 8787; } break; /* rlarr */ case 0xc316e83b9023f6f2ULL: if (len == 5) { return 8644; } break; /* rlhar */ case 0x8567d13b6ce779deULL: if (len == 5) { return 8652; } break; /* rlm */ case 0x8a07cb19610dd5c2ULL: if (len == 3) { return 8207; } break; /* rmoust */ case 0x4fd5371fb3168db7ULL: if (len == 6) { return 9137; } break; /* rmoustache */ case 0x144fd67ad856a0ccULL: if (len == 10) { return 9137; } break; /* rnmid */ case 0x6939904c75ee9349ULL: if (len == 5) { return 10990; } break; /* roang */ case 0xc8d00d4663e3014aULL: if (len == 5) { return 10221; } break; /* roarr */ case 0xc8c3224663d89a9dULL: if (len == 5) { return 8702; } break; /* robrk */ case 0xaf338646557d276bULL: if (len == 5) { return 10215; } break; /* ropar */ case 0x4ae47146ad9c0c69ULL: if (len == 5) { return 10630; } break; /* ropf */ case 0xa3b8191ff11914b4ULL: if (len == 4) { return 120163; } break; /* roplus */ case 0xb2f3c018e7a9e372ULL: if (len == 6) { return 10798; } break; /* rotimes */ case 0xbbfa0660c5691fdcULL: if (len == 7) { return 10805; } break; /* rpar */ case 0xebe3a81f886d8af8ULL: if (len == 4) { return 41; } break; /* rpargt */ case 0x3ae179e110b47b3bULL: if (len == 6) { return 10644; } break; /* rppolint */ case 0x93b0a458c9383cffULL: if (len == 8) { return 10770; } break; /* rrarr */ case 0x82aae3a57faf7058ULL: if (len == 5) { return 8649; } break; /* rsaquo */ case 0x795edd46be16f458ULL: if (len == 6) { return 8250; } break; /* rscr */ case 0xf640c31f8ec82e03ULL: if (len == 4) { return 120007; } break; /* rsh */ case 0x89c7c61960d7e94eULL: if (len == 3) { return 8625; } break; /* rsqb */ case 0xf610e31f8e9f40a1ULL: if (len == 4) { return 93; } break; /* rsquo */ case 0xbdbfbc9f586fc471ULL: if (len == 5) { return 8217; } break; /* rsquor */ case 0xdc9185c345ea1119ULL: if (len == 6) { return 8217; } break; /* rthree */ case 0x31d0a2b062cb6133ULL: if (len == 6) { return 8908; } break; /* rtimes */ case 0x41e63da50a4fab05ULL: if (len == 6) { return 8906; } break; /* rtri */ case 0xcab70f1f760e398eULL: if (len == 4) { return 9657; } break; /* rtrie */ case 0x83489d759a2c6a51ULL: if (len == 5) { return 8885; } break; /* rtrif */ case 0x83489a759a2c6538ULL: if (len == 5) { return 9656; } break; /* rtriltri */ case 0xbfb05bfa4a63349fULL: if (len == 8) { return 10702; } break; /* ruluhar */ case 0x5502cfe6adf6c066ULL: if (len == 7) { return 10600; } break; /* rx */ case 0x08dc4c07b57b89f7ULL: if (len == 2) { return 8478; } break; /* sacute */ case 0x0592103383b561deULL: if (len == 6) { return 347; } break; /* sbquo */ case 0x8f7b7bf4f1edc677ULL: if (len == 5) { return 8218; } break; /* sc */ case 0x08d92d07b5791f73ULL: if (len == 2) { return 8827; } break; /* scE */ case 0x8226ba195cd008c2ULL: if (len == 3) { return 10932; } break; /* scap */ case 0xf75cf318b51777d2ULL: if (len == 4) { return 10936; } break; /* scaron */ case 0x9e1f7fb7b4a6dd35ULL: if (len == 6) { return 353; } break; /* sccue */ case 0x584d87fbac666feeULL: if (len == 5) { return 8829; } break; /* sce */ case 0x82269a195ccfd262ULL: if (len == 3) { return 10928; } break; /* scedil */ case 0x5f6e7bd5cd13ea57ULL: if (len == 6) { return 351; } break; /* scirc */ case 0xaf4113fbddbe3275ULL: if (len == 5) { return 349; } break; /* scnE */ case 0xf781c018b5363d66ULL: if (len == 4) { return 10934; } break; /* scnap */ case 0xc83177fbeb92ce06ULL: if (len == 5) { return 10938; } break; /* scnsim */ case 0x368d8a118dccf686ULL: if (len == 6) { return 8937; } break; /* scpolint */ case 0x98514d56fb047373ULL: if (len == 8) { return 10771; } break; /* scsim */ case 0xced2cffb5ed83532ULL: if (len == 5) { return 8831; } break; /* scy */ case 0x82268e195ccfbdfeULL: if (len == 3) { return 1089; } break; /* sdot */ case 0x22d4be18cdc16d29ULL: if (len == 4) { return 8901; } break; /* sdotb */ case 0xf0ec4f259facb671ULL: if (len == 5) { return 8865; } break; /* sdote */ case 0xf0ec50259facb824ULL: if (len == 5) { return 10854; } break; /* seArr */ case 0x921c6730cb593b18ULL: if (len == 5) { return 8664; } break; /* searhk */ case 0x21f3d1e2722e5887ULL: if (len == 6) { return 10533; } break; /* searr */ case 0x7f7a473030850ab8ULL: if (len == 5) { return 8600; } break; /* searrow */ case 0x88ebf9c7d3990ac6ULL: if (len == 7) { return 8600; } break; /* sect */ case 0x2d0ee518d3fd8b32ULL: if (len == 4) { return 167; } break; /* semi */ case 0x2d15f618d403c6c3ULL: if (len == 4) { return 59; } break; /* seswar */ case 0x3d69b6774ac76528ULL: if (len == 6) { return 10537; } break; /* setminus */ case 0xc83b1ab590aeb049ULL: if (len == 8) { return 8726; } break; /* setmn */ case 0xef2448306f800d6cULL: if (len == 5) { return 8726; } break; /* sext */ case 0x2d5de718d44162e9ULL: if (len == 4) { return 10038; } break; /* sfr */ case 0x82319b195cd9db9aULL: if (len == 3) { return 120112; } break; /* sfrown */ case 0x11799f167b93ccf2ULL: if (len == 6) { return 8994; } break; /* sharp */ case 0x6e30a3493acbac07ULL: if (len == 5) { return 9839; } break; /* shchcy */ case 0xf1806561b926db39ULL: if (len == 6) { return 1097; } break; /* shcy */ case 0x47056d18e2b1429aULL: if (len == 4) { return 1096; } break; /* shortmid */ case 0x964e3ca52b213715ULL: if (len == 8) { return 8739; } break; /* shortparallel */ case 0x36090ea71d540b02ULL: if (len == 13) { return 8741; } break; /* shy */ case 0x824596195cea7c25ULL: if (len == 3) { return 173; } break; /* sigma */ case 0xdc022c4f3092a794ULL: if (len == 5) { return 963; } break; /* sigmaf */ case 0x6a593c8f89336036ULL: if (len == 6) { return 962; } break; /* sigmav */ case 0x6a592c8f89334506ULL: if (len == 6) { return 962; } break; /* sim */ case 0x82489e195cecbf94ULL: if (len == 3) { return 8764; } break; /* simdot */ case 0x172447c4e9f3f71bULL: if (len == 6) { return 10858; } break; /* sime */ case 0x4e249618e64a2683ULL: if (len == 4) { return 8771; } break; /* simeq */ case 0x1251fe4f50002d36ULL: if (len == 5) { return 8771; } break; /* simg */ case 0x4e249818e64a29e9ULL: if (len == 4) { return 10910; } break; /* simgE */ case 0x12581e4f5004cf44ULL: if (len == 5) { return 10912; } break; /* siml */ case 0x4e249d18e64a3268ULL: if (len == 4) { return 10909; } break; /* simlE */ case 0x12691e4f50134277ULL: if (len == 5) { return 10911; } break; /* simne */ case 0x1270024f50193191ULL: if (len == 5) { return 8774; } break; /* simplus */ case 0xb2bcc833c0aa6174ULL: if (len == 7) { return 10788; } break; /* simrarr */ case 0x8cc8b245e61c7589ULL: if (len == 7) { return 10610; } break; /* slarr */ case 0x18e6356bcdfda1b1ULL: if (len == 5) { return 8592; } break; /* smallsetminus */ case 0xaa5c5f42a7692a6cULL: if (len == 13) { return 8726; } break; /* smashp */ case 0x24aa4f334f4e1ce5ULL: if (len == 6) { return 10803; } break; /* smeparsl */ case 0x1c09891b368d20fcULL: if (len == 8) { return 10724; } break; /* smid */ case 0x72394918fb218808ULL: if (len == 4) { return 8739; } break; /* smile */ case 0x38c3b272b9e271afULL: if (len == 5) { return 8995; } break; /* smt */ case 0x825697195cf8f10bULL: if (len == 3) { return 10922; } break; /* smte */ case 0x72142e18fb023deaULL: if (len == 4) { return 10924; } break; /* softcy */ case 0x09a3e49fb94e8e61ULL: if (len == 6) { return 1100; } break; /* sol */ case 0x824fa3195cf2e6c1ULL: if (len == 3) { return 47; } break; /* solb */ case 0x6038c718f0bde6f9ULL: if (len == 4) { return 10692; } break; /* solbar */ case 0xad7d63f2bf129e8eULL: if (len == 6) { return 9023; } break; /* sopf */ case 0x5ff4cb18f08420f9ULL: if (len == 4) { return 120164; } break; /* spades */ case 0xaeade2acd79a97f3ULL: if (len == 6) { return 9824; } break; /* spadesuit */ case 0xf131ca3c38fae46fULL: if (len == 9) { return 9824; } break; /* spar */ case 0x8b7dac19093caee5ULL: if (len == 4) { return 8741; } break; /* sqcap */ case 0x3ab1e9957ea7d427ULL: if (len == 5) { return 8851; } break; /* sqcup */ case 0x3a6dd1957e6dde93ULL: if (len == 5) { return 8852; } break; /* sqsub */ case 0xc3bf5395cbd8b879ULL: if (len == 5) { return 8847; } break; /* sqsube */ case 0x76d323896140d794ULL: if (len == 6) { return 8849; } break; /* sqsubset */ case 0x46cbd8be684480afULL: if (len == 8) { return 8847; } break; /* sqsubseteq */ case 0x9701ea7c72bfdb3dULL: if (len == 10) { return 8849; } break; /* sqsup */ case 0xc3bf6195cbd8d043ULL: if (len == 5) { return 8848; } break; /* sqsupe */ case 0x7702f7896169b092ULL: if (len == 6) { return 8850; } break; /* sqsupset */ case 0x26115d34e4d62d41ULL: if (len == 8) { return 8848; } break; /* sqsupseteq */ case 0x1640270eea9c7a07ULL: if (len == 10) { return 8850; } break; /* squ */ case 0x826496195d052cb4ULL: if (len == 3) { return 9633; } break; /* square */ case 0x7884f79b0c364646ULL: if (len == 6) { return 9633; } break; /* squarf */ case 0x7884f69b0c364493ULL: if (len == 6) { return 9642; } break; /* squf */ case 0x9617df190fcb28d6ULL: if (len == 4) { return 9642; } break; /* srarr */ case 0xd9451178cc025863ULL: if (len == 5) { return 8594; } break; /* sscr */ case 0x83a07919050290f6ULL: if (len == 4) { return 120008; } break; /* ssetmn */ case 0x9d2804a86e737c19ULL: if (len == 6) { return 8726; } break; /* ssmile */ case 0x472f4aeee6774cfeULL: if (len == 6) { return 8995; } break; /* sstarf */ case 0xc53fc43796f6cc24ULL: if (len == 6) { return 8902; } break; /* star */ case 0xaefd58191d95e091ULL: if (len == 4) { return 9734; } break; /* starf */ case 0xee5da9ad45ad43b5ULL: if (len == 5) { return 9733; } break; /* straightepsilon */ case 0x5b6ede597dd0218fULL: if (len == 15) { return 1013; } break; /* straightphi */ case 0x733e8eb2536d818aULL: if (len == 11) { return 981; } break; /* strns */ case 0x5e7db9ad850bd34bULL: if (len == 5) { return 175; } break; /* sub */ case 0x82719d195d0fc2f5ULL: if (len == 3) { return 8834; } break; /* subE */ case 0xb6d0a21921c7d110ULL: if (len == 4) { return 10949; } break; /* subdot */ case 0x8e26ff89a06e1330ULL: if (len == 6) { return 10941; } break; /* sube */ case 0xb6d0821921c79ab0ULL: if (len == 4) { return 8838; } break; /* subedot */ case 0x8536e9d5a181f167ULL: if (len == 7) { return 10947; } break; /* submult */ case 0xee1a03176cbc20ffULL: if (len == 7) { return 10945; } break; /* subnE */ case 0x6c0ce5b4664b342cULL: if (len == 5) { return 10955; } break; /* subne */ case 0x6c0cc5b4664afdccULL: if (len == 5) { return 8842; } break; /* subplus */ case 0xc5a11c772a4a26e5ULL: if (len == 7) { return 10943; } break; /* subrarr */ case 0x64db92880cab1278ULL: if (len == 7) { return 10617; } break; /* subset */ case 0x30843e896bdc6013ULL: if (len == 6) { return 8834; } break; /* subseteq */ case 0x75862b5f70c0d4e9ULL: if (len == 8) { return 8838; } break; /* subseteqq */ case 0x73d04b2c97a93e48ULL: if (len == 9) { return 10949; } break; /* subsetneq */ case 0xad9b662cb7975415ULL: if (len == 9) { return 8842; } break; /* subsetneqq */ case 0x966301fbf62465ecULL: if (len == 10) { return 10955; } break; /* subsim */ case 0x309235896be88e24ULL: if (len == 6) { return 10951; } break; /* subsub */ case 0x304e34896baebfa5ULL: if (len == 6) { return 10965; } break; /* subsup */ case 0x304e42896baed76fULL: if (len == 6) { return 10963; } break; /* succ */ case 0xb6cd601921c52b13ULL: if (len == 4) { return 8827; } break; /* succapprox */ case 0x57d5c8d1fec817c3ULL: if (len == 10) { return 10936; } break; /* succcurlyeq */ case 0x8ec2f9fa0bb8ddb2ULL: if (len == 11) { return 8829; } break; /* succeq */ case 0x35006582950a57e9ULL: if (len == 6) { return 10928; } break; /* succnapprox */ case 0xd47804c7bd93ca6fULL: if (len == 11) { return 10938; } break; /* succneqq */ case 0xe9fbc35cfb1360ecULL: if (len == 8) { return 10934; } break; /* succnsim */ case 0x85949d5d531d9726ULL: if (len == 8) { return 8937; } break; /* succsim */ case 0x5a7f7ee2d3d43552ULL: if (len == 7) { return 8831; } break; /* sum */ case 0x82719e195d0fc4a8ULL: if (len == 3) { return 8721; } break; /* sung */ case 0xb6de641921d3a512ULL: if (len == 4) { return 9834; } break; /* sup1 */ case 0xb693ca19219466eaULL: if (len == 4) { return 185; } break; /* sup2 */ case 0xb693c91921946537ULL: if (len == 4) { return 178; } break; /* sup3 */ case 0xb693c81921946384ULL: if (len == 4) { return 179; } break; /* sup */ case 0x82718b195d0fa45fULL: if (len == 3) { return 8835; } break; /* supE */ case 0xb69376192193d82eULL: if (len == 4) { return 10950; } break; /* supdot */ case 0x79cd46f4cb6bb9baULL: if (len == 6) { return 10942; } break; /* supdsub */ case 0x83f80ff5b9cb0881ULL: if (len == 7) { return 10968; } break; /* supe */ case 0xb693961921940e8eULL: if (len == 4) { return 8839; } break; /* supedot */ case 0x8574c2ef72c88db5ULL: if (len == 7) { return 10948; } break; /* suphsol */ case 0xc69835d28bbcccd1ULL: if (len == 7) { return 10185; } break; /* suphsub */ case 0xc64d2fd28b7cd725ULL: if (len == 7) { return 10967; } break; /* suplarr */ case 0x1380b3b3ea932544ULL: if (len == 7) { return 10619; } break; /* supmult */ case 0x84b2fba8c99cd241ULL: if (len == 7) { return 10946; } break; /* supnE */ case 0xd0b7c7b40e7a5732ULL: if (len == 5) { return 10956; } break; /* supne */ case 0xd0b7e7b40e7a8d92ULL: if (len == 5) { return 8843; } break; /* supplus */ case 0x0a5f419122241743ULL: if (len == 7) { return 10944; } break; /* supset */ case 0xf7a8d1f481a5d185ULL: if (len == 6) { return 8835; } break; /* supseteq */ case 0x875de36a70689023ULL: if (len == 8) { return 8839; } break; /* supseteqq */ case 0x6d19bfdd01ad3b56ULL: if (len == 9) { return 10950; } break; /* supsetneq */ case 0xcb5896dd36c35677ULL: if (len == 9) { return 8843; } break; /* supsetneqq */ case 0x4ade5fe40deb2c32ULL: if (len == 10) { return 10956; } break; /* supsim */ case 0xf7d0e8f481c74aaeULL: if (len == 6) { return 10952; } break; /* supsub */ case 0xf7debbf481d33b93ULL: if (len == 6) { return 10964; } break; /* supsup */ case 0xf7decdf481d35a29ULL: if (len == 6) { return 10966; } break; /* swArr */ case 0xfeba9ba30fb1c0ceULL: if (len == 5) { return 8665; } break; /* swarhk */ case 0x5df11207a94f6111ULL: if (len == 6) { return 10534; } break; /* swarr */ case 0xe8b17ba271f8b46eULL: if (len == 5) { return 8601; } break; /* swarrow */ case 0xd00e33053073d40cULL: if (len == 7) { return 8601; } break; /* swnwar */ case 0x6e5a5f9bf51fa13fULL: if (len == 6) { return 10538; } break; /* szlig */ case 0x2c9fd7bf12ea7dc8ULL: if (len == 5) { return 223; } break; /* target */ case 0x16f3e46051eee3e8ULL: if (len == 6) { return 8982; } break; /* tau */ case 0x56d7bd194448c389ULL: if (len == 3) { return 964; } break; /* tbrk */ case 0xce942aef00f16b88ULL: if (len == 4) { return 9140; } break; /* tcaron */ case 0x7588128a4f15512eULL: if (len == 6) { return 357; } break; /* tcedil */ case 0x19f326a9789703fcULL: if (len == 6) { return 355; } break; /* tcy */ case 0x56d0bd194442a4dbULL: if (len == 3) { return 1090; } break; /* tdot */ case 0x048e1def2015363eULL: if (len == 4) { return 8411; } break; /* telrec */ case 0x2544e6cbb938bdccULL: if (len == 6) { return 8981; } break; /* tfr */ case 0x56e1d01944513857ULL: if (len == 3) { return 120113; } break; /* there4 */ case 0xe5d2a5553611536bULL: if (len == 6) { return 8756; } break; /* therefore */ case 0x62302200658996b7ULL: if (len == 9) { return 8756; } break; /* theta */ case 0xeadab6725da1db1bULL: if (len == 5) { return 952; } break; /* thetasym */ case 0x27f794c5bdc02a7aULL: if (len == 8) { return 977; } break; /* thetav */ case 0xb37f71551a07da37ULL: if (len == 6) { return 977; } break; /* thickapprox */ case 0x77abec71600eb6c2ULL: if (len == 11) { return 8776; } break; /* thicksim */ case 0xbbc13542f05a9a05ULL: if (len == 8) { return 8764; } break; /* thinsp */ case 0xf975d97804f98979ULL: if (len == 6) { return 8201; } break; /* thkap */ case 0x20cda5727cbf8057ULL: if (len == 5) { return 8776; } break; /* thksim */ case 0xf75c798a3f118be5ULL: if (len == 6) { return 8764; } break; /* thorn */ case 0x41804d728eb78f02ULL: if (len == 5) { return 254; } break; /* tilde */ case 0x1ebe716c32b937c9ULL: if (len == 5) { return 732; } break; /* times */ case 0x29338c6c39286cb5ULL: if (len == 5) { return 215; } break; /* timesb */ case 0x2b0472e51fb0f155ULL: if (len == 6) { return 8864; } break; /* timesbar */ case 0x0f185b2ddb9f6f2aULL: if (len == 8) { return 10801; } break; /* timesd */ case 0x2b046ce51fb0e723ULL: if (len == 6) { return 10800; } break; /* tint */ case 0x1e4984ef2e958a4cULL: if (len == 4) { return 8749; } break; /* toea */ case 0x2fc1e7ef38855d16ULL: if (len == 4) { return 10536; } break; /* top */ case 0x56f9bc194465a83cULL: if (len == 3) { return 8868; } break; /* topbot */ case 0xef9e9d19f2142161ULL: if (len == 6) { return 9014; } break; /* topcir */ case 0xf687c619f57f75daULL: if (len == 6) { return 10993; } break; /* topf */ case 0x3002f8ef38bd10eeULL: if (len == 4) { return 120165; } break; /* topfork */ case 0x25fefcf26538d5c8ULL: if (len == 7) { return 10970; } break; /* tosa */ case 0x300cebef38c54f5cULL: if (len == 4) { return 10537; } break; /* tprime */ case 0xdcbc0f6aeba7f4feULL: if (len == 6) { return 8244; } break; /* trade */ case 0xdebb6ea6c4e2f4d9ULL: if (len == 5) { return 8482; } break; /* triangle */ case 0xdc74456562ae7805ULL: if (len == 8) { return 9653; } break; /* triangledown */ case 0x014b077c1530e435ULL: if (len == 12) { return 9663; } break; /* triangleleft */ case 0xa3e265bd705e0a90ULL: if (len == 12) { return 9667; } break; /* trianglelefteq */ case 0x6430b3b678b0e35aULL: if (len == 14) { return 8884; } break; /* triangleq */ case 0x480a5f46ae76ad1cULL: if (len == 9) { return 8796; } break; /* triangleright */ case 0xed273c852f9f5665ULL: if (len == 13) { return 9657; } break; /* trianglerighteq */ case 0xbd419acd95c78603ULL: if (len == 15) { return 8885; } break; /* tridot */ case 0x597256a33dc59f25ULL: if (len == 6) { return 9708; } break; /* trie */ case 0x5b33c8ef512b0c21ULL: if (len == 4) { return 8796; } break; /* triminus */ case 0x042866af73e857daULL: if (len == 8) { return 10810; } break; /* triplus */ case 0x0f63b601c5b988c2ULL: if (len == 7) { return 10809; } break; /* trisb */ case 0x23dad9a6ebfcf60fULL: if (len == 5) { return 10701; } break; /* tritime */ case 0x4b4d9cdf2453b457ULL: if (len == 7) { return 10811; } break; /* trpezium */ case 0xf3e5799099bbe89bULL: if (len == 8) { return 9186; } break; /* tscr */ case 0x50c98aef4ac5a341ULL: if (len == 4) { return 120009; } break; /* tscy */ case 0x50c97fef4ac59090ULL: if (len == 4) { return 1094; } break; /* tshcy */ case 0x3737199c2631a538ULL: if (len == 5) { return 1115; } break; /* tstrok */ case 0x04f96dae725b776cULL: if (len == 6) { return 359; } break; /* twixt */ case 0x892887bfa8c593d3ULL: if (len == 5) { return 8812; } break; /* twoheadleftarrow */ case 0x9241b1d92283ddf3ULL: if (len == 16) { return 8606; } break; /* twoheadrightarrow */ case 0xf68e0dfa08a4ab98ULL: if (len == 17) { return 8608; } break; /* uArr */ case 0x0a4dd8e4e388fcc3ULL: if (len == 4) { return 8657; } break; /* uHar */ case 0x479e07e506750e1bULL: if (len == 4) { return 10595; } break; /* uacute */ case 0x47821f8c87c6c9acULL: if (len == 6) { return 250; } break; /* uarr */ case 0xf444b8e445cff063ULL: if (len == 4) { return 8593; } break; /* ubrcy */ case 0xea783fee0769cf4cULL: if (len == 5) { return 1118; } break; /* ubreve */ case 0xa196c8767c906626ULL: if (len == 6) { return 365; } break; /* ucirc */ case 0x83de90f415f4e8cfULL: if (len == 5) { return 251; } break; /* ucy */ case 0x4c8894193dfa4610ULL: if (len == 3) { return 1091; } break; /* udarr */ case 0x50e541fb63e84467ULL: if (len == 5) { return 8645; } break; /* udblac */ case 0x34cc7e31854321ceULL: if (len == 6) { return 369; } break; /* udhar */ case 0x01e9c0fb36e1238fULL: if (len == 5) { return 10606; } break; /* ufisht */ case 0xa5450cc31ae76d9aULL: if (len == 6) { return 10622; } break; /* ufr */ case 0x4c928d193e028eb0ULL: if (len == 3) { return 120114; } break; /* ugrave */ case 0xf074086ffeff1671ULL: if (len == 6) { return 249; } break; /* uharl */ case 0xfc07e01df7772055ULL: if (len == 5) { return 8639; } break; /* uharr */ case 0xfc07d21df777088bULL: if (len == 5) { return 8638; } break; /* uhblk */ case 0x037f0a1dfb5a7bc7ULL: if (len == 5) { return 9600; } break; /* ulcorn */ case 0xd91e4fd10e8e794eULL: if (len == 6) { return 8988; } break; /* ulcorner */ case 0x760bb9809c991439ULL: if (len == 8) { return 8988; } break; /* ulcrop */ case 0x361e42d0b2ad988aULL: if (len == 6) { return 8975; } break; /* ultri */ case 0x1ad65e415d50ba0dULL: if (len == 5) { return 9720; } break; /* umacr */ case 0x0b411e479d41d803ULL: if (len == 5) { return 363; } break; /* uml */ case 0x4caa8d193e172091ULL: if (len == 3) { return 168; } break; /* uogon */ case 0x633fb45979011ad7ULL: if (len == 5) { return 371; } break; /* uopf */ case 0x6f43eae48bf85cd3ULL: if (len == 4) { return 120166; } break; /* uparrow */ case 0x4d3d5c827e5a0719ULL: if (len == 7) { return 8593; } break; /* updownarrow */ case 0x0f92179d5142382dULL: if (len == 11) { return 8597; } break; /* upharpoonleft */ case 0x92e4d523b361453aULL: if (len == 13) { return 8639; } break; /* upharpoonright */ case 0x097fff6161b22fa7ULL: if (len == 14) { return 8638; } break; /* uplus */ case 0xb163f3588d1b2a50ULL: if (len == 5) { return 8846; } break; /* upsi */ case 0x63a0f4e3f4a0ae80ULL: if (len == 4) { return 965; } break; /* upsih */ case 0xeb2f0758ad093438ULL: if (len == 5) { return 978; } break; /* upsilon */ case 0xd8375cb55d00468dULL: if (len == 7) { return 965; } break; /* upuparrows */ case 0x9016ee55e0c064a7ULL: if (len == 10) { return 8648; } break; /* urcorn */ case 0x12c7ff1b7e5a59d8ULL: if (len == 6) { return 8989; } break; /* urcorner */ case 0x646cb5260d85446fULL: if (len == 8) { return 8989; } break; /* urcrop */ case 0xf9d7961b7085b5c8ULL: if (len == 6) { return 8974; } break; /* uring */ case 0x556568657a61f8aaULL: if (len == 5) { return 367; } break; /* urtri */ case 0x71d2dd658b2cb8ffULL: if (len == 5) { return 9721; } break; /* uscr */ case 0x7d6090e403254574ULL: if (len == 4) { return 120010; } break; /* utdot */ case 0x4f3d3e77211fd953ULL: if (len == 5) { return 8944; } break; /* utilde */ case 0xaf88d5554a110e76ULL: if (len == 6) { return 361; } break; /* utri */ case 0x8490bce406cca1a9ULL: if (len == 4) { return 9653; } break; /* utrif */ case 0x0e92c6778db6f2bdULL: if (len == 5) { return 9652; } break; /* uuarr */ case 0xde9bdb7e4bdcdb9eULL: if (len == 5) { return 8648; } break; /* uuml */ case 0x8bf7e8e40aa3404eULL: if (len == 4) { return 252; } break; /* uwangle */ case 0xd64290f488b91078ULL: if (len == 7) { return 10663; } break; /* vArr */ case 0x2d491f0050087bc4ULL: if (len == 4) { return 8661; } break; /* vBar */ case 0x469882005e2daa26ULL: if (len == 4) { return 10984; } break; /* vBarv */ case 0x22cf36a0079865f0ULL: if (len == 5) { return 10985; } break; /* vDash */ case 0x8cac1ab1ed9e0b11ULL: if (len == 5) { return 8872; } break; /* vangrt */ case 0x1e8ca4e031b38879ULL: if (len == 6) { return 10652; } break; /* varepsilon */ case 0xebd1e6a3573c21e0ULL: if (len == 10) { return 1013; } break; /* varkappa */ case 0xf2a72a63823ef301ULL: if (len == 8) { return 1008; } break; /* varnothing */ case 0xed924e7e6523b7b7ULL: if (len == 10) { return 8709; } break; /* varphi */ case 0xfb348c7bcacd7f9dULL: if (len == 6) { return 981; } break; /* varpi */ case 0x26505793ffe0b2b9ULL: if (len == 5) { return 982; } break; /* varpropto */ case 0xac2c5a662cf9200aULL: if (len == 9) { return 8733; } break; /* varr */ case 0x43523f00edc18824ULL: if (len == 4) { return 8597; } break; /* varrho */ case 0xe93e347bc0727a71ULL: if (len == 6) { return 1009; } break; /* varsigma */ case 0x1a0f46679639f9edULL: if (len == 8) { return 962; } break; /* vartheta */ case 0xcecdd481e27e73a6ULL: if (len == 8) { return 977; } break; /* vartriangleleft */ case 0x6c71a3f4e9da058bULL: if (len == 15) { return 8882; } break; /* vartriangleright */ case 0xb7af40a28cd07014ULL: if (len == 16) { return 8883; } break; /* vcy */ case 0x690b1b194ed78105ULL: if (len == 3) { return 1074; } break; /* vdash */ case 0xb73a1bbdef0e7ef1ULL: if (len == 5) { return 8866; } break; /* vee */ case 0x6911fb194edd6953ULL: if (len == 3) { return 8744; } break; /* veebar */ case 0x59aac8960b1b7adcULL: if (len == 6) { return 8891; } break; /* veeeq */ case 0x2f48bab6c82ca229ULL: if (len == 5) { return 8794; } break; /* vellip */ case 0xd35624d1976a5e2dULL: if (len == 6) { return 8942; } break; /* verbar */ case 0xced85147924135b3ULL: if (len == 6) { return 124; } break; /* vert */ case 0x673ed10102775f82ULL: if (len == 4) { return 124; } break; /* vfr */ case 0x691c22194ee6001dULL: if (len == 3) { return 120115; } break; /* vltri */ case 0x3bf2bb7c191ae230ULL: if (len == 5) { return 8882; } break; /* vopf */ case 0x311ec900e332a1e0ULL: if (len == 4) { return 120167; } break; /* vprop */ case 0xcc19c522de799df4ULL: if (len == 5) { return 8733; } break; /* vrtri */ case 0x56587434464aae8aULL: if (len == 5) { return 8883; } break; /* vscr */ case 0xde8f1301457d557fULL: if (len == 4) { return 120011; } break; /* vzigzag */ case 0x8d172bf590ef7a79ULL: if (len == 7) { return 10650; } break; /* wcirc */ case 0x7118953fb97ade19ULL: if (len == 5) { return 373; } break; /* wedbar */ case 0x3c6bee4a55123048ULL: if (len == 6) { return 10847; } break; /* wedge */ case 0x7785e02e12f8b54fULL: if (len == 5) { return 8743; } break; /* wedgeq */ case 0x11312c4a3c9bf85aULL: if (len == 6) { return 8793; } break; /* weierp */ case 0x5766aade150cb665ULL: if (len == 6) { return 8472; } break; /* wfr */ case 0x5e96df194869c706ULL: if (len == 3) { return 120116; } break; /* wopf */ case 0x70600af6366e75b5ULL: if (len == 4) { return 120168; } break; /* wp */ case 0x08cb4607b56d0c92ULL: if (len == 2) { return 8472; } break; /* wr */ case 0x08cb4407b56d092cULL: if (len == 2) { return 8768; } break; /* wreath */ case 0x7b78fd951aa46582ULL: if (len == 6) { return 8768; } break; /* wscr */ case 0xc34dc8f5d472b132ULL: if (len == 4) { return 120012; } break; /* xcap */ case 0x704a3d5440c51385ULL: if (len == 4) { return 8898; } break; /* xcirc */ case 0x4b5af429e570ae9cULL: if (len == 5) { return 9711; } break; /* xcup */ case 0x7072455440e67331ULL: if (len == 4) { return 8899; } break; /* xdtri */ case 0xd5a75b23eb6a34c2ULL: if (len == 5) { return 9661; } break; /* xfr */ case 0xbf91a4197fd26c93ULL: if (len == 3) { return 120117; } break; /* xhArr */ case 0xc9ed2388c8f32920ULL: if (len == 5) { return 10234; } break; /* xharr */ case 0xdff5438966aa8280ULL: if (len == 5) { return 10231; } break; /* xi */ case 0x08f13f07b58dcfeaULL: if (len == 2) { return 958; } break; /* xlArr */ case 0xf61e5364fcd5753cULL: if (len == 5) { return 10232; } break; /* xlarr */ case 0x0c2773659a8e819cULL: if (len == 5) { return 10229; } break; /* xmap */ case 0xa6cf3f54605ec727ULL: if (len == 4) { return 10236; } break; /* xnis */ case 0x9b770754592f1bafULL: if (len == 4) { return 8955; } break; /* xodot */ case 0x80797a4de93f2e8fULL: if (len == 5) { return 10752; } break; /* xopf */ case 0x9468f95455a4d8daULL: if (len == 4) { return 120169; } break; /* xoplus */ case 0xae374abc63c12188ULL: if (len == 6) { return 10753; } break; /* xotime */ case 0xc966eddf369f8451ULL: if (len == 6) { return 10754; } break; /* xrArr */ case 0x356eb7b85a86e7eeULL: if (len == 5) { return 10233; } break; /* xrarr */ case 0x4b77d7b8f83ff44eULL: if (len == 5) { return 10230; } break; /* xscr */ case 0xfd74db549174838dULL: if (len == 4) { return 120013; } break; /* xsqcup */ case 0x18f19cd966bfe481ULL: if (len == 6) { return 10758; } break; /* xuplus */ case 0x8c862e645cb8cf4aULL: if (len == 6) { return 10756; } break; /* xutri */ case 0xf15219a0d265eb6fULL: if (len == 5) { return 9651; } break; /* xvee */ case 0xe3785d5482bc7175ULL: if (len == 4) { return 8897; } break; /* xwedge */ case 0x89a246ac4779ef45ULL: if (len == 6) { return 8896; } break; /* yacute */ case 0x82cb32cf858d3170ULL: if (len == 6) { return 253; } break; /* yacy */ case 0xa0b70e498c4f13e7ULL: if (len == 4) { return 1103; } break; /* ycirc */ case 0x7d146906996a69c3ULL: if (len == 5) { return 375; } break; /* ycy */ case 0xb553881979927864ULL: if (len == 3) { return 1099; } break; /* yen */ case 0xb53f77197981b277ULL: if (len == 3) { return 165; } break; /* yfr */ case 0xb54281197983f94cULL: if (len == 3) { return 120118; } break; /* yicy */ case 0xe5295649b2d623cfULL: if (len == 4) { return 1111; } break; /* yopf */ case 0xd33ceb49a88352dfULL: if (len == 4) { return 120170; } break; /* yscr */ case 0x25ccc1494638d5a0ULL: if (len == 4) { return 120014; } break; /* yucy */ case 0xf378d2492a2e1eabULL: if (len == 4) { return 1102; } break; /* yuml */ case 0xf3a8e9492a576982ULL: if (len == 4) { return 255; } break; /* zacute */ case 0x05a19c61a4fa586bULL: if (len == 6) { return 378; } break; /* zcaron */ case 0x8462acbeb40d9fa4ULL: if (len == 6) { return 382; } break; /* zcy */ case 0xce6fff19878c6f29ULL: if (len == 3) { return 1079; } break; /* zdot */ case 0x293806613aeb0188ULL: if (len == 4) { return 380; } break; /* zeetrf */ case 0x1711e60908fa9dc5ULL: if (len == 6) { return 8488; } break; /* zeta */ case 0x2230c2613766819fULL: if (len == 4) { return 950; } break; /* zfr */ case 0xce65f61987840b59ULL: if (len == 3) { return 120119; } break; /* zhcy */ case 0x05c65f61269e15b7ULL: if (len == 4) { return 1078; } break; /* zigrarr */ case 0x5c550fb9b7b572f4ULL: if (len == 7) { return 8669; } break; /* zopf */ case 0xec09c961181bbeccULL: if (len == 4) { return 120171; } break; /* zscr */ case 0xde596361a14a61cbULL: if (len == 4) { return 120015; } break; /* zwj */ case 0xce98f41987af618cULL: if (len == 3) { return 8205; } break; /* zwnj */ case 0xbd3aa5618ef70edeULL: if (len == 4) { return 8204; } break; } /* unknown */ return -1; } httrack-3.49.14/src/htsencoding.h0000644000175000017500000000660115230602340012260 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2013 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Encoding conversion functions */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_ENCODING_DEFH #define HTS_ENCODING_DEFH /** Standard includes. **/ #include #include #ifdef _WIN32 #include #endif /** * Flags for hts_unescapeUrlSpecial(). **/ typedef enum unescapeFlags { /** Do not decode ASCII. **/ UNESCAPE_URL_NO_ASCII = 1 } unescapeFlags; /** * Unescape HTML entities (as per HTML 4.0 Specification) * and replace them in-place by their UTF-8 equivalents. * Note: source and destination may be the same, and the destination only * needs to hold as space as the source. * Returns 0 upon success, -1 upon overflow or error. **/ extern int hts_unescapeEntities(const char *src, char *dest, const size_t max); /** * Unescape HTML entities (as per HTML 4.0 Specification) * and replace them in-place by their charset equivalents. * Note: source and destination may be the same, and the destination only * needs to hold as space as the source. * Returns 0 upon success, -1 upon overflow or error. **/ extern int hts_unescapeEntitiesWithCharset(const char *src, char *dest, const size_t max, const char *charset); /** * Unescape an URL-encoded string. The implicit charset is UTF-8. * In case of UTF-8 decoding error inside URL-encoded characters, * the characters are left undecoded. * Note: source and destination MUST NOT be the same. * Returns 0 upon success, -1 upon overflow or error. **/ extern int hts_unescapeUrl(const char *src, char *dest, const size_t max); /** * Unescape an URL-encoded string. The implicit charset is UTF-8. * In case of UTF-8 decoding error inside URL-encoded characters, * the characters are left undecoded. * "flags" is a mask composed of UNESCAPE_URL_XXX constants. * Note: source and destination MUST NOT be the same. * Returns 0 upon success, -1 upon overflow or error. **/ extern int hts_unescapeUrlSpecial(const char *src, char *dest, const size_t max, const int flags); #endif httrack-3.49.14/src/punycode.h0000644000175000017500000001050115230602340011573 /* punycode.c from RFC 3492 http://www.nicemice.net/idn/ Adam M. Costello http://www.nicemice.net/amc/ This is ANSI C code (C89) implementing Punycode (RFC 3492). */ #ifndef PUNYCODE_COSTELLO_RFC3492_H #define PUNYCODE_COSTELLO_RFC3492_H /********************/ /* Public interface */ #include typedef enum punycode_status { punycode_success, punycode_bad_input, /* Input is invalid. */ punycode_big_output, /* Output would exceed the space provided. */ punycode_overflow /* Input needs wider integers to process. */ } punycode_status; #if UINT_MAX >= (1 << 26) - 1 typedef unsigned int punycode_uint; #else typedef unsigned long punycode_uint; #endif /* punycode_encode() converts Unicode to Punycode. The input */ /* is represented as an array of Unicode code points (not code */ /* units; surrogate pairs are not allowed), and the output */ /* will be represented as an array of ASCII code points. The */ /* output string is *not* null-terminated; it will contain */ /* zeros if and only if the input contains zeros. (Of course */ /* the caller can leave room for a terminator and add one if */ /* needed.) The input_length is the number of code points in */ /* the input. The output_length is an in/out argument: the */ /* caller passes in the maximum number of code points that it */ /* can receive, and on successful return it will contain the */ /* number of code points actually output. The case_flags array */ /* holds input_length boolean values, where nonzero suggests that */ /* the corresponding Unicode character be forced to uppercase */ /* after being decoded (if possible), and zero suggests that */ /* it be forced to lowercase (if possible). ASCII code points */ /* are encoded literally, except that ASCII letters are forced */ /* to uppercase or lowercase according to the corresponding */ /* uppercase flags. If case_flags is a null pointer then ASCII */ /* letters are left as they are, and other code points are */ /* treated as if their uppercase flags were zero. The return */ /* value can be any of the punycode_status values defined above */ /* except punycode_bad_input; if not punycode_success, then */ /* output_size and output might contain garbage. */ enum punycode_status punycode_encode(punycode_uint input_length, const punycode_uint input[], const unsigned char case_flags[], punycode_uint * output_length, char output[]); /* punycode_decode() converts Punycode to Unicode. The input is */ /* represented as an array of ASCII code points, and the output */ /* will be represented as an array of Unicode code points. The */ /* input_length is the number of code points in the input. The */ /* output_length is an in/out argument: the caller passes in */ /* the maximum number of code points that it can receive, and */ /* on successful return it will contain the actual number of */ /* code points output. The case_flags array needs room for at */ /* least output_length values, or it can be a null pointer if the */ /* case information is not needed. A nonzero flag suggests that */ /* the corresponding Unicode character be forced to uppercase */ /* by the caller (if possible), while zero suggests that it be */ /* forced to lowercase (if possible). ASCII code points are */ /* output already in the proper case, but their flags will be set */ /* appropriately so that applying the flags would be harmless. */ /* The return value can be any of the punycode_status values */ /* defined above; if not punycode_success, then output_length, */ /* output, and case_flags might contain garbage. On success, the */ /* decoder will never need to write an output_length greater than */ /* input_length, because of how the encoding is defined. */ enum punycode_status punycode_decode(punycode_uint input_length, const char input[], punycode_uint * output_length, punycode_uint output[], unsigned char case_flags[]); #endif httrack-3.49.14/src/htscharset.h0000644000175000017500000001426715230602340012132 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Charset conversion functions */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_CHARSET_DEFH #define HTS_CHARSET_DEFH /** Standard includes. **/ #include "htsglobal.h" #include #include #ifdef _WIN32 #include #endif /** UCS4 type. **/ typedef unsigned int hts_UCS4; /** Leading character (ASCII or leading UTF-8 sequence) **/ #define HTS_IS_LEADING_UTF8(C) ((unsigned char)(C) < 0x80 || (unsigned char)(C) >= 0xc0) /** * Convert the string "s" from charset "charset" to UTF-8. * Return NULL upon error. **/ HTSEXT_API char *hts_convertStringToUTF8(const char *s, size_t size, const char *charset); /** * Convert the string "s" from UTF-8 to charset "charset". * Return NULL upon error. **/ extern char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset); /** * Convert an UTF-8 string to an IDNA (RFC 3492) string. **/ extern char *hts_convertStringUTF8ToIDNA(const char *s, size_t size); /** * Convert an IDNA (RFC 3492) string to an UTF-8 string. **/ extern char *hts_convertStringIDNAToUTF8(const char *s, size_t size); /** * Has the given string any IDNA segments ? **/ extern int hts_isStringIDNA(const char *s, size_t size); /** * Extract the charset from the HTML buffer "html" (HTML5 charset= or * legacy http-equiv form). Returns a malloc'ed string, or NULL if none. **/ extern char *hts_getCharsetFromMeta(const char *html, size_t size); /** * Is the given string an ASCII string ? **/ extern int hts_isStringAscii(const char *s, size_t size); /** * Is the given string valid UTF-8 ? Strict RFC 3629: overlong forms, * surrogates, codepoints above U+10FFFF and 5/6-byte sequences are rejected. **/ extern int hts_isStringUTF8(const char *s, size_t size); /** * Is the given charset the UTF-8 charset ? **/ extern int hts_isCharsetUTF8(const char *charset); /** * Get an UTF-8 string length in characters. **/ extern size_t hts_stringLengthUTF8(const char *s); /** * Copy at most 'nBytes' bytes from src to dest, not truncating UTF-8 * sequences. * Returns the number of bytes copied, not including the terminating \0. **/ extern size_t hts_copyStringUTF8(char *dest, const char *src, size_t nBytes); /** * Append at most 'nBytes' bytes from src to dest, not truncating UTF-8 * sequences. * Returns the number of bytes appended, not including the terminating \0. **/ extern size_t hts_appendStringUTF8(char *dest, const char *src, size_t nBytes); /** * Convert an UTF-8 string into an Unicode string (0-terminated). **/ extern hts_UCS4* hts_convertUTF8StringToUCS4(const char *s, size_t size, size_t *nChars); /** * Convert an Unicode string into an UTF-8 string. **/ extern char *hts_convertUCS4StringToUTF8(const hts_UCS4 *s, size_t nChars); /** * Return the length (in characters) of an UCS4 string terminated by 0. **/ extern size_t hts_stringLengthUCS4(const hts_UCS4 *s); /** * Write the Unicode character 'uc' in 'dest' of maximum size 'size'. * Return the number of bytes written, or 0 upon error. * Note: does not \0-terminate the destination buffer. **/ extern size_t hts_writeUTF8(hts_UCS4 uc, char *dest, size_t size); /** * Read the next Unicode character within 'src' of size 'size' and, upon * successful reading, return the number of bytes read and place the * character is 'puc'. * Return 0 upon error. **/ extern size_t hts_readUTF8(const char *src, size_t size, hts_UCS4 *puc); /** * Given the first UTF-8 sequence character, get the total number of * characters in the sequence (1 for ASCII). * Return 0 upon error (not a leading character). **/ extern size_t hts_getUTF8SequenceLength(const char lead); /** WIN32 specific functions. **/ #ifdef _WIN32 /** * Convert UTF-8 to WCHAR. * This function is WIN32 specific. **/ extern LPWSTR hts_convertUTF8StringToUCS2(const char *s, int size, int *pwsize); /** * Convert from WCHAR. * This function is WIN32 specific. **/ extern char *hts_convertUCS2StringToUTF8(LPWSTR woutput, int wsize); /** * UTF-8 path to UCS-2 for the wide file/FindFirst APIs, \\?\-prefixed above * MAX_PATH (#133). Internal, not exported; caller frees. * This function is WIN32 specific. **/ extern LPWSTR hts_pathToUCS2(const char *path); /** * Convert current system codepage to UTF-8. * This function is WIN32 specific. **/ HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size); /** * Replace the CRT's ANSI argv by a UTF-8 one decoded from the real UTF-16 * command line: every char* is UTF-8 on Windows (FOPEN, STAT, ... convert at * the syscall boundary). Keeps the CRT's argv on failure; the new array is * writable, NULL-terminated, and lives for the process. * This function is WIN32 specific. **/ HTSEXT_API void hts_argv_utf8(int *pargc, char ***pargv); #endif #endif httrack-3.49.14/src/httrack-library.h0000644000175000017500000010770415230602340013063 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: HTTrack definition file for library usage */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** * @file httrack-library.h * @brief Public C API for embedding the HTTrack mirroring engine. * * Two ways to drive the engine, both supported and used by real consumers: * - argv path: build an argv vector and call hts_main()/hts_main2(), exactly * as the command-line tool is configured. * - struct/callback path: hts_create_opt(), install callbacks with * CHAIN_FUNCTION(), then hts_main2(), then hts_free_opt(). * * Typical lifecycle: hts_init() once per process, then per mirror * hts_create_opt() -> CHAIN_FUNCTION() -> hts_main2() (blocking) -> * hts_get_stats()/hts_errmsg() -> hts_free_opt(). * * Threading: hts_main2() blocks the calling thread. hts_request_stop() and * hts_has_stopped() are safe to call for the same opt from another thread while * the mirror runs. hts_free_opt() must not run until hts_has_stopped() is true. */ #ifndef HTTRACK_DEFLIB #define HTTRACK_DEFLIB #ifdef __cplusplus extern "C" { #endif #include "htsglobal.h" #ifndef _WIN32 #include #endif #include #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_strc_int2bytes2 #define HTS_DEF_FWSTRUCT_strc_int2bytes2 typedef struct strc_int2bytes2 strc_int2bytes2; #endif #ifndef HTS_DEF_DEFSTRUCT_hts_log_type #define HTS_DEF_DEFSTRUCT_hts_log_type /** Log severity levels, most to least severe. A message is emitted only if its level is <= opt->debug. LOG_ERRNO is a flag OR'd into the level to append ": " to the message. */ typedef enum hts_log_type { LOG_PANIC, /**< Fatal condition. */ LOG_ERROR, /**< Error. */ LOG_WARNING, /**< Warning. */ LOG_NOTICE, /**< Notice; the default opt->debug level. */ LOG_INFO, /**< Informational. */ LOG_DEBUG, /**< Debug detail. */ LOG_TRACE, /**< Most verbose tracing. */ LOG_ERRNO = 1 << 8 /**< Flag: append strerror(errno) to the message. */ } hts_log_type; #endif #ifndef HTS_DEF_FWSTRUCT_hts_stat_struct #define HTS_DEF_FWSTRUCT_hts_stat_struct typedef struct hts_stat_struct hts_stat_struct; #endif /** Assertion/error handler. Receives the failed expression text, source file, and line. The strings are valid only for the duration of the call; do not retain them. */ #ifndef HTS_DEF_FWSTRUCT_htsErrorCallback #define HTS_DEF_FWSTRUCT_htsErrorCallback typedef void (*htsErrorCallback)(const char *msg, const char *file, int line); #endif /* Helpers for plugging callbacks requires: htsdefines.h */ /** * Install callback FUNCTION into OPT->callbacks_fun->MEMBER, chaining it ahead * of any callback already there (whose function and carg are saved for * CALLBACKARG_PREV_FUN/CALLBACKARG_PREV_CARG). ARGUMENT is an optional (may be * NULL) user pointer, later read inside the callback with * CALLBACKARG_USERDEF(). Allocates a t_hts_callbackarg with hts_malloc (not * checked for OOM); it is freed by hts_free_opt(). */ #define CHAIN_FUNCTION(OPT, MEMBER, FUNCTION, ARGUMENT) \ do { \ t_hts_callbackarg *carg = \ (t_hts_callbackarg *) hts_malloc(sizeof(t_hts_callbackarg)); \ carg->userdef = (ARGUMENT); \ carg->prev.fun = (void *) (OPT)->callbacks_fun->MEMBER.fun; \ carg->prev.carg = (OPT)->callbacks_fun->MEMBER.carg; \ (OPT)->callbacks_fun->MEMBER.fun = (FUNCTION); \ (OPT)->callbacks_fun->MEMBER.carg = carg; \ } while (0) /* The following helpers are useful only if you know that an existing callback migh be existing before before the call to CHAIN_FUNCTION() If your functions were added just after hts_create_opt(), no need to make the previous function check */ /** Inside a chained callback, return the ARGUMENT pointer originally passed to CHAIN_FUNCTION(), or NULL when CARG is NULL. */ #define CALLBACKARG_USERDEF(CARG) (((CARG) != NULL) ? (CARG)->userdef : NULL) /** Return the callback of type NAME that this one chained over, cast to its function-pointer type, or NULL. Call it to forward to the prior handler. */ #define CALLBACKARG_PREV_FUN(CARG, NAME) \ ((t_hts_htmlcheck_##NAME)(((CARG) != NULL) ? (CARG)->prev.fun : NULL)) /** Return the carg of the callback this one chained over (pass it when forwarding to the CALLBACKARG_PREV_FUN result), or NULL. */ #define CALLBACKARG_PREV_CARG(CARG) \ (((CARG) != NULL) ? (CARG)->prev.carg : NULL) /* Functions */ /* Initialization */ /** Initialize the engine (lazy, idempotent, process-global): threading, the hashtable assert handler, modules, the MD5 self-test, and TLS when built with it. Only the first call does work. Honors $HTS_LOG for the debug level. Always returns 1. Call before hts_create_opt() or hts_main(). */ HTSEXT_API int hts_init(void); /** No-op kept for API compatibility. Frees nothing (the process-global mutexes set up by hts_init() are never released) and always returns 1. */ HTSEXT_API int hts_uninit(void); /** Block until all background mirror threads have finished. No-op unless built with threaded fetching. */ HTSEXT_API void htsthread_wait(void); /* Main functions */ /** Run a full mirror from a command-line argv (argv[0] is ignored, as in main()). Creates a fresh option set, runs the engine, and frees it. Returns the engine exit code. Call hts_init() first. */ HTSEXT_API int hts_main(int argc, char **argv); /** Run a full mirror using a caller-supplied option set. Use this instead of hts_main() to set options or plug callbacks on opt first. Blocks until the mirror ends and returns the engine exit code. The caller keeps ownership of opt and must release it with hts_free_opt(). */ HTSEXT_API int hts_main2(int argc, char **argv, httrackp *opt); /* Options handling */ /** Allocate and default-initialize an option set, preloading the bundled parser modules. Returns a heap object the caller owns and must release with hts_free_opt(). Does not return NULL on allocation failure. */ HTSEXT_API httrackp *hts_create_opt(void); /** Free an option set created by hts_create_opt() (callback chains, plugged modules, DNS cache, owned strings, and the structure). NULL is accepted. The pointer is invalid afterward. Do not call while a mirror is running on that opt; wait until hts_has_stopped() is true. */ HTSEXT_API void hts_free_opt(httrackp *opt); /** Return sizeof(httrackp) as the library sees it, for caller-vs-library struct ABI mismatch checks. */ HTSEXT_API size_t hts_sizeof_opt(void); /** Snapshot opt's error/warning/info counters and return a pointer to them. Returns NULL if opt is NULL. The result aliases a single process-global static: it is not thread-safe and is overwritten by the next call, so copy out the fields you need. */ HTSEXT_API const hts_stat_struct *hts_get_stats(httrackp *opt); /** Legacy no-op retained for API compatibility. */ HTSEXT_API void set_wrappers(httrackp *opt); /* LEGACY */ /** Load a plugin shared library and run its hts_plug(opt, argv) entry point. On success the handle is recorded in opt and unloaded by hts_free_opt(). @return 1 if loaded and hts_plug succeeded; 0 if loaded but hts_plug was missing or refused; -1 if the library could not be loaded. */ HTSEXT_API int plug_wrapper(httrackp *opt, const char *moduleName, const char *argv); /** Install the process-global assertion/error callback (NULL clears it). Not per-opt, and not safe to change while a mirror runs. */ HTSEXT_API void hts_set_error_callback(htsErrorCallback handler); /** Return the current process-global error callback, or NULL. */ HTSEXT_API htsErrorCallback hts_get_error_callback(void); /* Logging */ /** Legacy: write prefix then msg to opt->log. Returns 0 if written, 1 if opt->log is NULL. Prefer hts_log_print(). */ HTSEXT_API hts_boolean hts_log(httrackp *opt, const char *prefix, const char *msg); /** printf-style log at level @p type (an hts_log_type, optionally |LOG_ERRNO). Forwards to the registered log callback, and when the level is <= opt->debug also to opt->log. @p format must be non-NULL. */ HTSEXT_API void hts_log_print(httrackp *opt, int type, const char *format, ...) HTS_PRINTF_FUN(3, 4); /** va_list form of hts_log_print(). @p opt may be NULL (only the callback runs). Preserves errno. @p format must be non-NULL. */ HTSEXT_API void hts_log_vprint(httrackp *opt, int type, const char *format, va_list args); /** Install the process-global log callback invoked by hts_log_vprint() for every message, regardless of opt->debug (NULL clears it). Not per-opt. */ HTSEXT_API void hts_set_log_vprint_callback(void (*callback)(httrackp *opt, int type, const char *format, va_list args)); /* Infos */ /** Human-readable build/feature string plus the names of plugged modules. The result is written into and aliases a 2048-byte scratch buffer inside opt: it is valid until that buffer is next used, and must not be freed. opt must be non-NULL. */ HTSEXT_API const char *hts_get_version_info(httrackp *opt); /** Static build-features string (TLS, zlib, ipv6, and so on). Process-global storage; do not free or modify. */ HTSEXT_API const char *hts_is_available(void); /** HTTrack version id string. Static storage; do not free. */ HTSEXT_API const char *hts_version(void); /* Wrapper functions */ HTSEXT_API int htswrap_init(void); // DEPRECATED - DUMMY FUNCTION HTSEXT_API int htswrap_free(void); // DEPRECATED - DUMMY FUNCTION /** Register callback @p fct under @p name in opt's callback table (for example "start", "check-html", "linkdetected"). Returns 1 on success, 0 if @p name is not a known slot. Prefer CHAIN_FUNCTION(), which preserves any prior callback. */ HTSEXT_API int htswrap_add(httrackp *opt, const char *name, void *fct); /** Return the function pointer registered under @p name in opt as a uintptr_t, or 0 if none or unknown. */ HTSEXT_API uintptr_t htswrap_read(httrackp *opt, const char *name); /* Internal library allocators, if a different libc is being used by the client */ /** strdup() through the library allocator. Returns a heap copy freed with hts_free(), or NULL on failure. */ HTSEXT_API char *hts_strdup(const char *string); /** malloc() through the library allocator. Free with hts_free(). NULL on OOM. */ HTSEXT_API void *hts_malloc(size_t size); /** realloc() through the library allocator. NULL on failure, leaving the original block unchanged. */ HTSEXT_API void *hts_realloc(void *const data, const size_t size); /** free() through the library allocator. NULL is accepted. */ HTSEXT_API void hts_free(void *data); /* Other functions */ HTSEXT_API int hts_resetvar(void); // DEPRECATED - DUMMY FUNCTION /** (Re)build the top-level index.html aggregating every mirror project found under @p path. @p binpath is the data root used to locate the templates/topindex-*.html files, falling back to built-in templates. Writes /index.html. @return 1 on success, 0 on failure. */ HTSEXT_API int hts_buildtopindex(httrackp *opt, const char *path, const char *binpath); /** Scan every mirror project under @p path and return a CRLF-separated list: @p type==1 gives the distinct category names, any other value gives the project directory names. The result is heap-allocated and owned by the caller (free with freet()); it may be NULL. Not UTF-8. @p path is modified in place (a trailing '/' is stripped). */ HTSEXT_API char *hts_getcategories(char *path, int type); /** Read the `category=` value from a winprofile.ini file. The result is heap-allocated and owned by the caller (free with freet()), or NULL when the file is missing or has no category line. Not UTF-8. */ HTSEXT_API char *hts_getcategory(const char *filename); /* Catch-URL */ /** Open a local capture socket (a mini-proxy), trying a list of standard ports until one binds. Writes the chosen port to *port_prox and the local host address into adr_prox (a caller buffer of at least 128 bytes), and returns the listening socket. Returns INVALID_SOCKET if no port could be bound. */ HTSEXT_API T_SOC catch_url_init_std(int *port_prox, char *adr_prox); /** Open a local capture socket bound to *port (0 picks a free port). Writes the effective port back to *port and the local dotted address into @p adr (a caller buffer of at least 128 bytes), and returns the listening socket. Returns INVALID_SOCKET on failure. */ HTSEXT_API T_SOC catch_url_init(int *port, char *adr); /** Block on capture socket @p soc, accept one browser connection, and capture the proxied HTTP request: write the absolute URL to @p url, the upper-cased method to @p method, and the rebuilt request (request line, headers, and any POST body) to @p data, then send a canned response and close. @return 1 on success, 0 on error; on error @p url instead holds the peer's "ip:port". The buffers are caller-allocated and not bounds-checked: @p data must be CATCH_URL_DATA_SIZE bytes, and @p url / @p method must fit the captured request line. */ HTSEXT_API hts_boolean catch_url(T_SOC soc, char *url, char *method, char *data); /* State */ /** Whether the engine is parsing HTML. Returns 0 if not, otherwise the percent done (at least 1). @p flag >= 0 also requests a progress refresh; pass a negative value to query without side effects. */ HTSEXT_API int hts_is_parsing(httrackp *opt, int flag); /** Current background phase: 0 none, 1 testing links, 2 purge, 3, 4 scheduling, 5 waiting for a slot. */ HTSEXT_API int hts_is_testing(httrackp *opt); /** Nonzero once the engine has begun its exit sequence. */ HTSEXT_API int hts_is_exiting(httrackp *opt); /*HTSEXT_API int hts_setopt(httrackp* opt); DEPRECATED ; see copy_htsopt() */ /** Queue extra start URLs to inject into a running mirror. @p url is a caller-owned, NULL-terminated array of strings; the engine stores the pointer without copying, so the array and its strings must stay valid until the engine consumes them. @return nonzero if a list is now set. */ HTSEXT_API hts_boolean hts_addurl(httrackp *opt, char **url); /** Clear any pending add-URL list set by hts_addurl(). Always returns 0. */ HTSEXT_API hts_boolean hts_resetaddurl(httrackp *opt); /** Apply the runtime-tunable options from @p from onto @p to, to adjust a live mirror. Only fields set to a non-sentinel value are copied; the rest of @p to is left untouched. The user-agent string is deep-copied. @return 0. */ HTSEXT_API int copy_htsopt(const httrackp *from, httrackp *to); /** Return the engine's last error message, or NULL. The string is owned by @p opt; do not free it, and use it only while @p opt lives. */ HTSEXT_API char *hts_errmsg(httrackp *opt); /** Get or set the transfer-pause flag. @p p >= 0 sets it (nonzero means paused); a negative value queries. @return the current pause flag. */ HTSEXT_API int hts_setpause(httrackp *opt, int); /** Ask the running mirror to terminate (sets the stop flag under the state lock, so it is safe to call from another thread). @p force is currently ignored. @return 0; no-op if @p opt is NULL. */ HTSEXT_API int hts_request_stop(httrackp *opt, hts_boolean force); /** Queue a single in-progress file, by URL, to be cancelled by the engine. @p url is copied internally. Takes the state lock, so it is thread-safe. @return the underlying push result. */ HTSEXT_API int hts_cancel_file_push(httrackp *opt, const char *url); /** Cancel the in-progress link-testing phase. Effective only while a test runs. */ HTSEXT_API void hts_cancel_test(httrackp *opt); /** Cancel the in-progress HTML parsing. Effective only while parsing is active. */ HTSEXT_API void hts_cancel_parsing(httrackp *opt); /** Nonzero once the mirror has fully ended. Read under the engine state lock, so safe to poll from another thread. Wait for this before hts_free_opt(). */ HTSEXT_API hts_boolean hts_has_stopped(httrackp *opt); /* Tools */ /** Ensure the directory chain leading to @p path exists, creating missing directories. @p path ends either with '/' (a directory) or a filename (its basename is ignored). A regular file blocking a needed directory is renamed to ".txt". @p path is NOT UTF-8. @return 0 on success or if it already exists, -1 on error. */ HTSEXT_API int structcheck(const char *path); /** Like structcheck() but @p path is UTF-8. @return 0 on success, -1 on error. */ HTSEXT_API int structcheck_utf8(const char *path); /** Whether the directory containing @p path exists. The basename is stripped first, so passing a file path tests its parent directory. @return 1 if it is a directory, 0 otherwise. */ HTSEXT_API hts_boolean dir_exists(const char *path); /** Write the HTTP reason phrase for @p statuscode into @p msg, a caller buffer of at least 64 bytes. For an unknown code a non-empty @p msg is kept, otherwise it is set to "Unknown error". */ HTSEXT_API void infostatuscode(char *msg, int statuscode); /** Return the static reason-phrase string for @p statuscode, or NULL if unknown. The pointer is a string literal; do not free it. */ HTSEXT_API const char *infostatuscode_const(int statuscode); /** Current wall-clock time in milliseconds since the Unix epoch. */ HTSEXT_API TStamp mtime_local(void); /** Format a duration @p t (in seconds) into a compact string in @p st, for example "3d,02h,04min05s". @p st is caller-allocated and not bounds-checked. */ HTSEXT_API void qsec2str(char *st, TStamp t); /* The int2* helpers below write into the caller-supplied strc and return pointers into it. No allocation happens; the result is valid only until strc is reused, and a given strc is not reentrant. Use one strc per concurrently-live result. */ /** Format @p n as a decimal string into @p strc and return it. */ HTSEXT_API char *int2char(strc_int2bytes2 *strc, int n); /** Format byte count @p n as "" (B/KiB/MiB/GiB and so on) into @p strc and return it. */ HTSEXT_API char *int2bytes(strc_int2bytes2 *strc, LLint n); /** Format a transfer rate @p n as "/s" into @p strc and return it. */ HTSEXT_API char *int2bytessec(strc_int2bytes2 *strc, long int n); /** Split byte count @p n into number and unit, returning a 2-element array {number, unit} stored inside @p strc. */ HTSEXT_API char **int2bytes2(strc_int2bytes2 *strc, LLint n); /** Skip any "user[:pass]@" identification prefix in a URL, returning a pointer into the argument past it (or past the protocol if none). The result aliases the input string. */ HTSEXT_API char *jump_identification(char *); HTSEXT_API const char *jump_identification_const(const char *); /** Like jump_identification() and also strip a leading "www." host prefix, returning a pointer into the input to the normalized host. */ HTSEXT_API char *jump_normalized(char *); HTSEXT_API const char *jump_normalized_const(const char *); /** Return a pointer (into the input) to the ":port" part of a URL host, or NULL if there is no explicit port. Handles bracketed IPv6 literals. */ HTSEXT_API char *jump_toport(char *); HTSEXT_API const char *jump_toport_const(const char *); /** Canonicalize a URL path into @p dest: collapse duplicate '/' and sort the query-string arguments, so "?b=2&a=1" and "?a=1&b=2" compare equal. Returns @p dest, a caller buffer of at least strlen(source)+1 bytes (the output is never longer than the input). */ HTSEXT_API char *fil_normalized(const char *source, char *dest); /** Write the normalized host of @p source (identification and "www." stripped) into @p dest, truncated to @p destsize. Returns @p dest. */ HTSEXT_API char *adr_normalized_sized(const char *source, char *dest, size_t destsize); /** @deprecated Use adr_normalized_sized(). This form has no destination size and assumes @p dest is the engine URL buffer of HTS_URLMAXSIZE*2 bytes; a smaller buffer can overflow. */ HTS_DEPRECATED("use adr_normalized_sized(source, dest, destsize)") HTSEXT_API char *adr_normalized(const char *source, char *dest); /** Get or set the process executable root directory (with trailing '/'). The first call with non-NULL @p file initializes it and returns NULL; later initialization calls are ignored. Call with NULL to query: returns the stored directory, or "" if never set. The result is a static internal buffer; do not free it, and do not set it from multiple threads. */ HTSEXT_API const char *hts_rootdir(char *file); /* Escaping URLs */ /* * Size contract shared by the escape/unescape family below. * For the escape_* / append_escape_* / inplace_escape_* / * escape_for_html_print* / make_content_id / x_escape_http functions, `size` is * the total capacity of `dest` including the terminating NUL. The size_t return * is the number of bytes written, NOT counting the NUL; on overflow it returns * `size` and `dest` is still NUL-terminated (truncated). Passing sizeof(a * pointer) as the size trips a runtime assert. The unescape_http* functions * instead return `dest` (the catbuff pointer) and truncate to fit `size`. */ /** Decode HTML entities in @p s in place (for example "&" becomes "&"). */ HTSEXT_API void unescape_amp(char *s); /** Percent-escape only spaces (' ' becomes "%20"); copy everything else * verbatim. */ HTSEXT_API size_t escape_spc_url(const char *const src, char *const dest, const size_t size); /** Aggressively percent-escape @p src for use as a single URL path segment (reserved, delimiter, unwise, special, avoid and mark characters). */ HTSEXT_API size_t escape_in_url(const char *const src, char *const dest, const size_t size); /** Percent-escape @p src as a URI, escaping only what is necessary and keeping '/' and other reserved characters. */ HTSEXT_API size_t escape_uri(const char *const src, char *const dest, const size_t size); /** Like escape_uri() for a UTF-8 URI: also escapes reserved characters other than '/'. */ HTSEXT_API size_t escape_uri_utf(const char *const src, char *const dest, const size_t size); /** Minimal "make safe" escape: percent-escapes only '"', ' ' and control characters, leaving an already-formed URL otherwise intact. */ HTSEXT_API size_t escape_check_url(const char *const src, char *const dest, const size_t size); /** Append-variant of escape_spc_url(): escapes @p src after the existing NUL-terminated content of @p dest. Returns the bytes appended (excluding the NUL). */ HTSEXT_API size_t append_escape_spc_url(const char *const src, char *const dest, const size_t size); /** Append-variant of escape_in_url(). See append_escape_spc_url(). */ HTSEXT_API size_t append_escape_in_url(const char *const src, char *const dest, const size_t size); /** Append-variant of escape_uri(). See append_escape_spc_url(). */ HTSEXT_API size_t append_escape_uri(const char *const src, char *const dest, const size_t size); /** Append-variant of escape_uri_utf(). See append_escape_spc_url(). */ HTSEXT_API size_t append_escape_uri_utf(const char *const src, char *const dest, const size_t size); /** Append-variant of escape_check_url(). See append_escape_spc_url(). */ HTSEXT_API size_t append_escape_check_url(const char *const src, char *const dest, const size_t size); /** In-place variant of escape_spc_url(): escapes the NUL-terminated string in @p dest back into @p dest. */ HTSEXT_API size_t inplace_escape_spc_url(char *const dest, const size_t size); /** In-place variant of escape_in_url(). See inplace_escape_spc_url(). */ HTSEXT_API size_t inplace_escape_in_url(char *const dest, const size_t size); /** In-place variant of escape_uri(). See inplace_escape_spc_url(). */ HTSEXT_API size_t inplace_escape_uri(char *const dest, const size_t size); /** In-place variant of escape_uri_utf(). See inplace_escape_spc_url(). */ HTSEXT_API size_t inplace_escape_uri_utf(char *const dest, const size_t size); /** In-place variant of escape_check_url(). See inplace_escape_spc_url(). */ HTSEXT_API size_t inplace_escape_check_url(char *const dest, const size_t size); /** Same escaping as escape_check_url() but returns @p dest instead of the byte count. */ HTSEXT_API char *escape_check_url_addr(const char *const src, char *const dest, const size_t size); /** Build a MIME/MHTML content-id token in @p dest from @p adr and @p fil: escape_in_url() both, then replace every '%' with 'X' so the result is one opaque token. */ HTSEXT_API size_t make_content_id(const char *const adr, const char *const fil, char *const dest, const size_t size); /** Low-level percent-escaper backing the escape_* family. @p mode selects the character class to escape: 0 check_url, 1 in_url, 2 spc_url, 3 uri, 30 uri_utf. @p max_size is the dest capacity including the NUL. */ HTSEXT_API size_t x_escape_http(const char *const s, char *const dest, const size_t max_size, const int mode); /** Strip all control characters (byte value < 32) from @p s in place. */ HTSEXT_API void escape_remove_control(char *const s); /** HTML-escape for text output: rewrite '&' to "&" and pass every other byte through unchanged. */ HTSEXT_API size_t escape_for_html_print(const char *const s, char *const dest, const size_t size); /** Like escape_for_html_print() but also convert every high byte (>= 128) to a numeric entity "&#xNN;". */ HTSEXT_API size_t escape_for_html_print_full(const char *const s, char *const dest, const size_t size); /** Percent-decode @p s into @p catbuff (capacity @p size) and return @p catbuff. Decodes every "%xx" hex escape. */ HTSEXT_API char *unescape_http(char *const catbuff, const size_t size, const char *const s); /** Percent-decode @p s into @p catbuff, but only the escapes that are safe to decode while keeping a valid URI (reserved, delimiter, unwise, control and must-avoid escapes are kept encoded, and %25 is never decoded). @p no_high & 1 also decodes high (>= 128) bytes; @p no_high & 2 also decodes an escaped space. Returns @p catbuff. */ HTSEXT_API char *unescape_http_unharm(char *const catbuff, const size_t size, const char *s, const hts_boolean no_high); /** Determine the MIME type of local file name @p fil into @p s (capacity @p ssize): user --assume rules, then ".html", then the built-in extension table. @p flag != 0 forces a fallback type. @return 1 if a type was written, 0 otherwise. */ HTSEXT_API hts_boolean get_httptype_sized(httrackp *opt, char *s, size_t ssize, const char *fil, hts_boolean flag); /** @deprecated Use get_httptype_sized(). Assumes @p s has at least HTS_MIMETYPE_SIZE capacity. */ HTS_DEPRECATED("use get_httptype_sized(opt, s, ssize, fil, flag)") HTSEXT_API void get_httptype(httrackp *opt, char *s, const char *fil, int flag); /** Classify @p fil by its extension: 0 unknown, 1 known non-HTML, 2 known HTML. Consults the built-in table then user --assume rules. 0 for a NULL @p fil. */ HTSEXT_API int is_knowntype(httrackp *opt, const char *fil); /** Like is_knowntype() but consults only the user --assume rules: 0 no rule, 1 non-HTML, 2 HTML. */ HTSEXT_API int is_userknowntype(httrackp *opt, const char *fil); /** 1 if @p fil, an extension such as "asp" or "php" (not a full filename), is a known dynamic-page type, else 0. */ HTSEXT_API hts_boolean is_dyntype(const char *fil); /** Extract the extension of @p fil (text after the last '.', stopping at '?') into caller scratch @p catbuff (capacity @p size) and return it. Returns "" (a literal, not @p catbuff) when there is no extension or it does not fit. */ HTSEXT_API const char *get_ext(char *catbuff, size_t size, const char *fil); /** 1 if MIME type @p st must not be reclassified or renamed (hypertext types and a built-in keep-list of commonly mislabeled types), else 0. */ HTSEXT_API hts_boolean may_unknown(httrackp *opt, const char *st); /** Guess the MIME type of local file @p fil into @p s (capacity @p ssize), always producing a type. @return 1 if a type was written. */ HTSEXT_API hts_boolean guess_httptype_sized(httrackp *opt, char *s, size_t ssize, const char *fil); /** @deprecated Use guess_httptype_sized(). Assumes @p s has at least HTS_MIMETYPE_SIZE capacity. */ HTS_DEPRECATED("use guess_httptype_sized(opt, s, ssize, fil)") HTSEXT_API void guess_httptype(httrackp *opt, char *s, const char *fil); /* Ugly string tools */ /* These take a caller scratch buffer catbuff of capacity size and return it. On overflow they stop without writing past size and return the truncated buffer. size must be a real array sizeof (the macros below check this at compile time), not a pointer. */ /** Concatenate @p a and @p b into @p catbuff (NULL or empty operands are * skipped). */ HTSEXT_API char *concat(char *catbuff, size_t size, const char *a, const char *b); /** Like concat(a, b) but convert '/' to the platform path separator (Windows). */ HTSEXT_API char *fconcat(char *catbuff, size_t size, const char *a, const char *b); /** Copy @p a into @p catbuff, converting '/' to the platform path separator (Windows). */ HTSEXT_API char *fconv(char *catbuff, size_t size, const char *a); /** Copy @p a into @p catbuff, converting every '\\' to '/' on all platforms. */ HTSEXT_API char *fslash(char *catbuff, size_t size, const char *a); /* Debugging */ /** Set the process-global debug verbosity (0 is off); higher levels log more to stderr. Bit 0x80 redirects debug output to "hts-debug.txt". */ HTSEXT_API void hts_debug(int level); /* Portable directory API */ #ifndef HTS_DEF_FWSTRUCT_find_handle_struct #define HTS_DEF_FWSTRUCT_find_handle_struct typedef struct find_handle_struct find_handle_struct; typedef find_handle_struct *find_handle; #endif #ifndef HTS_DEF_FWSTRUCT_topindex_chain #define HTS_DEF_FWSTRUCT_topindex_chain typedef struct topindex_chain topindex_chain; #endif /** One node of the index/category listing built when generating the top index. */ struct topindex_chain { int level; /**< sort level */ char *category; /**< category (heap string) */ char name[2048]; /**< path */ struct topindex_chain *next; /**< next element */ }; /** Open directory @p path for iteration, positioned on the first entry. Returns an opaque handle to free with hts_findclose(), or NULL on empty path or open failure. */ HTSEXT_API find_handle hts_findfirst(char *path); /** Advance to the next directory entry. Returns 1 if an entry is available, 0 at end of directory. */ HTSEXT_API hts_boolean hts_findnext(find_handle find); /** Close the iteration and free @p find. Always returns 0; NULL is accepted. */ HTSEXT_API int hts_findclose(find_handle find); /** Name of the current entry, or NULL. Points into the handle's storage; valid only until the next hts_findnext()/hts_findclose(). */ HTSEXT_API char *hts_findgetname(find_handle find); /** Size in bytes of the current entry, or -1. Truncated to int, so unreliable for files larger than 2 GB. */ HTSEXT_API int hts_findgetsize(find_handle find); /** 1 if the current entry is a directory, else 0 (a system/special entry, see hts_findissystem(), reports 0). */ HTSEXT_API hts_boolean hts_findisdir(find_handle find); /** 1 if the current entry is a regular file, else 0 (a system/special entry, see hts_findissystem(), reports 0). */ HTSEXT_API hts_boolean hts_findisfile(find_handle find); /** 1 if the current entry is a special/system entry to skip: "." or "..", on POSIX also device/fifo/socket nodes, on Windows also system, hidden or temporary entries. Else 0. */ HTSEXT_API hts_boolean hts_findissystem(find_handle find); /* UTF-8 aware FILE API */ /* On non-Windows these macros resolve directly to the POSIX calls. On Windows they map to the hts_*_utf8 wrappers below, which convert the UTF-8 path to UTF-16 and call the wide CRT, falling back to the narrow CRT if conversion fails. Always pass UTF-8 paths through these. */ #ifndef HTS_DEF_FILEAPI #ifdef _WIN32 #define FOPEN hts_fopen_utf8 HTSEXT_API FILE *hts_fopen_utf8(const char *path, const char *mode); #define STAT hts_stat_utf8 /* _stat64: _stat's st_size is a 32-bit long, even in x64 builds */ typedef struct _stat64 STRUCT_STAT; HTSEXT_API int hts_stat_utf8(const char *path, STRUCT_STAT *buf); #define UNLINK hts_unlink_utf8 HTSEXT_API int hts_unlink_utf8(const char *pathname); #define RENAME hts_rename_utf8 HTSEXT_API int hts_rename_utf8(const char *oldpath, const char *newpath); #define MKDIR(F) hts_mkdir_utf8(F) HTSEXT_API int hts_mkdir_utf8(const char *pathname); #define RMDIR hts_rmdir_utf8 HTSEXT_API int hts_rmdir_utf8(const char *pathname); #define UTIME(A, B) hts_utime_utf8(A, B) typedef struct _utimbuf STRUCT_UTIMBUF; HTSEXT_API int hts_utime_utf8(const char *filename, const STRUCT_UTIMBUF *times); #else #define FOPEN fopen #define STAT stat typedef struct stat STRUCT_STAT; #define UNLINK unlink #define RENAME rename #define MKDIR(F) mkdir(F, HTS_ACCESS_FOLDER) #define RMDIR rmdir typedef struct utimbuf STRUCT_UTIMBUF; #define UTIME(A, B) utime(A, B) #endif #define HTS_DEF_FILEAPI #endif /** Macro aimed to break at build-time if a size is not a sizeof() strictly * greater than sizeof(char*). **/ #undef COMPILE_TIME_CHECK_SIZE #define COMPILE_TIME_CHECK_SIZE(A) \ (void) ((void (*)(char[A - sizeof(char *) - 1])) NULL) /** Macro aimed to break at compile-time if a size is not a sizeof() strictly * greater than sizeof(char*). **/ #undef RUNTIME_TIME_CHECK_SIZE #define RUNTIME_TIME_CHECK_SIZE(A) assertf((A) != sizeof(void *)) #define fconv(A, B, C) (COMPILE_TIME_CHECK_SIZE(B), fconv(A, B, C)) #define concat(A, B, C, D) (COMPILE_TIME_CHECK_SIZE(B), concat(A, B, C, D)) #define fconcat(A, B, C, D) (COMPILE_TIME_CHECK_SIZE(B), fconcat(A, B, C, D)) #define fslash(A, B, C) (COMPILE_TIME_CHECK_SIZE(B), fslash(A, B, C)) #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htsarrays.h0000644000175000017500000001727315230602340012002 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2014 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Arrays */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsarrays.h * Header-only generic dynamic array (a typed growable vector). All operations * are macros parameterized by the array lvalue A; the element type T is fixed * by the struct TypedArray(T) declares. Counts and capacities are in * elements, not bytes. The array owns its backing store: grow it via the Add/ * Append/EnsureRoom macros and release it with TypedArrayFree. */ #ifndef HTS_ARRAYS_DEFSTATIC #define HTS_ARRAYS_DEFSTATIC /* System definitions. */ #include #include #include "htssafe.h" /* Abort (with the failed byte count) when a growth allocation fails. The array macros never return an out-of-memory error; they assert and abort. */ static void hts_record_assert_memory_failed(const size_t size) { fprintf(stderr, "memory allocation failed (%lu bytes)", (long int) size); assertf(!"memory allocation failed"); } /** Dynamic array of T elements. **/ #define TypedArray(T) \ struct { \ /** Elements. **/ \ union { \ /** Typed. **/ \ T *elts; \ /** Opaque. **/ \ void *ptr; \ } data; \ /** Count. **/ \ size_t size; \ /** Capacity. **/ \ size_t capa; \ } /** Initializer for an empty array (no backing store, size and capacity 0). **/ #define EMPTY_TYPED_ARRAY {{NULL}, 0, 0} /** Array size, in elements. **/ #define TypedArraySize(A) ((A).size) /** Array capacity, in elements. **/ #define TypedArrayCapa(A) ((A).capa) /** * Remaining free space, in elements. * Macro, first element evaluated multiple times. **/ #define TypedArrayRoom(A) (TypedArrayCapa(A) - TypedArraySize(A)) /** Array elements, of type T*. **/ #define TypedArrayElts(A) ((A).data.elts) /** Array pointer, of type void*. **/ #define TypedArrayPtr(A) ((A).data.ptr) /** Size of T. **/ #define TypedArrayWidth(A) (sizeof(*TypedArrayElts(A))) /** Nth element of the array, as an lvalue. No bounds check; N must be < TypedArraySize(A). **/ #define TypedArrayNth(A, N) (TypedArrayElts(A)[N]) /** * Tail of the array (outside the array). * The returned pointer points to the beginning of TypedArrayRoom(A) * free elements. **/ #define TypedArrayTail(A) (TypedArrayNth(A, TypedArraySize(A))) /** * Ensure at least 'ROOM' elements can be put in the remaining space. * After a call to this macro, TypedArrayRoom(A) is guaranteed to be at * least equal to 'ROOM'. **/ #define TypedArrayEnsureRoom(A, ROOM) \ do { \ const size_t room_ = (ROOM); \ while (TypedArrayRoom(A) < room_) { \ TypedArrayCapa(A) = TypedArrayCapa(A) < 16 ? 16 : TypedArrayCapa(A) * 2; \ } \ TypedArrayPtr(A) = \ realloc(TypedArrayPtr(A), TypedArrayCapa(A) * TypedArrayWidth(A)); \ if (TypedArrayPtr(A) == NULL) { \ hts_record_assert_memory_failed(TypedArrayCapa(A) * TypedArrayWidth(A)); \ } \ } while (0) /** Add an element. Macro, first element evaluated multiple times. **/ #define TypedArrayAdd(A, E) \ do { \ TypedArrayEnsureRoom(A, 1); \ assertf(TypedArraySize(A) < TypedArrayCapa(A)); \ TypedArrayTail(A) = (E); \ TypedArraySize(A)++; \ } while (0) /** * Add 'COUNT' elements from 'PTR'. * Macro, first element evaluated multiple times. **/ #define TypedArrayAppend(A, PTR, COUNT) \ do { \ const size_t count_ = (COUNT); \ /* This 1-case is to benefit from type safety. */ \ if (count_ == 1) { \ TypedArrayAdd(A, *(PTR)); \ } else { \ const void *const source_ = (PTR); \ TypedArrayEnsureRoom(A, count_); \ assertf(count_ <= TypedArrayRoom(A)); \ memcpy(&TypedArrayTail(A), source_, count_ *TypedArrayWidth(A)); \ TypedArraySize(A) += count_; \ } \ } while (0) /** Clear an array, freeing memory and clearing size and capacity. **/ #define TypedArrayFree(A) \ do { \ if (TypedArrayPtr(A) != NULL) { \ TypedArrayCapa(A) = TypedArraySize(A) = 0; \ free(TypedArrayPtr(A)); \ TypedArrayPtr(A) = NULL; \ } \ } while (0) #endif httrack-3.49.14/src/htsstrings.h0000644000175000017500000004426515230602340012173 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Strings */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Safer Strings ; standalone .h library */ #ifndef HTS_STRINGS_DEFSTATIC #define HTS_STRINGS_DEFSTATIC /* System definitions. */ #include /* GCC extension */ #ifndef HTS_UNUSED #ifdef __GNUC__ #define HTS_UNUSED __attribute__((unused)) #define HTS_STATIC static __attribute__((unused)) #define HTS_PRINTF_FUN(fmt, arg) __attribute__((format(printf, fmt, arg))) #else #define HTS_UNUSED #define HTS_STATIC static #define HTS_PRINTF_FUN(fmt, arg) #endif #endif /** Forward definitions **/ #ifndef HTS_DEF_FWSTRUCT_String #define HTS_DEF_FWSTRUCT_String typedef struct String String; #endif #ifndef HTS_DEF_STRUCT_String #define HTS_DEF_STRUCT_String /** * Growable owned string. * * Ownership/lifetime: the String owns buffer_ and frees it (StringFree). * buffer_ is allocated lazily, so a freshly STRING_EMPTY/StringInit'd String, * or one just StringFree'd/StringAcquire'd, has buffer_ == NULL and * length_ == capacity_ == 0. Any growing operation may realloc, so a pointer * obtained from StringBuff/StringBuffRW is invalidated by the next append, * copy, or room request; do not cache it across such calls. * * Invariants when buffer_ != NULL: length_ < capacity_, and buffer_[length_] * is a NUL (the content is always NUL-terminated). length_ excludes that NUL; * capacity_ counts it. The empty state (buffer_ == NULL) has no readable NUL, * so callers must not treat StringBuff() of an untouched String as "". * * Direct field access is internal (trailing underscore); use the macros below. */ struct String { char *buffer_; size_t length_; size_t capacity_; }; #endif /** Allocator **/ #ifndef STRING_REALLOC #define STRING_REALLOC(BUFF, SIZE) ((char *) realloc(BUFF, SIZE)) #define STRING_FREE(BUFF) free(BUFF) #endif #ifndef STRING_ASSERT #include #define STRING_ASSERT(EXP) assert(EXP) #endif /** Initializer for an empty String (NULL buffer). Use to declare or reset. **/ #define STRING_EMPTY {(char *) NULL, 0, 0} /** Read-only buffer pointer. NULL until the String has been written to. Invalidated by any subsequent growing operation. **/ #define StringBuff(BLK) ((const char *) ((BLK).buffer_)) /** Read/write buffer pointer. Same NULL/invalidation rules as StringBuff. **/ #define StringBuffRW(BLK) ((BLK).buffer_) /** Current length in bytes, excluding the terminating NUL. **/ #define StringLength(BLK) ((BLK).length_) /** Non-zero if the String holds at least one byte. **/ #define StringNotEmpty(BLK) (StringLength(BLK) > 0) /** Allocated capacity in bytes, including room for the terminating NUL. **/ #define StringCapacity(BLK) ((BLK).capacity_) /** Byte at POS (read). No bounds check; POS must be < StringLength. **/ #define StringSub(BLK, POS) (StringBuff(BLK)[POS]) /** Byte at POS (read/write). No bounds check; POS must be < StringLength. **/ #define StringSubRW(BLK, POS) (StringBuffRW(BLK)[POS]) /** Byte POS positions from the end (read). POS==1 is the last byte. **/ #define StringRight(BLK, POS) (StringBuff(BLK)[StringLength(BLK) - POS]) /** Byte POS positions from the end (read/write). POS==1 is the last byte. **/ #define StringRightRW(BLK, POS) (StringBuffRW(BLK)[StringLength(BLK) - POS]) /** Drop the last byte and re-terminate. Undefined if the String is empty (no length check; would underflow). **/ #define StringPopRight(BLK) \ do { \ StringBuffRW(BLK)[--StringLength(BLK)] = '\0'; \ } while (0) /** Grow so capacity_ >= CAPACITY (total bytes, including the NUL). May realloc (invalidating prior buffer pointers); aborts via STRING_ASSERT on OOM. Never shrinks. **/ #define StringRoomTotal(BLK, CAPACITY) \ do { \ const size_t capacity_ = (size_t) (CAPACITY); \ while ((BLK).capacity_ < capacity_) { \ if ((BLK).capacity_ < 16) { \ (BLK).capacity_ = 16; \ } else { \ (BLK).capacity_ *= 2; \ } \ (BLK).buffer_ = STRING_REALLOC((BLK).buffer_, (BLK).capacity_); \ STRING_ASSERT((BLK).buffer_ != NULL); \ } \ } while (0) /** Reserve room for SIZE more bytes beyond the current length (plus the NUL). May realloc, invalidating prior buffer pointers. **/ #define StringRoom(BLK, SIZE) \ StringRoomTotal(BLK, StringLength(BLK) + (SIZE) + 1) /** Reserve room for SIZE more bytes and return the (post-realloc) RW buffer, for appending in place. Does not update length_; the caller must. **/ #define StringBuffN(BLK, SIZE) StringBuffN_(&(BLK), SIZE) HTS_STATIC char *StringBuffN_(String *blk, int size) { StringRoom(*blk, size); return StringBuffRW(*blk); } /** Zero the fields (NULL buffer, no allocation). Use on an uninitialized String only; does NOT free an existing buffer (use StringFree to reset an owned one), so calling it on a live String leaks. **/ #define StringInit(BLK) \ do { \ (BLK).buffer_ = NULL; \ (BLK).capacity_ = 0; \ (BLK).length_ = 0; \ } while (0) /** Truncate to length 0, keeping the allocation. Forces a non-NULL buffer (allocates if empty) and writes the leading NUL, so StringBuff is "". **/ #define StringClear(BLK) \ do { \ (BLK).length_ = 0; \ StringRoom(BLK, 0); \ (BLK).buffer_[0] = '\0'; \ } while (0) /** Set length_ to SIZE, or to strlen(buffer_) if SIZE is negative. Caller asserts SIZE fits the existing content; does not (re)allocate. **/ #define StringSetLength(BLK, SIZE) \ do { \ const int len__ = (SIZE); /* signed: negative means strlen(buffer_) */ \ if (len__ >= 0) { \ (BLK).length_ = len__; \ } else { \ (BLK).length_ = strlen((BLK).buffer_); \ } \ } while (0) /** Release the owned buffer and reset to the empty state (NULL buffer). Idempotent; safe on an already-empty String. **/ #define StringFree(BLK) \ do { \ if ((BLK).buffer_ != NULL) { \ STRING_FREE((BLK).buffer_); \ (BLK).buffer_ = NULL; \ } \ (BLK).capacity_ = 0; \ (BLK).length_ = 0; \ } while (0) /** Take ownership of a NUL-terminated heap string STR (the String will free it). Frees any current buffer first. STR MUST have been allocated by an allocator compatible with STRING_REALLOC()/STRING_FREE(), and must not be freed or used by the caller afterwards. length_/capacity_ are set to strlen(STR) (capacity_ here excludes the NUL, so the next append reallocs). **/ #define StringSetBuffer(BLK, STR) \ do { \ size_t len__ = strlen(STR); \ StringFree(BLK); \ (BLK).buffer_ = (STR); \ (BLK).capacity_ = len__; \ (BLK).length_ = len__; \ } while (0) /** Append SIZE raw bytes from STR (NULs allowed as data). Grows as needed and re-terminates with a NUL after the appended bytes. STR must not alias BLK's buffer (a realloc would invalidate it). **/ #define StringMemcat(BLK, STR, SIZE) \ do { \ const char *str_mc_ = (STR); \ const size_t size_mc_ = (size_t) (SIZE); \ StringRoom(BLK, size_mc_); \ if (size_mc_ > 0) { \ memcpy((BLK).buffer_ + (BLK).length_, str_mc_, size_mc_); \ (BLK).length_ += size_mc_; \ } \ *((BLK).buffer_ + (BLK).length_) = '\0'; \ } while (0) /** Replace content with SIZE raw bytes from STR (NULs allowed as data). Same non-aliasing requirement as StringMemcat. **/ #define StringMemcpy(BLK, STR, SIZE) \ do { \ (BLK).length_ = 0; \ StringMemcat(BLK, STR, SIZE); \ } while (0) /** Append one byte and re-terminate. Grows as needed. **/ #define StringAddchar(BLK, c) \ do { \ String *const s__ = &(BLK); \ char c__ = (c); \ StringRoom(*s__, 1); \ StringBuffRW(*s__)[StringLength(*s__)++] = c__; \ StringBuffRW(*s__)[StringLength(*s__)] = 0; \ } while (0) /** Hand the buffer to the caller and reset the String to empty (NULL buffer). The returned pointer is now owned by the caller, who must STRING_FREE() it. Returns NULL if the String was empty. **/ HTS_STATIC char *StringAcquire(String *blk) { char *buff = StringBuffRW(*blk); StringBuffRW(*blk) = NULL; StringCapacity(*blk) = 0; StringLength(*blk) = 0; return buff; } /** Return an independent deep copy of *src (its own allocation). The caller owns the result and must StringFree it. **/ HTS_STATIC String StringDup(const String *src) { String s = STRING_EMPTY; StringMemcat(s, StringBuff(*src), StringLength(*src)); return s; } /** Take ownership of *str (a NUL-terminated heap string) and NULL it out, so ownership transfers and the caller keeps no dangling alias. Frees any current buffer first. *str MUST be allocator-compatible (see StringSetBuffer). No-op if str or *str is NULL. **/ HTS_STATIC void StringAttach(String *blk, char **str) { StringFree(*blk); if (str != NULL && *str != NULL) { StringBuffRW(*blk) = *str; StringCapacity(*blk) = StringLength(*blk) = strlen(StringBuff(*blk)); *str = NULL; } } /** Append the C string STR (up to its NUL). No-op if STR is NULL. STR must not alias BLK's buffer. **/ #define StringCat(BLK, STR) \ do { \ const char *const str__ = (STR); \ if (str__ != NULL) { \ const size_t size__ = strlen(str__); \ StringMemcat(BLK, str__, size__); \ } \ } while (0) /** Append at most SIZE leading bytes of the C string STR. No-op if STR is NULL. STR must not alias BLK's buffer. **/ #define StringCatN(BLK, STR, SIZE) \ do { \ const char *str__ = (STR); \ const size_t usize__ = (SIZE); \ if (str__ != NULL) { \ size_t size__ = strlen(str__); \ if (size__ > usize__) { \ size__ = usize__; \ } \ StringMemcat(BLK, str__, size__); \ } \ } while (0) /** Replace content with at most SIZE leading bytes of the C string STR. If STR is NULL, clears to "". STR must not alias BLK's buffer. **/ #define StringCopyN(BLK, STR, SIZE) \ do { \ const char *str__ = (STR); \ const size_t usize__ = (SIZE); \ (BLK).length_ = 0; \ if (str__ != NULL) { \ size_t size__ = strlen(str__); \ if (size__ > usize__) { \ size__ = usize__; \ } \ StringMemcat(BLK, str__, size__); \ } else { \ StringClear(BLK); \ } \ } while (0) /** Replace blk's content with a copy of String blk2. blk and blk2 must be distinct Strings (use StringCopyOverlapped if they may be the same). **/ #define StringCopyS(blk, blk2) StringCopyN(blk, (blk2).buffer_, (blk2).length_) /** Replace content with a copy of the C string STR. If STR is NULL, clears to "". STR must not alias BLK's buffer (use StringCopyOverlapped if it might). **/ #define StringCopy(BLK, STR) \ do { \ const char *str__ = (STR); \ if (str__ != NULL) { \ size_t size__ = strlen(str__); \ StringMemcpy(BLK, str__, size__); \ } else { \ StringClear(BLK); \ } \ } while (0) /** Like StringCopy but safe when STR aliases BLK's own buffer: copies via a temporary, so a self-copy or overlap is well-defined. **/ #define StringCopyOverlapped(BLK, STR) \ do { \ String s__ = STRING_EMPTY; \ StringCopy(s__, STR); \ StringCopyS(BLK, s__); \ StringFree(s__); \ } while (0) #endif httrack-3.49.14/src/htszlib.h0000644000175000017500000000432615230602340011434 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Unpacking subroutines using Jean-loup Gailly's Zlib */ /* for http compressed data */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_DEFZLIB #define HTS_DEFZLIB /* ZLib */ #include "zlib.h" /* MiniZip */ #include "minizip/zip.h" #include "minizip/unzip.h" #include "minizip/mztools.h" /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* Inflate filename into newfile (gzip, zlib or raw deflate); decoded size, or -1 on a corrupt/truncated stream, an over-budget body, or an I/O failure. A body provably in no deflate framing is copied verbatim. */ extern int hts_zunpack(const char *filename, const char *newfile); /* Inflate the head of a gzip/zlib stream, out_len max; 0 if undecodable */ extern size_t hts_zhead(const void *in, size_t in_len, void *out, size_t out_len); extern int hts_extract_meta(const char *path); extern const char *hts_get_zerror(int err); #endif #endif httrack-3.49.14/src/htsproxy.h0000644000175000017500000000652515230602340011660 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Proxy tunneling (HTTP CONNECT, SOCKS5) .h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_DEFPROXY #define HTS_DEFPROXY #include "htsglobal.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif /* Open an HTTP CONNECT tunnel through the active proxy for an https request: `retour->soc` must already be TCP-connected to the proxy, and `adr` is the origin authority (url_adr, e.g. "https://host:port"). Sends the CONNECT request (with Proxy-Authorization when the proxy carries credentials) and reads the proxy's status line, so the caller's TLS handshake then runs end-to-end with the origin. Blocks up to `timeout` seconds. Returns 1 on a 2xx tunnel, 0 on failure (retour->msg/statuscode set). */ int http_proxy_tunnel(httrackp *opt, htsblk *retour, const char *adr, int timeout); /* SOCKS5 (RFC 1928, RFC 1929 auth) handshake on the raw proxy socket, before any TLS: `retour->soc` must be TCP-connected to the proxy and `adr` is the origin (url_adr). The origin name is sent verbatim (ATYP=domain), so the proxy resolves it; a bracketed IPv6 literal origin is rejected. Blocks up to `timeout` seconds. Returns 1 with the stream positioned on the first origin byte, 0 on failure (retour->msg set). */ int socks5_handshake(httrackp *opt, htsblk *retour, const char *adr, int timeout); /* Self-test hook (-#test=socks5): run the handshake against `reply`, a scripted server byte stream, instead of a socket. `sent` captures the client frames, `consumed` the reply bytes eaten (the frame-desync guard). */ typedef struct socks5_test_io { const unsigned char *reply; size_t reply_len; size_t consumed; unsigned char sent[1024]; size_t sent_len; char msg[256]; } socks5_test_io; int socks5_handshake_scripted(httrackp *opt, const char *adr, const char *proxy_name, socks5_test_io *io); #endif httrack-3.49.14/src/htswarc.h0000644000175000017500000001351515230602340011430 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* HTTrack WARC/1.1 output writer (ISO 28500). Internal, not installed. All WARC record serialization, gzip-member framing, digests, UUID and revisit dedup live here; the engine only stashes the request, frees it, and calls one entry point per finished transaction. */ /* ------------------------------------------------------------ */ #ifndef HTS_WARC_DEFH #define HTS_WARC_DEFH #include "htsopt.h" #ifdef __cplusplus extern "C" { #endif /* opt->warc_file sentinel: --warc with no argument => auto-name the archive under the project's output directory at open time. */ #define WARC_AUTONAME "\001auto" /* htsblk.warc_truncated / WARC-Truncated reason tokens (ISO 28500 sec 5.13). A cap-truncated body is still archived, tagged with why it was cut short. */ #define WARC_TRUNC_NONE 0 #define WARC_TRUNC_LENGTH 1 /* hit a size cap (-M mirror / -m per-file) */ #define WARC_TRUNC_TIME 2 /* hit the mirror time cap (-E/--max-time) */ #define WARC_TRUNC_DISCONNECT 3 /* connection dropped mid-body */ /* WARC-Truncated token for a warc_truncated code, or NULL for none. */ const char *warc_truncated_reason(int code); typedef struct warc_writer warc_writer; /* Stash the raw request header block (bstr.buffer) on r for the later WARC request record; frees any prior stash. No-op when reqhdr is NULL. */ void warc_stash_request(htsblk *r, const char *reqhdr); /* Stash the raw response header block: deletehttp frees r.headers when the socket closes, before back_finalize, so keep a WARC-owned copy. */ void warc_stash_response(htsblk *r, const char *resphdr); /* Free both stashed header blocks (idempotent, NULL-safe). */ void warc_free_request(htsblk *r); /* Adopt the de-chunked compressed spool at tmpfile_path onto r->warc_rawpath/warc_rawsize (strdupt; frees any prior) so the WARC record stores the body verbatim. No-op leaving warc_rawpath NULL when tmpfile_path is empty or the spool is missing/empty (the record then stores the decoded in-memory/on-disk body instead). */ void warc_adopt_rawspool(htsblk *r, const char *tmpfile_path); /* Emit the request + response (or revisit) records for one finished transaction. Lazily opens the writer into opt->state.warc; a no-op (logged once) if the archive cannot be created. */ void warc_write_backtransaction(httrackp *opt, lien_back *back); /* Close and free the writer held in opt->state.warc, if any. */ void warc_close_opt(httrackp *opt); /* --- Direct writer API (used by the hooks above and the self-test). --- */ /* Create the archive at path (auto-named when path is WARC_AUTONAME), writing the warcinfo record. .warc.gz => one gzip member per record; .warc => raw. Returns NULL on failure. */ warc_writer *warc_open(httrackp *opt, const char *path); /* Flush, close and free the writer (NULL-safe). */ void warc_close(warc_writer *w); /* SURT-canonicalize url into out[outsz] (the CDXJ sort key). Returns 0 on success, -1 on error or truncation. Exposed for the -#test=warc-surt test. */ int warc_surt(const char *url, char *out, size_t outsz); /* Write one transaction's request + response (or revisit) records. target_uri: absolute URL fetched. ip: numeric peer IP, or NULL/"" to omit. req_hdr: exact request header block sent, or NULL to skip the request. resp_hdr: raw received response header block (status line + headers). body/body_len: decoded in-memory body, or NULL when on disk. body_path: file re-read for the body when body==NULL (may be NULL). is_update_unchanged: nonzero for a 304 server-not-modified revisit. truncated: a WARC_TRUNC_* reason to tag a cap-truncated body, else 0. The body is stored verbatim: Content-Encoding is kept and Content-Length set to body_len, so body/body_len must be the as-received (coded) bytes. Returns 0 on success, -1 on error. */ int warc_write_transaction(warc_writer *w, const char *target_uri, const char *ip, const char *req_hdr, const char *resp_hdr, const char *body, size_t body_len, const char *body_path, int statuscode, int is_update_unchanged, int truncated); /* Write one non-HTTP capture as a single WARC 'resource' record: the block is the raw payload (no HTTP envelope), Content-Type is the payload's own MIME. Used for ftp:// transfers. truncated is a WARC_TRUNC_* reason or 0. Returns 0 on success, -1 on error. */ int warc_write_resource(warc_writer *w, const char *target_uri, const char *ip, const char *content_type, const char *body, size_t body_len, const char *body_path, int truncated); #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htscodec.h0000644000175000017500000000626015230602340011550 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: HTTP content codings (gzip/deflate, brotli, zstd) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_DEFCODEC #define HTS_DEFCODEC #include "htsglobal.h" /* Content codings we may meet in a Content-Encoding header. */ typedef enum { HTS_CODEC_IDENTITY = 0, /**< no coding, or a token we treat as none */ HTS_CODEC_DEFLATE, /**< gzip, x-gzip, deflate, x-deflate */ HTS_CODEC_BROTLI, /**< br */ HTS_CODEC_ZSTD, /**< zstd */ HTS_CODEC_UNSUPPORTED /**< a real coding we can not decode */ } hts_codec; #ifdef HTS_INTERNAL_BYTECODE /* Codec for a Content-Encoding token. A known coding we can not decode is UNSUPPORTED; an unrecognized token is IDENTITY (servers do emit junk). */ extern hts_codec hts_codec_parse(const char *encoding); /* Accept-Encoding value to advertise; secure (TLS) also offers br and zstd. */ extern const char *hts_acceptencoding(hts_boolean compressible, hts_boolean secure); /* HTS_TRUE if ext is the codec's own archive extension: a foo.gz served as Content-Encoding: gzip stays packed on disk. */ extern hts_boolean hts_codec_is_archive_ext(hts_codec codec, const char *ext); /* Decode filename into newfile. Returns the decoded size, or -1 on a truncated or corrupt stream, an unsupported coding, a bomb over the budget, or I/O. */ extern int hts_codec_unpack(hts_codec codec, const char *filename, const char *newfile); /* Decode up to out_len leading bytes of a coded body for the MIME sniffer; 0 when nothing could be decoded. */ extern size_t hts_codec_head(hts_codec codec, const void *in, size_t in_len, void *out, size_t out_len); /* Ceiling on the decoded size of a body of in_size coded bytes. */ extern LLint hts_codec_maxout(LLint in_size); /* Coded size of an open stream, left rewound; -1 if unknown. */ extern LLint hts_codec_coded_size(FILE *in); #endif #endif httrack-3.49.14/src/htswrap.h0000644000175000017500000000464615230602340011452 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* wrapper system (for shell */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htswrap.h Legacy entry points of the callback-wrapper subsystem. The live callback registration API now lives on the httrackp options block (hts_set_callback); only the no-op init/free stubs remain exported here for ABI compatibility. */ #ifndef HTSWRAP_DEFH #define HTSWRAP_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE #include "htsglobal.h" #include "coucal.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifdef __cplusplus extern "C" { #endif /** Legacy no-op retained for ABI compatibility; always returns 1. */ HTSEXT_API int htswrap_init(void); // LEGACY /** Legacy no-op retained for ABI compatibility; always returns 1. */ HTSEXT_API int htswrap_free(void); // LEGACY #ifdef __cplusplus } #endif // HTSEXT_API int htswrap_add(httrackp * opt, const char *name, void *fct); // HTSEXT_API uintptr_t htswrap_read(httrackp * opt, const char *name); #endif #endif httrack-3.49.14/src/htswizard.h0000644000175000017500000000433215230602340011771 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* wizard system (accept/refuse links) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSWIZARD_DEFH #define HTSWIZARD_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE #include "htsglobal.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_lien_url #define HTS_DEF_FWSTRUCT_lien_url typedef struct lien_url lien_url; #endif int hts_acceptlink(httrackp * opt, int ptr, const char *adr, const char *fil, const char *tag, const char *attribute, int *set_prio_to_0, int *just_test_it); int hts_testlinksize(httrackp * opt, const char *adr, const char *fil, LLint size); int hts_acceptmime(httrackp * opt, int ptr, const char *adr, const char *fil, const char *mime); #endif #endif httrack-3.49.14/src/htstools.h0000644000175000017500000001216015230602340011627 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* various tools (filename analyzing ..) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSTOOLS_DEFH #define HTSTOOLS_DEFH /* specific definitions */ #include "htsglobal.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_find_handle_struct #define HTS_DEF_FWSTRUCT_find_handle_struct typedef struct find_handle_struct find_handle_struct; typedef find_handle_struct *find_handle; #endif #ifndef HTS_DEF_FWSTRUCT_lien_adrfil #define HTS_DEF_FWSTRUCT_lien_adrfil typedef struct lien_adrfil lien_adrfil; #endif #ifndef HTS_DEF_FWSTRUCT_lien_adrfilsave #define HTS_DEF_FWSTRUCT_lien_adrfilsave typedef struct lien_adrfilsave lien_adrfilsave; #endif /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE int ident_url_relatif(const char *lien, const char *origin_adr, const char *origin_fil, lien_adrfil* const adrfil); int lienrelatif(char *s, size_t ssize, const char *link, const char *curr); int link_has_authority(const char *lien); int link_has_authorization(const char *lien); void long_to_83(int mode, char *n83, size_t n83size, char *save); void longfile_to_83(int mode, char *n83, size_t n83size, char *save); HTS_INLINE int __rech_tageq(const char *adr, const char *s); HTS_INLINE int __rech_tageqbegdigits(const char *adr, const char *s); HTS_INLINE int rech_tageq_all(const char *adr, const char *s); int hts_template_format(FILE *const out, const char *format, ...); int hts_template_format_str(char *buffer, size_t size, const char *format, ...); // A footer named field and its already-context-escaped value. typedef struct hts_footer_field { const char *name; const char *value; } hts_footer_field; // Expand a footer template. A "%s" in it selects the legacy positional model, // consuming the "addr"/"path"/"date"/"version" fields in that order; otherwise // "{name}" is substituted from fields by name ("{{"/"}}" emit a literal brace, // an unknown "{...}" is left verbatim). Values must already be escaped for the // target context by the caller. Returns <0 on overflow. int hts_footer_format(char *buffer, size_t size, const char *footer, const hts_footer_field *fields, size_t nfields); #define rech_tageq(adr,s) \ ( \ ( (*((adr)-1)=='<') || (is_space(*((adr)-1))) ) ? \ ( \ (streql(*(adr),*(s))) ? \ (__rech_tageq((adr),(s))) \ : 0 \ ) \ : 0\ ) #define rech_tageqbegdigits(adr,s) \ ( \ ( (*((adr)-1)=='<') || (is_space(*((adr)-1))) ) ? \ ( \ (streql(*(adr),*(s))) ? \ (__rech_tageqbegdigits((adr),(s))) \ : 0 \ ) \ : 0\ ) //HTS_INLINE int rech_tageq(const char* adr,const char* s); HTS_INLINE int rech_sampletag(const char *adr, const char *s); HTS_INLINE int rech_endtoken(const char *adr, const char **start); HTS_INLINE int check_tag(const char *from, const char *tag); int verif_backblue(httrackp * opt, const char *base); int verif_external(httrackp * opt, int nb, int test); int istoobig(httrackp * opt, LLint size, LLint maxhtml, LLint maxnhtml, char *type); HTSEXT_API int hts_buildtopindex(httrackp * opt, const char *path, const char *binpath); // Portable directory find functions // Directory find functions HTSEXT_API find_handle hts_findfirst(char *path); HTSEXT_API hts_boolean hts_findnext(find_handle find); HTSEXT_API int hts_findclose(find_handle find); // HTSEXT_API char *hts_findgetname(find_handle find); HTSEXT_API int hts_findgetsize(find_handle find); HTSEXT_API hts_boolean hts_findisdir(find_handle find); HTSEXT_API hts_boolean hts_findisfile(find_handle find); HTSEXT_API hts_boolean hts_findissystem(find_handle find); #endif #endif httrack-3.49.14/src/htsthread.h0000644000175000017500000000463715230602340011750 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Threads */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_DEFTHREAD #define HTS_DEFTHREAD #include "htsglobal.h" #ifndef _WIN32 #include #endif #ifdef _WIN32 #include "windows.h" #endif #ifndef USE_BEGINTHREAD #error needs USE_BEGINTHREAD #endif /* Forward definition */ #ifndef HTS_DEF_FWSTRUCT_htsmutex_s #define HTS_DEF_FWSTRUCT_htsmutex_s typedef struct htsmutex_s htsmutex_s, *htsmutex; #endif #define HTSMUTEX_INIT NULL #ifdef _WIN32 struct htsmutex_s { HANDLE handle; }; #else /* #ifdef _WIN32 */ struct htsmutex_s { pthread_mutex_t handle; }; #endif /* #ifdef _WIN32 */ /* Library internal definictions */ HTSEXT_API int hts_newthread(void (*fun) (void *arg), void *arg); HTSEXT_API void htsthread_wait_n(int n_wait); /* Locking functions */ HTSEXT_API void hts_mutexinit(htsmutex * mutex); HTSEXT_API void hts_mutexfree(htsmutex * mutex); HTSEXT_API void hts_mutexlock(htsmutex * mutex); HTSEXT_API void hts_mutexrelease(htsmutex * mutex); #ifdef HTS_INTERNAL_BYTECODE /* Thread initialization */ HTSEXT_API void htsthread_init(void); HTSEXT_API void htsthread_uninit(void); #endif #endif httrack-3.49.14/src/htsrobots.h0000644000175000017500000000502615230602340012002 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* robots.txt (website robot file) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSROBOTS_DEFH #define HTSROBOTS_DEFH // robots wizard #ifndef HTS_DEF_FWSTRUCT_robots_wizard #define HTS_DEF_FWSTRUCT_robots_wizard typedef struct robots_wizard robots_wizard; #endif /* Per-host blob: one rule per line, first byte 'A'/'D' then path pattern. */ #define HTS_ROBOTS_TOKEN_SIZE 4096 struct robots_wizard { char adr[128]; char token[HTS_ROBOTS_TOKEN_SIZE]; struct robots_wizard *next; }; /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* -1 if `fil` disallowed for `adr` (RFC 9309); empty: -1 if rules exist. */ int checkrobots(robots_wizard * robots, const char *adr, const char *fil); void checkrobots_free(robots_wizard * robots); int checkrobots_set(robots_wizard * robots, const char *adr, const char *data); /* Parse robots.txt `body` for `adr`, storing the HTTrack group's rules; `info` gets a disallow summary, `keep_root_disallow` FALSE drops "Disallow: /". */ void robots_parse(robots_wizard *robots, const char *adr, const char *body, size_t bodysize, char *info, size_t infosize, hts_boolean keep_root_disallow); #endif #endif httrack-3.49.14/src/htsopt.h0000644000175000017500000007653415230602340011310 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: HTTrack parameters block */ /* Called by httrack.h and some other files */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTTRACK_DEFOPT #define HTTRACK_DEFOPT #include #include "htsglobal.h" #include "htsnet.h" #ifdef __cplusplus extern "C" { #endif /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_t_hts_htmlcheck_callbacks #define HTS_DEF_FWSTRUCT_t_hts_htmlcheck_callbacks typedef struct t_hts_htmlcheck_callbacks t_hts_htmlcheck_callbacks; #endif #ifndef HTS_DEF_FWSTRUCT_t_dnscache #define HTS_DEF_FWSTRUCT_t_dnscache typedef struct t_dnscache t_dnscache; #endif #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif #ifndef HTS_DEF_FWSTRUCT_robots_wizard #define HTS_DEF_FWSTRUCT_robots_wizard typedef struct robots_wizard robots_wizard; #endif #ifndef HTS_DEF_FWSTRUCT_t_cookie #define HTS_DEF_FWSTRUCT_t_cookie typedef struct t_cookie t_cookie; #endif /** Forward definitions **/ #ifndef HTS_DEF_FWSTRUCT_String #define HTS_DEF_FWSTRUCT_String typedef struct String String; #endif #ifndef HTS_DEF_STRUCT_String #define HTS_DEF_STRUCT_String struct String { char *buffer_; size_t length_; size_t capacity_; }; #endif /* Defines */ #define CATBUFF_SIZE (STRING_SIZE * 2 * 2) #define STRING_SIZE 2048 /* Proxy configuration. */ #ifndef HTS_DEF_FWSTRUCT_t_proxy #define HTS_DEF_FWSTRUCT_t_proxy typedef struct t_proxy t_proxy; #endif struct t_proxy { int active; /**< nonzero if a proxy is configured */ String name; /**< proxy host name */ int port; /**< proxy port */ String bindhost; /**< local address to bind the outgoing socket to */ }; /* Bundle of filter pointers, kept together for bulk copy. */ #ifndef HTS_DEF_FWSTRUCT_htsfilters #define HTS_DEF_FWSTRUCT_htsfilters typedef struct htsfilters htsfilters; #endif struct htsfilters { char ***filters; /**< pointer to the +/-pattern filter array */ int *filptr; /**< pointer to the current filter count */ }; /* User callbacks chain */ typedef int (*htscallbacksfncptr)(void); typedef struct htscallbacks htscallbacks; struct htscallbacks { void *moduleHandle; /**< handle of the module that registered the callback */ htscallbacksfncptr exitFnc; /**< function to run on engine exit */ htscallbacks *next; /**< next entry in the callback chain */ }; /* filenote() internal file structure */ #ifndef HTS_DEF_FWSTRUCT_filenote_strc #define HTS_DEF_FWSTRUCT_filenote_strc typedef struct filenote_strc filenote_strc; #endif struct filenote_strc { FILE *lst; char path[STRING_SIZE * 2]; }; /* concat() functions */ #ifndef HTS_DEF_FWSTRUCT_concat_strc #define HTS_DEF_FWSTRUCT_concat_strc typedef struct concat_strc concat_strc; #endif struct concat_strc { int index; char buff[16][STRING_SIZE * 2 * 2]; }; /* int2 functions */ #ifndef HTS_DEF_FWSTRUCT_strc_int2bytes2 #define HTS_DEF_FWSTRUCT_strc_int2bytes2 typedef struct strc_int2bytes2 strc_int2bytes2; #endif struct strc_int2bytes2 { char catbuff[CATBUFF_SIZE]; char buff1[256]; char buff2[32]; char *buffadr[2]; }; /* cmd callback */ #ifndef HTS_DEF_FWSTRUCT_usercommand_strc #define HTS_DEF_FWSTRUCT_usercommand_strc typedef struct usercommand_strc usercommand_strc; #endif struct usercommand_strc { int exe; char cmd[2048]; }; /* error logging */ #ifndef HTS_DEF_FWSTRUCT_fspc_strc #define HTS_DEF_FWSTRUCT_fspc_strc typedef struct fspc_strc fspc_strc; #endif struct fspc_strc { int error; int warning; int info; }; /* lien_url */ #ifndef HTS_DEF_FWSTRUCT_lien_url #define HTS_DEF_FWSTRUCT_lien_url typedef struct lien_url lien_url; #endif #ifndef HTS_DEF_DEFSTRUCT_hts_log_type #define HTS_DEF_DEFSTRUCT_hts_log_type typedef enum hts_log_type { LOG_PANIC, LOG_ERROR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG, LOG_TRACE, LOG_ERRNO = 1 << 8 } hts_log_type; #endif /* Mirror cancellation list node. */ #ifndef HTS_DEF_FWSTRUCT_htsoptstatecancel #define HTS_DEF_FWSTRUCT_htsoptstatecancel typedef struct htsoptstatecancel htsoptstatecancel; #endif struct htsoptstatecancel { char *url; /**< URL flagged to be cancelled */ htsoptstatecancel *next; /**< next cancellation entry */ }; /* Mutexes */ #ifndef HTS_DEF_FWSTRUCT_htsmutex_s #define HTS_DEF_FWSTRUCT_htsmutex_s typedef struct htsmutex_s htsmutex_s, *htsmutex; #endif /* Hashtables */ #ifndef HTS_DEF_FWSTRUCT_struct_coucal #define HTS_DEF_FWSTRUCT_struct_coucal typedef struct struct_coucal struct_coucal, *coucal; #endif /* Mirror runtime state (mutable engine state, not user options). */ #ifndef HTS_DEF_FWSTRUCT_htsoptstate #define HTS_DEF_FWSTRUCT_htsoptstate typedef struct htsoptstate htsoptstate; #endif struct htsoptstate { htsmutex lock; /**< guards this state block */ /* */ int stop; /**< set to request the mirror to stop */ int exit_xh; int back_add_stats; /* */ int mimehtml_created; /**< MIME/MHTML output already started */ String mimemid; /**< MIME multipart boundary id */ FILE *mimefp; /**< MIME/MHTML output file */ int delayedId; /**< counter for delayed-type-check ids */ /* */ filenote_strc strc; /**< filenote() listing state */ /* Per-call function contexts (thread-local scratch, avoids globals) */ htscallbacks callbacks; /**< user callback chain head */ concat_strc concat; /**< concat() rotating buffers */ usercommand_strc usercmd; /**< pending user shell command */ fspc_strc fspc; /**< error/warning/info counters */ char *userhttptype; int verif_backblue_done; /**< backblue.gif/fade.gif already emitted */ int verif_external_status; coucal dns_cache; /**< DNS resolution cache: hostname -> t_dnscache record */ int dns_cache_nthreads; /**< number of in-flight DNS resolver threads */ /* HTML parsing state */ char _hts_errmsg[HTS_CDLMAXSIZE + 256]; /**< last engine error message */ int _hts_in_html_parsing; int _hts_in_html_done; int _hts_in_html_poll; int _hts_setpause; int _hts_in_mirror; /**< nonzero while a mirror is running */ char **_hts_addurl; /**< extra URLs to inject at runtime */ int _hts_cancel; htsoptstatecancel *cancel; /**< list of URLs flagged for cancellation */ char HTbuff[2048]; unsigned int debug_state; unsigned int tmpnameid; /**< counter for temporary file names */ int is_ended; /**< mirror has finished */ void *warc; /**< open WARC writer (warc_writer*), or NULL */ }; /* Library handles */ #ifndef HTS_DEF_FWSTRUCT_htslibhandles #define HTS_DEF_FWSTRUCT_htslibhandles typedef struct htslibhandles htslibhandles; #endif #ifndef HTS_DEF_FWSTRUCT_htslibhandle #define HTS_DEF_FWSTRUCT_htslibhandle typedef struct htslibhandle htslibhandle; #endif struct htslibhandle { char *moduleName; /**< name of a loaded external module */ void *handle; /**< dlopen() handle for it */ }; struct htslibhandles { int count; /**< number of loaded module handles */ htslibhandle *handles; /**< array of loaded module handles */ }; /* Javascript parser flags */ typedef enum htsparsejava_flags { HTSPARSE_NONE = 0, // don't parse HTSPARSE_DEFAULT = 1, // parse default (all) HTSPARSE_NO_CLASS = 2, // don't parse .java HTSPARSE_NO_JAVASCRIPT = 4, // don't parse .js HTSPARSE_NO_AGGRESSIVE = 8 // don't aggressively parse .js or .java } htsparsejava_flags; /* Link-rewriting style for saved pages (opt->urlmode). */ #ifndef HTS_DEF_DEFSTRUCT_hts_urlmode #define HTS_DEF_DEFSTRUCT_hts_urlmode typedef enum hts_urlmode { HTS_URLMODE_ABSOLUTE = 0, /**< absolute URL (http://host/path) everywhere */ HTS_URLMODE_ABSOLUTE_FILE = 1, /**< legacy file: form, unused */ HTS_URLMODE_RELATIVE = 2, /**< relative link (default) */ HTS_URLMODE_ABSOLUTE_URI = 3, /**< absolute URI from root (/path) */ HTS_URLMODE_KEEP_ORIGINAL = 4, /**< keep the original link, do not rewrite */ HTS_URLMODE_TRANSPARENT_PROXY = 5 /**< transparent-proxy URL */ } hts_urlmode; #endif /* Cache policy for updates and retries (opt->cache). */ #ifndef HTS_DEF_DEFSTRUCT_hts_cachemode #define HTS_DEF_DEFSTRUCT_hts_cachemode typedef enum hts_cachemode { HTS_CACHE_NONE = 0, /**< no cache */ HTS_CACHE_PRIORITY = 1, /**< cache takes priority over the network */ HTS_CACHE_TEST_UPDATE = 2 /**< check for update before reuse (default) */ } hts_cachemode; #endif /* Interactive wizard level (opt->wizard). */ #ifndef HTS_DEF_DEFSTRUCT_hts_wizard #define HTS_DEF_DEFSTRUCT_hts_wizard typedef enum hts_wizard { HTS_WIZARD_NONE = 0, /**< no wizard */ HTS_WIZARD_ASK = 1, /**< wizard asks questions */ HTS_WIZARD_AUTO = 2 /**< wizard runs without asking */ } hts_wizard; #endif /* robots.txt / meta-robots obedience level (opt->robots). */ #ifndef HTS_DEF_DEFSTRUCT_hts_robots #define HTS_DEF_DEFSTRUCT_hts_robots typedef enum hts_robots { HTS_ROBOTS_NEVER = 0, /**< ignore robots rules */ HTS_ROBOTS_SOMETIMES = 1, /**< partial obedience, set by -s */ HTS_ROBOTS_ALWAYS = 2, /**< obey robots rules (default) */ HTS_ROBOTS_ALWAYS_STRICT = 3 /**< obey even strict rules */ } hts_robots; #endif /* What to fetch (opt->getmode bitmask). */ typedef enum hts_getmode { HTS_GETMODE_HTML = 1 << 0, /**< save HTML files */ HTS_GETMODE_NONHTML = 1 << 1, /**< save non-HTML files */ HTS_GETMODE_HTML_FIRST = 1 << 2 /**< fetch HTML first, then the other files */ } hts_getmode; /* Allowed directions in the directory tree (opt->seeker bitmask). */ typedef enum hts_seeker { HTS_SEEKER_DOWN = 1 << 0, /**< may descend into subdirectories */ HTS_SEEKER_UP = 1 << 1 /**< may ascend to parent directories */ } hts_seeker; /* opt->travel: link-following scope in the low byte, flags OR'd in above it. */ typedef enum hts_travel_scope { HTS_TRAVEL_SAME_ADDRESS = 0, /**< stay on the same address (host) */ HTS_TRAVEL_SAME_DOMAIN = 1, /**< stay on the same principal domain */ HTS_TRAVEL_SAME_TLD = 2, /**< stay on the same TLD (e.g. .com) */ HTS_TRAVEL_EVERYWHERE = 7, /**< follow links anywhere on the web */ HTS_TRAVEL_TEST_ALL = 1 << 8 /**< also test forbidden URLs (-t) */ } hts_travel_scope; /* Mask selecting the scope value out of opt->travel. */ #define HTS_TRAVEL_SCOPE_MASK 0xff /* Text progress display detail (opt->verbosedisplay). */ typedef enum hts_verbosedisplay { HTS_VERBOSE_NONE = 0, /**< no animated progress display (default) */ HTS_VERBOSE_SIMPLE = 1, /**< minimal single-line progress */ HTS_VERBOSE_FULL = 2 /**< full animated progress */ } hts_verbosedisplay; /* Delayed file-type resolution policy (opt->savename_delayed). */ typedef enum hts_savename_delayed { HTS_SAVENAME_DELAYED_NONE = 0, /**< resolve the type immediately */ HTS_SAVENAME_DELAYED_SOFT = 1, /**< delay the type check when unknown */ HTS_SAVENAME_DELAYED_HARD = 2 /**< always delay the type check (default) */ } hts_savename_delayed; /* Saved-name length layout (opt->savename_83). */ typedef enum hts_savename_83 { HTS_SAVENAME_83_LONG = 0, /**< long file names (default) */ HTS_SAVENAME_83_DOS = 1, /**< DOS 8.3 names (ISO9660 level 1) */ HTS_SAVENAME_83_ISO9660 = 2 /**< ISO9660 level 2 names (up to 31 chars) */ } hts_savename_83; /* Host-banning triggers (opt->hostcontrol bitmask). */ typedef enum hts_hostcontrol { HTS_HOSTCONTROL_BAN_TIMEOUT = 1 << 0, /**< ban a timing-out host */ HTS_HOSTCONTROL_BAN_SLOW = 1 << 1 /**< ban a too-slow host */ } hts_hostcontrol; #ifndef HTS_DEF_FWSTRUCT_lien_buffers #define HTS_DEF_FWSTRUCT_lien_buffers typedef struct lien_buffers lien_buffers; #endif /* * Per-mirror options and state block. This is the central HTTrack parameters * structure: created by hts_create_opt(), it carries every tunable option for * one mirror and embeds the live engine state, and is then consumed by * hts_main2(). * * Callers normally configure it through the command-line argv vector (the * option parser), not by writing fields directly. The only fields real * consumers poke directly are 'log' and 'errlog' (set either to NULL to * silence logging). */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif struct httrackp { size_t size_httrackp; /**< size of this structure (version/ABI guard) */ /* */ hts_wizard wizard; /**< interactive wizard level (none/ask/auto) */ hts_boolean flush; /**< fflush() log files after each write */ int travel; /**< link-following scope (same domain, etc.) */ int seeker; /**< allowed direction: go up and/or down the tree */ int depth; /**< maximum recursion depth (-rN) */ int extdepth; /**< maximum recursion depth outside the start domain */ hts_urlmode urlmode; /**< saved-link rewriting style (relative, absolute, etc.) */ hts_boolean no_type_change; // do not change file type according to MIME hts_log_type debug; /**< debug logging level */ int getmode; /**< what to fetch (HTML, images, ...) bitmask */ FILE *log; /**< informational log stream; NULL mutes it */ FILE *errlog; /**< error log stream; NULL mutes it */ LLint maxsite; /**< max total bytes for the whole mirror */ LLint maxfile_nonhtml; /**< max bytes per non-HTML file */ LLint maxfile_html; /**< max bytes per HTML file */ int maxsoc; /**< max simultaneous sockets (-cN) */ LLint fragment; /**< split site after this many bytes */ hts_tristate nearlink; /**< also fetch images/data adjacent to a page but off-site */ hts_boolean makeindex; /**< build a top-level index.html */ hts_boolean kindex; /**< build a keyword index */ hts_tristate delete_old; /**< delete locally obsolete files after update */ int timeout; /**< connection timeout in seconds */ int rateout; /**< minimum transfer rate (bytes/s) before abort */ int maxtime; /**< max total mirror duration in seconds */ int maxrate; /**< max transfer rate cap (bytes/s) */ float maxconn; /**< max connections per second */ int waittime; /**< scheduled start time (wall-clock seconds) */ hts_cachemode cache; /**< cache generation mode */ hts_boolean shell; /**< driven by a shell over stdin/stdout pipes */ t_proxy proxy; /**< proxy configuration */ hts_savename_83 savename_83; /**< saved-name length layout (long/DOS/ISO9660) */ int savename_type; /**< saved-name layout (original tree, flat, ...) */ String savename_userdef; /**< user-defined name template (e.g. %h%p/%n%q.%t) */ hts_savename_delayed savename_delayed; /**< delayed type-check policy */ hts_boolean delayed_cached; // delayed type check can be cached to speedup updates hts_boolean mimehtml; /**< produce a single MIME/MHTML archive */ hts_boolean user_agent_send; /**< send a User-Agent header */ String user_agent; /**< User-Agent value (e.g. httrack/1.0) */ String referer; /**< Referer value to send */ String from; /**< From value to send */ String path_log; /**< directory for cache and logs */ String path_html; /**< output directory for the mirror */ String path_html_utf8; /**< output directory for the mirror, UTF-8 form */ String path_bin; /**< directory for HTML templates */ int retry; /**< extra retries on a failed transfer */ hts_boolean makestat; /**< maintain a transfer-statistics log */ hts_boolean maketrack; /**< maintain an operations-statistics log */ int parsejava; /**< Java/JS parsing mode; see htsparsejava_flags */ int hostcontrol; /**< ban slow/timing-out hosts; see hts_hostcontrol bits */ hts_tristate errpage; /**< generate an error page on 404 and similar */ hts_boolean check_type; /**< probe unknown-type links (cgi/asp/dir) and follow moves */ hts_boolean all_in_cache; /**< keep all retrieved data in the cache */ hts_robots robots; /**< robots.txt handling level */ hts_tristate external; /**< render external links as error pages */ hts_boolean passprivacy; /**< strip passwords from external links */ hts_boolean includequery; /**< include the query string in saved names */ hts_boolean mirror_first_page; /**< only mirror the links of the first page */ String sys_com; /**< system command to run */ hts_boolean sys_com_exec; /**< actually execute sys_com */ hts_boolean accept_cookie; /**< accept and send cookies */ t_cookie *cookie; /**< cookie store */ hts_boolean http10; /**< force HTTP/1.0 */ hts_boolean nokeepalive; /**< disable keep-alive */ hts_boolean nocompression; /**< disable content compression */ hts_boolean sizehack; /**< treat same-size response as "updated" */ hts_boolean urlhack; // force "url normalization" to avoid loops hts_boolean tolerant; /**< accept an incorrect Content-Length */ hts_tristate parseall; /**< parse aggressively, including unknown tags with links */ hts_boolean parsedebug; /**< parser debug mode */ hts_boolean norecatch; /**< do not re-fetch files the user deleted locally */ hts_verbosedisplay verbosedisplay; /**< animated text progress display */ String footer; /**< footer/info line injected into pages */ int maxcache; /**< in-memory cache backing limit (bytes) */ hts_boolean ftp_proxy; /**< use the HTTP proxy for FTP too */ String filelist; /**< file listing URLs to include */ String urllist; /**< file listing filters to include */ htsfilters filters; /**< filter pointers (+/-pattern rules) */ hash_struct *hash; // hash structure lien_url **liens; // links int lien_tot; // top index of "links" heap (always out-of-range) lien_buffers *liensbuf; // links buffers robots_wizard *robotsptr; // robots ptr String lang_iso; /**< Accept-Language value (en, fr, ...) */ String accept; // Accept: String headers; // Additional headers String mimedefs; // ext1=mimetype1\next2=mimetype2.. String mod_blacklist; /**< blacklisted modules */ hts_boolean convert_utf8; // filenames UTF-8 conversion (3.46) // int maxlink; /**< max number of links */ int maxfilter; /**< max number of filters */ // const char *exec; /**< path of the running executable */ // hts_boolean quiet; /**< suppress non-wizard questions */ hts_boolean keyboard; /**< poll stdin for keyboard input */ hts_boolean bypass_limits; // bypass built-in limits hts_boolean background_on_suspend; // background process on suspend signal // hts_boolean is_update; /**< this run is an update (show "File updated...") */ hts_boolean dir_topindex; /**< rebuild the top index afterwards */ // // callbacks t_hts_htmlcheck_callbacks *callbacks_fun; /**< user HTML/parsing callback table */ // store library handles htslibhandles libHandles; /**< loaded external module handles */ // htsoptstate state; /**< embedded live engine state */ String strip_query; /**< query keys to drop when deduping URLs (-strip-query); appended at the tail to keep field offsets stable */ hts_boolean no_www_dedup; /**< with urlhack, keep www.host distinct from host */ hts_boolean no_slash_dedup; /**< with urlhack, keep redundant // in paths */ hts_boolean no_query_dedup; /**< with urlhack, keep query-argument order */ String cookies_file; /**< extra Netscape cookies.txt to preload (--cookies-file) */ int pause_min_ms; /**< inter-file pause lower bound, ms (0=off, #185) */ int pause_max_ms; /**< inter-file pause upper bound, ms */ String why_url; /**< URL to diagnose (--why): print the deciding filter rule and exit without crawling */ String warc_file; /**< WARC output: WARC_AUTONAME for --warc, or the --warc-file basename (appended at the tail: ABI) */ LLint warc_max_size; /**< --warc-max-size: rotate the archive past this many bytes (<=0: single file). Tail: ABI */ hts_boolean warc_cdx; /**< --warc-cdx: write a sorted CDXJ index next to the archive. Tail: ABI */ hts_boolean warc_wacz; /**< --wacz: package archive+index+pages as a WACZ zip (implies --warc + --warc-cdx). Tail: ABI */ }; /* Running statistics for a mirror. */ #ifndef HTS_DEF_FWSTRUCT_hts_stat_struct #define HTS_DEF_FWSTRUCT_hts_stat_struct typedef struct hts_stat_struct hts_stat_struct; #endif struct hts_stat_struct { LLint HTS_TOTAL_RECV; /**< total bytes received from the network */ LLint stat_bytes; /**< total bytes written to disk */ TStamp stat_timestart; /**< mirror start time */ // LLint total_packed; /**< compressed bytes received (on the wire) */ LLint total_unpacked; /**< bytes after decompression */ int total_packedfiles; /**< number of compressed files */ // TStamp istat_timestart[2]; /**< window start times for the instantaneous rate */ LLint istat_bytes[2]; /**< window byte counts for the instantaneous rate */ TStamp istat_reference01; /**< reference timestamp handed from window #0 to #1 */ int istat_idlasttimer; /**< id of the timer that last produced a stat */ // int stat_files; /**< number of files written */ int stat_updated_files; /**< number of files updated */ int stat_background; /**< number of files written in the background */ // int stat_nrequests; /**< number of requests issued on sockets */ int stat_sockid; /**< total number of sockets ever allocated */ int stat_nsocket; /**< current number of open sockets */ int stat_errors; /**< number of errors */ int stat_errors_front; /**< errors at the very first level */ int stat_warnings; /**< number of warnings */ int stat_infos; /**< number of info messages */ int nbk; /**< background-anticipated files now completed */ LLint nb; /**< bytes currently being transferred (estimate) */ // LLint rate; /**< current transfer rate */ // TStamp last_connect; /**< time of the last connect() call */ TStamp last_request; /**< time of the last request issued */ }; /* Extra per-request parameters (mirrors httrackp request options). */ #ifndef HTS_DEF_FWSTRUCT_htsrequest_proxy #define HTS_DEF_FWSTRUCT_htsrequest_proxy typedef struct htsrequest_proxy htsrequest_proxy; #endif struct htsrequest_proxy { int active; /**< nonzero if a proxy is used for this request */ const char *name; /**< proxy host name */ int port; /**< proxy port */ const char *bindhost; /**< local address to bind the outgoing socket to */ }; #ifndef HTS_DEF_FWSTRUCT_htsrequest #define HTS_DEF_FWSTRUCT_htsrequest typedef struct htsrequest htsrequest; #endif struct htsrequest { short int user_agent_send; /**< send a User-Agent header */ short int http11; /**< sign the request as HTTP/1.1 rather than HTTP/1.0 */ short int nokeepalive; /**< disable keep-alive */ short int range_used; /**< a Range header is in use */ short int nocompression; /**< disable compression */ short int flush_garbage; // recycled const char *user_agent; /**< User-Agent value */ const char *referer; /**< Referer value */ const char *from; /**< From value */ const char *lang_iso; /**< Accept-Language value */ const char *accept; /**< Accept value */ const char *headers; /**< extra request headers */ htsrequest_proxy proxy; /**< proxy for this request */ }; /* Result of a connection / header fetch. */ #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif struct htsblk { int statuscode; /**< HTTP status code; -1=error, 200=OK, ... (RFC1945) */ short int notmodified; /**< page/file was not modified (not transferred) */ short int is_write; /**< output goes to disk (out) vs memory (adr) */ short int is_chunk; /**< chunked transfer encoding */ short int compressed; /**< body is compressed */ short int empty; /**< body is empty */ short int keep_alive; /**< connection is keep-alive */ short int keep_alive_trailers; /**< keep-alive with trailers extension */ int keep_alive_t; /**< keep-alive timeout (seconds) */ int keep_alive_max; /**< keep-alive max number of requests */ char *adr; /**< in-memory body buffer; NULL if empty */ char *headers; /**< received headers, if any */ FILE *out; /**< destination file when is_write=1 */ LLint size; /**< body size */ char msg[80]; /**< failure message ("" if none) */ char contenttype[HTS_MIMETYPE_SIZE]; // content-type (e.g. "text/html") char charset[HTS_MIMETYPE_SIZE]; // charset (e.g. "iso-8859-1") char contentencoding[HTS_MIMETYPE_SIZE]; // content-encoding (e.g. "gzip") char *location; /**< resolved Location target, if any */ LLint totalsize; /**< total size to download (-1=unknown) */ short int is_file; /**< 1 if a file descriptor rather than a socket */ T_SOC soc; /**< socket id */ SOCaddr address; /**< peer IP address */ int address_size; // IP address structure length (unused internally) FILE *fp; /**< file handle for file:// */ #if HTS_USEOPENSSL short int ssl; /**< nonzero if this is an SSL connection (https) */ // BIO* ssl_soc; // SSL structure SSL *ssl_con; /**< SSL connection structure */ #endif char lastmodified[64]; /**< Last-Modified value */ char etag[256]; /**< ETag value */ char cdispo[256]; /**< Content-Disposition filename (truncated) */ LLint crange; /**< Content-Range length */ LLint crange_start; /**< Content-Range start offset */ LLint crange_end; /**< Content-Range end offset */ int debugid; /**< connection debug id */ /* */ htsrequest req; /**< parameters used for the request */ /* Restart-whole signal: a resume this response rejected (unusable 206) must retry with no Range, else a surviving partial/temp-ref loops (#581). */ hts_boolean refetch_wholefile; char *warc_reqhdr; /**< stashed raw request header block for WARC (or NULL) */ char * warc_resphdr; /**< stashed raw response header block for WARC (or NULL) */ int warc_truncated; /**< WARC-Truncated reason for a cap-truncated body (WARC_TRUNC_*, 0=none). Tail: ABI */ char *warc_rawpath; /**< verbatim WARC: spooled compressed body path, or NULL (owns the file; unlinked on free). Tail: ABI */ LLint warc_rawsize; /**< byte length of warc_rawpath. Tail: ABI */ /*char digest[32+2]; // md5 digest generated by the engine ("" if none) */ }; /* A single link in the crawl. */ #ifndef HTS_DEF_FWSTRUCT_lien_url #define HTS_DEF_FWSTRUCT_lien_url typedef struct lien_url lien_url; #endif struct lien_url { char *adr; /**< host/address part of the URL */ char *fil; /**< remote file path */ char *sav; /**< local save name (with any path) */ char *cod; /**< codebase path for a Java class, if any */ char *former_adr; /**< original address before a move; may be NULL */ char *former_fil; /**< original remote file before a move; may be NULL */ int premier; /**< index of the first link that seeded this domain */ int precedent; /**< index of the link that referenced this one */ int depth; /**< remaining allowed depth; >0 strong, 0 weak */ int pass2; /**< second-pass marker; -1 means handled in background */ char link_import; /**< imported after a move; skip the usual up/down rules */ int retry; /**< remaining retries */ int testmode; /**< test only: send just a HEAD */ hts_boolean refetch_whole; /**< force a whole-file GET, ignoring any partial/temp-ref resume, so a rejected 206 can't loop (#581) */ }; /* A file being fetched in the background. */ #ifndef HTS_DEF_FWSTRUCT_lien_back #define HTS_DEF_FWSTRUCT_lien_back typedef struct lien_back lien_back; #endif struct lien_back { #if DEBUG_CHECKINT char magic; #endif char url_adr[HTS_URLMAXSIZE * 2]; /**< host/address part of the URL */ char url_fil[HTS_URLMAXSIZE * 2]; /**< remote file path */ char url_sav[HTS_URLMAXSIZE * 2]; /**< local save name (with any path) */ char referer_adr[HTS_URLMAXSIZE * 2]; /**< referer page host/address */ char referer_fil[HTS_URLMAXSIZE * 2]; /**< referer page file */ char location_buffer[HTS_URLMAXSIZE * 2]; /**< Location on a move (302, ...) */ char *tmpfile; /**< temporary save name (compressed) */ char tmpfile_buffer[HTS_URLMAXSIZE * 2]; /**< storage for tmpfile */ char send_too[1024]; /**< data to send together with the header */ int status; /**< -1=unused, 0=ready, >0=operation in progress */ int locked; /**< locked (reserved) */ int testmode; /**< test mode */ int timeout; /**< timeout in seconds (0=none) */ TStamp timeout_refresh; /**< last activity time, for timeout tracking */ int rateout; /**< minimum tolerated rate in bytes/s (0=none) */ TStamp rateout_time; /**< start time for the rate window */ LLint maxfile_nonhtml; /**< max bytes for a non-HTML file */ LLint maxfile_html; /**< max bytes for an HTML file */ htsblk r; /**< per-object result block */ int is_update; /**< update mode */ int head_request; /**< this is a HEAD request */ LLint range_req_size; /**< Range request size used */ TStamp ka_time_start; /**< keep-alive refresh start time */ // int http11; /**< sign the request as HTTP/1.1 rather than HTTP/1.0 */ int is_chunk; /**< chunked transfer */ char *chunk_adr; /**< buffer for the chunk being loaded */ LLint chunk_size; /**< size of the chunk being loaded */ LLint chunk_blocksize; /**< data size declared by the chunk */ LLint compressed_size; /**< compressed size (stats only) */ char info[256]; /**< status text, e.g. for FTP */ int stop_ftp; /**< stop flag for FTP */ int finalized; /**< finalized (memory optimization) */ int early_add; /**< was added before the link heap saw it */ #if DEBUG_CHECKINT char magic2; #endif }; #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htssniff.h0000644000175000017500000000366615230602340011607 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998-2017 Xavier Roche and other contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Important notes: - We hereby ask people using this source NOT to use it in purpose of grabbing emails addresses, or collecting any other private information on persons. This would disgrace our work, and spoil the many hours we spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: MIME magic-byte consistency checks */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSSNIFF_DEFH #define HTSSNIFF_DEFH #include #include "htsglobal.h" /* Leading-body window read to arbitrate a wire/extension MIME conflict. */ #define HTS_SNIFF_LEN 512 /* Can a magic rule ever confirm this MIME? (whether sniffing is worth it) */ hts_boolean hts_sniff_mime_known(const char *mime); /* TRUE when the leading body bytes are consistent with the claimed MIME; FALSE on unknown MIME, unknown magic, or too-short data (fail-safe). */ hts_boolean hts_sniff_mime_consistent(const void *data, size_t size, const char *mime); #endif httrack-3.49.14/src/htsnet.h0000644000175000017500000003047715230602340011270 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Net definitions */ /* Used in .c files that needs connect() functions and so */ /* Note: includes htsbasenet.h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsnet.h Socket/connection layer. Provides SOCaddr, an opaque IPv4/IPv6 socket-address wrapper, plus accessor macros so callers never branch on address family. Builds on htsbasenet.h. */ #ifndef HTS_DEFNETH #define HTS_DEFNETH /* basic net definitions */ #include "htsglobal.h" #include "htsbasenet.h" #include "htssafe.h" #include #include #ifdef _WIN32 // for read #include // for FindFirstFile #include typedef USHORT in_port_t; typedef ADDRESS_FAMILY sa_family_t; #else #define INVALID_SOCKET -1 #include #include #include #include #include /* Force BSD_COMP for Sun environments. */ #ifndef BSD_COMP #define BSD_COMP #endif #include /* gethostname & co */ #ifndef _WIN32 #include #endif /* inet_addr */ #include /* normally not needed; provide in_addr_t where the platform lacks it */ #ifndef HTS_DO_NOT_REDEFINE_in_addr_t typedef unsigned long in_addr_t; #endif #endif #ifdef __cplusplus extern "C" { #endif /** Raw IP address type: in6_addr when IPv6 is enabled, else in_addr. */ #if HTS_INET6 != 0 typedef struct in6_addr INaddr; #else typedef struct in_addr INaddr; #endif /** Opaque socket address holding either an IPv4 or IPv6 endpoint. Use the SOCaddr_* accessors rather than touching m_addr; sa_family selects the active union member. */ #ifndef HTS_DEF_FWSTRUCT_SOCaddr #define HTS_DEF_FWSTRUCT_SOCaddr typedef struct SOCaddr SOCaddr; #endif struct SOCaddr { union { /* Generic version, for network functions such as getnameinfo() */ struct sockaddr sa; /* IPv4 */ struct sockaddr_in in; #if HTS_INET6 != 0 /* IPv6 */ struct sockaddr_in6 in6; #endif } m_addr; }; /** Pointer to the port field (network byte order) for the active family. Asserts on NULL or an unset/unknown family. */ static HTS_INLINE HTS_UNUSED in_port_t * SOCaddr_sinport_(SOCaddr *const addr, const char *file, const int line) { assertf_(addr != NULL, file, line); switch (addr->m_addr.sa.sa_family) { case AF_INET: return &addr->m_addr.in.sin_port; break; #if HTS_INET6 != 0 case AF_INET6: return &addr->m_addr.in6.sin6_port; break; #endif default: assertf_(!"invalid structure", file, line); return 0; break; } } /** Length of the active sockaddr (sockaddr_in or sockaddr_in6), or 0 if the family is unset/unknown. The 0 case doubles as the "not valid" test. */ static HTS_INLINE HTS_UNUSED socklen_t SOCaddr_size_(const SOCaddr *const addr, const char *file, const int line) { assertf_(addr != NULL, file, line); switch (addr->m_addr.sa.sa_family) { case AF_INET: return sizeof(addr->m_addr.in); break; #if HTS_INET6 != 0 case AF_INET6: return sizeof(addr->m_addr.in6); break; #endif default: return 0; break; } } /** Reset to the unset state (family AF_UNSPEC), making the address invalid. */ static HTS_INLINE HTS_UNUSED void SOCaddr_clear_(SOCaddr *const addr, const char *file, const int line) { assertf_(addr != NULL, file, line); addr->m_addr.sa.sa_family = AF_UNSPEC; } /* SOCaddr accessors; server is an lvalue SOCaddr, not a pointer. */ #define SOCaddr_sinfamily(server) \ ((server).m_addr.sa.sa_family) /* AF_INET / AF_INET6 */ #define SOCaddr_sinport(server) \ (*SOCaddr_sinport_(&(server), __FILE__, \ __LINE__)) /* port lvalue (network order) */ #define SOCaddr_size(server) \ (SOCaddr_size_(&(server), __FILE__, __LINE__)) /* active sockaddr length */ #define SOCaddr_is_valid(server) \ (SOCaddr_size_(&(server), __FILE__, __LINE__) != \ 0) /* nonzero if family is set */ #define SOCaddr_clear(server) SOCaddr_clear_(&(server), __FILE__, __LINE__) #define SOCaddr_sockaddr(server) \ ((server).m_addr.sa) /* generic struct sockaddr view */ #define SOCaddr_capacity(server) \ sizeof((server).m_addr) /* full union size, for recvfrom() etc. */ /** Address family to bind/listen with: AF_INET6 when IPv6 is enabled (dual stack), else AF_INET. */ #if HTS_INET6 != 0 #define AFinet AF_INET6 #else #define AFinet AF_INET #endif /** Set the port (host-order argument, stored network-order) on the active * family. */ #define SOCaddr_initport(server, port) \ do { \ SOCaddr_sinport(server) = htons((in_port_t) (port)); \ } while (0) /** Initialize as an all-zero IPv4 wildcard (INADDR_ANY) address; returns its sockaddr length. */ static HTS_INLINE HTS_UNUSED socklen_t SOCaddr_initany_(SOCaddr *const addr, const char *file, const int line) { assertf_(addr != NULL, file, line); memset(&addr->m_addr.in, 0, sizeof(addr->m_addr.in)); addr->m_addr.in.sin_family = AF_INET; return SOCaddr_size_(addr, file, line); } /** Initialize server as an IPv4 wildcard (INADDR_ANY) address. */ #define SOCaddr_initany(server) \ do { \ SOCaddr_initany_(&(server), __FILE__, __LINE__); \ } while (0) /** Populate server from data. data_size selects the source form: a full sockaddr_in / sockaddr_in6, or a raw 4-byte (IPv4) / 16-byte (IPv6) address with port zeroed. Any other size leaves an AF_INET shell. Returns the resulting sockaddr length. */ static HTS_UNUSED socklen_t SOCaddr_copyaddr_(SOCaddr *const server, const void *data, const size_t data_size, const char *file, const int line) { assertf_(server != NULL, file, line); assertf_(data != NULL, file, line); if (data_size == sizeof(struct sockaddr_in)) { memcpy(&server->m_addr.in, data, sizeof(struct sockaddr_in)); assertf_(server->m_addr.sa.sa_family == AF_INET, file, line); #if HTS_INET6 != 0 } else if (data_size == sizeof(struct sockaddr_in6)) { memcpy(&server->m_addr.in6, data, sizeof(struct sockaddr_in6)); assertf_(server->m_addr.sa.sa_family == AF_INET6, file, line); #endif } else if (data_size == 4) { memset(&server->m_addr.in, 0, sizeof(server->m_addr.in)); server->m_addr.in.sin_family = AF_INET; server->m_addr.in.sin_port = 0; memcpy(&server->m_addr.in.sin_addr, data, 4); #if HTS_INET6 != 0 } else if (data_size == 16) { memset(&server->m_addr.in6, 0, sizeof(server->m_addr.in6)); server->m_addr.in6.sin6_family = AF_INET6; server->m_addr.in6.sin6_port = 0; memcpy(&server->m_addr.in6.sin6_addr, data, 16); #endif } else { server->m_addr.in.sin_family = AF_INET; } return SOCaddr_size_(server, file, line); } /** Copy hpaddr (length hpsize) into server, writing the result length into the lvalue server_len (int). See SOCaddr_copyaddr_ for accepted forms. */ #define SOCaddr_copyaddr(server, server_len, hpaddr, hpsize) \ do { \ server_len = (int) SOCaddr_copyaddr_(&(server), hpaddr, hpsize, __FILE__, \ __LINE__); \ } while (0) /** Like SOCaddr_copyaddr but discards the result length. */ #define SOCaddr_copyaddr2(server, hpaddr, hpsize) \ do { \ (void) SOCaddr_copyaddr_(&(server), hpaddr, hpsize, __FILE__, __LINE__); \ } while (0) /** Copy one SOCaddr (src) into another (dest), preserving family and port. */ #define SOCaddr_copy_SOCaddr(dest, src) \ do { \ SOCaddr_copyaddr_(&(dest), &(src).m_addr.sa, SOCaddr_size(src), __FILE__, \ __LINE__); \ } while (0) /** Write the numeric (dotted/colon) host of ss into namebuf (capacity namebuflen), scope id stripped. On failure namebuf becomes "". */ static HTS_UNUSED void SOCaddr_inetntoa_(char *namebuf, size_t namebuflen, SOCaddr *const ss, const char *file, const int line) { assertf_(namebuf != NULL, file, line); assertf_(ss != NULL, file, line); if (getnameinfo(&ss->m_addr.sa, sizeof(ss->m_addr), namebuf, namebuflen, NULL, 0, NI_NUMERICHOST) == 0) { /* remove scope id(s) */ char *const pos = strchr(namebuf, '%'); if (pos != NULL) { *pos = '\0'; } } else { namebuf[0] = '\0'; } } /** Numeric host of ss into namebuf (capacity namebuflen); "" on failure. */ #define SOCaddr_inetntoa(namebuf, namebuflen, ss) \ SOCaddr_inetntoa_(namebuf, namebuflen, &(ss), __FILE__, __LINE__) /** Single-char family tag: '1' for IPv4, '2' otherwise (used in the cache). */ #define SOCaddr_getproto(ss) \ (SOCaddr_size(ss) == sizeof(struct sockaddr_in) ? '1' : '2') /** Length type for socket APIs (getsockname, accept, ...). */ typedef socklen_t SOClen; #if HTS_INET6 != 0 /** Resolver backend: getaddrinfo/freeaddrinfo as a swappable pair, so the self-test can script DNS answers (families, multiplicity, errors) in-process. The free function must match its getaddrinfo (a fake allocates its own chain), hence the pair. */ /* Winsock's resolver is __stdcall; a plain pointer only compiles on x64, where there is one convention. Backend implementations must carry this too. */ #ifdef _WIN32 #define HTS_RESOLVER_CALL WSAAPI #else #define HTS_RESOLVER_CALL #endif typedef struct hts_resolver_backend { int(HTS_RESOLVER_CALL *getaddrinfo)(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void(HTS_RESOLVER_CALL *freeaddrinfo)(struct addrinfo *res); } hts_resolver_backend; /** Install a resolver backend for the process; NULL restores the libc default. Test-only seam, not thread-safe; callers must serialize against resolves. */ void hts_dns_set_resolver_backend(const hts_resolver_backend *backend); #endif #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htsname.h0000644000175000017500000001017215230602340011410 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* savename routine (compute output filename) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSNAME_DEFH #define HTSNAME_DEFH #include "htsglobal.h" #define DELAYED_EXT "delayed" #define IS_DELAYED_EXT(a) ( ((a) != NULL) && ((a)[0] != 0) && strendwith_(a, "." DELAYED_EXT) ) HTS_STATIC int strendwith_(const char *a, const char *b) { int i, j; for(i = 0; a[i] != 0; i++) ; for(j = 0; b[j] != 0; j++) ; while(i >= 0 && j >= 0 && a[i] == b[j]) { i--; j--; } return (j == -1); } #define CACHE_REFNAME "hts-cache/ref" /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_lien_url #define HTS_DEF_FWSTRUCT_lien_url typedef struct lien_url lien_url; #endif #ifndef HTS_DEF_FWSTRUCT_struct_back #define HTS_DEF_FWSTRUCT_struct_back typedef struct struct_back struct_back; #endif #ifndef HTS_DEF_FWSTRUCT_cache_back #define HTS_DEF_FWSTRUCT_cache_back typedef struct cache_back cache_back; #endif #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif #ifndef HTS_DEF_FWSTRUCT_lien_back #define HTS_DEF_FWSTRUCT_lien_back typedef struct lien_back lien_back; #endif #ifndef HTS_DEF_FWSTRUCT_lien_adrfil #define HTS_DEF_FWSTRUCT_lien_adrfil typedef struct lien_adrfil lien_adrfil; #endif #ifndef HTS_DEF_FWSTRUCT_lien_adrfilsave #define HTS_DEF_FWSTRUCT_lien_adrfilsave typedef struct lien_adrfilsave lien_adrfilsave; #endif // note: 'headers' can either be null, or incomplete (only r member filled) int url_savename(lien_adrfilsave *const afs, lien_adrfil *const former, const char *referer_adr, const char *referer_fil, httrackp * opt, struct_back * sback, cache_back * cache, hash_struct * hash, int ptr, int numero_passe, const lien_back * headers); void standard_name(char *b, size_t bsize, const char *dot_pos, const char *nom_pos, const char *fil_complete, int short_ver); void url_savename_addstr(char *d, const char *s); /* Contested wire-vs-ext verdict that a body sniff could settle (htssniff.h). */ int hts_ext_sniff_wanted(httrackp *opt, const char *wiremime, const char *file); char *url_md5(char *digest_buffer, const char *fil_complete); void url_savename_refname(const char *adr, const char *fil, char *filename); char *url_savename_refname_fullpath(httrackp * opt, const char *adr, const char *fil); /* Remove the temp-ref for (adr,fil); HTS_TRUE if it was removed. */ hts_boolean url_savename_refname_remove(httrackp *opt, const char *adr, const char *fil); #endif #endif httrack-3.49.14/src/htsmodules.h0000644000175000017500000001370315230602340012143 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsmodules.h subroutines: */ /* external modules (parsers) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsmodules.h Loadable-parser (external module) interface. The engine hands a downloaded object to a module via htsmoduleStruct; the module reports discovered links back through the addLink callback. */ #ifndef HTS_MODULES #define HTS_MODULES /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_lien_url #define HTS_DEF_FWSTRUCT_lien_url typedef struct lien_url lien_url; #endif #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_struct_back #define HTS_DEF_FWSTRUCT_struct_back typedef struct struct_back struct_back; #endif #ifndef HTS_DEF_FWSTRUCT_cache_back #define HTS_DEF_FWSTRUCT_cache_back typedef struct cache_back cache_back; #endif #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif /** Callback a module invokes to report a discovered link. str: the per-object context the module was called with. link: link to add (absolute or relative); the engine copies it. Returns 1 if the engine accepted/queued the link, 0 if it was rejected. */ #ifndef HTS_DEF_FWSTRUCT_htsmoduleStruct #define HTS_DEF_FWSTRUCT_htsmoduleStruct typedef struct htsmoduleStruct htsmoduleStruct; #endif typedef int (*t_htsAddLink)(htsmoduleStruct *str, char *link); /** Per-object context passed to a parser module for one downloaded file. Field access classes are noted; engine owns all pointers unless stated. */ struct htsmoduleStruct { /* Read-only elements */ const char *filename; /* filename (C:\My Web Sites\...) */ int size; /* size of filename (should be > 0) */ const char *mime; /* MIME type of the object */ const char *url_host; /* incoming hostname (www.foo.com) */ const char *url_file; /* incoming filename (/bar/bar.gny) */ /* Write-only */ const char *wrapper_name; /* name of wrapper (static string) */ char *err_msg; /* if an error occurred, the error message (max. 1KB) */ /* Read/Write */ int relativeToHtmlLink; /* set this to 1 if all urls you pass to addLink are in fact relative to the html file where your module was originally */ /* Callbacks */ t_htsAddLink addLink; /* call this function when links are being detected. it if not your responsability to decide if the engine will keep them, or not. */ /* Optional */ char *localLink; /* if non null, the engine will write there the local relative filename of the link added by addLink(), or the absolute path if the link was refused by the wizard */ int localLinkSize; /* size of the optionnal buffer */ /* User-defined */ void *userdef; /* can be used by callback routines */ /* The parser httrackp structure (may be used) */ httrackp *opt; /* Internal use - please don't touch */ struct_back *sback; cache_back *cache; hash_struct *hashptr; int numero_passe; /* */ int *ptr_; const char *page_charset_; /* Internal use - please don't touch */ }; #ifdef __cplusplus extern "C" { #endif /** Module lifecycle hooks. Init/PlugInit return 1 on success, 0 on failure; Exit returns its own status (ignored by the engine). */ typedef int (*t_htsWrapperInit)(char *fn, char *args); typedef int (*t_htsWrapperExit)(void); typedef int (*t_htsWrapperPlugInit)(char *args); /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /** Capabilities string ("-noV6", "-nossl", ...) followed by "+name" for each loaded module. Returned pointer aliases opt->state.HTbuff; do not free, and it is overwritten by the next call. */ HTSEXT_API const char *hts_get_version_info(httrackp *opt); /** Static capabilities string set by htspe_init(); valid for the process lifetime, do not free. */ HTSEXT_API const char *hts_is_available(void); /** Initialize the module subsystem (idempotent): builds the capabilities string and, on Windows, hardens the DLL search path. */ extern void htspe_init(void); /** Tear-down counterpart of htspe_init(); currently a no-op. */ extern void htspe_uninit(void); /** Run the external-parser callbacks for the object described by str. Returns the parse callback result (>=0) on a handled object, or -1 if no module claimed it or its wrapper_name is blacklisted. */ extern int hts_parse_externals(htsmoduleStruct *str); /** Nonzero if IPv6 support was compiled in (== HTS_INET6). */ extern int V6_is_available; #endif #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htsmd5.h0000644000175000017500000000367715230602340011171 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsmd5.c subroutines: */ /* generate a md5 hash */ /* */ /* Written March 1993 by Branko Lankester */ /* Modified June 1993 by Colin Plumb for altered md5.c. */ /* Modified October 1995 by Erik Troan for RPM */ /* Modified 2000 by Xavier Roche for domd5mem */ /* ------------------------------------------------------------ */ #ifndef HTSMD5_DEFH #define HTSMD5_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE int domd5mem(const char *buf, size_t len, char *digest, int asAscii); unsigned long int md5sum32(const char *buff); void md5selftest(void); #endif #endif httrack-3.49.14/src/htsurlport.h0000644000175000017500000000356515230602340012207 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: TCP port parser, shared by the engine, htsserver and */ /* proxytrack */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSURLPORT_DEFH #define HTSURLPORT_DEFH #include "htsglobal.h" /* Parse the port text "a" (after the ':', up to the end of the string): TRUE and *port set for a bare decimal in 1..65535, else FALSE and *port left alone. Not sscanf("%d"), which range-checks nothing and wraps past INT_MAX. Its own file so proxytrack, which does not link the library, can share it. */ hts_boolean hts_parse_url_port(const char *a, int *port); #endif httrack-3.49.14/src/htslib.h0000644000175000017500000005701715230602340011247 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Subroutines .h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ // Fichier librairie .h #ifndef HTS_DEFH #define HTS_DEFH #include "httrack-library.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_htsrequest #define HTS_DEF_FWSTRUCT_htsrequest typedef struct htsrequest htsrequest; #endif #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif #ifndef HTS_DEF_FWSTRUCT_t_dnscache #define HTS_DEF_FWSTRUCT_t_dnscache typedef struct t_dnscache t_dnscache; #endif #ifndef HTS_DEF_FWSTRUCT_lien_adrfil #define HTS_DEF_FWSTRUCT_lien_adrfil typedef struct lien_adrfil lien_adrfil; #endif #ifndef HTS_DEF_FWSTRUCT_lien_adrfilsave #define HTS_DEF_FWSTRUCT_lien_adrfilsave typedef struct lien_adrfilsave lien_adrfilsave; #endif /* définitions globales */ #include "htsglobal.h" #include "htsurlport.h" /* basic net definitions */ #include "htsbase.h" #include "htsbasenet.h" #include "htsnet.h" #include "htsdefines.h" /* readdir() */ #ifndef _WIN32 #include #include #endif /* cookies et auth */ #include "htsbauth.h" // Attention, définition existante également dans le shell // (à modifier avec celle-ci) #define POSTTOK "?>post" #include "htsopt.h" #define READ_ERROR (-1) #define READ_EOF (-2) #define READ_TIMEOUT (-3) #define READ_INTERNAL_ERROR (-4) /* concat */ #if ( defined(_WIN32) && defined(_MSC_VER) && ( _MSC_VER >= 1300 ) && (_MSC_VER <= 1310 ) ) /* NOTE: VC2003 inlining bug in optim mode not respecting function call sequence point */ #define MSVC2003INLINEBUG __declspec(noinline) #else #define MSVC2003INLINEBUG #endif MSVC2003INLINEBUG HTS_STATIC char *getHtsOptBuff_(httrackp * opt) { opt->state.concat.index = (opt->state.concat.index + 1) % 16; return opt->state.concat.buff[opt->state.concat.index]; } #undef MSVC2003INLINEBUG #define OPT_GET_BUFF(OPT) ( getHtsOptBuff_(OPT) ) #define OPT_GET_BUFF_SIZE(OPT) ( sizeof(opt->state.concat.buff[0]) ) /* ANCIENNE STURCTURE pour cache 1.0 */ #ifndef HTS_DEF_FWSTRUCT_OLD_t_proxy #define HTS_DEF_FWSTRUCT_OLD_t_proxy typedef struct OLD_t_proxy OLD_t_proxy; #endif struct OLD_t_proxy { int active; char name[1024]; int port; }; #ifndef HTS_DEF_FWSTRUCT_OLD_htsblk #define HTS_DEF_FWSTRUCT_OLD_htsblk typedef struct OLD_htsblk OLD_htsblk; #endif struct OLD_htsblk { int statuscode; // ANCIENNE STURCTURE - status-code, -1=erreur, 200=OK,201=..etc (cf RFC1945) int notmodified; // ANCIENNE STURCTURE - page ou fichier NON modifié (transféré) int is_write; // ANCIENNE STURCTURE - sortie sur disque (out) ou en mémoire (adr) char *adr; // ANCIENNE STURCTURE - adresse du bloc de mémoire, NULL=vide FILE *out; // ANCIENNE STURCTURE - écriture directe sur disque (si is_write=1) int size; // ANCIENNE STURCTURE - taille fichier char msg[80]; // ANCIENNE STURCTURE - message éventuel si échec ("\0"=non précisé) char contenttype[64]; // ANCIENNE STURCTURE - content-type ("text/html" par exemple) char *location; // ANCIENNE STURCTURE - on copie dedans éventuellement la véritable 'location' int totalsize; // ANCIENNE STURCTURE - taille totale à télécharger (-1=inconnue) int is_file; // ANCIENNE STURCTURE - ce n'est pas une socket mais un descripteur de fichier si 1 T_SOC soc; // ANCIENNE STURCTURE - ID socket FILE *fp; // ANCIENNE STURCTURE - fichier pour file:// OLD_t_proxy proxy; // ANCIENNE STURCTURE - proxy int user_agent_send; // ANCIENNE STURCTURE - user agent (ex: httrack/1.0 [sun]) char user_agent[64]; int http11; // ANCIENNE STURCTURE - l'en tête doit être signé HTTP/1.1 et non HTTP/1.0 }; /* fin ANCIENNE STURCTURE pour cache 1.0 */ // cache pour le dns, pour éviter de faire des gethostbyname sans arrêt #ifndef HTS_DEF_FWSTRUCT_t_dnscache #define HTS_DEF_FWSTRUCT_t_dnscache typedef struct t_dnscache t_dnscache; #endif // One DNS cache record, stored as a coucal value keyed by hostname. struct t_dnscache { // resolved addresses, in resolver (RFC 6724) order; host_count==0 means the // name does not resolve (negative cache). host_count<=HTS_MAXADDRNUM. int host_count; size_t host_length[HTS_MAXADDRNUM]; // sockaddr length of each (16 or 28) char host_addr[HTS_MAXADDRNUM][HTS_MAXADDRLEN]; }; /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE // initialize an htsblk structure void hts_init_htsblk(htsblk * r); // attach specific project log to hachtable logger void hts_set_hash_handler(coucal hashtable, httrackp *opt); // version HTSEXT_API const char* hts_version(void); // fonctions unix/winsock int hts_read(htsblk * r, char *buff, int size); LLint check_downloadable_bytes(int rate); HTSEXT_API int hts_uninit_module(void); // fonctions principales T_SOC http_fopen(httrackp * opt, const char *adr, const char *fil, htsblk * retour); T_SOC http_xfopen(httrackp * opt, int mode, int treat, int waitconnect, const char *xsend, const char *adr, const char *fil, htsblk * retour); int http_sendhead(httrackp * opt, t_cookie * cookie, int mode, const char *xsend, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * retour); /* Build the request "Cookie:" header line for stored cookies matching domain/path into dst (NUL-terminated), wrapping the logic http_sendhead() uses. Returns cookies emitted. */ int http_cookie_header(t_cookie *cookie, const char *domain, const char *path, char *dst, size_t dst_size); T_SOC newhttp(httrackp * opt, const char *iadr, htsblk * retour, int port, int waitconnect); /* Like newhttp(), but connect to the addr_index-th resolved address of the host (0-based) instead of always the first; *addr_count, if non-NULL, is set to the total resolved addresses. newhttp() == newhttp_addr(...,0,NULL). Used by the slot scheduler to try the next address when a connect fails (dead IPv6 etc.). */ T_SOC newhttp_addr(httrackp *opt, const char *iadr, htsblk *retour, int port, int waitconnect, int addr_index, int *addr_count); HTS_INLINE void deletehttp(htsblk * r); HTS_INLINE int deleteaddr(htsblk * r); HTS_INLINE void deletesoc(T_SOC soc); HTS_INLINE void deletesoc_r(htsblk * r); htsblk http_test(httrackp * opt, const char *adr, const char *fil, char *loc); int check_readinput(htsblk * r); int check_readinput_t(T_SOC soc, int timeout); int check_writeinput_t(T_SOC soc, int timeout); /* TRUE if this -P proxy name (which keeps its scheme) is a SOCKS5 proxy. */ hts_boolean hts_proxy_is_socks(const char *name); /* TRUE if this -P proxy name is a "connect://" CONNECT-only proxy (#564). */ hts_boolean hts_proxy_is_connect(const char *name); void treathead(t_cookie * cookie, const char *adr, const char *fil, htsblk * retour, char *rcvd); void treatfirstline(htsblk * retour, const char *rcvd); // sous-fonctions LLint http_xfread1(htsblk * r, int bufl); /* Cached resolver: fill out[0..count-1] with up to max addresses for iadr (in resolver order), returning the count (0 = does not resolve, negative-cached). Resolves once per host; later calls read the DNS cache. Must hold no lock (brackets opt->state.lock itself, never across the resolve). A miss resolves on a worker thread bounded by opt->timeout; a timeout reports 0, uncached. */ int hts_dns_resolve_all(httrackp *opt, const char *iadr, SOCaddr *out, int max, const char **error); HTS_INLINE SOCaddr *hts_dns_resolve2(httrackp *opt, const char *iadr, SOCaddr *const addr, const char **error); HTS_INLINE SOCaddr* hts_dns_resolve(httrackp * opt, const char *iadr, SOCaddr *const addr); HTSEXT_API SOCaddr* hts_dns_resolve_nocache2(const char *const hostname, SOCaddr *const addr, const char **error); HTSEXT_API SOCaddr* hts_dns_resolve_nocache(const char *const hostname, SOCaddr *const addr); HTSEXT_API int check_hostname_dns(const char *const hostname); int ftp_available(void); #if HTS_DNSCACHE /* Return opt's DNS cache hashtable (hostname -> t_dnscache record), creating it on first use. Records are owned by the table and freed on coucal_delete. */ coucal hts_cache(httrackp *opt); #endif // outils divers HTS_INLINE TStamp time_local(void); void sec2str(char *s, TStamp t); void time_gmt_rfc822(char *s); void time_local_rfc822(char *s); struct tm *convert_time_rfc822(struct tm *buffer, const char *s); int set_filetime(const char *file, struct tm *tm_time); int set_filetime_rfc822(const char *file, const char *date); int get_filetime_rfc822(const char *file, char *date); HTS_INLINE void time_rfc822(char *s, struct tm *A); HTS_INLINE void time_rfc822_local(char *s, struct tm *A); HTS_INLINE int sendc(htsblk * r, const char *s); int finput(T_SOC fd, char *s, int max); int binput(char *buff, char *s, int max); int linput(FILE * fp, char *s, int max); int linputsoc(T_SOC soc, char *s, int max); int linputsoc_t(T_SOC soc, char *s, int max, int timeout); int linput_trim(FILE * fp, char *s, int max); int linput_cpp(FILE * fp, char *s, int max); void rawlinput(FILE * fp, char *s, int max); const char *strstrcase(const char *s, const char *o); int ident_url_absolute(const char *url, lien_adrfil *adrfil); void fil_simplifie(char *f); int is_unicode_utf8(const char *buffer, const size_t size); void map_characters(unsigned char *buffer, unsigned int size, unsigned int *map); int ishtml(httrackp * opt, const char *urlfil); int ishtml_ext(const char *a); int ishttperror(int err); int get_userhttptype(httrackp * opt, char *s, const char *fil); int give_mimext(char *s, size_t ssize, const char *st); int may_bogus_multiple(httrackp * opt, const char *mime, const char *filename); int may_unknown2(httrackp * opt, const char *mime, const char *filename); const char *strrchr_limit(const char *s, char c, const char *limit); char *jump_protocol(char *source); const char *jump_protocol_const(const char *source); /* Split a -P proxy argument "[scheme://][user:pass@]host[:port]" into the proxy host string (scheme and any user:pass kept, for later stripping and auth), written NUL-terminated into name[name_size] (truncated to fit), and the port in *port. The port defaults by scheme: 1080 for socks5/socks5h, else 8080. */ void hts_parse_proxy(const char *arg, char *name, size_t name_size, int *port); void code64(unsigned char *a, int size_a, unsigned char *b, int crlf); #define copychar(catbuff,a) concat(catbuff,(a),NULL) char *convtolower(char *catbuff, size_t catbuffsize, const char *a); void hts_lowcase(char *s); void hts_replace(char *s, char from, char to); int multipleStringMatch(const char *s, const char *match); void fprintfio(FILE * fp, const char *buff, const char *prefix); #ifdef _WIN32 #else int sig_ignore_flag(int setflag); // flag ignore #endif void cut_path(char *fullpath, char *path, size_t path_size, char *pname, size_t pname_size); int fexist(const char *s); int fexist_utf8(const char *s); /* File size in bytes, -1 if absent or not a regular file. LLint, not off_t: the latter is a 32-bit long on MSVC, truncating any file of 2GB or more. */ LLint fpsize(FILE *fp); LLint fsize(const char *s); LLint fsize_utf8(const char *s); // Threads typedef void *(*beginthread_type) (void *); /*unsigned long _beginthread( beginthread_type start_address, unsigned stack_size, void *arglist );*/ /* variables globales */ extern HTSEXT_API hts_stat_struct HTS_STAT; extern int _DEBUG_HEAD; extern FILE *ioinfo; /* constantes */ extern const char *hts_mime_keep[]; extern const char *hts_mime[][2]; extern const char *hts_main_mime[]; extern const char *hts_detect[]; extern const char *hts_detectbeg[]; extern const char *hts_nodetect[]; extern const char *hts_detectURL[]; extern const char *hts_detectandleave[]; extern const char *hts_detect_js[]; // htsmodule.c definitions extern void *openFunctionLib(const char *file_); extern void *getFunctionPtr(void *handle, const char *fncname); extern void closeFunctionLib(void *handle); extern void clearCallbacks(htscallbacks * chain); int hts_set_callback(t_hts_htmlcheck_callbacks * callbacks, const char *name, void *function); void *hts_get_callback(t_hts_htmlcheck_callbacks * callbacks, const char *name); #define CBSTRUCT(OPT) ((t_hts_htmlcheck_callbacks*) ((OPT)->callbacks_fun)) #define GET_USERCALLBACK(OPT, NAME) ( CBSTRUCT(OPT)-> NAME .fun ) #define GET_USERARG(OPT, NAME) ( CBSTRUCT(OPT)-> NAME .carg ) #define GET_USERDEF(OPT, NAME) ( \ (CBSTRUCT(OPT) != NULL && CBSTRUCT(OPT)-> NAME .fun != NULL) \ ? ( GET_USERARG(OPT, NAME) ) \ : ( default_callbacks. NAME .carg ) \ ) #define GET_CALLBACK(OPT, NAME) ( \ (CBSTRUCT(OPT) != NULL && CBSTRUCT(OPT)-> NAME .fun != NULL) \ ? ( GET_USERCALLBACK(OPT, NAME ) ) \ : ( default_callbacks. NAME .fun ) \ ) /* Predefined macros */ #define RUN_CALLBACK_NOARG(OPT, NAME) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME)) #define RUN_CALLBACK0(OPT, NAME) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT) #define RUN_CALLBACK1(OPT, NAME, ARG1) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1) #define RUN_CALLBACK2(OPT, NAME, ARG1, ARG2) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2) #define RUN_CALLBACK3(OPT, NAME, ARG1, ARG2, ARG3) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2, ARG3) #define RUN_CALLBACK4(OPT, NAME, ARG1, ARG2, ARG3, ARG4) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2, ARG3, ARG4) #define RUN_CALLBACK5(OPT, NAME, ARG1, ARG2, ARG3, ARG4, ARG5) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2, ARG3, ARG4, ARG5) #define RUN_CALLBACK6(OPT, NAME, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) #define RUN_CALLBACK7(OPT, NAME, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) #define RUN_CALLBACK8(OPT, NAME, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) GET_CALLBACK(OPT, NAME)(GET_USERARG(OPT, NAME), OPT, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) /* #define GET_CALLBACK(OPT, NAME, ARG) ( \ ( \ ( ARG ) = GET_USERDEF(OPT, NAME), \ ( \ (CBSTRUCT(OPT) != NULL && CBSTRUCT(OPT)-> NAME .fun != NULL) \ ? ( GET_USERCALLBACK(OPT, NAME ) ) \ : ( default_callbacks. NAME .fun ) \ ) \ ) \ ) */ /* UTF-8 aware FILE API */ #ifndef HTS_DEF_FILEAPI #ifdef _WIN32 #define FOPEN hts_fopen_utf8 HTSEXT_API FILE *hts_fopen_utf8(const char *path, const char *mode); #define STAT hts_stat_utf8 /* _stat64: _stat's st_size is a 32-bit long, even in x64 builds */ typedef struct _stat64 STRUCT_STAT; HTSEXT_API int hts_stat_utf8(const char *path, STRUCT_STAT * buf); #define UNLINK hts_unlink_utf8 HTSEXT_API int hts_unlink_utf8(const char *pathname); #define RENAME hts_rename_utf8 HTSEXT_API int hts_rename_utf8(const char *oldpath, const char *newpath); #define MKDIR(F) hts_mkdir_utf8(F) HTSEXT_API int hts_mkdir_utf8(const char *pathname); #define UTIME(A,B) hts_utime_utf8(A,B) typedef struct _utimbuf STRUCT_UTIMBUF; HTSEXT_API int hts_utime_utf8(const char *filename, const STRUCT_UTIMBUF * times); #else /* The underlying filesystem charset is supposed to be UTF-8 */ #define FOPEN fopen #define STAT stat typedef struct stat STRUCT_STAT; #define UNLINK unlink #define RENAME rename #define MKDIR(F) mkdir(F, HTS_ACCESS_FOLDER) typedef struct utimbuf STRUCT_UTIMBUF; #define UTIME(A,B) utime(A,B) #endif #define HTS_DEF_FILEAPI #endif #endif // internals #undef PATH_SEPARATOR #ifdef _WIN32 #define PATH_SEPARATOR '\\' #else #define PATH_SEPARATOR '/' #endif /* Spaces: CR,LF,TAB,FF */ #define is_space(c) ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') ) #define is_realspace(c) ( ((c)==' ') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) ) #define is_taborspace(c) ( ((c)==' ') || ((c)==9) ) #define is_quote(c) ( ((c)=='\"') || ((c)=='\'') ) #define is_retorsep(c) ( ((c)==10) || ((c)==13) || ((c)==9) ) //HTS_INLINE int is_space(char); //HTS_INLINE int is_realspace(char); #define HTTP_IS_REDIRECT(code) ( \ (code) == 301 \ || (code) == 302 \ || (code) == 303 \ || (code) == 307 \ || (code) == 308 \ ) #define HTTP_IS_NOTMODIFIED(code) ( \ (code) == 304 \ ) #define HTTP_IS_OK(code) ( ( (code) / 100 ) == 2 ) #define HTTP_IS_ERROR(code) ( !HTTP_IS_OK(code) && !HTTP_IS_REDIRECT(code) && !HTTP_IS_NOTMODIFIED(code) ) // compare le début de f avec s et retourne la position de la fin // 'A=a' (case insensitive) HTS_STATIC int strfield(const char *f, const char *s) { int r = 0; while(streql(*f, *s) && ((*f) != 0) && ((*s) != 0)) { f++; s++; r++; } if (*s == 0) return r; else return 0; } HTS_STATIC int strcmpnocase(const char *a, const char *b) { while(*a) { int cmp = hichar(*a) - hichar(*b); if (cmp != 0) return cmp; a++; b++; } return 0; } #ifdef _WIN32 #define strcasecmp(a,b) stricmp(a,b) #define strncasecmp(a,b,n) strnicmp(a,b,n) #define snprintf _snprintf #endif /* MSVC ships these POSIX functions under other names. Kept out of the installed headers: they would rewrite the same identifiers in a consumer's own code. */ #ifdef _MSC_VER #define fseeko _fseeki64 #define ftello _ftelli64 #define timegm _mkgmtime #endif #define strfield2(f,s) ( (strlen(f)!=strlen(s)) ? 0 : (strfield(f,s)) ) // is this MIME an hypertext MIME (text/html), html/js-style or other script/text type? #define HTS_HYPERTEXT_DEFAULT_MIME "text/html" /* Sentinel stored when the server declared no Content-Type. It is html-ish for every type test (so a typeless response still parses/stores as today), but the naming code (wire_patches_ext) treats it as "no declared type" and keeps the URL extension. It rides the cache, so updates name consistently. */ #define HTS_UNKNOWN_MIME "unknown/unknown" /* Map the no-declared-type sentinel back to a real type for any header or record we EMIT or PERSIST, so "unknown/unknown" never reaches a consumer (a served Content-Type, a ProxyTrack .arc record, ...). */ #define hts_effective_mime(m) \ (strfield2((m), HTS_UNKNOWN_MIME) ? HTS_HYPERTEXT_DEFAULT_MIME : (m)) #define is_html_mime_type(a) \ ((strfield2((a), "text/html") != 0) || \ (strfield2((a), "application/xhtml+xml") != 0) || \ (strfield2((a), HTS_UNKNOWN_MIME) != \ 0) /* no declared type: treat as html */ \ ) #define is_hypertext_mime__(a) \ ( \ is_html_mime_type(a)\ || (strfield2((a),"application/x-javascript")!=0) \ || (strfield2((a),"text/css")!=0) \ /*|| (strfield2((a),"text/vnd.wap.wml")!=0)*/ \ || (strfield2((a),"image/svg+xml")!=0) \ || (strfield2((a),"image/svg-xml")!=0) \ /*|| (strfield2((a),"audio/x-pn-realaudio")!=0) */\ || (strfield2((a),"application/x-authorware-map")!=0) \ ) #define may_be_hypertext_mime__(a) \ (\ (strfield2((a),"audio/x-pn-realaudio")!=0) \ || (strfield2((a),"audio/x-mpegurl")!=0) \ /*|| (strfield2((a),"text/xml")!=0) || (strfield2((a),"application/xml")!=0) : TODO: content check */ \ ) /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE // check if (mime, file) is hypertext HTS_STATIC int is_hypertext_mime(httrackp * opt, const char *mime, const char *file) { if (is_hypertext_mime__(mime)) return 1; if (may_unknown(opt, mime)) { char guessed[256]; guessed[0] = '\0'; if (!guess_httptype_sized(opt, guessed, sizeof(guessed), file)) return 0; return is_hypertext_mime__(guessed); } return 0; } // check if (mime, file) might be "false" hypertext HTS_STATIC int may_be_hypertext_mime(httrackp * opt, const char *mime, const char *file) { if (may_be_hypertext_mime__(mime)) return 1; if (file != NULL && file[0] != '\0' && may_unknown(opt, mime)) { char guessed[256]; guessed[0] = '\0'; if (!guess_httptype_sized(opt, guessed, sizeof(guessed), file)) return 0; return may_be_hypertext_mime__(guessed); } return 0; } // compare (mime, file) with reference HTS_STATIC int compare_mime(httrackp * opt, const char *mime, const char *file, const char *reference) { if (is_hypertext_mime__(mime) || may_be_hypertext_mime__(mime)) return strfield2(mime, reference); if (file != NULL && file[0] != '\0' && may_unknown(opt, mime)) { char guessed[256]; guessed[0] = '\0'; if (!guess_httptype_sized(opt, guessed, sizeof(guessed), file)) return 0; return strfield2(guessed, reference); } return 0; } #endif // returns (size_t) -1 upon error static HTS_UNUSED size_t llint_to_size_t(LLint o) { const size_t so = (size_t) o; if ((LLint) so == o) { return so; } else { return (size_t) -1; } } /* dirent() compatibility */ #ifdef _WIN32 /* Holds a UTF-8 d_name: MAX_PATH (260) UTF-16 units expand to <=3 bytes each. Windows-only struct, ABI free to break. */ #define HTS_DIRENT_SIZE 1024 struct dirent { ino_t d_ino; /* ignored */ off_t d_off; /* ignored */ unsigned short d_reclen; /* ignored */ unsigned char d_type; /* ignored */ char d_name[HTS_DIRENT_SIZE]; /* filename */ }; typedef struct DIR DIR; struct DIR { HANDLE h; struct dirent entry; char *name; }; DIR *opendir(const char *name); struct dirent *readdir(DIR * dir); int closedir(DIR * dir); #endif #endif httrack-3.49.14/src/htsindex.h0000644000175000017500000000345115230602340011601 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsindex.h */ /* keyword indexing system (search index) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSKINDEX_DEFH #define HTSKINDEX_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE #include "htsglobal.h" int index_keyword(const char *html_data, LLint size, const char *mime, const char *filename, const char *indexpath); void index_init(const char *indexpath); void index_finish(const char *indexpath, int mode); #endif #endif httrack-3.49.14/src/htshelp.h0000644000175000017500000000356015230602340011423 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* command-line help system */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSHELP_DEFH #define HTSHELP_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif void infomsg(const char *msg); void help(const char *app, int more); void help_wizard(httrackp * opt); int help_query(const char *list, int def); void help_catchurl(const char *dest_path); #endif #endif httrack-3.49.14/src/htshash.h0000644000175000017500000000477015230602340011422 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* hash table system (fast index) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSHASH_DEFH #define HTSHASH_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif /** Type of hash. **/ typedef enum hash_struct_type { HASH_STRUCT_FILENAME = 0, HASH_STRUCT_ADR_PATH, HASH_STRUCT_ORIGINAL_ADR_PATH } hash_struct_type; // tables de hachage void hash_init(httrackp *opt, hash_struct *hash, hts_boolean normalized); void hash_free(hash_struct *hash); /* Test helper: HTS_TRUE if the two URLs dedupe together under opt's urlhack flags. */ hts_boolean hash_url_equals(httrackp *opt, const char *adra, const char *fila, const char *adrb, const char *filb); int hash_read(const hash_struct * hash, const char *nom1, const char *nom2, hash_struct_type type); void hash_write(hash_struct * hash, size_t lpos); int *hash_calc_chaine(hash_struct * hash, hash_struct_type type, int pos); unsigned long int hash_cle(const char *nom1, const char *nom2); #endif #endif httrack-3.49.14/src/htsglobal.h0000644000175000017500000003361315230602340011735 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Global #define file */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsglobal.h * Foundational portability layer included by every other public header: * version strings, platform/feature switches, the HTSEXT_API export marker, * the integer/time/socket typedefs (LLint, TStamp, INTsys, T_SOC), printf * format helpers, and the file-access mode constants. */ #ifndef HTTRACK_GLOBAL_DEFH #define HTTRACK_GLOBAL_DEFH /* Package version strings (the library ABI version is VERSION_INFO in configure.ac, decoupled from these). VERSION is the display form, VERSIONID the dotted numeric form, AFF_VERSION the short form shown in footers, LIB_VERSION the data/cache format generation. */ #define HTTRACK_VERSION "3.49-14" #define HTTRACK_VERSIONID "3.49.14" #define HTTRACK_AFF_VERSION "3.x" #define HTTRACK_LIB_VERSION "2.0" #ifndef HTS_NOINCLUDES #include #include #endif // Platform detection (sizes, feature macros) #include "htsconfig.h" // Fixed-width integer types + PRI* format macros for the LLint/TStamp typedefs #include #include // WIN32 types #ifdef _WIN32 #ifndef SIZEOF_LONG #define SIZEOF_LONG 4 #define SIZEOF_LONG_LONG 8 #endif #endif /* Compiler-attribute helpers, no-ops where unsupported. HTS_UNUSED: suppress unused-symbol warnings. HTS_STATIC: an unused-safe static. HTS_PRINTF_FUN(fmt, arg): mark a printf-like function so the compiler type-checks the format string at argument index fmt against the varargs starting at arg. */ #ifndef HTS_UNUSED #ifdef __GNUC__ #define HTS_UNUSED __attribute__((unused)) #define HTS_STATIC static __attribute__((unused)) #define HTS_PRINTF_FUN(fmt, arg) __attribute__((format(printf, fmt, arg))) #else #define HTS_UNUSED #define HTS_STATIC static #define HTS_PRINTF_FUN(fmt, arg) #endif #endif // config.h #ifdef _WIN32 /* #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TYPES_H 1 #define HAVE_SYS_STAT_H 1 */ #ifndef DLLIB #define DLLIB 1 #endif #ifndef HTS_INET6 #define HTS_INET6 1 #endif #ifndef S_ISREG #define S_ISREG(m) ((m) & _S_IFREG) #define S_ISDIR(m) ((m) & _S_IFDIR) #endif #else #include "config.h" #ifndef SETUID #define HTS_DO_NOT_USE_UID #endif #ifdef DLLIB #define HTS_DLOPEN 1 #else #define HTS_DLOPEN 0 #endif #endif #ifndef BIGSTK #define BIGSTK #endif // DOS-style 8.3 filenames? 1 on Windows, 0 elsewhere #ifdef _WIN32 #define HTS_DOSNAME 1 #else #define HTS_DOSNAME 0 #endif // utiliser zlib? #ifndef HTS_USEZLIB // autoload #define HTS_USEZLIB 1 #endif // brotli and zstd content codings; off unless the build opted in (configure, // or the Visual Studio projects, which link the vcpkg libraries) #ifndef HTS_USEBROTLI #define HTS_USEBROTLI 0 #endif #ifndef HTS_USEZSTD #define HTS_USEZSTD 0 #endif #ifndef HTS_INET6 #define HTS_INET6 0 #endif // utiliser openssl? #ifndef HTS_USEOPENSSL // autoload #define HTS_USEOPENSSL 1 #endif #ifndef HTS_DLOPEN #define HTS_DLOPEN 1 #endif #ifndef HTS_USESWF #define HTS_USESWF 1 #endif #ifdef _WIN32 #else #define __cdecl #endif /* Install paths and config-file names. HTTRACKRC is the per-user rc filename, HTTRACKCNF the system-wide config, HTTRACKDIR the shared data directory; the ETC/BIN/LIB/PREFIX paths are the defaults these derive from when not set by the build. */ #ifdef _WIN32 #define HTS_HTTRACKRC "httrackrc" #else #ifndef HTS_ETCPATH #define HTS_ETCPATH "/etc" #endif #ifndef HTS_BINPATH #define HTS_BINPATH "/usr/bin" #endif #ifndef HTS_LIBPATH #define HTS_LIBPATH "/usr/lib" #endif #ifndef HTS_PREFIX #define HTS_PREFIX "/usr" #endif #define HTS_HTTRACKRC ".httrackrc" #define HTS_HTTRACKCNF HTS_ETCPATH "/httrack.conf" #ifdef DATADIR #define HTS_HTTRACKDIR DATADIR "/httrack/" #else #define HTS_HTTRACKDIR HTS_PREFIX "/share/httrack/" #endif #endif /* Maximum URL length, in bytes. Callers size URL/path string buffers to this; anything longer is rejected. */ #define HTS_URLMAXSIZE 1024 /* Maximum command-line argument length, in bytes (kept >= HTS_URLMAXSIZE*2 so an addr+path pair always fits). */ #define HTS_CDLMAXSIZE 1024 /* MIME-type buffer contract (htsblk.contenttype/charset/contentencoding); holds the longest registered MIME type, the Office OOXML ones reaching 73 chars */ #define HTS_MIMETYPE_SIZE 128 /* Copyright (C) 1998 Xavier Roche and other contributors */ #define HTTRACK_AFF_AUTHORS "[XR&CO'2014]" #define HTS_DEFAULT_FOOTER \ "" /* Honest crawler User-Agent; no fake OS/browser to go stale. */ #define HTS_DEFAULT_USER_AGENT \ "Mozilla/5.0 (compatible; HTTrack/" HTTRACK_AFF_VERSION \ "; +https://www.httrack.com/)" #define HTTRACK_WEB "http://www.httrack.com" #define HTS_UPDATE_WEBSITE \ "http://www.httrack.com/" \ "update.php3?Product=HTTrack&Version=" HTTRACK_VERSIONID \ "&VersionStr=" HTTRACK_VERSION "&Platform=%d&Language=%s" #define H_CRLF "\x0d\x0a" #define CRLF "\x0d\x0a" #ifdef _WIN32 #define LF "\x0d\x0a" #else #define LF "\x0a" #endif /* Sentinel meaning "empty parameter", e.g. -F (none) */ #define HTS_NOPARAM "(none)" #define HTS_NOPARAM2 "\"(none)\"" /* Boolean flag for option fields and API yes/no returns. Int-backed, not an enum: an enum makes C++ reject `field = 1` / `f(0)` on the exported fields and params. Int-sized, so the httrackp layout and the ABI are unchanged. */ #ifndef HTS_DEF_DEFSTRUCT_hts_boolean #define HTS_DEF_DEFSTRUCT_hts_boolean typedef int hts_boolean; #define HTS_FALSE 0 #define HTS_TRUE 1 #endif #ifndef HTS_DEF_DEFSTRUCT_hts_tristate #define HTS_DEF_DEFSTRUCT_hts_tristate /* Tri-state hts_boolean: HTS_DEFAULT (-1) = "unspecified" (copy_htsopt leaves the target untouched); HTS_FALSE/HTS_TRUE = off/on. */ typedef int hts_tristate; #define HTS_DEFAULT (-1) #endif /* Larger/smaller of two values. Macros: arguments are evaluated twice. */ #define maximum(A, B) ((A) > (B) ? (A) : (B)) #define minimum(A, B) ((A) < (B) ? (A) : (B)) /* True when A is a non-NULL, non-empty string. */ #define strnotempty(A) (((A) != NULL && (A)[0] != '\0')) /* 'inline' where the dialect supports it (C++), nothing in plain C. */ #ifdef __cplusplus #define HTS_INLINE inline #else #define HTS_INLINE #endif /* Marks a symbol as part of the library's public ABI: exported from libhttrack and visible to callers. Symbols without it stay internal (hidden under -fvisibility=hidden). Expands to dllexport when building the library, dllimport when consuming it, and the visibility("default") attribute on ELF. */ #ifdef _WIN32 #ifdef LIBHTTRACK_EXPORTS #define HTSEXT_API __declspec(dllexport) #else #define HTSEXT_API __declspec(dllimport) #endif #else /* See */ #if ((defined(__GNUC__) && (__GNUC__ >= 4)) || \ (defined(HAVE_VISIBILITY) && HAVE_VISIBILITY)) #define HTSEXT_API __attribute__((visibility("default"))) #else #define HTSEXT_API #endif #endif /** * Mark a function deprecated, with a message pointing at the replacement. * Placed before the declaration so both the GCC/Clang attribute and the MSVC * __declspec sit in a position both accept. Degrades to nothing elsewhere. */ #if defined(__GNUC__) && \ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) #define HTS_DEPRECATED(msg) __attribute__((deprecated(msg))) #elif defined(__GNUC__) #define HTS_DEPRECATED(msg) __attribute__((deprecated)) #elif defined(_MSC_VER) && (_MSC_VER >= 1400) #define HTS_DEPRECATED(msg) __declspec(deprecated(msg)) #else #define HTS_DEPRECATED(msg) #endif /* LLint/TStamp: signed exact-width 64-bit; -1 is a sentinel engine-wide. */ typedef int64_t LLint; typedef int64_t TStamp; /* Full printf conversion, '%' included (PRId64 has none): "X: " LLintP. */ #define LLintP "%" PRId64 /* Integer type for file offsets/sizes passed to the C library; INTsysP is its printf conversion. HTS_LFS is the large-file macro: LFS_FLAG is a configure make variable carrying the -D flags, never itself defined. */ #if defined(HTS_LFS) || defined(_MSC_VER) typedef LLint INTsys; #define INTsysP LLintP #else typedef int INTsys; #define INTsysP "%d" #endif /* Socket-handle type. An unsigned integer wide enough for a Windows SOCKET; a plain int file descriptor on POSIX. */ #ifdef _WIN32 #if defined(_WIN64) typedef unsigned __int64 T_SOC; #else typedef unsigned __int32 T_SOC; #endif #else typedef int T_SOC; #endif /* Buffer size for a printed network address (IPv4 or IPv6, NUL included). */ #define HTS_MAXADDRLEN 64 /* Max resolved addresses kept per host for connect fallback (dead IPv6 etc.). */ #define HTS_MAXADDRNUM 4 #ifdef _WIN32 #else #define __cdecl #endif /* Permission bits for created folders and files (mkdir and chmod). PROTECT_FOLDER/FILE are owner-only. With HTS_ACCESS set (the default) the ACCESS_ modes also grant group/other read; otherwise they stay owner-only. */ #define HTS_PROTECT_FOLDER (S_IRUSR | S_IWUSR | S_IXUSR) #define HTS_PROTECT_FILE (S_IRUSR | S_IWUSR) #if HTS_ACCESS #define HTS_ACCESS_FILE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) #define HTS_ACCESS_FOLDER \ (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) #else #define HTS_ACCESS_FILE (S_IRUSR | S_IWUSR) #define HTS_ACCESS_FOLDER (S_IRUSR | S_IWUSR | S_IXUSR) #endif /* Sanity-check that the required preprocessor switches are defined */ #ifndef HTS_DOSNAME #error | HTS_DOSNAME Has not been defined. #error | Set it to 1 if you are under DOS, 0 under Unix. #error | Example: place this line in you source, before includes: #error | #define HTS_DOSNAME 0 #error #error #endif #ifndef HTS_ACCESS /* Default: files readable by all users */ #define HTS_ACCESS 1 #endif /* fflush sur stdout */ #define io_flush \ { \ fflush(stdout); \ fflush(stdin); \ } /* HTSLib */ // Enable the DNS cache (speeds up address resolution) #define HTS_DNSCACHE 1 // Pseudo-socket id standing in for a local file:// transfer #define LOCAL_SOCKET_ID -2 // Per-connection transfer buffer size, in bytes #define TAILLE_BUFFER 65536 #ifdef HTS_DO_NOT_USE_PTHREAD #error needs threads support #endif #define USE_BEGINTHREAD 1 #ifdef _DEBUG // trace mallocs // #define HTS_TRACE_MALLOC #ifdef HTS_TRACE_MALLOC typedef unsigned long int t_htsboundary; #ifndef HTS_DEF_FWSTRUCT_mlink #define HTS_DEF_FWSTRUCT_mlink typedef struct mlink mlink; #endif struct mlink { char *adr; int len; int id; struct mlink *next; }; static const t_htsboundary htsboundary = 0xDEADBEEF; #endif #endif /* strxxx debugging */ #ifndef NOSTRDEBUG #define STRDEBUG 1 #endif /* ------------------------------------------------------------ */ /* Debugging */ /* ------------------------------------------------------------ */ // type-detection debug #define DEBUG_SHOWTYPES 0 // backing debug #define BDEBUG 0 // chunk receive #define CHUNKDEBUG 0 // realloc links debug #define MDEBUG 0 // cache debug #define DEBUGCA 0 // DNS debug #define DEBUGDNS 0 // savename debug #define DEBUG_SAVENAME 0 // debug robots #define DEBUG_ROBOTS 0 // debug hash #define DEBUG_HASH 0 // integrity-check debug #define DEBUG_CHECKINT 0 // nbr sockets debug #define NSDEBUG 0 // HTSLib debug #define HDEBUG 0 // surveillance de la connexion #define CNXDEBUG 0 // debuggage cookies #define DEBUG_COOK 0 // heavy/low-level debug #define HTS_WIDE_DEBUG 0 // debuggage deletehttp et cie #define HTS_DEBUG_CLOSESOCK 0 // memory-tracing debug #define MEMDEBUG 0 // htsmain #define DEBUG_STEPS 0 // Derived debug control switches #if HTS_DEBUG_CLOSESOCK #define _HTS_WIDE 1 #endif #if HTS_WIDE_DEBUG #define _HTS_WIDE 1 #endif #if _HTS_WIDE extern FILE *DEBUG_fp; #define DEBUG_W(A) \ { \ if (DEBUG_fp == NULL) \ DEBUG_fp = fopen("bug.out", "wb"); \ fprintf(DEBUG_fp, ":>" A); \ fflush(DEBUG_fp); \ } #undef _ #define _ , #endif #endif httrack-3.49.14/src/htsftp.h0000644000175000017500000000567515230602340011275 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: basic FTP protocol manager .h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSFTP_DEFH #define HTSFTP_DEFH #include "htsbase.h" #include "htsbasenet.h" #include "htsthread.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_lien_back #define HTS_DEF_FWSTRUCT_lien_back typedef struct lien_back lien_back; #endif #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif /* Download structure */ #ifndef HTS_DEF_FWSTRUCT_FTPDownloadStruct #define HTS_DEF_FWSTRUCT_FTPDownloadStruct typedef struct FTPDownloadStruct FTPDownloadStruct; #endif struct FTPDownloadStruct { lien_back *pBack; httrackp *pOpt; }; /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE #if USE_BEGINTHREAD void launch_ftp(FTPDownloadStruct * params); void back_launch_ftp(void *pP); #else void launch_ftp(FTPDownloadStruct * params, char *path, char *exec); int back_launch_ftp(FTPDownloadStruct * params); #endif int run_launch_ftp(FTPDownloadStruct * params); int send_line(T_SOC soc, const char *data); int get_ftp_line(T_SOC soc, char *line, size_t line_size, int timeout); /* Split a "user[:pass]@" prefix (end = jump_identification result) into bounded, NUL-terminated user/pass buffers, truncating to fit. Both sizes must be nonzero. */ void ftp_split_userpass(const char *src, const char *end, char *user, size_t user_size, char *pass, size_t pass_size); T_SOC get_datasocket(char *to_send, size_t to_send_size); int stop_ftp(lien_back * back); char *linejmp(char *line); int check_socket(T_SOC soc); int check_socket_connect(T_SOC soc); int wait_socket_receive(T_SOC soc, int timeout); #endif #endif httrack-3.49.14/src/htsfilters.h0000644000175000017500000000565715230602340012154 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* filters ("regexp") */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSFILT_DEFH #define HTSFILT_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE #include "htsbase.h" int fa_strjoker(int type, char **filters, int nfil, const char *nom, LLint * size, int *size_flag, int *depth); /* fa_strjoker() on both URL forms the engine builds (nom1 full, nom2 without scheme); the match latest in the list wins, a "don't know" verdict defers. Returns the merged verdict; the out-params carry the winner's values. */ int fa_strjoker_dual(int type, char **filters, int nfil, const char *nom1, const char *nom2, LLint *size, int *size_flag, int *depth); HTS_INLINE const char *strjoker(const char *chaine, const char *joker, LLint * size, int *size_flag); /* strjoker() without the failure memo (exponential worst case); test-only oracle for the memoized matcher. */ const char *strjoker_nomemo(const char *chaine, const char *joker, LLint *size, int *size_flag); /* strjoker() reporting the work-budget steps and the recursion depth it spent, with their caps; test-only, lets a self-test assert both bound a hostile pattern (depth bounds the stack: an uncapped one overflows Windows' 1MB). */ const char *strjoker_bounds(const char *chaine, const char *joker, size_t *nsteps_out, size_t *maxsteps_out, size_t *depth_out, size_t *maxdepth_out); const char *strjokerfind(const char *chaine, const char *joker); #endif #endif httrack-3.49.14/src/htsdefines.h0000644000175000017500000003462215230602340012113 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Some defines for httrack.c and others */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsdefines.h * Public callback prototypes and the wrapper/plug-in interface: the function * pointer types a parser or wrapper module implements, and the callback table * the engine dispatches through. */ #ifndef HTS_DEFINES_DEFH #define HTS_DEFINES_DEFH /* Forward declarations of engine structs, so this header is usable without pulling in their full definitions. Each is guarded so multiple public headers can repeat the typedef without clashing. */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_lien_back #define HTS_DEF_FWSTRUCT_lien_back typedef struct lien_back lien_back; #endif #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif #ifndef HTS_DEF_FWSTRUCT_hts_stat_struct #define HTS_DEF_FWSTRUCT_hts_stat_struct typedef struct hts_stat_struct hts_stat_struct; #endif #ifndef HTS_DEF_FWSTRUCT_htsmoduleStruct #define HTS_DEF_FWSTRUCT_htsmoduleStruct typedef struct htsmoduleStruct htsmoduleStruct; #endif #ifndef HTS_DEF_FWSTRUCT_t_hts_callbackarg #define HTS_DEF_FWSTRUCT_t_hts_callbackarg typedef struct t_hts_callbackarg t_hts_callbackarg; #endif #ifndef HTS_DEF_FWSTRUCT_t_hts_callbackarg #define HTS_DEF_FWSTRUCT_t_hts_callbackarg typedef struct t_hts_callbackarg t_hts_callbackarg; #endif /* Marks a symbol an external wrapper module exports back to the engine. Must override -fvisibility=hidden on ELF, or dlopen()ed plugins hide their own hts_plug()/hts_unplug() entry points. */ #ifndef EXTERNAL_FUNCTION #ifdef _WIN32 #define EXTERNAL_FUNCTION __declspec(dllexport) #elif ((defined(__GNUC__) && (__GNUC__ >= 4)) || \ (defined(HAVE_VISIBILITY) && HAVE_VISIBILITY)) #define EXTERNAL_FUNCTION __attribute__((visibility("default"))) #else #define EXTERNAL_FUNCTION #endif #endif /* Entry points of a --wrapper plug-in: hts_plug(opt, argv) is called once to install the wrapper (argv is the wrapper's argument string), hts_unplug(opt) once to tear it down. Both return non-zero on success. */ typedef int (*t_hts_plug)(httrackp *opt, const char *argv); typedef int (*t_hts_unplug)(httrackp *opt); /* Engine callback prototypes. Each is one hook the engine fires at a defined point of a mirror; a wrapper installs the ones it cares about in the callback table below. carg carries the user-defined argument chain; int returns are 1 to continue/accept, 0 to abort/refuse unless noted. */ /* Called once when the wrapper is installed; allocate per-run state here. */ typedef void (*t_hts_htmlcheck_init)(t_hts_callbackarg *carg); /* Called once when the wrapper is removed; release per-run state here. */ typedef void (*t_hts_htmlcheck_uninit)(t_hts_callbackarg *carg); /* Fired at the start of a mirror, after options are parsed. */ typedef int (*t_hts_htmlcheck_start)(t_hts_callbackarg *carg, httrackp *opt); /* Fired at the end of a mirror. */ typedef int (*t_hts_htmlcheck_end)(t_hts_callbackarg *carg, httrackp *opt); /* Fired while options are being changed, to validate or adjust them. */ typedef int (*t_hts_htmlcheck_chopt)(t_hts_callbackarg *carg, httrackp *opt); /* Rewrite hook over an in-memory page: the html and len arguments point at the buffer and its length (the callback may reallocate and resize it), url_adresse and url_fichier name it. */ typedef int (*t_hts_htmlcheck_process)(t_hts_callbackarg *carg, httrackp *opt, char **html, int *len, const char *url_adresse, const char *url_fichier); /* Same shape as process, run before HTML parsing. */ typedef t_hts_htmlcheck_process t_hts_htmlcheck_preprocess; /* Same shape as process, run after HTML parsing. */ typedef t_hts_htmlcheck_process t_hts_htmlcheck_postprocess; /* Inspect a page (read-only html/len) without rewriting it. */ typedef int (*t_hts_htmlcheck_check_html)(t_hts_callbackarg *carg, httrackp *opt, char *html, int len, const char *url_adresse, const char *url_fichier); /* Answer an engine query identified by 'question'; returns the answer string (owned by the callback, must stay valid until the next call). */ typedef const char *(*t_hts_htmlcheck_query)(t_hts_callbackarg *carg, httrackp *opt, const char *question); /* Second query channel, same contract as query. */ typedef const char *(*t_hts_htmlcheck_query2)(t_hts_callbackarg *carg, httrackp *opt, const char *question); /* Third query channel, same contract as query. */ typedef const char *(*t_hts_htmlcheck_query3)(t_hts_callbackarg *carg, httrackp *opt, const char *question); /* Per-tick progress hook: 'back' is the transfer slot array of 'back_max' entries, back_index the active one; lien_tot/lien_ntot and stats report queue size and running totals, stat_time the elapsed time. */ typedef int (*t_hts_htmlcheck_loop)(t_hts_callbackarg *carg, httrackp *opt, lien_back *back, int back_max, int back_index, int lien_tot, int lien_ntot, int stat_time, hts_stat_struct *stats); /* Veto a link (adr host, fil path) after its transfer; status is the result. Return 0 to drop the link. */ typedef int (*t_hts_htmlcheck_check_link)(t_hts_callbackarg *carg, httrackp *opt, const char *adr, const char *fil, int status); /* Veto a link by its MIME type before download; return 0 to skip it. */ typedef int (*t_hts_htmlcheck_check_mime)(t_hts_callbackarg *carg, httrackp *opt, const char *adr, const char *fil, const char *mime, int status); /* Fired when the mirror pauses, waiting on 'lockfile' to be removed. */ typedef void (*t_hts_htmlcheck_pause)(t_hts_callbackarg *carg, httrackp *opt, const char *lockfile); /* Fired after a file is written to disk; 'file' is the local path. */ typedef void (*t_hts_htmlcheck_filesave)(t_hts_callbackarg *carg, httrackp *opt, const char *file); /* Richer file-saved notification: source host/filename, local path, and flags telling whether the file is new, modified, or left unchanged. */ typedef void (*t_hts_htmlcheck_filesave2)(t_hts_callbackarg *carg, httrackp *opt, const char *hostname, const char *filename, const char *localfile, int is_new, int is_modified, int not_updated); /* Fired for each link parsed out of a page; 'link' may be edited in place. */ typedef int (*t_hts_htmlcheck_linkdetected)(t_hts_callbackarg *carg, httrackp *opt, char *link); /* As linkdetected, plus tag_start, the markup the link was found in. */ typedef int (*t_hts_htmlcheck_linkdetected2)(t_hts_callbackarg *carg, httrackp *opt, char *link, const char *tag_start); /* Fired on each transfer-status change of slot 'back'. */ typedef int (*t_hts_htmlcheck_xfrstatus)(t_hts_callbackarg *carg, httrackp *opt, lien_back *back); /* Choose the local save path for a URL; write it into 'save'. adr/fil name the target, referer_adr/referer_fil the page that linked it. */ typedef int (*t_hts_htmlcheck_savename)(t_hts_callbackarg *carg, httrackp *opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save); /* Extended save-name hook, same signature as savename. */ typedef t_hts_htmlcheck_savename t_hts_htmlcheck_extsavename; /* Inspect or edit the outgoing request headers in 'buff' before they are sent. */ typedef int (*t_hts_htmlcheck_sendhead)(t_hts_callbackarg *carg, httrackp *opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk *outgoing); /* Inspect the incoming response headers in 'buff' after they are received. */ typedef int (*t_hts_htmlcheck_receivehead)(t_hts_callbackarg *carg, httrackp *opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk *incoming); /* External parser module hooks: detect claims a document type (return 1 to take it), parse then extracts its links. 'str' carries the document. */ typedef int (*t_hts_htmlcheck_detect)(t_hts_callbackarg *carg, httrackp *opt, htsmoduleStruct *str); typedef int (*t_hts_htmlcheck_parse)(t_hts_callbackarg *carg, httrackp *opt, htsmoduleStruct *str); /* Callbacks */ #ifndef HTS_DEF_FWSTRUCT_t_hts_htmlcheck_callbacks #define HTS_DEF_FWSTRUCT_t_hts_htmlcheck_callbacks typedef struct t_hts_htmlcheck_callbacks t_hts_htmlcheck_callbacks; #endif /* Declares one named callback slot: its function pointer (typed t_hts_htmlcheck_) paired with the carg passed to it. */ #define DEFCALLBACK(NAME) \ struct NAME { \ t_hts_htmlcheck_##NAME fun; \ t_hts_callbackarg *carg; \ } NAME /* Generic, type-erased callback slot used where the hook type is opaque. */ typedef void *t_hts_htmlcheck_t_hts_htmlcheck_callbacks_item; typedef DEFCALLBACK(t_hts_htmlcheck_callbacks_item); /* Per-callback argument node. Wrappers chain these so a new hook can wrap an existing one: userdef is the wrapper's own data, prev points back to the function and carg it displaced (call it to keep the previous behavior). */ struct t_hts_callbackarg { /* User-defined argument for the called function */ void *userdef; /* Previous function, if any (fun != NULL) */ struct prev { void *fun; t_hts_callbackarg *carg; } prev; }; /* The full callback table, one slot per hook; installed in httrackp options and dispatched by the engine. The trailing comments mark the API version a slot first appeared in. */ struct t_hts_htmlcheck_callbacks { /* v3.41 */ DEFCALLBACK(init); DEFCALLBACK(uninit); DEFCALLBACK(start); DEFCALLBACK(end); DEFCALLBACK(chopt); DEFCALLBACK(preprocess); DEFCALLBACK(postprocess); DEFCALLBACK(check_html); DEFCALLBACK(query); DEFCALLBACK(query2); DEFCALLBACK(query3); DEFCALLBACK(loop); DEFCALLBACK(check_link); DEFCALLBACK(check_mime); DEFCALLBACK(pause); DEFCALLBACK(filesave); DEFCALLBACK(filesave2); DEFCALLBACK(linkdetected); DEFCALLBACK(linkdetected2); DEFCALLBACK(xfrstatus); DEFCALLBACK(savename); DEFCALLBACK(sendhead); DEFCALLBACK(receivehead); DEFCALLBACK(detect); DEFCALLBACK(parse); /* >3.41 */ DEFCALLBACK(extsavename); }; /* Library-internal helpers, compiled only inside the engine. */ #ifdef HTS_INTERNAL_BYTECODE /* Maps a callback slot's name to its byte offset in the callback table, so a slot can be installed by name. */ #ifndef HTS_DEF_FWSTRUCT_t_hts_callback_ref #define HTS_DEF_FWSTRUCT_t_hts_callback_ref typedef struct t_hts_callback_ref t_hts_callback_ref; #endif struct t_hts_callback_ref { const char *name; size_t offset; }; #ifdef __cplusplus extern "C" { #endif /* Default (no-op) callback table the engine starts from. */ extern const t_hts_htmlcheck_callbacks default_callbacks; #ifdef __cplusplus } #endif /* Internal helpers for building an HTTP request/response into the engine's scratch buffer (opt->state.HTbuff): START resets it, PRINT appends; the PANIC variant records a fatal error message. */ #define HT_PRINT(A) strcatbuff(opt->state.HTbuff, A); #define HT_REQUEST_START opt->state.HTbuff[0] = '\0'; #define HT_REQUEST_END #define HTT_REQUEST_START opt->state.HTbuff[0] = '\0'; #define HTT_REQUEST_END #define HTS_REQUEST_START opt->state.HTbuff[0] = '\0'; #define HTS_REQUEST_END #define HTS_PANIC_PRINTF(S) strcpybuff(opt->state._hts_errmsg, S); #endif #endif httrack-3.49.14/src/htscoremain.h0000644000175000017500000000341715230602340012271 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* main routine (first called) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSMAINHSR_DEFH #define HTSMAINHSR_DEFH // --assume standard #define HTS_ASSUME_STANDARD \ "php2 php3 php4 php cgi asp jsp pl cfm nsf=text/html" #include "htsglobal.h" #include "htsopt.h" /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE int cmdl_opt(char *s); int check_path(String * s, char *defaultname); #endif #endif httrack-3.49.14/src/htsparse.h0000644000175000017500000001364315230602340011610 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsparse.h parser */ /* html/javascript/css parser */ /* and other parser routines */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include "htsglobal.h" /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif #ifndef HTS_DEF_FWSTRUCT_robots_wizard #define HTS_DEF_FWSTRUCT_robots_wizard typedef struct robots_wizard robots_wizard; #endif #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif #ifndef HTS_DEF_FWSTRUCT_htsmoduleStructExtended #define HTS_DEF_FWSTRUCT_htsmoduleStructExtended typedef struct htsmoduleStructExtended htsmoduleStructExtended; #endif struct htsmoduleStructExtended { /* Main object */ htsblk *r_; /* Error handling */ int *error_; int *exit_xh_; int *store_errpage_; /* Structural */ int *filptr_; char ***filters_; robots_wizard *robots_; hash_struct *hash_; /* Base & codebase */ char *base; char *codebase; /* Index */ int *makeindex_done_; FILE **makeindex_fp_; int *makeindex_links_; char *makeindex_firstlink_; /* Html templates */ char *template_header_; char *template_body_; char *template_footer_; /* Specific to downloads */ LLint *stat_fragment_; TStamp makestat_time; FILE *makestat_fp; LLint *makestat_total_; int *makestat_lnk_; FILE *maketrack_fp; /* Function-dependant */ char *loc_; TStamp *last_info_shell_; int *info_shell_; }; /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* Main parser, attempt to scan links inside the html/css/js file Parameters: The public module structure, and the private module variables */ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre); /* Strip a default ":80" (any spelling) from an absolute link's authority, in place into a buffer of the given size. */ void hts_strip_default_port(char *lien, size_t size); /* Check for 301,302.. errors ("moved") and handle them; re-isuue requests, make rediretc file, handle filters considerations.. Parameters: The public module structure, and the private module variables Returns 0 upon success */ int hts_mirror_check_moved(htsmoduleStruct * str, htsmoduleStructExtended * stre); /* Non-zero if a redirect (cur_adr,cur_fil)->(moved_adr,moved_fil) saves to the same local file, so it must be followed rather than turned into a self-pointing "moved" stub (#159). Mirrors the savename: scheme+userinfo stripped, www kept (www dedup is the crawl layer's job), path slash/query-normalized per the URL-hack flags. Not hash_url_equals: that keys on the dedup hash, which folds www and never collapses http<->https. */ hts_boolean hts_redirect_same_savefile(httrackp *opt, const char *cur_adr, const char *cur_fil, const char *moved_adr, const char *moved_fil); /* Process user intercations: pause, add link, delete link.. */ void hts_mirror_process_user_interaction(htsmoduleStruct * str, htsmoduleStructExtended * stre); /* Get the next file on the queue, waiting for it, handling other files in background.. Parameters: The public module structure, and the private module variables Returns 0 upon success */ int hts_mirror_wait_for_next_file(htsmoduleStruct * str, htsmoduleStructExtended * stre); /* Wait for (adr, fil, save) to be started, that is, to be ready for naming, having its header MIME type If the final URL is to be forbidden, sets 'forbidden_url' to the corresponding value */ int hts_wait_delayed(htsmoduleStruct * str, lien_adrfilsave *afs, char *parent_adr, char *parent_fil, lien_adrfil *former, int *forbidden_url); /* Context state */ #define ENGINE_DEFINE_CONTEXT_BASE() \ httrackp* const opt HTS_UNUSED = (httrackp*) str->opt; \ struct_back* const sback HTS_UNUSED = (struct_back*) str->sback; \ lien_back* const back HTS_UNUSED = sback->lnk; \ const int back_max HTS_UNUSED = sback->count; \ cache_back* const cache HTS_UNUSED = (cache_back*) str->cache; \ hash_struct* const hashptr HTS_UNUSED = (hash_struct*) str->hashptr; \ const int numero_passe HTS_UNUSED = str->numero_passe; \ /* variable */ \ int ptr = *str->ptr_ #define ENGINE_SET_CONTEXT_BASE() \ ptr = *str->ptr_ #define ENGINE_LOAD_CONTEXT_BASE() \ ENGINE_DEFINE_CONTEXT_BASE() #define ENGINE_SAVE_CONTEXT_BASE() \ /* Apply changes */ \ * str->ptr_ = ptr #endif httrack-3.49.14/src/htscore.h0000644000175000017500000004253215230602340011425 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Main file .h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Core engine declarations. Not an installed header, but part of the de-facto API surface: external consumers (e.g. httrack-android) read these structs and constants and call functions declared here. */ #ifndef HTS_CORE_DEFH #define HTS_CORE_DEFH #include "htsglobal.h" /* specific definitions */ #include "htsbase.h" /* Includes and definitions */ #include #include #ifdef _WIN32 #include #include #else #ifndef _WIN32 #include #endif #endif /* END specific definitions */ /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_lien_url #define HTS_DEF_FWSTRUCT_lien_url typedef struct lien_url lien_url; #endif #ifndef HTS_DEF_FWSTRUCT_lien_back #define HTS_DEF_FWSTRUCT_lien_back typedef struct lien_back lien_back; #endif #ifndef HTS_DEF_FWSTRUCT_struct_back #define HTS_DEF_FWSTRUCT_struct_back typedef struct struct_back struct_back; #endif #ifndef HTS_DEF_FWSTRUCT_cache_back #define HTS_DEF_FWSTRUCT_cache_back typedef struct cache_back cache_back; #endif #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif #ifndef HTS_DEF_FWSTRUCT_filecreate_params #define HTS_DEF_FWSTRUCT_filecreate_params typedef struct filecreate_params filecreate_params; #endif // Include htslib.h for all types #include "htslib.h" // options #include "htsopt.h" // HTTrack engine sub-headers // main entry point #include "htscoremain.h" // core routines #include "htscore.h" // misc tools for httrack.c #include "htstools.h" // command-line help #include "htshelp.h" // build the on-disk save filename #include "htsname.h" // FTP support #include "htsftp.h" // URL interception #include "htscatchurl.h" // robots.txt handling #include "htsrobots.h" // link-acceptance rules #include "htswizard.h" // regexp/filter routines #include "htsfilters.h" // download backing (the back[] slot ring) #include "htsback.h" // cache handling #include "htscache.h" // hashing #include "htshash.h" #include "coucal.h" #include "htsdefines.h" #include "hts-indextmpl.h" /** A remote URL split into host and path, each a fixed inline buffer (HTS_URLMAXSIZE*2 bytes, NUL-terminated). */ #ifndef HTS_DEF_FWSTRUCT_lien_adrfil #define HTS_DEF_FWSTRUCT_lien_adrfil typedef struct lien_adrfil lien_adrfil; #endif struct lien_adrfil { char adr[HTS_URLMAXSIZE * 2]; /**< host (address) */ char fil[HTS_URLMAXSIZE * 2]; /**< remote file path */ }; /** A remote URL plus the local on-disk path it is saved to. */ #ifndef HTS_DEF_FWSTRUCT_lien_adrfilsave #define HTS_DEF_FWSTRUCT_lien_adrfilsave typedef struct lien_adrfilsave lien_adrfilsave; #endif struct lien_adrfilsave { lien_adrfil af; char save[HTS_URLMAXSIZE * 2]; /**< local save path (with directory) */ }; /** Per-slot connect-fallback bookkeeping (parallel to struct_back.lnk). Tracks which resolved address the slot is currently connecting to so a stuck connect can be retried against the next one. */ typedef struct hts_connect_fallback { int addr_index; /**< candidate being connected (0-based) */ int addr_count; /**< resolved addresses; -1 = not yet probed */ TStamp connect_start; /**< when the current candidate's connect began */ } hts_connect_fallback; /** The download-slot ring: the set of concurrent transfers in flight. Allocated/owned by the engine; consumers (status callbacks, the loop) read it but do not resize or free it. */ #ifndef HTS_DEF_FWSTRUCT_struct_back #define HTS_DEF_FWSTRUCT_struct_back typedef struct struct_back struct_back; #endif struct struct_back { lien_back *lnk; /**< slot array, valid indices [0..count-1] (count+1 entries allocated); a slot is active iff lnk[i].status != STATUS_FREE. See struct lien_back in htsopt.h and the STATUS_* codes in htsbasenet.h. */ int count; /**< number of usable slots (back_max) */ coucal ready; /**< index of slots whose transfer completed */ LLint ready_size_bytes; /**< total bytes buffered in completed slots */ hts_connect_fallback *connect_fallback; /**< per-slot, count+1 entries */ }; typedef struct cache_back_zip_entry cache_back_zip_entry; /** Open handle to the mirror cache (the read-from-old / write-to-new state used to resume and to avoid re-fetching unchanged files). Engine-owned. */ #ifndef HTS_DEF_FWSTRUCT_cache_back #define HTS_DEF_FWSTRUCT_cache_back typedef struct cache_back cache_back; #endif struct cache_back { int version; /**< cache-file format version being read */ /* */ int type; int ro; /**< read-only: no new cache is written */ FILE *lst; /**< file list, used for purge */ FILE *txt; /**< human-readable file list (info) */ char lastmodified[256]; // HASH coucal hashtable; // HASH for tests (naming subsystem) coucal cached_tests; /* optional log files */ FILE *log; FILE *errlog; /* read-ahead cursors into the old cache */ int ptr_ant; int ptr_last; /* ZIP-backed cache backend (newer format) */ void *zipInput; void *zipOutput; cache_back_zip_entry *zipEntries; int zipEntriesOffs; int zipEntriesCapa; hts_boolean zipWriteFailed; /**< a cache write failed; stop touching the stream */ int zipWriteFailures; /**< consecutive entry write failures; reset on store */ }; #ifndef HTS_DEF_FWSTRUCT_hash_struct #define HTS_DEF_FWSTRUCT_hash_struct typedef struct hash_struct hash_struct; #endif /** Lookup indexes over the link heap: map save-name / URL back to a link, so a URL seen twice resolves to one entry. The coucal tables index into liens; they do not own the links. */ struct hash_struct { /* points at the engine's link array (opt->liens); not owned */ const lien_url *const*const*liens; /* save-name -> link index (case-insensitive: keys lowercased) */ coucal sav; /* address+path -> link index */ coucal adrfil; /* former address+path -> link index (renamed/moved entries) */ coucal former_adrfil; /* effective urlhack sub-flags: www.==host / // collapse / query-arg sort */ hts_boolean norm_host; hts_boolean norm_slash; hts_boolean norm_query; /* query-strip keys (not owned); set from opt->strip_query at hash_init */ const char *strip_query; char normfil[HTS_URLMAXSIZE * 2]; char normfil2[HTS_URLMAXSIZE * 2]; char catbuff[CATBUFF_SIZE]; }; #ifndef HTS_DEF_FWSTRUCT_filecreate_params #define HTS_DEF_FWSTRUCT_filecreate_params typedef struct filecreate_params filecreate_params; #endif /** Parameters threaded through file-creation callbacks (filenote). */ struct filecreate_params { FILE *lst; /**< open file list to append created paths to */ char path[HTS_URLMAXSIZE * 2]; }; /* Convenience accessors over the link heap; assume `opt` (and where used, `ptr`/`parent_relative`) are in scope. heap(N) is the Nth link; heap_top_index() is the last recorded link's index. */ #define heap(N) (opt->liens[N]) #define heap_top_index() (opt->lien_tot - 1) #define heap_top() (heap(heap_top_index())) #define urladr() (heap(ptr)->adr) #define urlfil() (heap(ptr)->fil) #define savename() (heap(ptr)->sav) #define parenturladr() (heap(heap(ptr)->precedent)->adr) #define parenturlfil() (heap(heap(ptr)->precedent)->fil) #define parentsavename() (heap(heap(ptr)->precedent)->sav) #define relativeurladr() ((!parent_relative)?urladr():parenturladr()) #define relativeurlfil() ((!parent_relative)?urlfil():parenturlfil()) #define relativesavename() ((!parent_relative)?savename():parentsavename()) /* Library-internal helpers (engine-only, HTS_INTERNAL_BYTECODE). */ #ifdef HTS_INTERNAL_BYTECODE /* True if a new cache is being written (plain or zip backend). */ HTS_STATIC int cache_writable(cache_back * cache) { return (cache != NULL && cache->zipOutput != NULL); } /* True if an old cache is available to read (plain or zip backend). */ HTS_STATIC int cache_readable(cache_back * cache) { return (cache != NULL && cache->zipInput != NULL); } #endif // Functions /* Library-internal only (engine TUs). */ #ifdef HTS_INTERNAL_BYTECODE char *hts_cancel_file_pop(httrackp * opt); #endif /* Record a link on the heap. All strings are copied (caller keeps ownership). Returns 1 on success, 0 if the link limit (opt->maxlink) is reached. */ int hts_record_link(httrackp * opt, const char *address, const char *file, const char *save, const char *ref_address, const char *ref_file, const char *codebase); /* Index of the most recently recorded link. */ size_t hts_record_link_latest(httrackp *opt); /* Mark link at index lpos as not to be processed (sets pass2 = -1). */ void hts_invalidate_link(httrackp * opt, int lpos); /* Reset / free the engine's link heap. */ void hts_record_init(httrackp *opt); void hts_record_free(httrackp *opt); /* Run the mirror for the given start URL(s) under opt. Top-level engine entry. */ int httpmirror(char *url1, httrackp * opt); /* Write len bytes of adr to local path s. url_adr/url_fil (may be NULL) name the source URL for logging/notification. */ int filesave(httrackp * opt, const char *adr, int len, const char *s, const char *url_adr /* = NULL */ , const char *url_fil /* = NULL */ ); char *hts_cancel_file_pop(httrackp * opt); int check_fatal_io_errno(void); int engine_stats(void); void host_ban(httrackp * opt, int ptr, struct_back * sback, const char *host); /* Open local file s for writing (filecreate, truncate) or appending (fileappend), creating parent directories as needed. Return an open FILE* the caller must fclose(), or NULL on failure. */ FILE *filecreate(filenote_strc * strct, const char *s); FILE *fileappend(filenote_strc * strct, const char *s); /* Create an empty file, return 1 on success, 0 on failure. */ int filecreateempty(filenote_strc * strct, const char *filename); int filenote(filenote_strc * strct, const char *s, filecreate_params * params); void file_notify(httrackp * opt, const char *adr, const char *fil, const char *save, int create, int modify, int wasupdated); void usercommand(httrackp * opt, int exe, const char *cmd, const char *file, const char *adr, const char *fil); void usercommand_exe(const char *cmd, const char *file); // Finish the makeindex index.html (footer + refresh meta), run usercommand. // Updates *makeindex_done/*makeindex_fp in place; adr/fil are the mode strings. void hts_finish_makeindex(httrackp *opt, int *makeindex_done, FILE **makeindex_fp, int makeindex_links, const char *makeindex_firstlink, const char *template_footer, const char *adr, const char *fil); // Flush ht_buff[0..ht_len] to save on disk (skip if MD5 unchanged); *fp // closed+NULLed on write. Precondition: ht_len>0. void hts_finish_html_file(httrackp *opt, cache_back *cache, htsblk *r, FILE **fp, const char *ht_buff, size_t ht_len, const char *adr, const char *fil, const char *save); int filters_init(char ***ptrfilters, int maxfilter, int filterinc); int fspc(httrackp * opt, FILE * fp, const char *type); char *next_token(char *p, int flag); /* Like fil_normalized(), but first drops query keys in STRIP (comma-separated, "*" = all); STRIP NULL/empty behaves exactly like fil_normalized(). */ char *fil_normalized_filtered(const char *source, char *dest, const char *strip); /* As fil_normalized_filtered(), but DO_SLASH/DO_QUERY gate the // collapse and the query-argument sort independently (the urlhack sub-flags). */ char *fil_normalized_filtered_ex(const char *source, char *dest, const char *strip, int do_slash, int do_query); /* For URL ADR/FIL, return (in DEST) the comma keylist to strip from the '\n'-separated "[pattern=]keys" RULES (patterns matched on host/path via strjoker, last wins); NULL if none match. Feeds fil_normalized_filtered(). */ const char *hts_query_strip_keys(const char *rules, const char *adr, const char *fil, char *dest, size_t destsize); /* Read a whole file into a freshly malloc'd, NUL-terminated buffer; the caller owns it and must release it with freet(). Return NULL on missing/unreadable file (readfile_or substitutes defaultdata instead). The byte content is NOT transcoded except readfile_utf8, which expects a UTF-8 path. readfile2 reports the byte size (excluding the NUL) via *size when non-NULL. */ char *readfile(const char *fil); char *readfile2(const char *fil, LLint * size); char *readfile_utf8(const char *fil); char *readfile_or(const char *fil, const char *defaultdata); /* Backing (download-slot) scheduler. Operate on the back[] ring (struct_back). Not thread-safe; call from the single crawl loop. */ /* True if a connecting slot should give up on the current address and try the next one: a fallback address remains (addr_index+1 < addr_count) and the candidate has been connecting for at least its deadline, min(timeout, an internal cap). elapsed/timeout in seconds. Exposed for the -#D self-test. */ int back_connect_fallback_due(int addr_index, int addr_count, int elapsed, int timeout); /* How many new sockets may be opened now, honoring maxsoc and the maxconn rate limit (>=0). _strict ignores reserved-slot headroom; the plain form leaves room for naming tests and stops at 0 when the stack is nearly full. */ int back_pluggable_sockets(struct_back * sback, httrackp * opt); int back_pluggable_sockets_strict(struct_back * sback, httrackp * opt); /* One engine-loop tick: refresh the transfer stats and run the loop callback for slot b (-1 = none). HTS_FALSE = the callback requested an abort. */ hts_boolean hts_loop_tick(struct_back *sback, httrackp *opt, int b, int ptr); /* Wait until a test socket can be plugged, pumping transfers, stats and the loop callback; gives up past the -E deadline. HTS_FALSE = callback abort. */ hts_boolean hts_wait_available_socket(struct_back *sback, httrackp *opt, cache_back *cache, int ptr); /* Randomized inter-file pause target in [min_ms,max_ms] (#185), derived from a timestamp seed so it is stable within one gap and rerolls per launch. */ int hts_pause_target_ms(TStamp seed, int min_ms, int max_ms); /* Schedule more links from the heap into free slots. Returns the number queued, or <=0 if none could be added (no free slot / paused / stopped). */ int back_fill(struct_back * sback, httrackp * opt, cache_back * cache, int ptr, int numero_passe); /* Count of links already finished (in background or served from cache). */ int backlinks_done(const struct_back *sback, lien_url **liens, int lien_tot, int ptr); /* Like back_fill, but a no-op (returns -1) when in-memory buffered data already exceeds opt->maxcache. */ int back_fillmax(struct_back * sback, httrackp * opt, cache_back * cache, int ptr, int numero_passe); /* Interactive prompt: continue an interrupted mirror? Returns nonzero to go on. */ int ask_continue(httrackp * opt); /* Number of decimal digits in n. */ int nombre_digit(int n); // Polling #if HTS_POLL int check_flot(T_SOC s); int check_stdin(void); int read_stdin(char *s, int max); #endif /* Socket readiness probes: nonzero if the socket has an error / has data. */ int check_sockerror(T_SOC s); int check_sockdata(T_SOC s); /* external modules: register a link discovered by a parser plugin. */ int htsAddLink(htsmoduleStruct * str, char *link); /* No-op function (used as a do-nothing callback / to defeat optimizers). */ void voidf(void); /* HTML marker comment marking where the top index is spliced. */ #define HTS_TOPINDEX "TOP_INDEX_HTTRACK" /* Worst-case byte expansion HT_ADD_HTMLESCAPED* must reserve per escaper. */ #define HTS_HTMLESCAPE_MAXEXP 5 /* escape_for_html_print: '&'->"&" */ #define HTS_HTMLESCAPE_FULL_MAXEXP 6 /* _full: high byte->"&#xHH;" */ #endif httrack-3.49.14/src/htsconfig.h0000644000175000017500000000625615230602340011745 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Global engine definition file */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ // Ensemble des paramètres du robot #ifndef HTTRACK_GLOBAL_ENGINE_DEFH #define HTTRACK_GLOBAL_ENGINE_DEFH // ------------------------------------------------------------ // Définitions du ROBOT // accès des miroirs pour les autres utilisateurs (0/1) #define HTS_ACCESS 1 // temps de poll d'une socket: 1/10s #define HTS_SOCK_SEC 0 #define HTS_SOCK_MS 100000 // nom par défaut #define DEFAULT_HTML "index.html" // nom par défaut pour / en ftp #define DEFAULT_FTP "index.txt" // extension par défaut pour fichiers n'en ayant pas #define DEFAULT_EXT ".html" #define DEFAULT_EXT_SHORT ".htm" // éviter les /nul, /con.. #define HTS_OVERRIDE_DOS_FOLDERS 1 // indexing (keyword) #define HTS_MAKE_KEYWORD_INDEX 1 // poll stdin autorisé? (0/1) #define HTS_POLL 1 // le slash est un html par défaut (exemple/ est toujours un html) #define HTS_SLASH_ISHTML 1 // supprimer index si un répertoire identique existe #define HTS_REMOVE_ANNOYING_INDEX 1 // écriture directe dur disque possible (0/1) #define HTS_DIRECTDISK 1 // always direct-to-disk (0/1) #define HTS_DIRECTDISK_ALWAYS 1 // le > peut être considéré comme un tag de fermeture de commentaire (\r\n"\ "\r\n"\ "Link caught!\r\n"\ "\r\n"\ "\r\n"\ "\r\n"\ "

Link captured into HTTrack Website Copier, you can now restore your proxy preferences!

\r\n"\ "

\r\n"\ "

Clic here to go back

\r\n"\ ""\ "\r\n"\ "\r\n"\ #endif #endif httrack-3.49.14/src/htsselftest.h0000644000175000017500000000400115230602340012313 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsselftest.h */ /* named dispatch for the hidden engine self-tests */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSSELFTEST_DEFH #define HTSSELFTEST_DEFH #ifdef HTS_INTERNAL_BYTECODE #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif /* Run engine self-test `name` over the positional args argv[0..argc-1], or list the available tests when name is NULL, empty, or "list". Prints the result; returns the process exit code (0 == success). The caller owns option cleanup. Reached through the hidden `httrack -#test[=NAME ...]` subcommand. */ int hts_selftest(httrackp *opt, const char *name, int argc, char **argv); #endif #endif httrack-3.49.14/src/htsdns_selftest.h0000644000175000017500000000430215230602340013163 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsdns_selftest.h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSDNS_SELFTEST_DEFH #define HTSDNS_SELFTEST_DEFH #ifdef HTS_INTERNAL_BYTECODE #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif /* Drive the DNS resolver and cache through a scripted (mock) getaddrinfo, asserting address family, single-address selection, negative caching, the IPv4/IPv6 family filter, and that a cached host is resolved only once. Returns the number of failed checks (0 == success). */ int dns_selftests(httrackp *opt); /* Drive a deliberately slow (mock) resolver, asserting that a resolve is bounded by opt->timeout, does not hold opt->state.lock while it runs, and does not cache a timeout as an answer (#606). Takes a few seconds. Returns the number of failed checks (0 == success). */ int dns_timeout_selftests(httrackp *opt); #endif #endif httrack-3.49.14/src/htscache_selftest.h0000644000175000017500000000614115230602340013445 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htscache_selftest.h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSCACHE_SELFTEST_DEFH #define HTSCACHE_SELFTEST_DEFH #ifdef HTS_INTERNAL_BYTECODE #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif /* Run the cache create/read/update self-test against a working directory. Returns the number of failed checks (0 == success). */ int cache_selftests(httrackp *opt, const char *dir); /* Read a committed (frozen) cache fixture under /hts-cache/new.zip and assert a fixed set of entries decodes field- and byte-exact. Unlike cache_selftests (write-then-read with the same build, a round-trip), this reads bytes an earlier build froze, so it catches read-path / format drift. regen!=0 first rewrites the fixture from the same table (to regenerate the committed file, never by the test). Returns the failed-check count. */ int cache_golden_selftest(httrackp *opt, const char *dir, int regen); /* Cache write-failure policy (#174/#219): abort on fatal errno or a streak, drop just the entry otherwise. Returns the failed-check count. */ int cache_write_failure_selftest(httrackp *opt, const char *dir); /* Exercise the hts_cache_reconcile() generation policies on file fixtures under . Returns the failed-check count. */ int cache_reconcile_selftest(httrackp *opt, const char *dir); /* Verify cache_init refuses a pre-3.31 .dat/.ndx cache without touching it. Returns the number of failed checks (0 = pass). */ int cache_legacy_refused_selftest(httrackp *opt, const char *dir); /* Inject read-side corruption (zip byte surgery: bad size, header, deflate) under and assert every case degrades to STATUSCODE_INVALID without tainting a sibling entry. */ int cache_corruption_selftest(httrackp *opt, const char *dir); #endif #endif httrack-3.49.14/src/htscache.h0000644000175000017500000001047715230602340011543 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* cache system (index and stores files in cache) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSCACHE_DEFH #define HTSCACHE_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE #include "htsglobal.h" #include /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_cache_back #define HTS_DEF_FWSTRUCT_cache_back typedef struct cache_back cache_back; #endif #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif // cache void cache_mayadd(httrackp * opt, cache_back * cache, htsblk * r, const char *url_adr, const char *url_fil, const char *url_save); void cache_add(httrackp * opt, cache_back * cache, const htsblk * r, const char *url_adr, const char *url_fil, const char *url_save, int all_in_cache, const char *path_prefix); htsblk cache_read(httrackp * opt, cache_back * cache, const char *adr, const char *fil, const char *save, char *location); htsblk cache_read_ro(httrackp * opt, cache_back * cache, const char *adr, const char *fil, const char *save, char *location); /* Like cache_read, but also yields entries whose transfer broke; return_save (optional, HTS_URLMAXSIZE*2) receives the entry's recorded save name. */ htsblk cache_read_including_broken(httrackp *opt, cache_back *cache, const char *adr, const char *fil, char *return_save); htsblk cache_readex(httrackp * opt, cache_back * cache, const char *adr, const char *fil, const char *save, char *location, char *return_save, int readonly); htsblk *cache_header(httrackp * opt, cache_back * cache, const char *adr, const char *fil, htsblk * r); void cache_init(cache_back * cache, httrackp * opt); /* Which hts-cache/ generation (new.* vs old.*) is authoritative. */ typedef enum { CACHE_RECONCILE_PROMOTE, /* no new cache: promote the old generation */ CACHE_RECONCILE_INTERRUPTED, /* aborted run: keep the larger generation */ CACHE_RECONCILE_ROLLBACK /* nothing transferred: restore the old one */ } hts_cache_reconcile_mode; /* Reconcile the on-disk cache generations according to mode; a no-op when the involved files are absent. */ void hts_cache_reconcile(httrackp *opt, hts_cache_reconcile_mode mode); void cache_rstr(FILE *fp, char *s, size_t s_size); char *cache_rstr_addr(FILE * fp); int cache_brstr(char *adr, char *s, size_t s_size); /* binput over a NUL-terminated buffer, bounded: no read starts at/past end. */ int cache_binput(char *adr, const char *end, char *s, int max); int cache_brint(char *adr, int *i); void cache_rint(FILE * fp, int *i); void cache_rLLint(FILE * fp, LLint * i); int cache_wstr(FILE * fp, const char *s); int cache_wint(FILE * fp, int i); int cache_wLLint(FILE * fp, LLint i); #endif #endif httrack-3.49.14/src/htsbauth.h0000644000175000017500000001033715230602340011576 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* basic authentication: password storage */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsbauth.h HTTP Basic authentication storage: a per-session list of (URL-prefix, credentials) pairs, plus the cookie jar that holds it. */ #ifndef HTSBAUTH_DEFH #define HTSBAUTH_DEFH #include /** One stored credential: the longest-prefix match against a request's host+path selects which auth header to send. */ #ifndef HTS_DEF_FWSTRUCT_bauth_chain #define HTS_DEF_FWSTRUCT_bauth_chain typedef struct bauth_chain bauth_chain; #endif struct bauth_chain { char prefix[1024]; /* host + path prefix, e.g. www.foo.com/secure/ */ char auth[1024]; /* base-64 encoded user:pass (Authorization payload) */ struct bauth_chain *next; /* next element, NULL-terminated list */ }; /** Per-session cookie jar; also holds the basic-auth list head (auth). The head node (auth) is embedded, not heap-allocated. */ #ifndef HTS_DEF_FWSTRUCT_t_cookie #define HTS_DEF_FWSTRUCT_t_cookie typedef struct t_cookie t_cookie; #endif struct t_cookie { int max_len; /* capacity of data[] in use */ char data[32768]; /* raw cookie store (NUL-terminated field list) */ bauth_chain auth; /* embedded head of the basic-auth list */ }; /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE /* cookies */ int cookie_add(t_cookie *cookie, const char *cook_name, const char *cook_value, const char *domain, const char *path); int cookie_del(t_cookie *cookie, const char *cook_name, const char *domain, const char *path); int cookie_load(t_cookie *cookie, const char *path, const char *name); int cookie_save(t_cookie *cookie, const char *name); void cookie_insert(char *s, size_t s_size, const char *ins); void cookie_delete(char *s, size_t s_size, size_t pos); const char *cookie_get(char *buffer, const char *cookie_base, int param); char *cookie_find(char *s, const char *cook_name, const char *domain, const char *path); char *cookie_nextfield(char *a); /* basic auth */ /** Register credentials (auth = base-64 user:pass) for the prefix derived from adr (host) and fil (path). No-op returning 0 if cookie is NULL, allocation fails, or a matching prefix is already stored; returns 1 on insertion. */ int bauth_add(t_cookie *cookie, const char *adr, const char *fil, const char *auth); /** Return the stored base-64 credentials whose prefix matches adr+fil, or NULL if none (or cookie is NULL). Returned pointer aliases the jar's bauth_chain; caller must not free it. */ char *bauth_check(t_cookie *cookie, const char *adr, const char *fil); /** Build the auth lookup key (host + path, query string stripped, truncated at the last '/') from adr and fil into prefix; returns prefix. Caller must supply a buffer of HTS_URLMAXSIZE * 2 bytes. */ char *bauth_prefix(char *buffer, const char *adr, const char *fil); #endif #endif httrack-3.49.14/src/htsbasenet.h0000644000175000017500000001214715230602340012115 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Basic net definitions */ /* Used in .c and .h files that needs hostent and so */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /** @file htsbasenet.h Base networking definitions: platform socket headers, the optional global OpenSSL context, and the status-code/connection-state enumerations stored in htsblk and lien_back. Pulled in by htsnet.h. */ #ifndef HTS_DEFBASENETH #define HTS_DEFBASENETH #ifdef _WIN32 #if HTS_INET6 == 0 #include #else #undef HTS_USESCOPEID #define WIN32_LEAN_AND_MEAN // KB955045 (http://support.microsoft.com/kb/955045) // To execute an application using this function on earlier versions of Windows // (Windows 2000, Windows NT, and Windows Me/98/95), then it is mandatary to // #include Ws2tcpip.h and also Wspiapi.h. When the Wspiapi.h header file is // included, the 'getaddrinfo' function is #defined to the 'WspiapiGetAddrInfo' // inline function in Wspiapi.h. #include #include #endif #else #define HTS_USESCOPEID #define INVALID_SOCKET -1 #endif #ifdef __cplusplus extern "C" { #endif #if HTS_USEOPENSSL /* OpensSSL crypto routines by Eric Young (eay@cryptsoft.com) Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved */ #ifndef HTS_OPENSSL_H_INCLUDED #define HTS_OPENSSL_H_INCLUDED /* OpenSSL definitions */ #include #include #include /* OpenSSL structure */ #include /** Process-wide OpenSSL client context, created lazily on first TLS use; shared by all connections. NULL until initialized. */ extern SSL_CTX *openssl_ctx; #endif #endif /** RFC2616 status-codes ('statuscode' member of htsblk) **/ typedef enum HTTPStatusCode { HTTP_CONTINUE = 100, HTTP_SWITCHING_PROTOCOLS = 101, HTTP_OK = 200, HTTP_CREATED = 201, HTTP_ACCEPTED = 202, HTTP_NON_AUTHORITATIVE_INFORMATION = 203, HTTP_NO_CONTENT = 204, HTTP_RESET_CONTENT = 205, HTTP_PARTIAL_CONTENT = 206, HTTP_MULTIPLE_CHOICES = 300, HTTP_MOVED_PERMANENTLY = 301, HTTP_FOUND = 302, HTTP_SEE_OTHER = 303, HTTP_NOT_MODIFIED = 304, HTTP_USE_PROXY = 305, HTTP_TEMPORARY_REDIRECT = 307, HTTP_BAD_REQUEST = 400, HTTP_UNAUTHORIZED = 401, HTTP_PAYMENT_REQUIRED = 402, HTTP_FORBIDDEN = 403, HTTP_NOT_FOUND = 404, HTTP_METHOD_NOT_ALLOWED = 405, HTTP_NOT_ACCEPTABLE = 406, HTTP_PROXY_AUTHENTICATION_REQUIRED = 407, HTTP_REQUEST_TIME_OUT = 408, HTTP_CONFLICT = 409, HTTP_GONE = 410, HTTP_LENGTH_REQUIRED = 411, HTTP_PRECONDITION_FAILED = 412, HTTP_REQUEST_ENTITY_TOO_LARGE = 413, HTTP_REQUEST_URI_TOO_LARGE = 414, HTTP_UNSUPPORTED_MEDIA_TYPE = 415, HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416, HTTP_EXPECTATION_FAILED = 417, HTTP_TOO_MANY_REQUESTS = 429, HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451, HTTP_INTERNAL_SERVER_ERROR = 500, HTTP_NOT_IMPLEMENTED = 501, HTTP_BAD_GATEWAY = 502, HTTP_SERVICE_UNAVAILABLE = 503, HTTP_GATEWAY_TIME_OUT = 504, HTTP_HTTP_VERSION_NOT_SUPPORTED = 505 } HTTPStatusCode; /** Internal HTTrack status-codes ('statuscode' member of htsblk) **/ typedef enum BackStatusCode { STATUSCODE_INVALID = -1, STATUSCODE_TIMEOUT = -2, STATUSCODE_SLOW = -3, STATUSCODE_CONNERROR = -4, STATUSCODE_NON_FATAL = -5, STATUSCODE_SSL_HANDSHAKE = -6, STATUSCODE_TOO_BIG = -7, STATUSCODE_TEST_OK = -10, STATUSCODE_EXCLUDED = -11 /* aborted: MIME excluded by a -mime: filter */ } BackStatusCode; /** HTTrack status ('status' member of of 'lien_back') **/ typedef enum HTTrackStatus { STATUS_ALIVE = -103, STATUS_FREE = -1, STATUS_READY = 0, STATUS_TRANSFER = 1, STATUS_CHUNK_CR = 97, STATUS_CHUNK_WAIT = 98, STATUS_WAIT_HEADERS = 99, STATUS_CONNECTING = 100, STATUS_WAIT_DNS = 101, STATUS_SSL_WAIT_HANDSHAKE = 102, STATUS_FTP_TRANSFER = 1000, STATUS_FTP_READY = 1001 } HTTrackStatus; #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htssafe.h0000644000175000017500000004717315230602340011421 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2014 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htssafe.h safe strings operations, and asserts */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSSAFE_DEFH #define HTSSAFE_DEFH #include #include #include #include "htsglobal.h" /** * Emergency logging. * Default is to use libhttrack one. */ #if (!defined(HTSSAFE_ABORT_FUNCTION) && defined(LIBHTTRACK_EXPORTS)) /** Assert error callback. **/ #ifndef HTS_DEF_FWSTRUCT_htsErrorCallback #define HTS_DEF_FWSTRUCT_htsErrorCallback typedef void (*htsErrorCallback)(const char *msg, const char *file, int line); #ifdef __cplusplus extern "C" { #endif HTSEXT_API htsErrorCallback hts_get_error_callback(void); #ifdef __cplusplus } #endif #endif #define HTSSAFE_ABORT_FUNCTION(A, B, C) \ do { \ htsErrorCallback callback = hts_get_error_callback(); \ if (callback != NULL) { \ callback(A, B, C); \ } \ } while (0) #endif /** * Log an abort condition, and calls abort(). */ #define abortLog(a) abortf_(a, __FILE__, __LINE__) /** * Fatal assertion check. */ #define assertf__(exp, sexp, file, line) \ (void) ((exp) || (abortf_(sexp, file, line), 0)) /** * Fatal assertion check. */ #define assertf_(exp, file, line) assertf__(exp, #exp, file, line) /** * Fatal assertion check. */ #define assertf(exp) assertf_(exp, __FILE__, __LINE__) static HTS_UNUSED void log_abort_(const char *msg, const char *file, int line) { fprintf(stderr, "%s failed at %s:%d\n", msg, file, line); fflush(stderr); } static HTS_UNUSED void abortf_(const char *exp, const char *file, int line) { #ifdef HTSSAFE_ABORT_FUNCTION HTSSAFE_ABORT_FUNCTION(exp, file, line); #endif log_abort_(exp, file, line); abort(); } /** * Check whether 'VAR' is of type char[]. */ #if (defined(__GNUC__) && !defined(__cplusplus)) /* Note: char[] and const char[] are compatible */ #define HTS_IS_CHAR_BUFFER(VAR) \ (__builtin_types_compatible_p(typeof(VAR), char[])) #else /* Note: a bit lame as char[8] won't be seen. */ #define HTS_IS_CHAR_BUFFER(VAR) (sizeof(VAR) != sizeof(char *)) #endif #define HTS_IS_NOT_CHAR_BUFFER(VAR) (!HTS_IS_CHAR_BUFFER(VAR)) /* Compile-time checks. */ static HTS_UNUSED void htssafe_compile_time_check_(void) { char array[32]; char *pointer = array; char check_array[HTS_IS_CHAR_BUFFER(array) ? 1 : -1]; char check_pointer[HTS_IS_CHAR_BUFFER(pointer) ? -1 : 1]; (void) pointer; (void) check_array; (void) check_pointer; } /* * Pointer-destination diagnostics for the buff() macros (GCC/Clang, C only). * * strcpybuff()/strcatbuff()/strncatbuff() bounds-check only when the * destination is a sized char[] array (HTS_IS_CHAR_BUFFER). For a bare char* * the capacity is unknown, so the macro silently falls back to plain * strcpy()/strcat()/strncat() while still looking like a checked call. * * These stubs route that pointer case through __builtin_choose_expr() so the * 'warning' attribute fires only at pointer-destination sites; array sites use * the bounded *_safe_ helpers and stay quiet. The warning names the * explicit-size replacement (strlcpybuff/strlcatbuff). Diagnostic only: no * runtime or ABI change, built only on GCC/Clang in C mode. Other compilers * (MSVC, ...) keep the previous behavior via the #else branches. */ #if (defined(__GNUC__) && !defined(__cplusplus)) #if defined(__has_attribute) #if __has_attribute(warning) #define HTS_BUFF_PTR_ATTR(msg) __attribute__((unused, noinline, warning(msg))) #endif #endif #ifndef HTS_BUFF_PTR_ATTR /* 'warning' attribute unavailable: keep noinline so the migration can still grep for these symbols, but no compile-time diagnostic is emitted. */ #define HTS_BUFF_PTR_ATTR(msg) __attribute__((unused, noinline)) #endif HTS_BUFF_PTR_ATTR("strcpybuff() destination is a pointer (capacity unknown): " "NOT bounds-checked; use strlcpybuff(dst, src, size)") static char *strcpybuff_ptr_(char *dest, const char *src) { return strcpy(dest, src); } HTS_BUFF_PTR_ATTR("strcatbuff() destination is a pointer (capacity unknown): " "NOT bounds-checked; use strlcatbuff(dst, src, size)") static char *strcatbuff_ptr_(char *dest, const char *src) { return strcat(dest, src); } HTS_BUFF_PTR_ATTR("strncatbuff() destination is a pointer (capacity unknown): " "NOT bounds-checked; use strlcatbuff(dst, src, size)") static char *strncatbuff_ptr_(char *dest, const char *src, size_t n) { return strncat(dest, src, n); } #endif /* * SIZE CONTRACT shared by strcpybuff/strcatbuff/strncatbuff (the "buff" * family): the destination bound is taken from sizeof(A), so A MUST be a real * char[] array in scope. The bound is the full array size in bytes, INCLUDING * the terminating NUL. On overflow the *_safe_ helpers do NOT truncate: they * abort() (assertf). On success the result is always NUL-terminated. * * CRITICAL CAVEAT: if A is a bare char* pointer (not an array), sizeof(A) is * the pointer size, not the buffer capacity. There is no way to recover the * real capacity, so these macros SILENTLY DEGRADE to the unbounded raw * strcpy()/strcat()/strncat() while still looking like a checked call. The * bound is lost. On GCC/Clang (C) the pointer case routes through the * *_ptr_ stubs above, which carry a 'warning' attribute to flag the site at * compile time; on other compilers it is silent. When the destination is a * pointer of known capacity, call the explicit-size strlcpybuff/strlcatbuff * (passing the capacity, NUL included) instead. */ /** * Append at most N characters from "B" to "A". * If "A" is a char[] variable whose size is not sizeof(char*), then the size * is assumed to be the capacity of this array. */ #if (defined(__GNUC__) && !defined(__cplusplus)) #define strncatbuff(A, B, N) \ __builtin_choose_expr( \ HTS_IS_CHAR_BUFFER(A), \ strncat_safe_(A, sizeof(A), B, \ HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), N, \ "overflow while appending '" #B "' to '" #A "'", __FILE__, \ __LINE__), \ strncatbuff_ptr_((A), (B), (N))) #else #define strncatbuff(A, B, N) \ (HTS_IS_NOT_CHAR_BUFFER(A) \ ? strncat(A, B, N) \ : strncat_safe_(A, sizeof(A), B, \ HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), N, \ "overflow while appending '" #B "' to '" #A "'", \ __FILE__, __LINE__)) #endif /** * Append characters of "B" to "A". * If "A" is a char[] variable whose size is not sizeof(char*), then the size * is assumed to be the capacity of this array. */ #if (defined(__GNUC__) && !defined(__cplusplus)) #define strcatbuff(A, B) \ __builtin_choose_expr( \ HTS_IS_CHAR_BUFFER(A), \ strncat_safe_(A, sizeof(A), B, \ HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ (size_t) -1, \ "overflow while appending '" #B "' to '" #A "'", __FILE__, \ __LINE__), \ strcatbuff_ptr_((A), (B))) #else #define strcatbuff(A, B) \ (HTS_IS_NOT_CHAR_BUFFER(A) \ ? strcat(A, B) \ : strncat_safe_(A, sizeof(A), B, \ HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ (size_t) -1, \ "overflow while appending '" #B "' to '" #A "'", \ __FILE__, __LINE__)) #endif /** * Copy characters from "B" to "A". * If "A" is a char[] variable whose size is not sizeof(char*), then the size * is assumed to be the capacity of this array. */ #if (defined(__GNUC__) && !defined(__cplusplus)) #define strcpybuff(A, B) \ __builtin_choose_expr( \ HTS_IS_CHAR_BUFFER(A), \ strcpy_safe_(A, sizeof(A), B, \ HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ "overflow while copying '" #B "' to '" #A "'", __FILE__, \ __LINE__), \ strcpybuff_ptr_((A), (B))) #else #define strcpybuff(A, B) \ (HTS_IS_NOT_CHAR_BUFFER(A) \ ? strcpy(A, B) \ : strcpy_safe_(A, sizeof(A), B, \ HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ "overflow while copying '" #B "' to '" #A "'", __FILE__, \ __LINE__)) #endif /* * Explicit-size variants (strlcatbuff/strlncatbuff/strlcpybuff): the * destination capacity is the caller-supplied S (total bytes, NUL included), * NOT derived from sizeof(A). Use these when A is a pointer or its capacity is * not its sizeof. Same abort-on-overflow, always-NUL-terminated contract; no * silent pointer degradation since the bound is passed in. */ /** * Append characters of "B" to "A", "A" having a maximum capacity of "S". */ #define strlcatbuff(A, B, S) \ strncat_safe_(A, S, B, HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ (size_t) -1, "overflow while appending '" #B "' to '" #A "'", \ __FILE__, __LINE__) /** * Append at most "N" characters of "B" to "A", "A" having a maximum capacity * of "S". */ #define strlncatbuff(A, B, S, N) \ strncat_safe_(A, S, B, HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ N, "overflow while appending '" #B "' to '" #A "'", __FILE__, \ __LINE__) /** * Copy characters of "B" to "A", "A" having a maximum capacity of "S". */ #define strlcpybuff(A, B, S) \ strcpy_safe_(A, S, B, HTS_IS_NOT_CHAR_BUFFER(B) ? (size_t) -1 : sizeof(B), \ "overflow while copying '" #B "' to '" #A "'", __FILE__, \ __LINE__) /** strnlen replacement (autotools). **/ #if (!defined(_WIN32) && !defined(HAVE_STRNLEN)) static HTS_UNUSED size_t strnlen(const char *s, size_t maxlen) { size_t i; for (i = 0; i < maxlen && s[i] != '\0'; i++) ; return i; } #endif /* strlen of source, but bounded by sizeof_source (its capacity, NUL included). Aborts if source is NULL or has no NUL within that capacity. The sentinel sizeof_source == (size_t)-1 means "capacity unknown", and falls back to the unbounded strlen (used when the source is a pointer rather than an array). */ static HTS_INLINE HTS_UNUSED size_t strlen_safe_(const char *source, const size_t sizeof_source, const char *file, int line) { size_t size; assertf_(source != NULL, file, line); size = sizeof_source != (size_t) -1 ? strnlen(source, sizeof_source) : strlen(source); assertf_(size < sizeof_source, file, line); return size; } /* Core bounded append. Appends min(strlen(source), n) bytes of source onto dest. sizeof_dest is dest's total capacity (NUL included); sizeof_source is source's capacity or (size_t)-1 if unknown. Aborts if the result (existing dest length + appended bytes + NUL) would not fit sizeof_dest: this NEVER truncates. Always NUL-terminates on success. */ static HTS_INLINE HTS_UNUSED char * strncat_safe_(char *const dest, const size_t sizeof_dest, const char *const source, const size_t sizeof_source, const size_t n, const char *exp, const char *file, int line) { const size_t source_len = strlen_safe_(source, sizeof_source, file, line); const size_t dest_len = strlen_safe_(dest, sizeof_dest, file, line); /* note: "size_t is an unsigned integral type" ((size_t) -1 is positive) */ const size_t source_copy = source_len <= n ? source_len : n; const size_t dest_final_len = dest_len + source_copy; assertf__(dest_final_len < sizeof_dest, exp, file, line); memcpy(dest + dest_len, source, source_copy); dest[dest_final_len] = '\0'; return dest; } /* Core bounded copy: empties dest then appends all of source via strncat_safe_. sizeof_dest is dest's total capacity (NUL included). Aborts (no truncation) if source plus its NUL would not fit. */ static HTS_INLINE HTS_UNUSED char * strcpy_safe_(char *const dest, const size_t sizeof_dest, const char *const source, const size_t sizeof_source, const char *exp, const char *file, int line) { assertf_(sizeof_dest != 0, file, line); dest[0] = '\0'; return strncat_safe_(dest, sizeof_dest, source, sizeof_source, (size_t) -1, exp, file, line); } /** * htsbuff: a non-owning bounded string builder over a fixed buffer. * * Companion to the strcpybuff()/strcatbuff() macros for the common case of a * cursor walking a buffer of known capacity (building a name into a fixed * array, assembling a status line, etc.). It tracks the write position, bounds * every write against the real capacity, and aborts on overflow (same contract * as the *_safe_ helpers), so the error-prone manual "p += strlen(p)" dance * goes away. * * Build one from an in-scope array with htsbuff_array() (capacity via sizeof, * so pass an array, not a pointer), or from a pointer of known capacity with * htsbuff_ptr(). The buffer is kept NUL-terminated; htsbuff_str() returns it. */ typedef struct { char *buf; /* backing buffer (kept NUL-terminated) */ size_t cap; /* total capacity of buf, including the NUL */ size_t len; /* current length, excluding the NUL */ } htsbuff; static HTS_INLINE HTS_UNUSED htsbuff htsbuff_ptr_(char *buf, size_t cap) { htsbuff b; b.buf = buf; b.cap = cap; b.len = 0; assertf(cap != 0); buf[0] = '\0'; return b; } /** * Builder over the in-scope array ARR (capacity = sizeof(ARR)). * On GCC/Clang this rejects a non-array (e.g. a char* pointer), whose sizeof * would be the pointer size and silently wrong; use htsbuff_ptr() for pointers. * On other compilers there is no such guard, so pass only true arrays there. */ #if (defined(__GNUC__) && !defined(__cplusplus)) /* 0 for an array, a -1 array-size compile error for a pointer. */ #define htsbuff_must_be_array_(A) \ (sizeof(char[1 - 2 * !!__builtin_types_compatible_p(typeof(A), \ typeof(&(A)[0]))]) - \ 1) #define htsbuff_array(ARR) \ htsbuff_ptr_((ARR), sizeof(ARR) + htsbuff_must_be_array_(ARR)) #else #define htsbuff_array(ARR) htsbuff_ptr_((ARR), sizeof(ARR)) #endif /** Builder over pointer P of known capacity N (N includes the NUL). */ #define htsbuff_ptr(P, N) htsbuff_ptr_((P), (N)) /** Append at most n characters of s (stopping at its NUL). Aborts on overflow. */ static HTS_INLINE HTS_UNUSED void htsbuff_catn(htsbuff *b, const char *s, size_t n) { const size_t add = strnlen(s, n); /* Overflow-safe: keep the (potentially huge) 'add' alone on one side. The maintained invariant len < cap makes 'cap - len' >= 1 (no underflow), so 'add < cap - len' cannot wrap the way 'len + add < cap' could. */ assertf__(add < b->cap - b->len, "htsbuff append overflow", __FILE__, __LINE__); memcpy(b->buf + b->len, s, add); b->len += add; b->buf[b->len] = '\0'; } /** Append s. Aborts on overflow. */ static HTS_INLINE HTS_UNUSED void htsbuff_cat(htsbuff *b, const char *s) { htsbuff_catn(b, s, (size_t) -1); } /** Append a single character (including '\0' as data). Aborts on overflow. */ static HTS_INLINE HTS_UNUSED void htsbuff_catc(htsbuff *b, char c) { assertf__(1 < b->cap - b->len, "htsbuff append overflow", __FILE__, __LINE__); b->buf[b->len++] = c; b->buf[b->len] = '\0'; } /** Reset content to s. Aborts on overflow. */ static HTS_INLINE HTS_UNUSED void htsbuff_cpy(htsbuff *b, const char *s) { b->len = 0; htsbuff_catn(b, s, (size_t) -1); } /** Current NUL-terminated content. */ static HTS_INLINE HTS_UNUSED const char *htsbuff_str(const htsbuff *b) { return b->buf; } /* Thin aliases over the libc allocator/memcpy (historical "t" suffix); no added bounds checking. freet() also NULLs the freed pointer and tolerates NULL. memcpybuff() despite the name is a raw memcpy: the caller owns the bounds. */ #define malloct(A) malloc(A) #define calloct(A, B) calloc((A), (B)) #define freet(A) \ do { \ if ((A) != NULL) { \ free(A); \ (A) = NULL; \ } \ } while (0) #define strdupt(A) strdup(A) #define realloct(A, B) realloc(A, B) #define memcpybuff(A, B, N) memcpy((A), (B), (N)) #endif httrack-3.49.14/src/htsbase.h0000644000175000017500000000676115230602340011413 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Basic definitions */ /* Used in .c files for basic (malloc() ..) definitions */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTS_BASICH #define HTS_BASICH #ifdef __cplusplus extern "C" { #endif #include "htsglobal.h" #include "htsstrings.h" #include "htssafe.h" #include #include #ifndef _WIN32 #include #endif #include #include #ifndef _WIN32 #include #endif #include #ifdef _WIN32 #else #include #endif #include /* Compiler-portability attribute macros (no-ops on non-GCC). */ #ifndef HTS_UNUSED #ifdef __GNUC__ #define HTS_UNUSED __attribute__ ((unused)) #define HTS_STATIC static __attribute__ ((unused)) #define HTS_INLINE __inline__ /* printf-style format check; fmt/arg are 1-based argument positions. */ #define HTS_PRINTF_FUN(fmt, arg) __attribute__ ((format (printf, fmt, arg))) #else #define HTS_UNUSED #define HTS_STATIC static #define HTS_INLINE #define HTS_PRINTF_FUN(fmt, arg) #endif #endif /* min/max evaluate their arguments twice; pass side-effect-free expressions. */ #undef min #undef max #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) #ifndef _WIN32 #undef Sleep #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) /* Win32 Sleep() shim for POSIX; argument is milliseconds. */ #define Sleep(a) { if (((a)*1000)%1000000) usleep(((a)*1000)%1000000); if (((a)*1000)/1000000) sleep(((a)*1000)/1000000); } #endif /* hichar: ASCII uppercasing of one char. streql: case-insensitive equality of two chars. ASCII only; not locale-aware. */ #define hichar(a) ((((a)>='a') && ((a)<='z')) ? ((a)-('a'-'A')) : (a)) #define streql(a,b) (hichar(a)==hichar(b)) /* True if c is an ASCII uppercase letter. */ #define isUpperLetter(a) ( ((a) >= 'A') && ((a) <= 'Z') ) /* Library-internal only (engine translation units that define HTS_INTERNAL_BYTECODE); not part of the consumer surface. */ #ifdef HTS_INTERNAL_BYTECODE /* Resolve a symbol in an already-loaded dynamic module. */ #ifdef _WIN32 #define DynamicGet(handle, sym) GetProcAddress(handle, sym) #else #define DynamicGet(handle, sym) dlsym(handle, sym) #endif #endif #ifdef __cplusplus } #endif #endif httrack-3.49.14/src/htsback.h0000644000175000017500000001467215230602340011401 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* backing system (multiple socket download) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSBACK_DEFH #define HTSBACK_DEFH #include "htsglobal.h" #if HTS_XGETHOST #if USE_BEGINTHREAD #include "htsthread.h" #endif #endif /* Forward definitions */ #ifndef HTS_DEF_FWSTRUCT_httrackp #define HTS_DEF_FWSTRUCT_httrackp typedef struct httrackp httrackp; #endif #ifndef HTS_DEF_FWSTRUCT_struct_back #define HTS_DEF_FWSTRUCT_struct_back typedef struct struct_back struct_back; #endif #ifndef HTS_DEF_FWSTRUCT_cache_back #define HTS_DEF_FWSTRUCT_cache_back typedef struct cache_back cache_back; #endif #ifndef HTS_DEF_FWSTRUCT_lien_back #define HTS_DEF_FWSTRUCT_lien_back typedef struct lien_back lien_back; #endif #ifndef HTS_DEF_FWSTRUCT_htsblk #define HTS_DEF_FWSTRUCT_htsblk typedef struct htsblk htsblk; #endif /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE // create/destroy struct_back *back_new(httrackp *opt, int back_max); void back_free(struct_back ** sback); // backing #define BACK_ADD_TEST "(dummy)" #define BACK_ADD_TEST2 "(dummy2)" int back_index(httrackp * opt, struct_back * sback, const char *adr, const char *fil, const char *sav); int back_available(const struct_back * sback); LLint back_incache(const struct_back * sback); int back_done_incache(const struct_back * sback); HTS_INLINE int back_exist(struct_back * sback, httrackp * opt, const char *adr, const char *fil, const char *sav); int back_nsoc(const struct_back * sback); int back_nsoc_overall(const struct_back * sback); /* refetch_whole: force a whole-file GET, ignoring any partial/temp-ref resume (set when a prior 206 was rejected as unusable, #581). */ int back_add(struct_back *sback, httrackp *opt, cache_back *cache, const char *adr, const char *fil, const char *save, const char *referer_adr, const char *referer_fil, int test, hts_boolean refetch_whole); int back_add_if_not_exists(struct_back * sback, httrackp * opt, cache_back * cache, const char *adr, const char *fil, const char *save, const char *referer_adr, const char *referer_fil, int test); int back_stack_available(struct_back * sback); int back_search(httrackp * opt, struct_back * sback); int back_search_quick(struct_back * sback); void back_clean(httrackp * opt, cache_back * cache, struct_back * sback); int back_cleanup_background(httrackp * opt, cache_back * cache, struct_back * sback); void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, TStamp stat_timestart); int back_letlive(httrackp * opt, cache_back * cache, struct_back * sback, const int p); int back_searchlive(httrackp * opt, struct_back * sback, const char *search_addr); void back_connxfr(htsblk * src, htsblk * dst); void back_move(lien_back * src, lien_back * dst); void back_copy_static(const lien_back * src, lien_back * dst); int back_serialize(FILE * fp, const lien_back * src); int back_unserialize(FILE * fp, lien_back ** dst); int back_serialize_ref(httrackp * opt, const lien_back * src); int back_unserialize_ref(httrackp * opt, const char *adr, const char *fil, lien_back ** dst); void back_set_finished(struct_back * sback, const int p); void back_set_locked(struct_back * sback, const int p); void back_set_unlocked(struct_back * sback, const int p); int back_delete(httrackp * opt, cache_back * cache, struct_back * sback, const int p); /* Discard back's on-disk .delayed placeholder and its refname. */ void back_delayed_discard(httrackp *opt, lien_back *back); /* Move back's .delayed placeholder (and open stream) to newname; HTS_FALSE = file lost, slot flagged in error. */ hts_boolean back_delayed_rename(httrackp *opt, lien_back *back, const char *newname); void back_index_unlock(struct_back * sback, const int p); int back_clear_entry(lien_back * back); int back_flush_output(httrackp * opt, cache_back * cache, struct_back * sback, const int p); void back_delete_all(httrackp * opt, cache_back * cache, struct_back * sback); int back_maydelete(httrackp * opt, cache_back * cache, struct_back * sback, const int p); void back_maydeletehttp(httrackp * opt, cache_back * cache, struct_back * sback, const int p); int back_trylive(httrackp * opt, cache_back * cache, struct_back * sback, const int p); int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback, const int p); void back_info(struct_back * sback, int i, int j, FILE * fp); void back_infostr(struct_back *sback, int i, int j, char *s, size_t size); LLint back_transferred(LLint add, struct_back * sback); // hostback #if HTS_XGETHOST int host_wait(httrackp * opt, lien_back * sback); #endif int back_checksize(httrackp * opt, lien_back * eback, int check_only_totalsize); /* Enforce -M/-E quotas: smooth-stops when reached; returns 0 once the -M cap or -E deadline overruns its grace period (callers must stop waiting). */ int back_checkmirror(httrackp * opt); #endif #endif httrack-3.49.14/src/htsalias.h0000644000175000017500000001001715230602340011557 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsalias.h subroutines: */ /* alias for command-line options and config files */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTSALIAS_DEFH #define HTSALIAS_DEFH /* Library internal definictions */ #ifdef HTS_INTERNAL_BYTECODE extern const char *hts_optalias[][4]; int optalias_check(int argc, const char *const *argv, int n_arg, int *return_argc, char **return_argv, size_t return_argv_size, char *return_error, size_t return_error_size); int optalias_find(const char *token); const char *optalias_help(const char *token); int optreal_find(const char *token); int optinclude_file(const char *name, int *argc, char **argv, char *x_argvblk, size_t x_argvblk_size, int *x_ptr); const char *optreal_value(int p); const char *optalias_value(int p); const char *opttype_value(int p); const char *opthelp_value(int p); const char *hts_gethome(void); void expand_home(String * str); /* Command-line argv-block builders, shared by htscoremain.c (the CLI parser) and htsalias.c (config-file alias expansion). Tokens are packed back-to-back into x_argvblk (total capacity bufsize); each argv[] entry points into the block. cmdl_room bounds every copy: the running offset ptr can outrun the block (alias / doit.log expansion outpacing the +32768 slack), so it yields 0 rather than a wrapped size_t and the bounded copy aborts cleanly. */ #define cmdl_room(bufsize, ptr) \ ((ptr) < (size_t) (bufsize) ? (size_t) (bufsize) - (ptr) : 0) /* Append a token as a new argv[argc]. */ #define cmdl_add(token, argc, argv, buff, bufsize, ptr) \ argv[argc] = (buff + ptr); \ strlcpybuff(argv[argc], token, cmdl_room(bufsize, ptr)); \ ptr += (int) (strlen(argv[argc]) + 1); \ argc++ /* Insert a token at argv[0], shifting the existing argc entries up by one. */ #define cmdl_ins(token, argc, argv, buff, bufsize, ptr) \ { \ int i; \ for (i = argc; i > 0; i--) \ argv[i] = argv[i - 1]; \ } \ argv[0] = (buff + ptr); \ strlcpybuff(argv[0], token, cmdl_room(bufsize, ptr)); \ ptr += (int) (strlen(argv[0]) + 1); \ argc++ #endif #endif httrack-3.49.14/src/hts-indextmpl.h0000644000175000017500000014634315230602340012563 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Index.html templates file */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #ifndef HTTRACK_DEFTMPL #define HTTRACK_DEFTMPL /* Index for each project */ /* regen: (for i in *; do echo $i; cat $i | sed -e 's/"/\\"/g' | sed -e 's/^\(.*\)$/ "\1"LF\\/'; done) > /tmp/1.txt */ /* %s = INFO */ #define HTS_INDEX_HEADER \ ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ " Local index - HTTrack Website Copier"LF\ " %s"LF\ " "LF\ ""LF\ ""LF\ ""LF\ "
· %s
"LF\ " "LF\ " "LF\ " "LF\ "
HTTrack Website Copier - Open Source offline browser
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ ""LF\ ""LF\ "

Index of locally available sites:

"LF\ " "LF /* %s = URL */ /* %s = TITLE */ #define HTS_INDEX_BODY \ ""LF\ " "LF\ " "LF\ " "LF #define HTS_INDEX_BODYCAT \ ""LF\ " "LF /* %s = INFO */ #define HTS_INDEX_FOOTER \ ""LF\ "
"LF\ " ·"LF\ " "LF\ " %s"LF\ " "LF\ "
"LF\ "
"LF\ " %s"LF\ "
"LF\ "
"LF\ "
"LF\ "
"LF\ "
"LF\ " Mirror and index made by HTTrack Website Copier [XR&CO'2014]"LF\ "
"LF\ " %s"LF\ " "LF\ ""LF\ ""LF\ "
"LF\ "
"LF\ "
"LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
© 2014 Xavier Roche & other contributors - Web Design: Kauler Leto.
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF /* Index for all projects (top index) */ /* %s = INFO */ #define HTS_TOPINDEX_HEADER \ ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ " List of available projects - HTTrack Website Copier"LF\ " %s"LF\ ""LF\ " "LF\ ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
HTTrack Website Copier - Open Source offline browser
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ ""LF\ ""LF\ ""LF\ "

Index of locally available projects:

"LF\ " "LF /* %s = URL */ /* %s = TITLE */ #define HTS_TOPINDEX_BODY \ ""LF\ " "LF\ " "LF\ " "LF /* %s = INFO */ #define HTS_TOPINDEX_FOOTER \ ""LF\ "
"LF\ " · %s"LF\ "
"LF\ "
"LF\ "
"LF\ " Mirror and index made by HTTrack Website Copier [XR&CO'2014]"LF\ "
"LF\ " %s"LF\ " "LF\ ""LF\ ""LF\ "
"LF\ "
"LF\ "
"LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
© 2014 Xavier Roche & other contributors - Web Design: Kauler Leto.
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF /* Other files (fade and backblue images) */ #define HTS_LOG_SECURITY_WARNING "note:\tthe hts-log.txt file, and hts-cache folder, may contain sensitive information,"LF\ "\tsuch as username/password authentication for websites mirrored in this project"LF\ "\tdo not share these files/folders if you want these information to remain private"LF #define HTS_DATA_UNKNOWN_HTML ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ " Page not retrieved! - HTTrack Website Copier"LF\ " %s"LF\ " "LF\ ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
HTTrack Website Copier - Open Source offline browser
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ ""LF\ "

Oops!...

"LF\ "

This page has not been retrieved by HTTrack Website Copier.

"LF\ ""LF\ "
Mirror by HTTrack Website Copier
"LF\ ""LF\ "
"LF\ "
"LF\ "
"LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
© 2014 Xavier Roche & other contributors - Web Design: Kauler Leto.
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF #define HTS_DATA_UNKNOWN_HTML_LEN 0 #define HTS_DATA_ERROR_HTML ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ " Page not retrieved! - HTTrack Website Copier"LF\ " "LF\ ""LF\ ""LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
HTTrack Website Copier - Open Source offline browser
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ " "LF\ " "LF\ " "LF\ " "LF\ "
"LF\ ""LF\ "

Oops!...

"LF\ "

This page has not been retrieved by HTTrack Website Copier (%s).

"LF\ ""LF\ "
Mirror by HTTrack Website Copier
"LF\ ""LF\ ""LF\ ""LF\ "
"LF\ "
"LF\ "
"LF\ ""LF\ ""LF\ " "LF\ " "LF\ " "LF\ "
© 2014 Xavier Roche & other contributors - Web Design: Kauler Leto.
"LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF\ ""LF // image gif "unknown" #define HTS_DATA_UNKNOWN_GIF \ "\x47\x49\x46\x38\x39\x61\x20\x0\x20\x0\xf7\xff\x0\xc0\xc0\xc0\xff\x0\x0\xfc\x3\x0\xf8\x6\x0\xf6\x9\x0\xf2\xc\x0\xf0\xf\x0\xf0\xe\x0\xed\x11\x0\xec\x13\x0\xeb\x14\x0\xe9\x15\x0\xe8\x18\x0\xe6\x18\x0\xe5\x1a\x0\xe3\x1c\x0\xe2\x1d\x0\xe1\x1e\x0\xdf\x20\x0\xdd\x23\x0\xdd\x22\x0\xdb\x23\x0\xda\x25\x0\xd9\x25\x0\xd8\x27\x0\xd6\x29\x0\xd5\x2a\x0\xd3\x2c\x0\xd2\x2d\x0"\ "\xd1\x2d\x0\xd0\x2f\x0\xcf\x30\x0\xce\x31\x0\xcb\x34\x0\xcb\x33\x0\xc8\x36\x0\xc5\x3b\x0\xc2\x3c\x0\xc0\x3f\x0\xbc\x43\x0\xba\x45\x0\xb7\x48\x0\xb4\x4c\x0\xb1\x4e\x0\xad\x51\x0\xaa\x55\x0\xa8\x58\x0\xa4\x5a\x0\xa1\x5e\x0\x9f\x60\x0\x99\x66\x0\x96\x68\x0\x93\x6c\x0\x90\x6e\x0\x8d\x72\x0\x8b\x74\x0\x8a\x75\x0\x88\x78\x0\x85\x79\x0\x82\x7d\x0\x7e\x80\x0\x7d\x82\x0\x79"\ "\x86\x0\x77\x88\x0\x73\x8b\x0\x72\x8d\x0\x70\x8e\x0\x6e\x91\x0\x6a\x95\x0\x68\x97\x0\x65\x9a\x0\x63\x9d\x0\x62\x9e\x0\x60\xa0\x0\x5d\xa2\x0\x5c\xa3\x0\x5a\xa5\x0\x57\xa9\x0\x57\xa7\x0\x54\xab\x0\x53\xac\x0\x52\xad\x0\x51\xae\x0\x4f\xb0\x0\x4e\xb1\x0\x4d\xb2\x0\x4c\xb4\x0\x49\xb6\x0\x48\xb8\x0\x46\xba\x0\x45\xbb\x0\x43\xbd\x0\x43\xbc\x0\x40\xbf\x0\x3f\xc0\x0\x3e\xc1"\ "\x0\x3d\xc2\x0\x3a\xc5\x0\x39\xc5\x0\x38\xc7\x0\x37\xc8\x0\x35\xca\x0\x34\xcb\x0\x32\xcc\x0\x31\xce\x0\x30\xd0\x0\x30\xce\x0\x2f\xd1\x0\x2e\xd1\x0\x2c\xd2\x0\x2b\xd4\x0\x2a\xd5\x0\x29\xd6\x0\x27\xd8\x0\x26\xda\x0\x26\xd8\x0\x25\xdb\x0\x24\xdc\x0\x21\xde\x0\x20\xdf\x0\x1f\xe1\x0\x1e\xe1\x0\x1c\xe3\x0\x1b\xe5\x0\x19\xe6\x0\x18\xe7\x0\x15\xeb\x0\x15\xea\x0\x14\xec\x0"\ "\x12\xed\x0\x10\xef\x0\xf\xf0\x0\xd\xf2\x0\xa\xf5\x0\x9\xf6\x0\x7\xf8\x0\x5\xfa\x0\x3\xfb\x0\x1\xfd\x0\x0\xfe\x2\x0\xfb\x4\x0\xf8\x7\x0\xf6\xa\x0\xf3\xd\x0\xee\x12\x0\xaa\x54\x0\xa5\x5a\x0\xa2\x5d\x0\xa0\x60\x0\x9c\x62\x0\x99\x66\x0\x98\x67\x0\x94\x6b\x0\x92\x6d\x0\x91\x6e\x0\x8f\x70\x0\x8c\x74\x0\x8a\x75\x0\x86\x79\x0\x83\x7c\x0\x81\x7e\x0\x7e\x82\x0"\ "\x7b\x83\x0\x79\x87\x0\x76\x8a\x0\x73\x8c\x0\x70\x8f\x0\x6a\x95\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"\ "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"\ "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\xf9\x4\x1\x0\x0\x0\x0\x2c\x0\x0\x0\x0\x20\x0\x20\x0\x40\x8"\ "\xff\x0\x1\x8\x1c\x48\xb0\x60\x82\x7\x16\x3a\x8c\x30\x91\x82\xc5\x8b\x82\x10\x23\xa\xa4\x81\x83\xa0\x92\x27\x56\xb6\x88\x51\x23\xb1\xa3\xc0\x38\x78\xfe\x10\x4a\xe4\xb1\xa4\xc9\x93\x1e\xf\x30\x90\x90\x41\xa2\x8e\x1e\x40\x88\x20\x41\x29\xf1\x4b\x99\x36\x75\xf6\xd0\x8c\xe8\x8\xd2\xce\x92\x94\x2e\x6d\xf2\x14\x8a\xd4\xcf\x92\x1\x4\x14\x58\x10\x1\xc3\x87\x82\x32\x6a\xe4\xe0\x81\x72\xc2\x86\x10"\ "\x1d\x83\x14\x49\xd2\x84\x8a\x96\xa3\x5\xa3\x5c\xe9\x42\x66\x8d\x1c\xb0\x4\xcf\xbc\xb1\xd3\x67\x10\x5a\x82\x80\xa\x29\x6a\xf4\xb6\xee\xce\x48\x93\x2c\x69\xb2\x4b\x50\x54\xa9\x53\x7c\x25\x6\x18\x60\xa0\x1\x5\xd\x22\x4a\xa0\x58\xe1\x22\xc6\xc\x1b\x34\x3\x10\x40\xe0\xa0\x2\x87\x88\x37\x76\xf8\x10\x82\x52\x1\x84\xb\x1e\x3a\xfe\x18\x62\x64\x9\x14\x94\x20\x48\x9c\x50\xd1\x2\x6\xc4\x23\x4c"\ "\xa4\x60\xf1\x12\xd8\xc9\x94\x2c\x60\xcc\xb8\xe1\x5b\x85\x4b\x18\x34\x70\xee\x4\x1e\x93\x66\x4e\x1e\x3f\x81\xd9\xd0\xd1\x13\xc8\x50\x60\x0\x7c\x4\x1d\x5a\xf4\x1c\x0\x22\x46\x8f\xaa\x6b\xdf\xce\xbd\xa3\xa4\x4a\x98\x38\x7d\xb\x7a\x9e\xa9\x13\xa8\x51\xa6\xba\xbf\xd\x8\x0\x3b\xff" #define HTS_DATA_UNKNOWN_GIF_LEN 1070 /* hexdump bg_rings.gif | cut -c9- - | sed -e 's/\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)/\\x\2 \\x\1/g' | sed -e 's/ //g' | sed -e 's/^\(.*\)$/ \"\1\" \\/' */ #define HTS_DATA_BACK_GIF \ "\x47\x49\x46\x38\x39\x61\xf5\x01\xc8\x01\xa2\x00\x00\xcc\xcc\xdd" \ "\xc7\xc7\xda\xc4\xc4\xd7\xbe\xbe\xd3\xbd\xbd\xd2\xb9\xb9\xd0\xfe" \ "\x01\x02\x00\x00\x00\x21\xf9\x04\xfd\x14\x00\x06\x00\x2c\x00\x00" \ "\x00\x00\xf5\x01\xc8\x01\x40\x03\xff\x08\xba\xdc\xfe\x30\xca\x49" \ "\xab\xbd\x38\xeb\xcd\xbb\xff\x60\x28\x8e\x64\x69\x9e\x68\xaa\xae" \ "\x6c\xeb\xbe\x70\x2c\xcf\x74\x6d\xdf\x62\x20\x08\x43\xe1\xff\xc0" \ "\xa0\x70\x48\x2c\x1a\x8f\xc8\xa4\xd2\x38\x68\x06\x02\xb8\xa8\x74" \ "\x4a\xad\xc2\x74\x84\xa5\x76\xcb\xed\x7a\xbf\xe0\x30\xd8\x69\x2d" \ "\x9b\xcf\xe8\x40\x4f\xcc\x6e\xbb\xdf\xf0\xb8\x9c\x4d\x20\x40\xd1" \ "\xf8\xbc\x79\x3d\xef\xfb\xff\x42\x4d\x3b\x77\x7a\x12\x4f\x3b\x4d" \ "\x80\x6d\x03\x02\x85\x8e\x8f\x0f\x02\x8a\x93\x94\x43\x02\x84\x90" \ "\x99\x1f\x58\x95\x05\x8d\x9a\xa0\x24\x92\x9d\xa4\x6e\x03\xa1\xa8" \ "\xa1\x3c\x73\x9f\xa9\x8e\x59\xa5\xb1\x5b\xad\xae\xb5\xb6\x20\x02" \ "\xb0\x62\xb4\xb7\x28\xba\xb2\xc0\x43\xa7\xbd\xc4\xc5\x36\x7c\x5d" \ "\xc3\xc6\x10\xc8\xc1\xce\x98\xcb\xd1\xd2\x67\xa3\x5c\xbc\x8e\xd5" \ "\xce\xc0\xd7\xd3\xdd\xde\xa1\x01\xbf\x49\xdc\x33\x01\xda\xc1\xdf" \ "\xe9\xea\xe9\xe1\x4b\x76\x29\xd9\xe7\x9d\xeb\xf4\x14\x3a\xcd\xf2" \ "\x71\x82\xd0\xc4\xf1\x46\xe4\x13\xc4\xe5\x03\xa4\xac\x5e\x3f\x81" \ "\x03\x13\xca\x61\x84\xcd\x88\x04\x7c\x0a\xe7\xf0\x33\xa8\xc7\x5c" \ "\xc4\x71\x00\x7b\x71\x1a\x33\x91\xff\xca\x45\x82\x14\xf1\x20\x4c" \ "\xd8\x31\xe4\x89\x5c\x4b\x32\x96\x80\xf8\xd1\x94\xc9\x29\x23\xb5" \ "\x95\x7c\x89\x47\xcd\x91\x82\x1b\x5a\xfa\x51\x49\x33\x45\x4c\x60" \ "\x33\x7b\x2e\x6b\x47\x84\x1c\x4b\x9d\x62\x70\x0a\x85\x47\x72\xa9" \ "\xd3\x07\x3d\x18\x1c\x45\x0a\x86\xe7\x53\x0e\x3f\x4b\x05\xbd\xca" \ "\x75\x2a\xd5\x2f\x5c\x49\x0c\x54\x1a\xb6\x6c\x83\xaf\x72\xcc\x7a" \ "\xf0\x87\x4e\xad\xdb\x07\x59\xd1\x5a\x7b\x9b\x61\x2c\xdd\xbb\x0b" \ "\xd8\xca\xad\x8a\x97\x82\x57\x52\x5b\xfb\x3a\xd5\xbb\x17\xac\x60" \ "\x66\x76\x0f\xdf\x2d\x0c\x47\xb1\x83\xb8\xa4\x1c\xd3\xb5\xc8\xb8" \ "\x8d\x55\xb5\x94\xf3\x49\xa6\x5b\xf9\x4d\x60\xb5\x11\x37\xbb\x25" \ "\xdc\x99\x0b\xd9\xbe\x11\x09\x88\x36\x4b\xba\xf4\xac\xcd\xad\xb7" \ "\xad\x0e\xeb\xfa\xcd\xe6\xcc\x0a\x3f\xcf\x66\x57\xdb\x8d\x6a\xc9" \ "\xb8\x15\x9e\xde\x4d\x2f\x78\x6f\x30\xba\xc3\xc6\x3e\x97\x9c\x78" \ "\xb1\xe5\xc7\x97\x34\xef\xfa\xf5\xb7\x73\x75\xd0\xa3\x2b\x19\x8e" \ "\xd7\x78\xcb\x77\xd7\xa7\x41\xd6\xbe\x84\x7b\xdf\xbf\x17\xcd\x87" \ "\xcf\xe4\x9d\x3c\xdf\xdd\x44\x4b\xab\x5f\x7f\x06\xbd\xfb\x2d\xf3" \ "\x05\x67\x97\x3b\x60\x3a\xfd\x17\xff\xe3\xdd\x87\xdf\x7f\xf1\x09" \ "\x18\x04\x43\xff\xc1\xb0\x9f\x81\x5a\xe4\x27\x9a\x4d\x0c\xce\x21" \ "\xc8\x0e\x97\x3c\x61\xa1\x21\x16\x1e\xc2\x43\x13\x53\xd1\xb4\x60" \ "\x84\x5a\x5c\x76\x1d\x4a\x20\x86\x16\x56\x81\x25\xc6\xe1\x1f\x7d" \ "\x10\xa6\x38\xc7\x61\x28\xba\xa8\xcf\x8a\x09\x52\xb0\x43\x80\xd1" \ "\x5d\xd7\x9e\x8c\x72\x88\x58\xe3\x8f\x4b\xd9\xc7\x63\x1c\x3e\x02" \ "\x69\x24\x3d\x1f\x0e\xc9\xca\x91\x4c\xbe\x94\xa4\x92\x94\xf4\xd7" \ "\xe4\x94\xd3\x3c\x09\xe5\x39\x64\x50\xa9\x25\x24\x56\x5e\xe9\x1a" \ "\x87\x4f\x14\x77\xa3\x61\x5b\x3e\xd2\xa2\x97\x68\xa2\x59\xe6\x34" \ "\x67\xa6\xe9\x66\x6d\x6b\x5e\x45\xe2\x9b\x74\x9e\x13\x27\x71\x73" \ "\xd6\xa9\x27\x18\x77\xf6\x99\x57\x9e\x7b\x42\xe9\xe7\xa0\x29\x1c" \ "\x22\x64\xa0\x7d\x30\x42\x23\xa1\x8c\xaa\x93\xe1\xa3\x90\x46\xfa" \ "\x68\xa3\x94\x56\x6a\xe9\x94\x19\x52\xb8\x21\x87\x89\x84\xc1\xe9" \ "\x84\x14\x66\x78\xe9\xa8\x43\x01\x8a\xa8\x36\xfb\x90\xea\xa7\x0e" \ "\xa7\xb6\x5a\x44\x96\xaa\x52\xd4\xa6\xab\xb4\x02\x43\x40\x91\xb1" \ "\xb6\x70\x68\xad\x3e\x28\x3a\xdb\x3d\xbb\x2e\x84\x6b\xac\x3b\x22" \ "\x8a\x60\xae\x1c\x6c\x94\xe8\xa2\xff\x23\xba\x3a\x2c\xb2\x36\xac" \ "\x62\x0a\xb3\x4b\xe1\x98\x22\xb5\xd0\xda\x22\xed\x7b\x1e\xd2\xe9" \ "\x60\xb6\x93\x05\xfb\x03\xb6\x55\x74\x19\x1d\xb9\xe0\xee\xf6\x21" \ "\x78\x67\x58\xeb\x1e\xba\xe9\x6e\x39\x2b\x13\x32\x98\xeb\x1a\xbc" \ "\xf1\x66\x60\x21\x85\x9f\x0a\xf9\xa9\xa6\x17\x72\x95\xdd\xb7\x86" \ "\x5c\x49\x70\xae\xf3\xf2\xda\xeb\xb3\x53\x64\x17\x94\xbd\x9d\x65" \ "\x0b\xb1\x70\x8c\x5c\x12\x83\x86\x9d\xca\x71\xab\x19\x05\x46\xe0" \ "\xee\x71\x95\xc6\xf8\x11\xc3\xf5\x28\x9b\x52\x14\x1f\xd7\x76\x30" \ "\x8b\x2d\x91\x1c\x9e\xa9\x96\x98\x30\x71\x61\xf2\xa6\x96\x6f\x04" \ "\x53\x39\x58\xac\x81\x4d\xce\x6c\xdb\xcd\x24\x88\x2c\x95\x92\x2e" \ "\xdf\xb5\x73\x64\x40\xd7\x20\xae\xca\x35\x0e\x64\x5d\xd2\x35\xf8" \ "\x2c\x57\xd1\x65\xa5\x2c\x21\xd4\x52\x48\x8d\xd6\xca\x6e\x2d\x7d" \ "\x35\xd6\x52\x1c\x2d\x20\xd5\x4e\x25\x06\x76\xd6\x06\xc3\x67\xf6" \ "\xd9\x51\x88\x3d\xf6\x6c\x56\x7f\xcd\xb6\x14\x5e\xf7\x46\xf6\x4b" \ "\x75\x2f\x39\x37\xdd\x68\xe2\x6b\x50\xdc\x7d\xec\x8d\x36\x9a\x77" \ "\xcb\x1a\x91\xdf\x82\x6b\x90\x37\xc8\x9b\xa5\x97\x78\xb4\x6f\x22" \ "\xbe\xce\x47\x5c\x3f\x0e\x02\xe0\xff\xd1\x3d\x0d\xe3\x77\x96\xc7" \ "\xb0\xb8\x76\xa2\x61\x0e\x52\xe7\x2c\x68\xfd\xa5\x68\x9f\x2b\xa2" \ "\x39\xe9\xa2\xec\xb9\xfa\x61\xa6\xfb\x21\x79\xe2\x6e\xf3\x58\xf9" \ "\x53\xb1\x03\x32\x3b\xd8\xa9\x0b\xb8\x3b\x92\xf2\xfd\x0e\x6e\xee" \ "\xe7\x3a\x47\x7c\x29\x85\x67\x2b\x3a\x88\xb7\xab\xd5\xfb\x45\x16" \ "\xef\xfd\x3c\x88\xc2\xd3\x34\x7d\x65\xb0\x5a\x2a\xb2\xb3\x4c\x1e" \ "\xaf\x70\x10\x4f\x2d\x4f\xf4\x9a\xdb\x7e\xaf\xc5\x64\xe2\xa7\x1d" \ "\x32\xcc\x74\xae\x76\x3d\xe1\x73\xeb\xb0\x21\x52\xa9\x02\xe9\xbd" \ "\x97\xc9\xb3\x9e\xed\xfb\xa7\xe6\xaf\xff\xa5\xb5\x33\x5f\x79\xfc" \ "\xf7\xbf\x3e\xf1\x4f\x80\xaf\xaa\x5e\x01\x59\x94\x3e\x04\xbe\x21" \ "\x7b\xeb\xb9\xc7\x0f\x16\x38\x01\xf6\x39\xd0\x5b\xfd\x3a\xe0\x8b" \ "\x28\x98\x03\x0d\x5e\xf0\x83\x0e\xe1\x20\x0d\x12\x06\xc2\x12\x26" \ "\x41\x84\x99\xb0\xa0\x09\x69\x85\xc2\x75\x48\x70\x85\x43\x6a\x21" \ "\x70\x54\x08\x43\x3b\xc9\x90\x54\x18\xf3\x20\xf6\x7c\x75\xc3\x1e" \ "\xfa\xf0\x87\x40\x0c\xa2\x10\x87\x48\xc4\x22\x76\x2e\x87\x0c\x02" \ "\x55\x98\x8c\x88\xb5\x17\xd6\x10\x09\xf5\x63\x62\x78\x4c\xf6\xc4" \ "\x60\x40\x50\x8a\x25\xd3\x61\x15\xff\x65\x51\x07\x05\x62\xb1\x04" \ "\x24\xdc\xa2\x9b\x76\xf0\xc5\x7a\x89\x51\x8c\xc7\x2a\x23\x06\xc2" \ "\x78\xc6\x06\x81\x6a\x10\x93\x5a\xe3\xa3\x34\xb5\x29\x2d\x52\x62" \ "\x63\x5f\xbc\x5f\x9a\xa2\xd8\x13\x43\xd9\x31\x44\x5e\xa4\xd4\xf6" \ "\x04\x78\xab\x40\x3a\xc5\x89\x9d\xc0\x23\xd8\x02\x58\xa7\xe8\xe5" \ "\x8b\x8a\x7d\x20\x20\x7d\xfe\x58\x1b\x45\x8a\x10\x92\x2e\x89\xd3" \ "\x20\xe9\x24\x49\xd2\xb1\xb1\x0b\x9d\x0c\xd2\xa9\x9a\xa7\x46\x05" \ "\xd0\x30\x44\xa1\x0b\x94\x21\xd5\x58\xbe\x2f\x84\xd2\x16\x0d\xac" \ "\xcd\x2b\x4b\xc9\x81\x53\x1a\x81\x5d\x21\xa1\x24\x52\x56\x49\xcb" \ "\x11\xd8\xb2\x28\xe9\xe0\x64\x2f\xa5\xf1\x24\x52\x52\x81\x91\xbe" \ "\x1b\x26\x45\x92\x64\x4c\x19\xb8\x89\x97\xca\xd4\x43\xb0\x66\xc9" \ "\x01\x5d\x0a\x27\x9a\x7d\x59\x50\x33\x3f\x00\x3f\x6c\xae\x66\x3f" \ "\xb8\x5c\x81\x1e\x1d\xe7\xcd\xff\x08\x29\x9c\x22\x18\xa7\x89\x7a" \ "\x28\x3f\x6b\x7a\x81\x43\x8e\xc4\x4e\x79\x70\xa1\xbe\xc7\x21\x12" \ "\x83\xd0\x44\x41\x76\x8a\x54\xcf\xa4\xfd\xf2\x82\x57\xcc\xc3\x72" \ "\xfc\x02\xa5\x6d\x52\x49\x9d\x84\xa4\xa6\x07\x20\x32\x81\x2b\x21" \ "\xcc\x9d\xfa\x88\xa7\x23\x80\x35\xff\xad\x72\xf9\x20\x02\xc8\xec" \ "\x8d\x41\x23\x58\x18\x89\x86\x04\x93\x49\x90\x92\x45\x95\x94\x4f" \ "\xb5\x20\xf4\x0b\x22\x15\xcd\x3f\x0b\x90\xd2\x18\x9c\x54\x1e\x83" \ "\xca\x68\x25\x36\x8a\x97\x56\x16\x21\x94\x32\xbd\x97\x26\x29\x37" \ "\xaa\x53\xde\x0d\x4a\x25\xed\x09\x44\x91\xf0\xba\xfd\x1d\x61\x58" \ "\x43\xb5\xa2\x96\x5e\x4a\xd4\xce\x4d\x45\x25\x39\x2d\x4d\x50\x0d" \ "\x12\x55\xbd\x71\x90\x30\xbc\x60\xaa\x33\x8a\x4a\x1f\xad\xde\x74" \ "\x88\xc8\x18\xda\x90\x68\x5a\x16\xaf\x12\xa1\x97\x49\x95\xcd\x8f" \ "\x12\xa2\xcc\x82\xd6\xc8\xac\x42\x50\xa8\xe0\xd2\x0a\x8c\x04\xd1" \ "\x35\x08\x53\xf5\x27\x50\xbb\x3a\x90\x72\x56\x15\x7b\x1c\xcd\x87" \ "\x5c\x2d\x77\xd7\x58\xe4\xd5\x18\x85\x9d\x60\x39\x01\xf0\xd7\xca" \ "\x84\x67\x6d\xde\x84\x6b\x5d\x9d\x03\x59\x6f\x26\xb6\x14\xce\xb9" \ "\x6c\x01\x16\xcb\x00\x2f\xe1\x69\x20\x83\x65\x9d\x97\x0e\x6b\x8b" \ "\xa6\x70\x56\x01\xb1\xdc\xda\xaf\xd8\x7a\x5a\x05\x68\x16\x69\x2a" \ "\x35\xed\x69\x25\x0b\x0c\xb2\x96\x2c\x21\xb6\x95\x61\x37\x1b\x27" \ "\x5b\xce\xd2\x16\x28\xa8\x53\x48\x6b\x15\x90\x26\xd2\xa2\x62\x9d" \ "\x9c\x6d\x6c\x69\x42\x6b\x0c\xe4\xff\x2e\xf6\xb7\x6a\x75\x8c\x72" \ "\xe1\xc0\x5c\xc2\xba\x49\x34\x17\x31\x2e\xd4\x5e\x6b\xd8\xcd\x70" \ "\xf7\xa2\xbe\x7d\xd3\x6d\x3e\xa2\xdd\x9b\x4d\x77\xb9\xb0\x19\xd9" \ "\x62\x85\x29\x99\xef\xfa\x80\xab\xac\xa4\x53\x79\x33\xe1\xde\x5e" \ "\x79\xb3\x91\xe9\x6d\x49\x6e\x59\x07\x5d\x54\x8d\x57\x27\xf0\x65" \ "\x62\x7d\x63\x11\x5b\xa4\x54\x37\x69\xa9\x45\xaf\x77\xbf\x72\xe0" \ "\x7c\x05\xca\x7d\x68\x69\x30\xb8\x02\xb5\x5f\x79\xca\x65\xbe\x94" \ "\x4a\xf0\xe9\x56\xa3\xe1\x3e\xa0\xf3\x87\x03\xae\xed\x6a\x19\x23" \ "\x61\xed\x9d\x2a\xc0\xdd\x51\x70\x0f\x3b\x5c\x1b\x0c\x87\x22\xc4" \ "\x50\x94\xe1\x79\xdd\x53\xe1\x7a\xf4\x97\x23\x14\x84\xb1\x33\x4a" \ "\x6c\x8c\x1b\x27\xc5\xc5\xeb\xd1\xf1\x33\xa6\xc8\xe2\xda\x02\x99" \ "\xc3\xbc\x3a\x72\x2a\x7c\xcc\x0a\x25\xdf\x45\xc8\xda\xe0\x71\x95" \ "\xa0\xd4\xc5\x5c\x41\x59\x1b\x28\x5e\xcd\x27\x95\x54\x87\x41\x58" \ "\xc1\xc9\x60\x14\xa0\x94\xd3\x71\xe5\x18\xe6\x12\x81\x63\x76\x54" \ "\x99\x05\x24\x94\x19\xbb\x28\xcd\x36\x2e\x72\x9d\x04\xf6\xc1\x1a" \ "\x4f\x66\xa5\xb5\x1a\x4d\x09\xe1\xdc\x66\x3c\xa7\x29\x9b\x2b\xe4" \ "\xf3\x89\x6c\xea\x50\xc7\x30\x19\xff\xb0\x8f\x44\x04\x9b\x7f\x25" \ "\x67\x1e\x09\x1a\x48\xfb\xe2\xd7\xa7\x92\x40\x80\x7f\x85\x6a\x89" \ "\x71\x3a\xb4\x2c\x87\x6b\xc0\x36\xb2\x14\xcc\x9c\x96\xc6\x9a\x19" \ "\xd3\xd2\x50\x1b\x69\xd4\x2a\x36\xf5\x5b\x3d\x7d\x13\x50\xab\x5a" \ "\x13\x5b\x66\xf5\xa7\x5f\x4d\x9c\x4d\xca\x9a\x08\x69\xa4\xb5\x60" \ "\x6c\x7d\xeb\x90\xba\x5a\xd7\x38\x40\xb5\x9b\x02\x0a\x6c\x93\xf8" \ "\xb9\xd7\x49\xe1\xe1\x64\x40\xaa\xd8\x16\x6a\x1a\xd9\x3f\x50\xa2" \ "\x8b\x73\xa8\x41\x22\x1e\x1b\xda\xc8\x2e\xe5\xb3\xb1\xed\xa2\xe7" \ "\x36\x9a\xdb\xd7\x55\x75\xac\xc1\xad\xb0\x62\x3b\x60\xdc\xe4\x6e" \ "\x9f\xb9\x2f\x80\xee\x74\xa7\x68\xdd\xbe\xfc\xb6\xbb\x61\x0a\xef" \ "\x16\xec\x60\xde\xa0\xab\x77\xdb\x08\x8d\x6f\xe1\xea\x7b\xa2\xfc" \ "\xee\xf7\x24\xfe\x1d\x8d\x7b\x0a\x1c\x3f\x1e\x25\x38\x4d\xda\x79" \ "\xc6\x8a\x29\x7c\x55\xf2\xdb\x14\xa9\x2b\x56\xa1\x87\x5b\xfc\xe2" \ "\x18\xcf\xb8\xc6\x37\xce\xf1\x8e\x7b\xfc\xe3\x20\x0f\xb9\xc8\x47" \ "\x4e\x72\xfd\x69\x48\xe2\xdf\x81\x27\x1c\x4b\x7e\x27\x3f\x62\xd0" \ "\x09\xbf\x66\xf9\x14\x5c\xfe\x44\x3e\xca\xdc\x85\x01\x07\xb7\xcd" \ "\x6f\x0e\xeb\x6b\x0b\xbc\xcb\x31\xff\xef\x78\xce\x0f\x6e\x8a\x84" \ "\xf3\xfc\x04\x6a\x10\xf6\x19\xab\x7c\x74\x0f\xb4\x9b\xe8\x5b\xfd" \ "\x70\xd3\x4d\x29\x6f\xa8\x2b\x22\xd7\x23\xf7\xb9\xd5\x0b\x83\x75" \ "\x8b\x6b\x7d\xeb\xda\x29\x75\xb1\x95\x0e\xf6\x49\x74\x7d\xb1\x4f" \ "\x2f\x3b\x9d\x2c\xd9\xcb\xb4\x6f\xb1\x0e\xb7\xaa\x90\x71\x23\x3d" \ "\xbf\xc2\xb0\xbd\x88\xdb\x26\x4f\xc5\x82\xde\x01\x8c\x51\x8e\xef" \ "\x35\xe2\xf5\x05\x81\x6e\x34\x83\x47\x77\x81\x79\xe7\x8f\xd1\xe1" \ "\x53\xf7\x58\x88\x7d\x6e\x64\xc7\x12\xe0\x87\x92\x74\x52\x3c\x3e" \ "\x5f\x91\xdf\xc6\xe4\x3f\xfa\xf5\x06\x6d\xde\x7a\x08\xbc\xfc\xcd" \ "\x86\x6e\x99\x58\x25\x5e\xb0\x14\xbc\xf7\x4e\x1a\xe5\x66\x01\x89" \ "\x5e\x84\xa4\x7f\xe7\xe7\x6d\x91\x79\x40\x3c\xfa\x52\xb1\x9f\x0b" \ "\x93\x5a\xaf\x9d\xdb\x0f\x6f\x7a\xaf\xff\x66\xab\xec\x2c\xc3\xce" \ "\x47\x7b\xf6\x55\xa8\xfa\x85\xf5\xed\xf6\x98\x49\x46\xf9\x54\x21" \ "\x7e\x7c\xd9\xe0\xfb\x32\xf0\x3e\xd5\x1f\x87\x58\xf5\x51\xa6\x27" \ "\xe9\x0f\xb7\xf9\x3f\xd8\xbe\x0c\xa0\xff\x91\x2c\x97\x1c\xfc\xc1" \ "\xf7\x46\xed\x4b\x3f\x75\x1b\x59\xcd\xfb\x0d\x5b\x7b\xfb\x37\xd0" \ "\x7c\xf1\x83\xe0\xfa\x7b\xb1\x3f\xff\xad\x97\x96\x7e\x50\x90\x3f" \ "\x37\xf3\x77\x12\x5e\xa0\x7f\x36\x12\x39\x01\x58\x3a\xc9\x30\x79" \ "\xff\x37\x10\xc8\x07\x6f\x49\x42\x80\x8c\xf5\x4c\x07\x78\x03\xc1" \ "\x02\x7f\xd5\x54\x5c\x13\x38\x73\xbb\xd2\x7f\x33\x90\x26\x10\xc8" \ "\x73\x78\x46\x5a\xf8\x87\x14\xe6\x97\x81\xc1\xf6\x1a\x90\x33\x5a" \ "\x26\xc8\x25\x38\xc2\x5c\xeb\xd7\x05\x25\xb8\x82\x65\x70\x28\x0a" \ "\xb5\x80\x32\x21\x83\xb5\xb0\x1f\xa1\x64\x83\xce\x80\x83\xc4\x20" \ "\x78\x3e\xe0\x3f\x5e\x62\x81\xc8\x82\x44\x8e\x47\x71\x98\x26\x2b" \ "\x01\x72\x37\x3c\x78\x78\xa9\x97\x7b\xf4\xa3\x6c\xdd\x20\x24\xcc" \ "\xd2\x84\xb2\xd0\x80\x46\x63\x7c\x9d\xb1\x73\xb5\x60\x1f\x52\x17" \ "\x10\x57\x82\x85\x83\x66\x85\x24\x78\x77\xa0\x60\x1f\xdf\xf2\x82" \ "\x5b\xc0\x36\xac\x52\x43\x4c\xa7\x09\xf6\x51\x01\xa7\x97\x16\x49" \ "\x03\x7e\x0e\xc4\x81\x61\x93\x15\xf6\x10\x86\xf9\xa2\x85\x2b\x64" \ "\x86\x5f\x56\x04\x14\xc0\x87\x12\x53\x22\x6f\x24\x2a\x15\x90\x29" \ "\x92\xf6\x47\x80\x38\x38\x40\x30\x01\x6a\x78\x32\xb9\xe2\x87\xa8" \ "\xb2\x78\x37\xc0\x70\x70\x70\x76\x14\xd8\x6c\x91\xe0\x56\xaa\xa2" \ "\x74\x52\xe8\x0a\x14\xb5\x0b\xc7\xff\x04\x5f\x85\x76\x29\xa3\xf6" \ "\x81\x23\xc0\x6c\xe3\x80\x06\x91\xa8\x04\x62\x88\x58\xfc\x11\x8b" \ "\xa2\x20\x2e\x8d\x58\x0e\x50\xa2\x8a\xe9\x30\x87\xba\xb8\x6f\xd6" \ "\x82\x87\x28\xf0\x8a\x27\xc4\x28\x30\x06\x8c\x77\xb1\x52\xa1\x35" \ "\x82\xd0\x13\x53\x06\x76\x24\xe3\x46\x4d\xc2\x88\x04\xab\xa2\x13" \ "\xb4\xa8\x09\xd0\xd1\x49\xb9\xd8\x72\x2d\x51\x8d\xb5\xb0\x65\xc9" \ "\x33\x87\x8d\xb1\x26\xca\xe8\x4a\xa6\x97\x15\x5f\x88\x01\x64\xd8" \ "\x09\xbd\xd8\x0b\xee\xc5\x8d\x64\x26\x8d\xc9\xb2\x57\x4b\x65\x33" \ "\x58\xe3\x15\xcd\x01\x8e\x3f\x43\x25\xe9\xf8\x03\x31\x68\x54\x5f" \ "\x55\x01\xd1\xf8\x0f\x54\x32\x8e\x5b\xd0\x8f\x89\xf6\x2a\x0d\x45" \ "\x52\x53\xe2\x63\xee\xa8\x67\x44\x80\x4e\x04\xc9\x5a\x4c\xf2\x5a" \ "\x44\x48\x29\x47\xc1\x00\xf8\xe8\x06\x4d\xb2\x8f\x05\xd0\x90\x86" \ "\x26\x04\x18\xa9\x24\x15\x19\x12\xfe\x36\x44\xd5\x20\x56\xb6\x73" \ "\x24\xb8\x85\x45\x98\x10\x90\x08\x09\x24\xfb\x38\x92\x40\xe3\x92" \ "\xc0\xf4\x23\x9a\x25\x93\x33\x39\x3e\xab\x96\x0f\x38\x09\x34\x1c" \ "\x39\x09\xeb\xf8\x08\x12\xd9\x4b\x3f\x79\x75\x35\xb2\x8f\xd8\x44" \ "\x93\xc2\x90\x20\x11\xd9\x8a\xd1\xff\xa4\x94\x43\x90\x20\x48\x99" \ "\x94\x82\xc2\x32\xa8\x87\x4d\x19\xd9\x06\x1e\x79\x0c\x7d\xe5\x4d" \ "\x4d\x79\x95\x8f\x05\x96\xd8\x44\x65\x81\x25\x0f\x5b\xc9\x24\x45" \ "\xa9\x08\x67\x69\x46\x9a\xb1\x58\x50\x19\x57\xe1\x71\x59\x3d\x79" \ "\x36\x59\xd9\x06\x61\x29\x0f\x73\x79\x36\x84\x48\x1c\x95\xf5\x94" \ "\x9e\xc8\x97\x3c\x39\x5b\x7b\x39\x1b\x7d\x19\x4d\xfd\xb4\x1a\x43" \ "\x59\x4e\x75\xc9\x06\x6b\xe9\x02\x9a\xd5\x5a\x5f\x19\x98\xea\xc2" \ "\x80\xad\xf5\x96\x42\xd0\x98\x08\x28\x99\xc9\xe5\x59\xbb\x91\x98" \ "\xe5\x64\x99\x07\xb2\x1b\x9a\x15\x94\x96\xa2\x82\xc2\xd7\x95\x82" \ "\x79\x8a\xd8\x05\x5a\xc3\x35\x84\xb3\x71\x63\xc3\xb5\x98\xd4\x47" \ "\x98\xac\x59\x99\xa6\x99\x5f\xf9\x80\x99\x4c\xa2\x26\x88\xe9\x99" \ "\x91\xc5\x9b\xb8\x89\x97\xc3\x05\x9a\x20\x19\x5c\x85\x19\x4d\x69" \ "\x39\x09\x06\xc9\x15\x0a\x41\x9a\x95\x82\x26\x79\x99\x0a\x91\x89" \ "\x04\xce\xd9\x28\xb2\xc9\x06\xd1\x89\x0a\x3e\x56\x9d\x8c\x72\x9d" \ "\x49\x51\x60\xb5\xc9\x59\xc4\x19\x9a\x0b\xb6\x92\xa7\x95\x9c\x94" \ "\x60\x9c\xc7\x39\x4c\xe8\x39\x70\xe5\xe9\x9b\x86\xf9\x67\xef\x49" \ "\x99\x9c\x25\x81\xed\x15\x11\xdc\xff\x39\x28\x63\x14\x9c\xf9\xb0" \ "\x9c\x45\x34\x6c\xfc\x99\x9b\xf5\x19\x6e\xd2\x45\x4e\xe5\x64\x80" \ "\xcf\x97\x5d\x8b\xd5\x9e\x40\x39\x9f\x4e\xb3\xa0\xe2\x05\x1c\xea" \ "\x65\x59\x08\xea\x18\xc9\xa9\x9b\xff\xe1\x9d\x8b\x10\xa0\xa8\xa9" \ "\x4c\x1a\xaa\x95\xbc\x75\x11\xfe\xf9\x43\xd3\x89\x9f\x1c\xaa\x99" \ "\xc3\x34\x67\x9b\x81\x9e\xd9\x99\x2e\xe3\x89\x6b\x27\x8a\xa2\xda" \ "\x56\x27\x18\xba\x12\x3a\xd1\xa2\xd0\x52\xa2\xf4\x98\xa0\x9c\x43" \ "\x94\xf8\x25\xa1\xbb\x44\x4b\x1f\xea\x06\x35\xda\x3a\xcd\x58\x4a" \ "\x7a\x32\xa2\xa2\x44\x3f\xa5\xf4\xa2\xff\x78\x9f\x54\x51\xa4\x40" \ "\xfa\xa3\x50\xca\xa4\x5f\xc4\xa0\x80\xa1\x9e\x41\x2a\x45\x3a\x2a" \ "\xa2\x10\x56\x1d\x58\xe4\xa4\x45\xa0\xa4\x4b\x01\x8e\x38\x2a\x48" \ "\x14\xa6\x65\xf9\x67\x44\x62\xfa\x92\xb7\x81\xa5\x40\x90\x9f\xf4" \ "\x61\x2c\xb3\xb1\x66\x72\xda\x2c\x69\x7a\x9a\x7b\x71\xa6\x7d\x02" \ "\xa7\x96\xb7\x1b\x7e\x0a\x04\xe7\xb8\x40\x5d\xda\xa3\x7a\xda\x51" \ "\x3e\x34\xa4\x71\x40\xa6\x4f\x21\x6c\xc6\x38\x57\xad\x22\xa5\x26" \ "\x50\xa8\xdf\xd9\x42\x81\x4a\x0a\x77\x7a\x03\xde\xc9\xa7\xce\xe8" \ "\x2a\x9c\xfa\x62\x1a\x95\x7a\xae\xff\xc2\xa8\x57\x51\x7b\x8f\x3a" \ "\x7a\xb4\x22\xa9\xc1\xd8\x7b\xac\xd3\xa6\x4e\x99\x59\xe4\x71\x8b" \ "\xdb\x45\x2b\x83\xaa\x18\xaf\x28\xab\xf9\x72\xa9\xb1\x90\xa9\x8e" \ "\x78\x1f\x96\x08\x2e\xba\x5a\x0a\xb5\xaa\x18\x94\x08\x3d\xaa\xda" \ "\x0b\xc1\x8a\x3c\xe6\xe4\x22\xa7\xea\x27\xae\x2a\x1d\x19\x2a\x92" \ "\xbc\x3a\x0d\xcf\xba\x1d\x35\x22\xa6\x5d\x86\x8a\xdf\x33\xad\x55" \ "\x50\xad\xbd\xd2\x1f\xc7\x1a\x7f\xdf\x13\xae\x2c\x60\x87\x86\xb8" \ "\x0f\x5e\xe4\x77\xe0\xb5\x8b\x02\x44\xae\xe5\xea\xad\x1f\x71\x5b" \ "\xe6\x33\xac\xa2\x09\x76\x21\x91\xac\x22\xd6\x3d\xf8\xea\x1e\x78" \ "\x13\x7a\x07\x35\x6f\x3d\xa1\xa8\x33\xe5\xae\x17\x03\xaf\xe9\xd9" \ "\x66\xfb\x6a\x2b\x04\x2b\x03\xe6\xca\x2b\xa5\xfa\x41\x0b\x4b\x03" \ "\xc5\xaa\x6e\x57\x41\xa9\xd8\x27\x2f\x02\x3b\x59\x65\x61\xb0\xa6" \ "\x41\x28\xac\xd8\x2a\x6f\x91\xb1\x5a\x41\x29\x50\x08\x9c\x6f\xc1" \ "\xb1\xc9\xd0\x53\x22\x2b\x06\xbb\x06\x43\x11\x9b\x06\x63\xa2\x9a" \ "\xe7\x01\x43\x9f\xea\x16\xf2\x93\xb0\x4a\xf0\xa6\x35\xc4\xad\x25" \ "\x33\x8a\x1b\x06\x9e\x30\xc4\xb3\x4b\x61\x84\xa5\x30\x21\x49\x18" \ "\xad\x55\x24\xb4\x3e\x08\x89\x62\xff\xa4\xb4\x4b\xfb\x00\x40\x88" \ "\x66\x4f\x5b\x1c\x9e\x56\xb3\x53\x1b\x66\x55\xfb\xb2\x37\xb7\xb2" \ "\x09\xe1\xb4\x4f\xcb\xb5\x09\x81\xab\x57\xab\x9d\xd0\xd6\xac\x63" \ "\x5b\x13\xdc\x66\xb6\x67\x6b\x7d\x38\x4b\x6a\x5e\x3b\x81\x28\x5b" \ "\x09\x6f\x3b\x7f\x60\xfb\x15\x9a\xb8\xb6\x02\x75\x70\x6a\x8b\xb7" \ "\x34\x10\xb7\x46\xc6\xb7\x85\x50\xb7\x9d\x51\x48\x80\x7b\x06\x0d" \ "\x5b\xb5\x73\x9b\x7d\x6a\x17\x04\x84\x5b\xb8\x51\xe0\xb7\xfa\xb5" \ "\xb7\x8e\xdb\x77\x90\x6b\xb7\xbf\xca\x22\x89\xeb\x21\x6d\x5b\x27" \ "\x30\xf7\x2b\x84\x26\xaa\x8b\x8b\x9d\xa1\xb8\x70\x86\x27\x88\x28" \ "\x24\xb8\xc3\x87\xae\xb7\xd0\x4e\xbd\x93\xa8\xa1\x8b\x2a\x87\x88" \ "\x88\xf7\xa7\x88\x75\x44\x60\x41\x34\xb1\xaf\x0b\xb2\x45\x74\xb8" \ "\xb9\x7b\x2a\x65\x54\xb9\xbd\xdb\x05\xbd\x84\xbb\xc1\xcb\x23\x14" \ "\x5a\xbc\x02\x34\x5b\xc0\x8b\xbc\x9b\x15\x6a\xc4\xcb\xbc\xae\x01" \ "\x6c\xcf\x0b\xbd\x72\x51\x6f\xd3\x4b\xbd\xf1\xaa\x70\x25\x8b\xbd" \ "\x11\x93\x71\xbc\xcb\xbd\x1d\xca\x71\xdb\x0b\xbe\xce\x15\x72\xd7" \ "\x4b\xbe\x74\xc8\x73\x1f\x8b\xbe\x3d\x38\x81\xe3\xcb\xbe\x7e\xb0" \ "\xb4\xeb\x0b\xbf\x1b\x74\xb6\x95\x58\x47\xbf\x7f\x30\xb9\x0a\x30" \ "\xbf\xf8\xbb\x04\xfa\x1b\x01\xef\xdb\xbf\xcd\xfb\xbf\x89\x78\xbf" \ "\x02\x7c\x56\x04\xec\x74\x8d\x47\xbf\x56\xdb\x74\x86\xd2\xbb\xa3" \ "\x9b\xc0\x0c\xab\x68\x69\x4b\x46\x12\xdc\x73\x0b\xfc\x3d\x5c\x78" \ "\xc1\xdd\x40\xb4\xcc\xb3\x77\x5a\xcb\xc1\xfa\x72\x72\x75\xf4\x47" \ "\x9c\x02\x30\x47\x2b\xc2\x2a\xbc\xc2\x2c\xdc\xc2\x2e\x0c\x6f\x09" \ "\x00\x00\x3b\x00" #define HTS_DATA_BACK_GIF_LEN 4243 #define HTS_DATA_FADE_GIF \ "\x47\x49\x46\x38\x39\x61\x8\x0\x8\x0\xf7\x0\x0\x0\x0\x0\x0\x0\x33\x0\x0\x66\x0\x0\x99\x0\x0\xcc\x0\x0\xff\x0\x33\x0\x0\x33\x33\x0\x33\x66\x0\x33\x99\x0\x33\xcc\x0\x33\xff\x0\x66\x0\x0\x66\x33\x0\x66\x66\x0\x66\x99\x0\x66\xcc\x0\x66\xff\x0\x99\x0\x0\x99\x33\x0\x99\x66\x0\x99\x99\x0\x99\xcc\x0\x99\xff\x0\xcc\x0\x0\xcc\x33\x0\xcc\x66\x0\xcc\x99\x0\xcc\xcc"\ "\x0\xcc\xff\x0\xff\x0\x0\xff\x33\x0\xff\x66\x0\xff\x99\x0\xff\xcc\x0\xff\xff\x33\x0\x0\x33\x0\x33\x33\x0\x66\x33\x0\x99\x33\x0\xcc\x33\x0\xff\x33\x33\x0\x33\x33\x33\x33\x33\x66\x33\x33\x99\x33\x33\xcc\x33\x33\xff\x33\x66\x0\x33\x66\x33\x33\x66\x66\x33\x66\x99\x33\x66\xcc\x33\x66\xff\x33\x99\x0\x33\x99\x33\x33\x99\x66\x33\x99\x99\x33\x99\xcc\x33\x99\xff\x33\xcc\x0\x33\xcc\x33\x33"\ "\xcc\x66\x33\xcc\x99\x33\xcc\xcc\x33\xcc\xff\x33\xff\x0\x33\xff\x33\x33\xff\x66\x33\xff\x99\x33\xff\xcc\x33\xff\xff\x66\x0\x0\x66\x0\x33\x66\x0\x66\x66\x0\x99\x66\x0\xcc\x66\x0\xff\x66\x33\x0\x66\x33\x33\x66\x33\x66\x66\x33\x99\x66\x33\xcc\x66\x33\xff\x66\x66\x0\x66\x66\x33\x66\x66\x66\x66\x66\x99\x66\x66\xcc\x66\x66\xff\x66\x99\x0\x66\x99\x33\x66\x99\x66\x66\x99\x99\x66\x99\xcc\x66\x99"\ "\xff\x66\xcc\x0\x66\xcc\x33\x66\xcc\x66\x66\xcc\x99\x66\xcc\xcc\x66\xcc\xff\x66\xff\x0\x66\xff\x33\x66\xff\x66\x66\xff\x99\x66\xff\xcc\x66\xff\xff\x99\x0\x0\x99\x0\x33\x99\x0\x66\x99\x0\x99\x99\x0\xcc\x99\x0\xff\x99\x33\x0\x99\x33\x33\x99\x33\x66\x99\x33\x99\x99\x33\xcc\x99\x33\xff\x99\x66\x0\x99\x66\x33\x99\x66\x66\x99\x66\x99\x99\x66\xcc\x99\x66\xff\x99\x99\x0\x99\x99\x33\x99\x99\x66"\ "\x99\x99\x99\x99\x99\xcc\x99\x99\xff\x99\xcc\x0\x99\xcc\x33\x99\xcc\x66\x99\xcc\x99\x99\xcc\xcc\x99\xcc\xff\x99\xff\x0\x99\xff\x33\x99\xff\x66\x99\xff\x99\x99\xff\xcc\x99\xff\xff\xcc\x0\x0\xcc\x0\x33\xcc\x0\x66\xcc\x0\x99\xcc\x0\xcc\xcc\x0\xff\xcc\x33\x0\xcc\x33\x33\xcc\x33\x66\xcc\x33\x99\xcc\x33\xcc\xcc\x33\xff\xcc\x66\x0\xcc\x66\x33\xcc\x66\x66\xcc\x66\x99\xcc\x66\xcc\xcc\x66\xff\xcc"\ "\x99\x0\xcc\x99\x33\xcc\x99\x66\xcc\x99\x99\xcc\x99\xcc\xcc\x99\xff\xcc\xcc\x0\xcc\xcc\x33\xcc\xcc\x66\xcc\xcc\x99\xcc\xcc\xcc\xcc\xcc\xff\xcc\xff\x0\xcc\xff\x33\xcc\xff\x66\xcc\xff\x99\xcc\xff\xcc\xcc\xff\xff\xff\x0\x0\xff\x0\x33\xff\x0\x66\xff\x0\x99\xff\x0\xcc\xff\x0\xff\xff\x33\x0\xff\x33\x33\xff\x33\x66\xff\x33\x99\xff\x33\xcc\xff\x33\xff\xff\x66\x0\xff\x66\x33\xff\x66\x66\xff\x66"\ "\x99\xff\x66\xcc\xff\x66\xff\xff\x99\x0\xff\x99\x33\xff\x99\x66\xff\x99\x99\xff\x99\xcc\xff\x99\xff\xff\xcc\x0\xff\xcc\x33\xff\xcc\x66\xff\xcc\x99\xff\xcc\xcc\xff\xcc\xff\xff\xff\x0\xff\xff\x33\xff\xff\x66\xff\xff\x99\xff\xff\xcc\xff\xff\xff\x21\xe\x9\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0"\ "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\xf9\x4\x1\x0\x0\xd8\x0\x2c\x0\x0\x0\x0\x8\x0\x8\x0\x0\x8"\ "\x19\x0\xaf\x61\x13\x48\x10\xdb\xc0\x83\x4\xb\x16\x44\x88\x50\xe1\x41\x86\x9\x21\x1a\x74\x78\x2d\x20\x0\x3b\xff" #define HTS_DATA_FADE_GIF_LEN 828 #endif httrack-3.49.14/src/md5.c0000644000175000017500000002041415230602340010431 /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. */ /* #include "config.h" */ #include /* for memcpy() */ #include "md5.h" static void byteReverse(unsigned char *buf, unsigned longs); /* * Note: this code is harmless on little-endian machines. */ #define byteSwap(a, b) do { \ a ^= b; \ b ^= a; \ a ^= b; \ } while(0) static void byteReverse(unsigned char *buf, unsigned longs) { /*uint32 t; */ do { /* t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | ((unsigned) buf[1] << 8 | buf[0]); *(uint32 *) buf = t; */ byteSwap(buf[0], buf[3]); byteSwap(buf[1], buf[2]); buf += 4; } while(--longs); } /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(struct MD5Context *ctx, int brokenEndian) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; /*#ifdef WORDS_BIGENDIAN */ if (brokenEndian) { ctx->doByteReverse = 0; } else { ctx->doByteReverse = 1; } /*#else ctx->doByteReverse = 0; #endif */ } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { uint32 t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { unsigned char *p = ctx->in.ui8 + t; t = 64 - t; if (len < t) { memcpy(p, buf, len); return; } memcpy(p, buf, t); if (ctx->doByteReverse) byteReverse(ctx->in.ui8, 16); MD5Transform(ctx->buf, ctx->in.ui32); buf += t; len -= t; } /* Process data in 64-byte chunks */ while(len >= 64) { memcpy(ctx->in.ui8, buf, 64); if (ctx->doByteReverse) byteReverse(ctx->in.ui8, 16); MD5Transform(ctx->buf, ctx->in.ui32); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memcpy(ctx->in.ui8, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) { unsigned count; unsigned char *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in.ui8 + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset(p, 0, count); if (ctx->doByteReverse) byteReverse(ctx->in.ui8, 16); MD5Transform(ctx->buf, ctx->in.ui32); /* Now fill the next block with 56 bytes */ memset(ctx->in.ui8, 0, 56); } else { /* Pad block to 56 bytes */ memset(p, 0, count - 8); } if (ctx->doByteReverse) byteReverse(ctx->in.ui8, 14); /* Append length in bits and transform */ /* Note: see patch for PAM from Tomas Mraz */ ctx->in.ui32[14] = ctx->bits[0]; ctx->in.ui32[15] = ctx->bits[1]; /*((uint32 *) ctx->in)[14] = ctx->bits[0]; ((uint32 *) ctx->in)[15] = ctx->bits[1]; */ MD5Transform(ctx->buf, ctx->in.ui32); if (ctx->doByteReverse) byteReverse((unsigned char *) ctx->buf, 4); memcpy(digest, ctx->buf, 16); memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ } /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(uint32 buf[4], uint32 const in[16]) { register uint32 a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } httrack-3.49.14/src/htssniff.c0000644000175000017500000003416215230602340011575 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998-2017 Xavier Roche and other contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Important notes: - We hereby ask people using this source NOT to use it in purpose of grabbing emails addresses, or collecting any other private information on persons. This would disgrace our work, and spoil the many hours we spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: MIME magic-byte consistency checks */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include "htssniff.h" #include #include "htslib.h" /* One magic rule: `len` bytes at `off` confirm `mime`. */ typedef struct sniff_magic { const char *mime; unsigned short off; unsigned char len; const char *bytes; } sniff_magic; /* Direction is mime -> magic (verify a claim, never classify); types with no reliable magic (plain text, css, js..) are deliberately absent. Patterns follow the WHATWG MIME Sniffing Standard tables where it defines them (https://mimesniff.spec.whatwg.org/); the rest covers httrack's wider MIME set. Spec-only types absent from our MIME tables (EOT, font/collection) are omitted as unreachable. */ static const sniff_magic sniff_table[] = { /* images */ {"image/jpeg", 0, 3, "\xff\xd8\xff"}, {"image/pipeg", 0, 3, "\xff\xd8\xff"}, {"image/pjpeg", 0, 3, "\xff\xd8\xff"}, {"image/png", 0, 8, "\x89PNG\r\n\x1a\n"}, {"image/gif", 0, 6, "GIF87a"}, {"image/gif", 0, 6, "GIF89a"}, {"image/bmp", 0, 2, "BM"}, {"image/tiff", 0, 4, "II*\0"}, {"image/tiff", 0, 4, "MM\0*"}, {"image/x-icon", 0, 4, "\0\0\1\0"}, {"image/x-icon", 0, 4, "\0\0\2\0"}, /* Windows cursor, per the spec */ {"image/x-portable-bitmap", 0, 2, "P1"}, {"image/x-portable-bitmap", 0, 2, "P4"}, {"image/x-portable-pixmap", 0, 2, "P3"}, {"image/x-portable-pixmap", 0, 2, "P6"}, {"image/x-xpixmap", 0, 9, "/* XPM */"}, {"image/x-xbitmap", 0, 7, "#define"}, {"image/x-rgb", 0, 2, "\x01\xda"}, {"image/x-cmu-raster", 0, 4, "\xf1\x00\x40\xbb"}, /* audio */ {"audio/mpeg", 0, 3, "ID3"}, {"audio/basic", 0, 4, ".snd"}, {"audio/mid", 0, 8, "MThd\0\0\0\6"}, {"audio/midi", 0, 8, "MThd\0\0\0\6"}, {"audio/x-pn-realaudio", 0, 4, ".ra\xfd"}, {"audio/x-pn-realaudio", 0, 4, ".RMF"}, {"audio/x-pn-realaudio-plugin", 0, 4, ".ra\xfd"}, {"audio/x-pn-realaudio-plugin", 0, 4, ".RMF"}, {"audio/flac", 0, 4, "fLaC"}, {"audio/aac", 0, 4, "ADIF"}, /* video */ {"video/mpeg", 0, 4, "\x00\x00\x01\xba"}, {"video/mpeg", 0, 4, "\x00\x00\x01\xb3"}, {"video/x-sgi-movie", 0, 4, "MOVI"}, /* archives / compression */ {"application/x-gzip", 0, 3, "\x1f\x8b\x08"}, {"multipart/x-gzip", 0, 3, "\x1f\x8b\x08"}, {"application/x-compressed", 0, 3, "\x1f\x8b\x08"}, {"application/x-compress", 0, 2, "\x1f\x9d"}, {"application/x-bzip2", 0, 3, "BZh"}, {"application/x-7z-compressed", 0, 6, "7z\xbc\xaf\x27\x1c"}, /* 6-byte prefix common to RAR4 (spec) and RAR5 */ {"application/x-rar-compressed", 0, 6, "Rar!\x1a\x07"}, {"application/zstd", 0, 4, "\x28\xb5\x2f\xfd"}, {"application/arj", 0, 2, "\x60\xea"}, {"application/x-cpio", 0, 6, "070701"}, {"application/x-cpio", 0, 6, "070707"}, {"application/x-cpio", 0, 2, "\xc7\x71"}, {"application/x-sv4cpio", 0, 6, "070701"}, {"application/x-sv4crc", 0, 6, "070702"}, {"application/x-stuffit", 0, 8, "StuffIt "}, {"application/x-stuffit", 0, 4, "SIT!"}, {"application/mac-binhex40", 0, 10, "(This file"}, /* documents */ {"application/pdf", 0, 5, "%PDF-"}, {"application/postscript", 0, 2, "%!"}, {"application/rtf", 0, 5, "{\\rtf"}, {"application/x-dvi", 0, 2, "\xf7\x02"}, {"application/x-hdf", 0, 4, "\x0e\x03\x13\x01"}, {"application/x-hdf", 0, 8, "\x89HDF\r\n\x1a\n"}, {"application/x-netcdf", 0, 4, "CDF\x01"}, {"application/x-netcdf", 0, 4, "CDF\x02"}, {"application/x-msaccess", 0, 19, "\0\1\0\0Standard Jet DB"}, /* fonts */ {"font/woff", 0, 4, "wOFF"}, {"font/woff2", 0, 4, "wOF2"}, {"font/ttf", 0, 4, "\0\1\0\0"}, {"font/ttf", 0, 4, "true"}, {"font/otf", 0, 4, "OTTO"}, /* misc */ {"application/x-shockwave-flash", 0, 3, "FWS"}, {"application/x-shockwave-flash", 0, 3, "CWS"}, {"application/x-shockwave-flash", 0, 3, "ZWS"}, {"application/futuresplash", 0, 3, "FWS"}, {"application/x-director", 0, 4, "RIFX"}, {"application/x-director", 0, 4, "XFIR"}, {"application/x-java-vm", 0, 4, "\xca\xfe\xba\xbe"}, {"application/wasm", 0, 4, "\0asm"}, {"application/x-msmetafile", 0, 4, "\xd7\xcd\xc6\x9a"}, {"application/x-msmetafile", 0, 4, "\x01\x00\x09\x00"}, {"application/x-x509-ca-cert", 0, 2, "\x30\x82"}, {"application/x-pkcs12", 0, 2, "\x30\x82"}, {"application/x-pkcs7-mime", 0, 2, "\x30\x82"}, {"application/x-pkcs7-signature", 0, 2, "\x30\x82"}, {"application/x-pkcs7-certificates", 0, 2, "\x30\x82"}, {"x-world/x-vrml", 0, 5, "#VRML"}, {"application/x-bittorrent", 0, 11, "d8:announce"}, {"drawing/x-dwf", 0, 4, "(DWF"}, {"application/acad", 0, 4, "AC10"}, {NULL, 0, 0, NULL}}; /* MIME families sharing a container magic */ static const char *const zip_mimes[] = { "application/zip", "application/x-zip-compressed", "multipart/x-zip", NULL}; static const char *const zip_mime_prefixes[] = { "application/vnd.openxmlformats-officedocument.", "application/vnd.oasis.opendocument.", NULL}; static const char *const ole_mimes[] = {"application/msword", "application/excel", "application/vnd.ms-excel", "application/powerpoint", "application/vnd.ms-powerpoint", "application/vnd.ms-project", "application/vnd.ms-works", "application/x-msmoney", "application/x-mspublisher", NULL}; static const char *const tar_mimes[] = { "application/x-tar", "application/x-ustar", "application/x-gtar", NULL}; static const char *const ogg_mimes[] = {"application/ogg", "audio/ogg", "video/ogg", "audio/opus", NULL}; static const char *const ebml_mimes[] = {"video/webm", "audio/webm", NULL}; /* ISO-BMFF, any 'ftyp' brand: containers overlap too much to split */ static const char *const bmff_mimes[] = {"video/mp4", "audio/mp4", "video/quicktime", NULL}; static const char *const avif_mimes[] = {"image/avif", NULL}; static const char *const heic_mimes[] = {"image/heic", NULL}; static const char *const asf_mimes[] = {"video/x-ms-asf", "video/x-ms-wmv", "video/x-la-asf", NULL}; static const char *const xml_mimes[] = {"application/xml", "text/xml", "image/svg+xml", "image/svg-xml", NULL}; static const char *const svg_mimes[] = {"image/svg+xml", "image/svg-xml", NULL}; static const char *const html_mimes[] = {"text/html", NULL}; static const char *const pem_mimes[] = { "application/x-x509-ca-cert", "application/x-pkcs7-certificates", "application/x-pkcs7-mime", "application/x-pkcs7-signature", NULL}; static hts_boolean mime_in(const char *const *list, const char *mime) { size_t i; for (i = 0; list[i] != NULL; i++) if (strfield2(list[i], mime)) return HTS_TRUE; return HTS_FALSE; } static hts_boolean mime_in_prefix(const char *const *list, const char *mime) { size_t i; for (i = 0; list[i] != NULL; i++) if (strfield(mime, list[i])) return HTS_TRUE; return HTS_FALSE; } static hts_boolean has_bytes(const unsigned char *d, size_t n, size_t off, const char *bytes, size_t len) { /* overflow-safe: untrusted n alone on one side */ return n >= off && len <= n - off && memcmp(d + off, bytes, len) == 0 ? HTS_TRUE : HTS_FALSE; } static unsigned char ascii_lower(unsigned char c) { return c >= 'A' && c <= 'Z' ? (unsigned char) (c + 32) : c; } /* Case-insensitive text prefix after an optional UTF-8 BOM and whitespace. */ static hts_boolean has_text_prefix(const unsigned char *d, size_t n, const char *prefix) { const size_t len = strlen(prefix); size_t i, k; i = n >= 3 && memcmp(d, "\xef\xbb\xbf", 3) == 0 ? 3 : 0; while (i < n && (d[i] == ' ' || d[i] == '\t' || d[i] == '\r' || d[i] == '\n')) i++; if (len > n - i) /* i <= n from the loop above */ return HTS_FALSE; for (k = 0; k < len; k++) if (ascii_lower(d[i + k]) != ascii_lower((unsigned char) prefix[k])) return HTS_FALSE; return HTS_TRUE; } typedef enum sniff_op { SNIFF_QUERY_KNOWN, /* is any rule defined for this MIME? */ SNIFF_QUERY_MATCH /* do the bytes confirm this MIME? */ } sniff_op; /* Single walk for both queries so the rule set can't drift apart. */ static hts_boolean sniff_eval(sniff_op op, const unsigned char *d, size_t n, const char *mime) { size_t i; /* KNOWN short-circuits; MATCH tests the magic */ #define SNIFF_RULE(cond) \ do { \ if (op == SNIFF_QUERY_KNOWN) \ return HTS_TRUE; \ if (cond) \ return HTS_TRUE; \ } while (0) for (i = 0; sniff_table[i].mime != NULL; i++) { if (strfield2(sniff_table[i].mime, mime)) { SNIFF_RULE(has_bytes(d, n, sniff_table[i].off, sniff_table[i].bytes, sniff_table[i].len)); } } if (mime_in(zip_mimes, mime) || mime_in_prefix(zip_mime_prefixes, mime)) { SNIFF_RULE(has_bytes(d, n, 0, "PK\3\4", 4) || has_bytes(d, n, 0, "PK\5\6", 4)); } if (mime_in(ole_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 0, "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1", 8)); } if (mime_in(tar_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 257, "ustar", 5)); } if (mime_in(ogg_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 0, "OggS\0", 5)); } if (mime_in(ebml_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 0, "\x1a\x45\xdf\xa3", 4)); } if (mime_in(bmff_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 4, "ftyp", 4)); } if (mime_in(avif_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 4, "ftypavif", 8) || has_bytes(d, n, 4, "ftypavis", 8)); } if (mime_in(heic_mimes, mime)) { SNIFF_RULE( has_bytes(d, n, 4, "ftyphei", 7) || has_bytes(d, n, 4, "ftyphev", 7) || has_bytes(d, n, 4, "ftypmif1", 8) || has_bytes(d, n, 4, "ftypmsf1", 8)); } if (mime_in(asf_mimes, mime)) { SNIFF_RULE(has_bytes(d, n, 0, "\x30\x26\xb2\x75\x8e\x66\xcf\x11", 8)); } if (strfield2("audio/x-wav", mime)) { SNIFF_RULE(has_bytes(d, n, 0, "RIFF", 4) && has_bytes(d, n, 8, "WAVE", 4)); } if (strfield2("video/x-msvideo", mime)) { SNIFF_RULE(has_bytes(d, n, 0, "RIFF", 4) && has_bytes(d, n, 8, "AVI ", 4)); } if (strfield2("image/webp", mime)) { SNIFF_RULE(has_bytes(d, n, 0, "RIFF", 4) && has_bytes(d, n, 8, "WEBPVP", 6)); } if (strfield2("image/x-portable-anymap", mime)) { SNIFF_RULE(n >= 2 && d[0] == 'P' && d[1] >= '1' && d[1] <= '6'); } if (strfield2("audio/x-aiff", mime)) { SNIFF_RULE( has_bytes(d, n, 0, "FORM", 4) && (has_bytes(d, n, 8, "AIFF", 4) || has_bytes(d, n, 8, "AIFC", 4))); } if (strfield2("audio/mpeg", mime)) { /* MPEG audio frame sync (11 bits), valid layer and bitrate fields */ SNIFF_RULE(n >= 2 && d[0] == 0xff && (d[1] & 0xe0) == 0xe0 && (d[1] & 0x06) != 0); } if (strfield2("audio/aac", mime)) { /* ADTS sync */ SNIFF_RULE(n >= 2 && d[0] == 0xff && (d[1] & 0xf6) == 0xf0); } if (strfield2("video/mp2t", mime)) { SNIFF_RULE(n >= 1 && d[0] == 0x47 && (n <= 188 || d[188] == 0x47)); } if (mime_in(xml_mimes, mime)) { SNIFF_RULE(has_text_prefix(d, n, ". Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Encoding conversion functions */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include #include "htscharset.h" #include "htsencoding.h" #include "htssafe.h" /* static int decode_entity(const uint64_t hash, const size_t len); */ #include "htsentities.h" /* hexadecimal conversion */ static int get_hex_value(char c) { if (c >= '0' && c <= '9') return c - '0'; else if (c >= 'a' && c <= 'f') return (c - 'a' + 10); else if (c >= 'A' && c <= 'F') return (c - 'A' + 10); else return -1; } /* 64-bit FNV-1a; must match htsentities.sh, which keys the entity table on it. */ #define HASH_INIT 0xcbf29ce484222325ULL #define HASH_PRIME 0x100000001b3ULL #define HASH_ADD(HASH, C) \ do { \ (HASH) ^= (unsigned char) (C); \ (HASH) *= HASH_PRIME; \ } while (0) int hts_unescapeEntitiesWithCharset(const char *src, char *dest, const size_t max, const char *charset) { size_t i, j, ampStart, ampStartDest; int uc; int hex; uint64_t hash; assertf(max != 0); for (i = 0, j = 0, ampStart = (size_t) -1, ampStartDest = 0, uc = -1, hex = 0, hash = HASH_INIT; src[i] != '\0'; i++) { /* start of entity */ if (src[i] == '&') { ampStart = i; ampStartDest = j; hash = HASH_INIT; uc = -1; } /* inside a potential entity */ else if (ampStart != (size_t) -1) { /* &#..; entity */ if (ampStart + 1 == i && src[ampStart + 1] == '#') { uc = 0; hex = 0; } /* &#x..; entity */ else if (ampStart + 2 == i && src[ampStart + 1] == '#' && src[ampStart + 2] == 'x') { hex = 1; } /* end of entity */ else if (src[i] == ';') { size_t len; /* decode entity */ if (uc == -1) { /* &foo; */ uc = decode_entity(hash, /*&src[ampStart + 1],*/ i - ampStart - 1); /* FIXME: TEMPORARY HACK FROM PREVIOUS VERSION TO BE INVESTIGATED */ if (uc == 160) { uc = 32; } } /* end */ ampStart = (size_t) -1; /* success ? */ if (uc > 0) { const size_t maxOut = max - ampStartDest; /* write at position */ if (charset != NULL && hts_isCharsetUTF8(charset)) { len = hts_writeUTF8(uc, &dest[ampStartDest], maxOut); } else { size_t ulen; char buffer[32]; len = 0; if ( ( ulen = hts_writeUTF8(uc, buffer, sizeof(buffer)) ) != 0) { char *s; buffer[ulen] = '\0'; s = hts_convertStringFromUTF8(buffer, strlen(buffer), charset); if (s != NULL) { const size_t sLen = strlen(s); if (sLen < maxOut) { /* Do not copy \0. */ memcpy(&dest[ampStartDest], s, sLen); len = sLen; } free(s); } } } if (len > 0) { /* new dest position */ j = ampStartDest + len; /* do not copy ; */ continue; } } } /* numerical entity */ else if (uc != -1) { /* decimal */ if (!hex) { if (src[i] >= '0' && src[i] <= '9') { const int h = src[i] - '0'; /* Guard before multiplying: a codepoint past the Unicode max (0x10FFFF) is invalid anyway, so stop rather than overflow uc. */ if (uc > (0x10FFFF - h) / 10) { ampStart = (size_t) -1; } else { uc = uc * 10 + h; } } else { /* abandon */ ampStart = (size_t) -1; } } /* hex */ else { const int h = get_hex_value(src[i]); if (h != -1) { if (uc > (0x10FFFF - h) / 16) { ampStart = (size_t) -1; } else { uc = uc * 16 + h; } } else { /* abandon */ ampStart = (size_t) -1; } } } /* alphanumerical entity */ else { /* alphanum, capped at the longest name * '∳' (31) */ if (i <= ampStart + 31 && ((src[i] >= '0' && src[i] <= '9') || (src[i] >= 'A' && src[i] <= 'Z') || (src[i] >= 'a' && src[i] <= 'z'))) { /* compute hash */ HASH_ADD(hash, (unsigned char) src[i]); } else { /* abandon */ ampStart = (size_t) -1; } } } /* reserve one byte for the trailing NUL written after the loop */ if (j + 1 >= max) { /* overflow */ return -1; } if (src != dest || i != j) { dest[j] = src[i]; } j++; } dest[j] = '\0'; return 0; } int hts_unescapeEntities(const char *src, char *dest, const size_t max) { return hts_unescapeEntitiesWithCharset(src, dest, max, "UTF-8"); } int hts_unescapeUrlSpecial(const char *src, char *dest, const size_t max, const int flags) { size_t i, j, lastI, lastJ, k, utfBufferJ, utfBufferSize; int seenQuery = 0; char utfBuffer[32]; assertf(src != dest); assertf(max != 0); for(i = 0, j = 0, k = 0, utfBufferJ = 0, utfBufferSize = 0, lastI = (size_t) -1, lastJ = (size_t) -1 ; src[i] != '\0' ; i++) { char c = src[i]; unsigned char cUtf = (unsigned char) c; /* Replacement for ' ' */ if (c == '+' && seenQuery) { c = cUtf = ' '; k = 0; /* cancel any sequence */ } /* Escape sequence start */ else if (c == '%') { /* last known position of % written on destination copy blindly c, we'll rollback later */ lastI = i; lastJ = j; } /* End of sequence seen */ else if (i >= 2 && i == lastI + 2) { const int a1 = get_hex_value(src[lastI + 1]); const int a2 = get_hex_value(src[lastI + 2]); if (a1 != -1 && a2 != -1) { const char ec = a1*16 + a2; /* new character */ cUtf = (unsigned char) ec; /* Shortcut for ASCII (do not unescape non-printable) */ if ( (cUtf < 0x80 && cUtf >= 32) && ( flags & UNESCAPE_URL_NO_ASCII ) == 0 ) { /* Rollback new write position and character */ j = lastJ; c = ec; } } else { k = 0; /* cancel any sequence */ } } /* ASCII (and not in %xx) */ else if (cUtf < 0x80 && i != lastI + 1) { k = 0; /* cancel any sequence */ if (c == '?' && !seenQuery) { seenQuery = 1; } } /* UTF-8 sequence in progress (either a raw or a %xx character) */ if (cUtf >= 0x80) { /* Leading UTF ? */ if (HTS_IS_LEADING_UTF8(cUtf)) { k = 0; /* cancel any sequence */ } /* Copy */ if (k < sizeof(utfBuffer)) { /* First character */ if (k == 0) { /* New destination-centric offset of utf-8 buffer beginning */ if (lastI != (size_t) -1 && i == lastI + 2) { /* just read a %xx */ utfBufferJ = lastJ; /* position of % */ } else { utfBufferJ = j; /* current position otherwise */ } /* Sequence length */ utfBufferSize = hts_getUTF8SequenceLength(cUtf); } /* Copy */ utfBuffer[k++] = cUtf; /* Flush UTF-8 buffer when completed. */ if (k == utfBufferSize) { const size_t nRead = hts_readUTF8(utfBuffer, utfBufferSize, NULL); /* Reset UTF-8 buffer in all cases. */ k = 0; /* Was the character read successfully ? */ if (nRead == utfBufferSize) { /* the 'continue' below skips the NUL-reserve guard: re-check */ if (utfBufferJ + utfBufferSize >= max) { return -1; } /* Rollback write position to sequence start write position */ j = utfBufferJ; /* Copy full character sequence */ memcpy(&dest[j], utfBuffer, utfBufferSize); j += utfBufferSize; /* Skip current character */ continue; } } } } /* reserve one byte for the trailing NUL written after the loop */ if (j + 1 >= max) { return -1; } /* Copy current */ dest[j++] = c; } dest[j] = '\0'; return 0; } int hts_unescapeUrl(const char *src, char *dest, const size_t max) { return hts_unescapeUrlSpecial(src, dest, max, 0); } httrack-3.49.14/src/punycode.c0000644000175000017500000003325115230602340011575 /* punycode.c from RFC 3492 http://www.nicemice.net/idn/ Adam M. Costello http://www.nicemice.net/amc/ This is ANSI C code (C89) implementing Punycode (RFC 3492). */ #include "punycode.h" /******************/ /* Implementation */ #include /*** Bootstring parameters for Punycode ***/ enum { base = 36, tmin = 1, tmax = 26, skew = 38, damp = 700, initial_bias = 72, initial_n = 0x80, delimiter = 0x2D }; /* basic(cp) tests whether cp is a basic code point: */ #define basic(cp) ((punycode_uint)(cp) < 0x80) /* delim(cp) tests whether cp is a delimiter: */ #define delim(cp) ((cp) == delimiter) /* decode_digit(cp) returns the numeric value of a basic code */ /* point (for use in representing integers) in the range 0 to */ /* base-1, or base if cp is does not represent a value. */ static unsigned decode_digit(int cp) { return (unsigned) (cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base); } /* encode_digit(d,flag) returns the basic code point whose value */ /* (when used for representing integers) is d, which needs to be in */ /* the range 0 to base-1. The lowercase form is used unless flag is */ /* nonzero, in which case the uppercase form is used. The behavior */ /* is undefined if flag is nonzero and digit d has no uppercase form. */ static char encode_digit(punycode_uint d, int flag) { return d + 22 + 75 * (d < 26) - ((flag != 0) << 5); /* 0..25 map to ASCII a..z or A..Z */ /* 26..35 map to ASCII 0..9 */ } /* flagged(bcp) tests whether a basic code point is flagged */ /* (uppercase). The behavior is undefined if bcp is not a */ /* basic code point. */ #define flagged(bcp) ((punycode_uint)(bcp) - 65 < 26) /* encode_basic(bcp,flag) forces a basic code point to lowercase */ /* if flag is zero, uppercase if flag is nonzero, and returns */ /* the resulting code point. The code point is unchanged if it */ /* is caseless. The behavior is undefined if bcp is not a basic */ /* code point. */ static char encode_basic(punycode_uint bcp, int flag) { bcp -= (bcp - 97 < 26) << 5; return bcp + ((!flag && (bcp - 65 < 26)) << 5); } /*** Platform-specific constants ***/ /* maxint is the maximum value of a punycode_uint variable: */ static const punycode_uint maxint = -1; /* Because maxint is unsigned, -1 becomes the maximum value. */ /*** Bias adaptation function ***/ static punycode_uint adapt(punycode_uint delta, punycode_uint numpoints, int firsttime) { punycode_uint k; delta = firsttime ? delta / damp : delta >> 1; /* delta >> 1 is a faster way of doing delta / 2 */ delta += delta / numpoints; for(k = 0; delta > ((base - tmin) * tmax) / 2; k += base) { delta /= base - tmin; } return k + (base - tmin + 1) * delta / (delta + skew); } /*** Main encode function ***/ enum punycode_status punycode_encode(punycode_uint input_length, const punycode_uint input[], const unsigned char case_flags[], punycode_uint * output_length, char output[]) { punycode_uint n, delta, h, b, out, max_out, bias, j, m, q, k, t; /* Initialize the state: */ n = initial_n; delta = out = 0; max_out = *output_length; bias = initial_bias; /* Handle the basic code points: */ for(j = 0; j < input_length; ++j) { if (basic(input[j])) { if (max_out - out < 2) return punycode_big_output; output[out++] = case_flags ? encode_basic(input[j], case_flags[j]) : input[j]; } /* else if (input[j] < n) return punycode_bad_input; */ /* (not needed for Punycode with unsigned code points) */ } h = b = out; /* h is the number of code points that have been handled, b is the */ /* number of basic code points, and out is the number of characters */ /* that have been output. */ if (b > 0) output[out++] = delimiter; /* Main encoding loop: */ while(h < input_length) { /* All non-basic code points < n have been */ /* handled already. Find the next larger one: */ for(m = maxint, j = 0; j < input_length; ++j) { /* if (basic(input[j])) continue; */ /* (not needed for Punycode) */ if (input[j] >= n && input[j] < m) m = input[j]; } /* Increase delta enough to advance the decoder's */ /* state to , but guard against overflow: */ if (m - n > (maxint - delta) / (h + 1)) return punycode_overflow; delta += (m - n) * (h + 1); n = m; for(j = 0; j < input_length; ++j) { /* Punycode does not need to check whether input[j] is basic: */ if (input[j] < n /* || basic(input[j]) */ ) { if (++delta == 0) return punycode_overflow; } if (input[j] == n) { /* Represent delta as a generalized variable-length integer: */ for(q = delta, k = base;; k += base) { if (out >= max_out) return punycode_big_output; t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */ k >= bias + tmax ? tmax : k - bias; if (q < t) break; output[out++] = encode_digit(t + (q - t) % (base - t), 0); q = (q - t) / (base - t); } output[out++] = encode_digit(q, case_flags && case_flags[j]); bias = adapt(delta, h + 1, h == b); delta = 0; ++h; } } ++delta, ++n; } *output_length = out; return punycode_success; } /*** Main decode function ***/ enum punycode_status punycode_decode(punycode_uint input_length, const char input[], punycode_uint * output_length, punycode_uint output[], unsigned char case_flags[]) { punycode_uint n, out, i, max_out, bias, b, j, in, oldi, w, k, digit, t; /* Initialize the state: */ n = initial_n; out = i = 0; max_out = *output_length; bias = initial_bias; /* Handle the basic code points: Let b be the number of input code */ /* points before the last delimiter, or 0 if there is none, then */ /* copy the first b code points to the output. */ for(b = j = 0; j < input_length; ++j) if (delim(input[j])) b = j; if (b > max_out) return punycode_big_output; for(j = 0; j < b; ++j) { if (case_flags) case_flags[out] = flagged(input[j]); if (!basic(input[j])) return punycode_bad_input; output[out++] = input[j]; } /* Main decoding loop: Start just after the last delimiter if any */ /* basic code points were copied; start at the beginning otherwise. */ for(in = b > 0 ? b + 1 : 0; in < input_length; ++out) { /* in is the index of the next character to be consumed, and */ /* out is the number of code points in the output array. */ /* Decode a generalized variable-length integer into delta, */ /* which gets added to i. The overflow checking is easier */ /* if we increase i as we go, then subtract off its starting */ /* value at the end to obtain delta. */ for(oldi = i, w = 1, k = base;; k += base) { if (in >= input_length) return punycode_bad_input; digit = decode_digit(input[in++]); if (digit >= base) return punycode_bad_input; if (digit > (maxint - i) / w) return punycode_overflow; i += digit * w; t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */ k >= bias + tmax ? tmax : k - bias; if (digit < t) break; if (w > maxint / (base - t)) return punycode_overflow; w *= (base - t); } bias = adapt(i - oldi, out + 1, oldi == 0); /* i was supposed to wrap around from out+1 to 0, */ /* incrementing n each time, so we'll fix that now: */ if (i / (out + 1) > maxint - n) return punycode_overflow; n += i / (out + 1); i %= (out + 1); /* Insert n at position i of the output: */ /* not needed for Punycode: */ /* if (decode_digit(n) <= base) return punycode_invalid_input; */ if (out >= max_out) return punycode_big_output; if (case_flags) { memmove(case_flags + i + 1, case_flags + i, out - i); /* Case of last character determines uppercase flag: */ case_flags[i] = flagged(input[in - 1]); } memmove(output + i + 1, output + i, (out - i) * sizeof *output); output[i++] = n; } *output_length = out; return punycode_success; } #ifdef PUNYCODE_COSTELLO_RFC3492_INCLUDE_TEST #define PUNYCODE_COSTELLO_RFC3492_INCLUDE_TEST /******************************************************************/ /* Wrapper for testing (would normally go in a separate .c file): */ #include #include #include #include /* For testing, we'll just set some compile-time limits rather than */ /* use malloc(), and set a compile-time option rather than using a */ /* command-line option. */ enum { unicode_max_length = 256, ace_max_length = 256 }; static void usage(char **argv) { fprintf(stderr, "\n" "%s -e reads code points and writes a Punycode string.\n" "%s -d reads a Punycode string and writes code points.\n" "\n" "Input and output are plain text in the native character set.\n" "Code points are in the form u+hex separated by whitespace.\n" "Although the specification allows Punycode strings to contain\n" "any characters from the ASCII repertoire, this test code\n" "supports only the printable characters, and needs the Punycode\n" "string to be followed by a newline.\n" "The case of the u in u+hex is the force-to-uppercase flag.\n", argv[0], argv[0]); exit(EXIT_FAILURE); } static void fail(const char *msg) { fputs(msg, stderr); exit(EXIT_FAILURE); } static const char too_big[] = "input or output is too large, recompile with larger limits\n"; static const char invalid_input[] = "invalid input\n"; static const char overflow[] = "arithmetic overflow\n"; static const char io_error[] = "I/O error\n"; #endif /* The following string is used to convert printable */ /* characters between ASCII and the native charset: */ #ifdef PUNYCODE_COSTELLO_RFC3492_INCLUDE_MAIN static const char print_ascii[] = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" " !\"#$%&'()*+,-./" "0123456789:;<=>?" "@ABCDEFGHIJKLMNO" "PQRSTUVWXYZ[\\]^_" "`abcdefghijklmno" "pqrstuvwxyz{|}~\n"; int main(int argc, char **argv) { enum punycode_status status; int r; unsigned int input_length, output_length, j; unsigned char case_flags[unicode_max_length]; if (argc != 2) usage(argv); if (argv[1][0] != '-') usage(argv); if (argv[1][2] != 0) usage(argv); if (argv[1][1] == 'e') { punycode_uint input[unicode_max_length]; unsigned long codept; char output[ace_max_length + 1], uplus[3]; int c; /* Read the input code points: */ input_length = 0; for(;;) { r = scanf("%2s%lx", uplus, &codept); if (ferror(stdin)) fail(io_error); if (r == EOF || r == 0) break; if (r != 2 || uplus[1] != '+' || codept > (punycode_uint) - 1) { fail(invalid_input); } if (input_length == unicode_max_length) fail(too_big); if (uplus[0] == 'u') case_flags[input_length] = 0; else if (uplus[0] == 'U') case_flags[input_length] = 1; else fail(invalid_input); input[input_length++] = codept; } /* Encode: */ output_length = ace_max_length; status = punycode_encode(input_length, input, case_flags, &output_length, output); if (status == punycode_bad_input) fail(invalid_input); if (status == punycode_big_output) fail(too_big); if (status == punycode_overflow) fail(overflow); assert(status == punycode_success); /* Convert to native charset and output: */ for(j = 0; j < output_length; ++j) { c = output[j]; assert(c >= 0 && c <= 127); if (print_ascii[c] == 0) fail(invalid_input); output[j] = print_ascii[c]; } output[j] = 0; r = puts(output); if (r == EOF) fail(io_error); return EXIT_SUCCESS; } if (argv[1][1] == 'd') { char input[ace_max_length + 2], *p, *pp; punycode_uint output[unicode_max_length]; /* Read the Punycode input string and convert to ASCII: */ fgets(input, ace_max_length + 2, stdin); if (ferror(stdin)) fail(io_error); if (feof(stdin)) fail(invalid_input); input_length = strlen(input) - 1; if (input[input_length] != '\n') fail(too_big); input[input_length] = 0; for(p = input; *p != 0; ++p) { pp = strchr(print_ascii, *p); if (pp == 0) fail(invalid_input); *p = pp - print_ascii; } /* Decode: */ output_length = unicode_max_length; status = punycode_decode(input_length, input, &output_length, output, case_flags); if (status == punycode_bad_input) fail(invalid_input); if (status == punycode_big_output) fail(too_big); if (status == punycode_overflow) fail(overflow); assert(status == punycode_success); /* Output the result: */ for(j = 0; j < output_length; ++j) { r = printf("%s+%04lX\n", case_flags[j] ? "U" : "u", (unsigned long) output[j]); if (r < 0) fail(io_error); } return EXIT_SUCCESS; } usage(argv); return EXIT_SUCCESS; /* not reached, but quiets compiler warning */ } #endif httrack-3.49.14/src/htscharset.c0000644000175000017500000011145215230602340012117 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Charset conversion functions */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include "htscharset.h" #ifdef _WIN32 #include #endif #include "htsbase.h" #include "punycode.h" #include "htssafe.h" #ifdef _WIN32 #include typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #elif (defined(SOLARIS) || defined(sun) || defined(HAVE_INTTYPES_H) \ || defined(BSD) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD_kernel__)) #include #else #include #endif #include int hts_isStringAscii(const char *s, size_t size) { size_t i; for(i = 0; i < size; i++) { const unsigned char c = (const unsigned char) s[i]; if (c >= 0x80) { return 0; } } return 1; } #define IS_ALNUM(C) ( ((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z') || ((C) >= '0' && (C) <= '9') ) #define CHAR_LOWER(C) ( ((C) >= 'A' && (C) <= 'Z') ? ((C) + 'a' - 'A') : (C) ) static int hts_equalsAlphanum(const char *a, const char *b) { size_t i, j; for(i = 0, j = 0;; i++, j++) { /* Skip non-alnum */ for(; a[i] != '\0' && !IS_ALNUM(a[i]); i++) ; for(; b[j] != '\0' && !IS_ALNUM(b[j]); j++) ; /* Compare */ if (CHAR_LOWER(a[i]) != CHAR_LOWER(b[j])) { break; } /* End of string ? (note: a[i] == b[j]) */ else if (a[i] == '\0') { return 1; } } return 0; } #undef IS_ALNUM #undef CHAR_LOWER /* Copy the memory region [s .. s + size - 1 ] as a \0-terminated string. */ static char *hts_stringMemCopy(const char *s, size_t size) { char *dest = malloct(size + 1); if (dest != NULL) { memcpy(dest, s, size); dest[size] = '\0'; return dest; } return NULL; } #ifdef _WIN32 typedef struct wincodepage_t wincodepage_t; struct wincodepage_t { UINT codepage; const char *name; }; /* See */ static const wincodepage_t codepages[] = { {37, "ibm037"}, {437, "ibm437"}, {500, "ibm500"}, {708, "asmo-708"}, {720, "dos-720"}, {737, "ibm737"}, {775, "ibm775"}, {850, "ibm850"}, {852, "ibm852"}, {855, "ibm855"}, {857, "ibm857"}, {858, "ibm00858"}, {860, "ibm860"}, {861, "ibm861"}, {862, "dos-862"}, {863, "ibm863"}, {864, "ibm864"}, {865, "ibm865"}, {866, "cp866"}, {869, "ibm869"}, {870, "ibm870"}, {874, "windows-874"}, {875, "cp875"}, {932, "shift_jis"}, {936, "gb2312"}, {949, "ks_c_5601-1987"}, {950, "big5"}, {1026, "ibm1026"}, {1047, "ibm01047"}, {1140, "ibm01140"}, {1141, "ibm01141"}, {1142, "ibm01142"}, {1143, "ibm01143"}, {1144, "ibm01144"}, {1145, "ibm01145"}, {1146, "ibm01146"}, {1147, "ibm01147"}, {1148, "ibm01148"}, {1149, "ibm01149"}, {1200, "utf-16"}, {1201, "unicodefffe"}, {1250, "windows-1250"}, {1251, "windows-1251"}, {1252, "windows-1252"}, {1253, "windows-1253"}, {1254, "windows-1254"}, {1255, "windows-1255"}, {1256, "windows-1256"}, {1257, "windows-1257"}, {1258, "windows-1258"}, {1361, "johab"}, {10000, "macintosh"}, {10001, "x-mac-japanese"}, {10002, "x-mac-chinesetrad"}, {10003, "x-mac-korean"}, {10004, "x-mac-arabic"}, {10005, "x-mac-hebrew"}, {10006, "x-mac-greek"}, {10007, "x-mac-cyrillic"}, {10008, "x-mac-chinesesimp"}, {10010, "x-mac-romanian"}, {10017, "x-mac-ukrainian"}, {10021, "x-mac-thai"}, {10029, "x-mac-ce"}, {10079, "x-mac-icelandic"}, {10081, "x-mac-turkish"}, {10082, "x-mac-croatian"}, {12000, "utf-32"}, {12001, "utf-32be"}, {20000, "x-chinese_cns"}, {20001, "x-cp20001"}, {20002, "x_chinese-eten"}, {20003, "x-cp20003"}, {20004, "x-cp20004"}, {20005, "x-cp20005"}, {20105, "x-ia5"}, {20106, "x-ia5-german"}, {20107, "x-ia5-swedish"}, {20108, "x-ia5-norwegian"}, {20127, "us-ascii"}, {20261, "x-cp20261"}, {20269, "x-cp20269"}, {20273, "ibm273"}, {20277, "ibm277"}, {20278, "ibm278"}, {20280, "ibm280"}, {20284, "ibm284"}, {20285, "ibm285"}, {20290, "ibm290"}, {20297, "ibm297"}, {20420, "ibm420"}, {20423, "ibm423"}, {20424, "ibm424"}, {20833, "x-ebcdic-koreanextended"}, {20838, "ibm-thai"}, {20866, "koi8-r"}, {20871, "ibm871"}, {20880, "ibm880"}, {20905, "ibm905"}, {20924, "ibm00924"}, {20932, "euc-jp"}, {20936, "x-cp20936"}, {20949, "x-cp20949"}, {21025, "cp1025"}, {21866, "koi8-u"}, {28591, "iso-8859-1"}, {28592, "iso-8859-2"}, {28593, "iso-8859-3"}, {28594, "iso-8859-4"}, {28595, "iso-8859-5"}, {28596, "iso-8859-6"}, {28597, "iso-8859-7"}, {28598, "iso-8859-8"}, {28599, "iso-8859-9"}, {28603, "iso-8859-13"}, {28605, "iso-8859-15"}, {29001, "x-europa"}, {38598, "iso-8859-8-i"}, {50220, "iso-2022-jp"}, {50221, "csiso2022jp"}, {50222, "iso-2022-jp"}, {50225, "iso-2022-kr"}, {50227, "x-cp50227"}, {50229, "iso-2022-cn"}, {51932, "euc-jp"}, {51936, "euc-cn"}, {51949, "euc-kr"}, {52936, "hz-gb-2312"}, {54936, "gb18030"}, {57002, "x-iscii-de"}, {57003, "x-iscii-be"}, {57004, "x-iscii-ta"}, {57005, "x-iscii-te"}, {57006, "x-iscii-as"}, {57007, "x-iscii-or"}, {57008, "x-iscii-ka"}, {57009, "x-iscii-ma"}, {57010, "x-iscii-gu"}, {57011, "x-iscii-pa"}, {65000, "utf-7"}, {65001, "utf-8"}, {0, NULL} }; /* Get a Windows codepage, by its name. Return 0 upon error. */ UINT hts_getCodepage(const char *name) { int id; for(id = 0; codepages[id].name != NULL; id++) { /* Compare the two strings, lowercase and alphanum only (ISO88591 == iso-8859-1) */ if (hts_equalsAlphanum(name, codepages[id].name)) { return codepages[id].codepage; } } /* Not found */ return 0; } LPWSTR hts_convertStringToUCS2(const char *s, int size, UINT cp, int *pwsize) { /* Size in wide chars of the output */ const int wsize = MultiByteToWideChar(cp, 0, (LPCSTR) s, size, NULL, 0); if (wsize > 0) { LPSTR uoutput = NULL; LPWSTR woutput = malloc((wsize + 1) * sizeof(WCHAR)); if (woutput != NULL && MultiByteToWideChar(cp, 0, (LPCSTR) s, size, woutput, wsize) == wsize) { const int usize = WideCharToMultiByte(CP_UTF8, 0, woutput, wsize, NULL, 0, NULL, FALSE); if (usize > 0) { woutput[wsize] = 0x0; if (pwsize != NULL) *pwsize = wsize; return woutput; } } if (woutput != NULL) free(woutput); } return NULL; } LPWSTR hts_convertUTF8StringToUCS2(const char *s, int size, int *pwsize) { return hts_convertStringToUCS2(s, size, CP_UTF8, pwsize); } char *hts_convertUCS2StringToCP(LPWSTR woutput, int wsize, UINT cp) { const int usize = WideCharToMultiByte(cp, 0, woutput, wsize, NULL, 0, NULL, FALSE); if (usize > 0) { char *const uoutput = malloc((usize + 1) * sizeof(char)); if (uoutput != NULL) { if (WideCharToMultiByte (cp, 0, woutput, wsize, uoutput, usize, NULL, FALSE) == usize) { uoutput[usize] = '\0'; return uoutput; } else { free(uoutput); } } } return NULL; } char *hts_convertUCS2StringToUTF8(LPWSTR woutput, int wsize) { return hts_convertUCS2StringToCP(woutput, wsize, CP_UTF8); } char *hts_convertStringCPToUTF8(const char *s, size_t size, UINT cp) { /* Empty string ? */ if (size == 0) { return hts_stringMemCopy(s, size); } /* Already UTF-8 ? */ if (cp == CP_UTF8 || hts_isStringAscii(s, size)) { return hts_stringMemCopy(s, size); } /* Other (valid) charset */ else if (cp != 0) { /* Size in wide chars of the output */ int wsize; LPWSTR woutput = hts_convertStringToUCS2(s, (int) size, cp, &wsize); if (woutput != NULL) { char *const uoutput = hts_convertUCS2StringToUTF8(woutput, wsize); free(woutput); return uoutput; } } /* Error, charset not found! */ return NULL; } char *hts_convertStringCPFromUTF8(const char *s, size_t size, UINT cp) { /* Empty string ? */ if (size == 0) { return hts_stringMemCopy(s, size); } /* Already UTF-8 ? */ if (cp == CP_UTF8 || hts_isStringAscii(s, size)) { return hts_stringMemCopy(s, size); } /* Other (valid) charset */ else if (cp != 0) { /* Size in wide chars of the output */ int wsize; LPWSTR woutput = hts_convertStringToUCS2(s, (int) size, CP_UTF8, &wsize); if (woutput != NULL) { char *const uoutput = hts_convertUCS2StringToCP(woutput, wsize, cp); free(woutput); return uoutput; } } /* Error, charset not found! */ return NULL; } HTSEXT_API char *hts_convertStringToUTF8(const char *s, size_t size, const char *charset) { const UINT cp = hts_getCodepage(charset); return hts_convertStringCPToUTF8(s, size, cp); } char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset) { const UINT cp = hts_getCodepage(charset); return hts_convertStringCPFromUTF8(s, size, cp); } HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size) { return hts_convertStringCPToUTF8(s, size, GetACP()); } HTSEXT_API void hts_argv_utf8(int *pargc, char ***pargv) { int wargc = 0; LPWSTR *const wargv = CommandLineToArgvW(GetCommandLineW(), &wargc); char **argv; int i; // On any failure keep the CRT's ANSI argv: lossy, but never half-converted. if (wargv == NULL) return; if (wargc <= 0 || (argv = calloct((size_t) wargc + 1, sizeof(char *))) == NULL) { LocalFree(wargv); return; } for (i = 0; i < wargc; i++) { const int wsize = (int) wcslen(wargv[i]); // hts_convertUCS2StringToUTF8() returns NULL on an empty string argv[i] = wsize != 0 ? hts_convertUCS2StringToUTF8(wargv[i], wsize) : strdupt(""); if (argv[i] == NULL) { while (i-- != 0) freet(argv[i]); freet(argv); LocalFree(wargv); return; } } argv[wargc] = NULL; // callers may rely on argv[argc] == NULL LocalFree(wargv); *pargc = wargc; *pargv = argv; // never freed: argv lives for the process } #else #include #if ( defined(HTS_USEICONV) && ( HTS_USEICONV == 0 ) ) #define DISABLE_ICONV #endif #ifndef DISABLE_ICONV #include #else #include "htscodepages.h" /* decode from a codepage to UTF-8 */ static char* hts_codepageToUTF8(const char *codepage, const char *s) { /* find the given codepage */ size_t i; for(i = 0 ; table_mappings[i].name != NULL && !hts_equalsAlphanum(table_mappings[i].name, codepage) ; i++) ; /* found ; decode */ if (table_mappings[i].name != NULL) { size_t j, k; char *dest = NULL; size_t capa = 0; #define MAX_UTF 8 for(j = 0, k = 0 ; s[j] != '\0' ; j++) { const unsigned char c = (unsigned char) s[j]; const hts_UCS4 uc = table_mappings[i].table[c]; const size_t max = k + MAX_UTF; if (capa < max) { for(capa = 16 ; capa < max ; capa <<= 1) ; dest = realloc(dest, capa); if (dest == NULL) { return NULL; } } if (dest != NULL) { const size_t len = hts_writeUTF8(uc, &dest[k], MAX_UTF); k += len; assertf(k < capa); } } dest[k] = '\0'; return dest; #undef MAX_UTF } return NULL; } #endif static char *hts_convertStringCharset(const char *s, size_t size, const char *to, const char *from) { /* Empty string ? */ if (size == 0) { return strdup(""); } /* Already on correct charset ? */ if (hts_equalsAlphanum(from, to)) { return hts_stringMemCopy(s, size); } #ifndef DISABLE_ICONV /* Find codepage */ else { const iconv_t cp = iconv_open(to, from); if (cp != (iconv_t) - 1) { char *inbuf = (char*) (uintptr_t) s; /* ugly iconv api, sheesh */ size_t inbytesleft = size; size_t outbufCapa = 0; char *outbuf = NULL; size_t outbytesleft = 0; size_t finalSize; /* Initial size to around the string size */ for(outbufCapa = 16; outbufCapa < size + 1; outbufCapa *= 2) ; outbuf = malloc(outbufCapa); outbytesleft = outbufCapa; /* Convert */ while(outbuf != NULL && inbytesleft != 0) { const size_t offset = outbufCapa - outbytesleft; char *outbufCurrent = outbuf + offset; const size_t ret = iconv(cp, &inbuf, &inbytesleft, &outbufCurrent, &outbytesleft); if (ret == (size_t) - 1) { if (errno == E2BIG) { const size_t used = outbufCapa - outbytesleft; outbufCapa *= 2; outbuf = realloc(outbuf, outbufCapa); if (outbuf == NULL) { break; } outbytesleft = outbufCapa - used; } else { free(outbuf); outbuf = NULL; break; } } } /* Final size ? */ finalSize = outbufCapa - outbytesleft; /* Terminating \0 */ if (outbuf != NULL && finalSize + 1 >= outbufCapa) { outbuf = realloc(outbuf, finalSize + 1); } if (outbuf != NULL) outbuf[finalSize] = '\0'; /* Close codepage */ iconv_close(cp); /* Return result (may be NULL) */ return outbuf; } } #else /* Limited codepage decoding support only. */ if (hts_isCharsetUTF8(to)) { return hts_codepageToUTF8(from, s); } #endif /* Error, charset not found! */ return NULL; } HTSEXT_API char *hts_convertStringToUTF8(const char *s, size_t size, const char *charset) { /* Empty string ? */ if (size == 0) { return strdup(""); } /* Already UTF-8 ? */ if (hts_isCharsetUTF8(charset) || hts_isStringAscii(s, size)) { return hts_stringMemCopy(s, size); } /* Find codepage */ else { return hts_convertStringCharset(s, size, "utf-8", charset); } } char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset) { /* Empty string ? */ if (size == 0) { return strdup(""); } /* Already UTF-8 ? */ if (hts_isCharsetUTF8(charset) || hts_isStringAscii(s, size)) { return hts_stringMemCopy(s, size); } /* Find codepage */ else { return hts_convertStringCharset(s, size, charset, "utf-8"); } } #endif #ifdef _WIN32 #define strcasecmp(a,b) stricmp(a,b) #define strncasecmp(a,b,n) strnicmp(a,b,n) #endif static int is_space(char c) { return c == ' ' || c == '\t' || c == '\r' || c == '\n'; } static int is_space_or_equal(char c) { return is_space(c) || c == '='; } static int is_space_or_equal_or_quote(char c) { return is_space_or_equal(c) || c == '"' || c == '\''; } size_t hts_stringLengthUTF8(const char *s) { const unsigned char *const bytes = (const unsigned char *) s; size_t i, len; for(i = 0, len = 0; bytes[i] != '\0'; i++) { const unsigned char c = bytes[i]; if (HTS_IS_LEADING_UTF8(c)) { /* ASCII or leading byte */ len++; } } return len; } size_t hts_copyStringUTF8(char *dest, const char *src, size_t size) { const unsigned char *const bytes = (const unsigned char *) src; size_t i, mark; for(i = 0, mark = 0; ( i == 0 || bytes[i + 1] != '\0' ) && i <= size; i++) { const unsigned char c = bytes[i]; dest[i] = c; if (HTS_IS_LEADING_UTF8(c)) { mark = i; } } dest[mark] = '\0'; return mark; } size_t hts_appendStringUTF8(char *dest, const char *src, size_t nBytes) { const size_t size = strlen(dest); return hts_copyStringUTF8(dest + size, src, nBytes); } int hts_isCharsetUTF8(const char *charset) { return charset != NULL && ( strcasecmp(charset, "utf-8") == 0 || strcasecmp(charset, "utf8") == 0 ); } /* Extract X from a "text/html; charset=X" content= attribute value. */ static char *charset_from_content(const char *s, size_t len) { size_t i; for (i = 0; i + 7 < len; i++) { if ((i == 0 || is_space(s[i - 1]) || s[i - 1] == ';') && strncasecmp(&s[i], "charset", 7) == 0 && is_space_or_equal(s[i + 7])) { size_t j, val; for (j = i + 7; j < len && is_space_or_equal_or_quote(s[j]); j++) ; for (val = j; j < len && s[j] != '"' && s[j] != '\'' && s[j] != ';' && !is_space(s[j]); j++) ; if (j != val) { return hts_stringMemCopy(&s[val], j - val); } } } return NULL; } char *hts_getCharsetFromMeta(const char *html, size_t size) { size_t i; /* HTML5 or legacy , attributes in any order; first resolvable tag wins. */ for (i = 0; i + 6 < size; i++) { size_t j; const char *equiv = NULL, *content = NULL; size_t equiv_len = 0, content_len = 0; if (html[i] != '<' || strncasecmp(&html[i + 1], "meta", 4) != 0 || !is_space(html[i + 5])) { continue; } /* Attribute scan, strictly bounded by size. */ for (j = i + 6; j < size && html[j] != '>';) { size_t name, name_len, val = 0, val_len = 0; if (is_space(html[j]) || html[j] == '/') { j++; continue; } for (name = j; j < size && html[j] != '=' && html[j] != '>' && html[j] != '/' && !is_space(html[j]); j++) ; name_len = j - name; for (; j < size && is_space(html[j]); j++) ; if (j < size && html[j] == '=') { for (j++; j < size && is_space(html[j]); j++) ; if (j < size && (html[j] == '"' || html[j] == '\'')) { const char quote = html[j++]; for (val = j; j < size && html[j] != quote; j++) ; if (j >= size) /* unterminated quote: drop the tag */ break; val_len = j++ - val; } else { /* unquoted: ends at whitespace or '>' only (HTML5 prescan); '/' belongs to the value except as the tail of a self-close */ for (val = j; j < size && !is_space(html[j]) && html[j] != '>'; j++) ; val_len = j - val; if (val_len != 0 && j < size && html[j] == '>' && html[val + val_len - 1] == '/') { val_len--; } } } /* first occurrence of each attribute wins, as in browsers */ if (val_len != 0) { if (name_len == 7 && strncasecmp(&html[name], "charset", 7) == 0) { return hts_stringMemCopy(&html[val], val_len); } else if (equiv == NULL && name_len == 10 && strncasecmp(&html[name], "http-equiv", 10) == 0) { equiv = &html[val]; equiv_len = val_len; } else if (content == NULL && name_len == 7 && strncasecmp(&html[name], "content", 7) == 0) { content = &html[val]; content_len = val_len; } } } if (equiv_len == 12 && strncasecmp(equiv, "content-type", 12) == 0 && content != NULL) { char *const s = charset_from_content(content, content_len); if (s != NULL) { return s; } } i = j; } return NULL; } /* UTF-8 helpers */ /* Number of leading zeros. Returns a value between 0 and 8. */ static unsigned int nlz8(unsigned char x) { unsigned int b = 0; if (x & 0xf0) { x >>= 4; } else { b += 4; } if (x & 0x0c) { x >>= 2; } else { b += 2; } if (! (x & 0x02) ) { b++; } return b; } /* Emit the Unicode character 'UC' (internal) See 7 U+0000 U+007F 1 0xxxxxxx 11 U+0080 U+07FF 2 110xxxxx 16 U+0800 U+FFFF 3 1110xxxx 21 U+10000 U+1FFFFF 4 11110xxx 26 U+200000 U+3FFFFFF 5 111110xx 31 U+4000000 U+7FFFFFFF 6 1111110x */ #define ADD_FIRST_SEQ(UC, LEN, EMITTER) do { \ /* first octet */ \ const unsigned char lead = \ /* leading bits: LEN "1" bits */ \ ~ ( ( 1 << (unsigned) ( 8 - LEN ) ) - 1 ) \ /* encoded bits */ \ | ( (UC) >> (unsigned) ( ( LEN - 1 ) * 6 ) ); \ EMITTER(lead); \ } while(0) #define ADD_NEXT_SEQ(UC, SHIFT, EMITTER) do { \ /* further bytes are encoding 6 bits */ \ const unsigned char next = \ 0x80 | ( ( (UC) >> SHIFT ) & 0x3f ); \ EMITTER(next); \ } while(0) /* UC is a constant. EMITTER is a macro function taking an unsigned int. */ #define EMIT_UNICODE(UC, EMITTER) do { \ if ((UC) < 0x80) { \ EMITTER(((unsigned char) (UC))); \ } else if ((UC) < 0x0800) { \ ADD_FIRST_SEQ(UC, 2, EMITTER); \ ADD_NEXT_SEQ(UC, 0, EMITTER); \ } else if ((UC) < 0x10000) { \ ADD_FIRST_SEQ(UC, 3, EMITTER); \ ADD_NEXT_SEQ(UC, 6, EMITTER); \ ADD_NEXT_SEQ(UC, 0, EMITTER); \ } else if ((UC) < 0x200000) { \ ADD_FIRST_SEQ(UC, 4, EMITTER); \ ADD_NEXT_SEQ(UC, 12, EMITTER); \ ADD_NEXT_SEQ(UC, 6, EMITTER); \ ADD_NEXT_SEQ(UC, 0, EMITTER); \ } else if ((UC) < 0x4000000) { \ ADD_FIRST_SEQ(UC, 5, EMITTER); \ ADD_NEXT_SEQ(UC, 18, EMITTER); \ ADD_NEXT_SEQ(UC, 12, EMITTER); \ ADD_NEXT_SEQ(UC, 6, EMITTER); \ ADD_NEXT_SEQ(UC, 0, EMITTER); \ } else { \ ADD_FIRST_SEQ(UC, 6, EMITTER); \ ADD_NEXT_SEQ(UC, 24, EMITTER); \ ADD_NEXT_SEQ(UC, 18, EMITTER); \ ADD_NEXT_SEQ(UC, 12, EMITTER); \ ADD_NEXT_SEQ(UC, 6, EMITTER); \ ADD_NEXT_SEQ(UC, 0, EMITTER); \ } \ } while(0) #undef READ_LOOP #define READ_LOOP(C, READER, EMITTER, CLEARED) \ do { \ unsigned int uc_ = \ (C) & ( (1 << (CLEARED - 1)) - 1 ); \ int i_; \ /* loop should be unrolled by compiler */ \ for(i_ = 0 ; i_ < 7 - CLEARED ; i_++) { \ const int c_ = (READER); \ /* continuation byte 10xxxxxx */ \ if (c_ != -1 && ( c_ >> 6 ) == 0x2) { \ uc_ <<= 6; \ uc_ |= (c_ & 0x3f); \ } else { \ uc_ = (unsigned int) -1; \ break; \ } \ } \ EMITTER(((int) uc_)); \ } while(0) /* READER is a macro returning an int (-1 for error). EMITTER is a macro function taking an int (-1 for error). */ #define READ_UNICODE(READER, EMITTER) do { \ const unsigned int f_ = \ (unsigned int) (READER); \ /* 1..8 */ \ const unsigned int c_ = \ nlz8((unsigned char)~f_); \ /* ascii */ \ switch(c_) { \ case 0: \ EMITTER(((int)f_)); \ break; \ /* 110xxxxx 10xxxxxx */ \ case 2: \ READ_LOOP(f_, READER, EMITTER, 6); \ break; \ case 3: \ READ_LOOP(f_, READER, EMITTER, 5); \ break; \ case 4: \ READ_LOOP(f_, READER, EMITTER, 4); \ break; \ case 5: \ READ_LOOP(f_, READER, EMITTER, 3); \ break; \ case 6: \ READ_LOOP(f_, READER, EMITTER, 2); \ break; \ /* unexpected continuation/bogus */ \ default: \ EMITTER(-1); \ break; \ } \ } while(0) /* IDNA helpers. */ #undef ADD_BYTE #undef INCREASE_CAPA #define INCREASE_CAPA() do { \ capa = capa < 16 ? 16 : ( capa << 1 ); \ dest = realloc(dest, capa*sizeof(dest[0])); \ if (dest == NULL) { \ return NULL; \ } \ } while(0) #define ADD_BYTE(C) do { \ if (capa == destSize) { \ INCREASE_CAPA(); \ } \ dest[destSize++] = (C); \ } while(0) #define FREE_BUFFER() do { \ if (dest != NULL) { \ free(dest); \ dest = NULL; \ } \ } while(0) char *hts_convertStringUTF8ToIDNA(const char *s, size_t size) { char *dest = NULL; size_t capa = 0, destSize = 0; size_t i, startSeg; int nonAsciiFound; for(i = startSeg = 0, nonAsciiFound = 0 ; i <= size ; i++) { const unsigned char c = i < size ? (unsigned char) s[i] : 0; /* separator (ending, url segment, scheme, path segment, query string) */ if (c == 0 || c == '.' || c == ':' || c == '/' || c == '?') { /* non-empty segment */ if (startSeg != i) { /* IDNA ? */ if (nonAsciiFound) { const size_t segSize = i - startSeg; const unsigned char *segData = (const unsigned char*) &s[startSeg]; punycode_uint *segInt = NULL; size_t j, utfSeq, segOutputSize; punycode_uint output_length; punycode_status status; /* IDNA prefix */ ADD_BYTE('x'); ADD_BYTE('n'); ADD_BYTE('-'); ADD_BYTE('-'); /* copy utf-8 to integers. note: buffer is sufficient! */ segInt = (punycode_uint*) malloc(segSize*sizeof(punycode_uint)); if (segInt == NULL) { FREE_BUFFER(); return NULL; } for(j = 0, segOutputSize = 0, utfSeq = (size_t) -1 ; j <= segSize ; j++) { const unsigned char c = j < segSize ? segData[j] : 0; /* character start (ascii, or utf-8 leading sequence) */ if (HTS_IS_LEADING_UTF8(c)) { /* commit sequence ? */ if (utfSeq != (size_t) -1) { /* Reader: can read bytes up to j */ #define RD ( utfSeq < j ? segData[utfSeq++] : -1 ) /* Writer: a malformed sequence abandons the encode (NULL) */ #define WR(C) \ do { \ if ((C) != -1) { \ /* copy character */ \ assertf(segOutputSize < segSize); \ segInt[segOutputSize++] = (C); \ } else { \ freet(segInt); \ FREE_BUFFER(); \ return NULL; \ } \ } while (0) /* Read/Write Unicode character. */ READ_UNICODE(RD, WR); #undef RD #undef WR /* not anymore in sequence */ utfSeq = (size_t) -1; } /* ascii ? */ if (c < 0x80) { assertf(segOutputSize < segSize); segInt[segOutputSize] = c; if (c != 0) { segOutputSize++; } } /* new UTF8 sequence */ else { utfSeq = j; } } } /* encode */ output_length = (punycode_uint) ( capa - destSize ); while((status = punycode_encode((punycode_uint) segOutputSize, segInt, NULL, &output_length, &dest[destSize])) == punycode_big_output) { INCREASE_CAPA(); output_length = (punycode_uint) ( capa - destSize ); } /* cleanup */ free(segInt); /* success ? */ if (status == punycode_success) { destSize += output_length; } else { FREE_BUFFER(); return NULL; } } /* copy ascii segment otherwise */ else { size_t j; for(j = startSeg ; j < i ; j++) { const char c = s[j]; ADD_BYTE(c); } } } /* next segment start */ startSeg = i + 1; nonAsciiFound = 0; /* add separator (including terminating \0) */ ADD_BYTE(c); } /* found non-ascii */ else if (c >= 0x80) { nonAsciiFound = 1; } } return dest; } int hts_isStringIDNA(const char *s, size_t size) { size_t i, startSeg; for(i = startSeg = 0 ; i <= size ; i++) { const unsigned char c = i < size ? s[i] : 0; if (c == 0 || c == '.' || c == ':' || c == '/' || c == '?') { const size_t segSize = i - startSeg; /* IDNA segment ? */ if (segSize > 4 && strncasecmp(&s[startSeg], "xn--", 4) == 0) { return 1; } /* next segment start */ startSeg = i + 1; } } return 0; } char *hts_convertStringIDNAToUTF8(const char *s, size_t size) { char *dest = NULL; size_t capa = 0, destSize = 0; size_t i, startSeg; for(i = startSeg = 0 ; i <= size ; i++) { const unsigned char c = i < size ? s[i] : 0; if (c == 0 || c == '.' || c == ':' || c == '/' || c == '?') { const size_t segSize = i - startSeg; /* IDNA segment ? */ if (segSize > 4 && strncasecmp(&s[startSeg], "xn--", 4) == 0) { punycode_status status; punycode_uint output_capa; punycode_uint output_length; punycode_uint *output_dest; /* encode. pre-reserve buffer. */ for(output_capa = 16 ; output_capa < segSize ; output_capa <<= 1) ; output_dest = (punycode_uint*) malloc(output_capa*sizeof(punycode_uint)); if (output_dest == NULL) { FREE_BUFFER(); return NULL; } for(output_length = output_capa ; (status = punycode_decode((punycode_uint) segSize - 4, &s[startSeg + 4], &output_length, output_dest, NULL)) == punycode_big_output ; ) { output_capa <<= 1; output_dest = (punycode_uint*) realloc(output_dest, output_capa*sizeof(punycode_uint)); if (output_dest == NULL) { FREE_BUFFER(); return NULL; } output_length = output_capa; } /* success ? */ if (status == punycode_success) { punycode_uint j; for(j = 0 ; j < output_length ; j++) { const punycode_uint uc = output_dest[j]; if (uc < 0x80) { ADD_BYTE((char) uc); } else { /* emiter (byte per byte) */ #define EM(C) do { \ if (C != -1) { \ ADD_BYTE(C); \ } else { \ FREE_BUFFER(); \ return NULL; \ } \ } while(0) /* Emit codepoint */ EMIT_UNICODE(uc, EM); #undef EM } } } /* cleanup */ free(output_dest); /* error ? */ if (status != punycode_success) { FREE_BUFFER(); return NULL; } } else { size_t j; for(j = startSeg ; j < i ; j++) { const char c = s[j]; ADD_BYTE(c); } } /* next segment start */ startSeg = i + 1; /* add separator (including terminating \0) */ ADD_BYTE(c); } } return dest; } hts_UCS4* hts_convertUTF8StringToUCS4(const char *s, size_t size, size_t *nChars) { const unsigned char *const data = (const unsigned char*) s; size_t i; hts_UCS4 *dest = NULL; size_t capa = 0, destSize = 0; if (nChars != NULL) { *nChars = 0; } for(i = 0 ; i < size ; ) { hts_UCS4 uc; /* Reader: can read bytes up to j */ #define RD ( i < size ? data[i++] : -1 ) /* Writer: upon error, return FFFD (replacement character) */ #define WR(C) uc = (C) != -1 ? (hts_UCS4) (C) : (hts_UCS4) 0xfffd /* Read Unicode character. */ READ_UNICODE(RD, WR); #undef RD #undef WR /* Emit char */ ADD_BYTE(uc); if (nChars != NULL) { (*nChars)++; } } ADD_BYTE('\0'); return dest; } int hts_isStringUTF8(const char *s, size_t size) { const unsigned char *const data = (const unsigned char*) s; size_t i; /* Strict RFC 3629: reject overlongs, surrogates, > U+10FFFF, 5/6-byte. */ for(i = 0 ; i < size ; ) { const unsigned char c = data[i]; size_t len, k; hts_UCS4 uc, min; if (c < 0x80) { i++; continue; } else if (c >= 0xc2 && c <= 0xdf) { len = 2; min = 0x80; uc = c & 0x1f; } else if (c >= 0xe0 && c <= 0xef) { len = 3; min = 0x800; uc = c & 0x0f; } else if (c >= 0xf0 && c <= 0xf4) { len = 4; min = 0x10000; uc = c & 0x07; } else { /* continuation byte, overlong C0/C1, or F5..FF lead */ return 0; } if (size - i < len) { return 0; } for (k = 1; k < len; k++) { const unsigned char cc = data[i + k]; if ((cc & 0xc0) != 0x80) { return 0; } uc = (uc << 6) | (cc & 0x3f); } if (uc < min || uc > 0x10FFFF || (uc >= 0xD800 && uc <= 0xDFFF)) { return 0; } i += len; } return 1; } char *hts_convertUCS4StringToUTF8(const hts_UCS4 *s, size_t nChars) { size_t i; char *dest = NULL; size_t capa = 0, destSize = 0; for(i = 0 ; i < nChars ; i++) { const hts_UCS4 uc = s[i]; /* emitter (byte per byte) */ #define EM(C) do { \ if (C != -1) { \ ADD_BYTE(C); \ } else { \ FREE_BUFFER(); \ return NULL; \ } \ } while(0) EMIT_UNICODE(uc, EM); #undef EM } ADD_BYTE('\0'); return dest; } size_t hts_writeUTF8(hts_UCS4 uc, char *dest, size_t size) { size_t offs = 0; #define EM(C) do { \ if (offs + 1 < size) { \ dest[offs++] = C; \ } else { \ return 0; \ } \ } while(0) EMIT_UNICODE(uc, EM); #undef EM return offs; } size_t hts_readUTF8(const char *src, size_t size, hts_UCS4 *puc) { const unsigned char *const data = (const unsigned char*) src; size_t i = 0; int uc = -1; /* Reader: can read bytes up to j */ #define RD ( i < size ? data[i++] : -1 ) /* Writer: upon error, return FFFD (replacement character) */ #define WR(C) uc = (C) /* Read Unicode character. */ READ_UNICODE(RD, WR); #undef RD #undef WR /* Return */ if (uc != -1) { if (puc != NULL) { *puc = (hts_UCS4) uc; } return i; } return 0; } size_t hts_getUTF8SequenceLength(const char lead) { const unsigned char f = (unsigned char) lead; const unsigned int c = nlz8(~f); switch(c) { case 0: /* ASCII */ return 1; break; case 2: case 3: case 4: case 5: case 6: /* UTF-8 */ return c; break; default: /* ERROR */ return 0; break; } } size_t hts_stringLengthUCS4(const hts_UCS4 *s) { size_t i; for(i = 0 ; s[i] != 0 ; i++) ; return i; } #undef ADD_BYTE #undef INCREASE_CAPA httrack-3.49.14/src/htsmodules.c0000644000175000017500000001442615230602340012141 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsmodules.c subroutines: */ /* external modules (parsers) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsglobal.h" #include "htsmodules.h" #include "htsopt.h" #include "htsbasenet.h" #include "htslib.h" extern int fspc(httrackp * opt, FILE * fp, const char *type); #ifndef _WIN32 #if HTS_DLOPEN #include #endif #endif /* >>> Put all modules definitions here */ #include "htszlib.h" #include "htsbase.h" /* <<< */ /* >>> Put all modules variables here */ int V6_is_available = HTS_INET6; static char WHAT_is_available[64] = ""; /* <<< */ HTSEXT_API const char *hts_get_version_info(httrackp * opt) { size_t size; int i; strcpy(opt->state.HTbuff, WHAT_is_available); size = strlen(opt->state.HTbuff); for(i = 0; i < opt->libHandles.count; i++) { const char *name = opt->libHandles.handles[i].moduleName; if (name != NULL) { size_t nsize = strlen(name) + sizeof("+"); size += nsize; if (size + 1 >= sizeof(opt->state.HTbuff)) break; strcat(opt->state.HTbuff, "+"); strcat(opt->state.HTbuff, name); } } return opt->state.HTbuff; } static void htspe_log(htsmoduleStruct * str, const char *msg); int hts_parse_externals(htsmoduleStruct * str) { str->wrapper_name = "wrapper-lib"; /* External callback */ if (RUN_CALLBACK1(str->opt, detect, str)) { if (str->wrapper_name == NULL) str->wrapper_name = "wrapper-lib"; /* Blacklisted */ if (multipleStringMatch (str->wrapper_name, StringBuff(str->opt->mod_blacklist))) { return -1; } else { htspe_log(str, str->wrapper_name); return RUN_CALLBACK1(str->opt, parse, str); } } /* Not detected */ return -1; } void clearCallbacks(htscallbacks * chain_); void clearCallbacks(htscallbacks * chain_) { htscallbacks *chain; chain = chain_; while(chain != NULL) { if (chain->exitFnc != NULL) { (void) chain->exitFnc(); /* result ignored */ chain->exitFnc = NULL; } chain = chain->next; } chain = chain_; while(chain != NULL) { if (chain->moduleHandle != NULL) { #ifdef _WIN32 FreeLibrary(chain->moduleHandle); #else dlclose(chain->moduleHandle); #endif } chain = chain->next; } chain = chain_->next; // Don't free the block #0 while(chain != NULL) { htscallbacks *nextchain = chain->next; freet(chain); chain = nextchain; } chain_->next = NULL; // Empty } void *openFunctionLib(const char *file_) { void *handle; char *file = malloct(strlen(file_) + 32); strcpy(file, file_); #ifdef _WIN32 handle = LoadLibraryA(file); if (handle == NULL) { sprintf(file, "%s.dll", file_); handle = LoadLibraryA(file); } #else handle = dlopen(file, RTLD_LAZY); if (handle == NULL) { sprintf(file, "lib%s.so", file_); handle = dlopen(file, RTLD_LAZY); } #endif freet(file); return handle; } void closeFunctionLib(void *handle) { #ifdef _WIN32 FreeLibrary(handle); #else dlclose(handle); #endif } void *getFunctionPtr(void *handle, const char *fncname_) { if (handle) { void *userfunction = NULL; char *fncname = strdupt(fncname_); /* Strip optional comma */ char *comma; if ((comma = strchr(fncname, ',')) != NULL) { /* empty arg */ *comma++ = '\0'; } /* the function itself */ userfunction = (void *) DynamicGet(handle, (char *) fncname); freet(fncname); return userfunction; } return NULL; } void htspe_init(void) { static int initOk = 0; if (!initOk) { initOk = 1; /* See CVE-2010-5252 */ #if (defined(_WIN32) && (!defined(_DEBUG))) { /* See KB 2389418 "If this parameter is an empty string (""), the call removes the current directory from the default DLL search order" */ BOOL (WINAPI*const k32_SetDllDirectoryA)(LPCSTR) = (BOOL (WINAPI *)(LPCSTR)) GetProcAddress(GetModuleHandle("kernel32.dll"), "SetDllDirectoryA"); if (k32_SetDllDirectoryA != NULL && !k32_SetDllDirectoryA("")) { /* Do no choke on NT or 98SE with KernelEx NT API (James Blough) */ const DWORD dwVersion = GetVersion(); const DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); const DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); if (dwMajorVersion >= 5) { assertf(!"SetDllDirectory failed"); } } } #endif /* Options availability */ sprintf(WHAT_is_available, "%s%s%s", V6_is_available ? "" : "-noV6", "", #if HTS_USEOPENSSL "" #else "-nossl" #endif ); } } void htspe_uninit(void) { } static void htspe_log(htsmoduleStruct * str, const char *msg) { const char *savename = str->filename; httrackp *opt = (httrackp *) str->opt; hts_log_print(opt, LOG_DEBUG, "(External module): parsing %s using module %s", savename, msg); } HTSEXT_API const char *hts_is_available(void) { return WHAT_is_available; } httrack-3.49.14/src/htsconcat.c0000644000175000017500000000657415230602340011745 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2014 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Subroutines */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include #include #include #include "httrack.h" #include "httrack-library.h" // concat, concatène deux chaines et renvoi le résultat // permet d'alléger grandement le code #undef concat HTSEXT_API char *concat(char *catbuff, size_t size, const char *a, const char *b) { size_t max = 0; RUNTIME_TIME_CHECK_SIZE(size); catbuff[0] = '\0'; if (a != NULL && a[0] != '\0') { max += strlen(a); if (max + 1 >= size) { return catbuff; } strcat(catbuff, a); } if (b != NULL && b[0] != '\0') { max += strlen(b); if (max + 1 >= size) { return catbuff; } strcat(catbuff, b); } return catbuff; } // conversion fichier / -> antislash static char *__fconv(char *a) { #if HTS_DOSNAME int i; for(i = 0; a[i] != 0; i++) if (a[i] == '/') // Unix-to-DOS style a[i] = '\\'; #endif return a; } #undef fconcat #undef concat HTSEXT_API char *fconcat(char *catbuff, size_t size, const char *a, const char *b) { RUNTIME_TIME_CHECK_SIZE(size); return __fconv(concat(catbuff, size, a, b)); } #undef fconv HTSEXT_API char *fconv(char *catbuff, size_t size, const char *a) { RUNTIME_TIME_CHECK_SIZE(size); return __fconv(concat(catbuff, size, a, "")); } /* / et \\ en / */ static char *__fslash(char *a) { int i; for(i = 0; a[i] != 0; i++) if (a[i] == '\\') // convertir a[i] = '/'; return a; } #undef fslash char *fslash(char *catbuff, size_t size, const char *a) { RUNTIME_TIME_CHECK_SIZE(size); return __fslash(concat(catbuff, size, a, NULL)); } // extension : html,gif.. HTSEXT_API const char *get_ext(char *catbuff, size_t size, const char *fil) { size_t i, last; RUNTIME_TIME_CHECK_SIZE(size); for(i = 0, last = 0 ; fil[i] != '\0' && fil[i] != '?' ; i++) { if (fil[i] == '.') { last = i + 1; } } if (last != 0 && i > last) { const size_t len = i - last; if (len < size) { catbuff[0] = '\0'; strncat(catbuff, &fil[last], size); return catbuff; } } return ""; } httrack-3.49.14/src/htswrap.c0000644000175000017500000000411615230602340011435 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* wrapper system (for shell */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htswrap.h" #include "htshash.h" #include "coucal.h" #include "htslib.h" HTSEXT_API int htswrap_init(void) { // LEGACY return 1; } HTSEXT_API int htswrap_free(void) { // LEGACY return 1; } HTSEXT_API int htswrap_add(httrackp * opt, const char *name, void *fct) { return hts_set_callback((t_hts_htmlcheck_callbacks *) opt->callbacks_fun, name, fct); } HTSEXT_API uintptr_t htswrap_read(httrackp * opt, const char *name) { return (uintptr_t) hts_get_callback((t_hts_htmlcheck_callbacks *) opt-> callbacks_fun, name); } httrack-3.49.14/src/htszlib.c0000644000175000017500000002200615230602340011422 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Unpacking subroutines using Jean-loup Gailly's Zlib */ /* for http compressed data */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE /* specific definitions */ #include "htsbase.h" #include "htscore.h" #include "htscodec.h" #include "htszlib.h" #if HTS_USEZLIB /* zlib */ /* #include #include "htszlib.h" */ /* Note: utf-8 */ int hts_zunpack(const char *filename, const char *newfile) { int ret = -1; if (filename != NULL && newfile != NULL && filename[0] && newfile[0]) { char catbuff[CATBUFF_SIZE]; FILE *const in = FOPEN(fconv(catbuff, sizeof(catbuff), filename), "rb"); if (in != NULL) { unsigned char BIGSTK inbuf[8192]; const LLint maxout = hts_codec_maxout(hts_codec_coded_size(in)); size_t navail = fread(inbuf, 1, sizeof(inbuf), in); /* gzip/zlib headers -> +32 windowBits; else raw deflate (RFC1951) */ const hts_boolean wrapped = (navail >= 2 && ((inbuf[0] == 0x1f && inbuf[1] == 0x8b) || ((inbuf[0] & 0x0f) == Z_DEFLATED && (((unsigned) inbuf[0] << 8 | inbuf[1]) % 31) == 0))); int attempt; /* not_deflate: the raw attempt hit a data error, so the body is in no deflate framing at all. env_error: local I/O or memory failure. */ hts_boolean not_deflate = HTS_FALSE; hts_boolean env_error = HTS_FALSE; hts_boolean bomb = HTS_FALSE; /* deflate is ambiguous; on failure retry with the other windowBits */ for (attempt = 0; attempt < 2 && ret < 0 && !bomb; attempt++) { const int windowBits = (attempt == 0 ? wrapped : !wrapped) ? (32 + MAX_WBITS) : -MAX_WBITS; FILE *fpout; z_stream strm; if (attempt > 0) { /* rewind input; reopening fpout "wb" discards the partial output */ if (fseek(in, 0, SEEK_SET) != 0) { env_error = HTS_TRUE; break; } navail = fread(inbuf, 1, sizeof(inbuf), in); } fpout = FOPEN(fconv(catbuff, sizeof(catbuff), newfile), "wb"); if (fpout == NULL) { env_error = HTS_TRUE; break; } memset(&strm, 0, sizeof(strm)); if (inflateInit2(&strm, windowBits) != Z_OK) { env_error = HTS_TRUE; fclose(fpout); break; } { hts_boolean ok = HTS_TRUE; LLint size = 0; int zerr = Z_OK; /* chunked inflate; first chunk in inbuf, single member */ do { strm.next_in = inbuf; strm.avail_in = (uInt) navail; do { unsigned char BIGSTK outbuf[8192]; size_t produced; strm.next_out = outbuf; strm.avail_out = sizeof(outbuf); zerr = inflate(&strm, Z_NO_FLUSH); if (zerr == Z_NEED_DICT || zerr == Z_DATA_ERROR || zerr == Z_MEM_ERROR || zerr == Z_STREAM_ERROR) { if (zerr == Z_MEM_ERROR || zerr == Z_STREAM_ERROR) env_error = HTS_TRUE; else if (windowBits < 0) not_deflate = HTS_TRUE; ok = HTS_FALSE; break; } produced = sizeof(outbuf) - strm.avail_out; size += (LLint) produced; if (size > maxout) { /* decompression bomb: no retry, no copy */ bomb = HTS_TRUE; ok = HTS_FALSE; break; } if (produced > 0 && fwrite(outbuf, 1, produced, fpout) != produced) { env_error = HTS_TRUE; ok = HTS_FALSE; break; } } while (strm.avail_out == 0); if (!ok || zerr == Z_STREAM_END) break; navail = fread(inbuf, 1, sizeof(inbuf), in); } while (navail > 0); if (ok && zerr == Z_STREAM_END) ret = (int) size; } inflateEnd(&strm); fclose(fpout); } /* keep a mislabeled identity body verbatim only when provably not deflate; truncation or a local failure must keep failing (#47) */ if (ret < 0 && !bomb && !wrapped && not_deflate && !env_error && !ferror(in)) { FILE *const fpout = FOPEN(fconv(catbuff, sizeof(catbuff), newfile), "wb"); if (fpout != NULL && fseek(in, 0, SEEK_SET) == 0) { int size = 0; while ((navail = fread(inbuf, 1, sizeof(inbuf), in)) > 0) { if (fwrite(inbuf, 1, navail, fpout) != navail) { size = -1; break; } size += (int) navail; } if (size >= 0 && !ferror(in)) ret = size; } if (fpout != NULL) fclose(fpout); } fclose(in); } } return ret; } size_t hts_zhead(const void *in, size_t in_len, void *out, size_t out_len) { z_stream zs; size_t n = 0; int err; memset(&zs, 0, sizeof(zs)); if (inflateInit2(&zs, 47) != Z_OK) /* 47: gzip or zlib, autodetected */ return 0; zs.next_in = (const Bytef *) in; zs.avail_in = (uInt) in_len; zs.next_out = (Bytef *) out; zs.avail_out = (uInt) out_len; err = inflate(&zs, Z_SYNC_FLUSH); if (err == Z_OK || err == Z_STREAM_END || err == Z_BUF_ERROR) n = out_len - zs.avail_out; inflateEnd(&zs); return n; } int hts_extract_meta(const char *path) { char catbuff[CATBUFF_SIZE]; unzFile zFile = unzOpen(fconcat(catbuff, sizeof(catbuff), path, "hts-cache/new.zip")); zipFile zFileOut = zipOpen(fconcat(catbuff, sizeof(catbuff), path, "hts-cache/meta.zip"), 0); if (zFile != NULL && zFileOut != NULL) { if (unzGoToFirstFile(zFile) == Z_OK) { zip_fileinfo fi; unz_file_info ufi; char BIGSTK filename[HTS_URLMAXSIZE * 4]; char BIGSTK comment[8192]; memset(comment, 0, sizeof(comment)); // for truncated reads memset(&fi, 0, sizeof(fi)); memset(&ufi, 0, sizeof(ufi)); do { int readSizeHeader; filename[0] = '\0'; comment[0] = '\0'; if (unzOpenCurrentFile(zFile) == Z_OK) { if ((readSizeHeader = unzGetLocalExtrafield(zFile, comment, sizeof(comment) - 2)) > 0 && unzGetCurrentFileInfo(zFile, &ufi, filename, sizeof(filename) - 2, NULL, 0, NULL, 0) == Z_OK) { comment[readSizeHeader] = '\0'; fi.dosDate = ufi.dosDate; fi.internal_fa = ufi.internal_fa; fi.external_fa = ufi.external_fa; if (zipOpenNewFileInZip(zFileOut, filename, &fi, NULL, 0, NULL, 0, NULL, /* comment */ Z_DEFLATED, Z_DEFAULT_COMPRESSION) == Z_OK) { if (zipWriteInFileInZip(zFileOut, comment, (int) strlen(comment)) != Z_OK) { } if (zipCloseFileInZip(zFileOut) != Z_OK) { } } } unzCloseCurrentFile(zFile); } } while(unzGoToNextFile(zFile) == Z_OK); } zipClose(zFileOut, "Meta-data extracted by HTTrack/" HTTRACK_VERSION); unzClose(zFile); return 1; } return 0; } const char *hts_get_zerror(int err) { switch (err) { case UNZ_OK: return "no error"; break; case UNZ_END_OF_LIST_OF_FILE: return "end of list of file"; break; case UNZ_ERRNO: return (const char *) strerror(errno); break; case UNZ_PARAMERROR: return "parameter error"; break; case UNZ_BADZIPFILE: return "bad zip file"; break; case UNZ_INTERNALERROR: return "internal error"; break; case UNZ_CRCERROR: return "crc error"; break; default: return "unknown error"; break; } } #endif httrack-3.49.14/src/htsproxy.c0000644000175000017500000004343515230602340011654 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Proxy tunneling (HTTP CONNECT, SOCKS5) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htscore.h" #include "htslib.h" #include "htsproxy.h" #include // Read a CRLF line from a non-blocking socket (waits up to timeout per recv). // Returns the line length (0 = empty), or -1 on timeout/EOF/error. static int proxy_getline(T_SOC soc, char *s, int max, int timeout) { int j = 0; for (;;) { unsigned char ch; int n; if (!check_readinput_t(soc, timeout)) return -1; // timed out waiting for data n = (int) recv(soc, &ch, 1, 0); if (n == 1) { if (ch == 13) // CR continue; if (ch == 10) // LF: end of line break; if (j >= max - 1) return -1; // line too long: bound the read against a hostile proxy s[j++] = (char) ch; } else if (n == 0) { return -1; // connection closed } else { #ifdef _WIN32 if (WSAGetLastError() == WSAEWOULDBLOCK) continue; #else if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) continue; #endif return -1; } } s[j] = '\0'; return j; } int http_proxy_tunnel(httrackp *opt, htsblk *retour, const char *adr, int timeout) { const T_SOC soc = retour->soc; const char *const host = jump_identification_const(adr); // host[:port] const char *const portsep = jump_toport_const(adr); // ":port" or NULL char BIGSTK authority[HTS_URLMAXSIZE * 2]; char BIGSTK req[HTS_URLMAXSIZE * 4 + 1100]; char line[1024]; int code; if (soc == INVALID_SOCKET) return 0; // CONNECT needs an explicit host:port; default :80 for http, :443 for https authority[0] = '\0'; if (portsep != NULL) strlcatbuff(authority, host, sizeof(authority)); // already host:port else { const int defport = (strncmp(adr, "https://", 8) == 0) ? 443 : 80; snprintf(authority, sizeof(authority), "%s:%d", host, defport); } // backstop: never let a stray CR/LF in the host smuggle a second line into // the CONNECT request (the host is already sanitized upstream) { const char *c; for (c = authority; *c != '\0'; c++) { if ((unsigned char) *c < ' ') { strcpybuff(retour->msg, "proxy CONNECT: invalid host"); return 0; } } } snprintf(req, sizeof(req), "CONNECT %s HTTP/1.0" H_CRLF "Host: %s" H_CRLF, authority, authority); // creds go on the CONNECT, not the tunneled origin request if (link_has_authorization(retour->req.proxy.name)) { const char *a = jump_identification_const(retour->req.proxy.name); const char *astart = jump_protocol_const(retour->req.proxy.name); char autorisation[1100]; char user_pass[256]; autorisation[0] = user_pass[0] = '\0'; strncatbuff(user_pass, astart, (int) (a - astart) - 1); strcpybuff(user_pass, unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), user_pass)); code64((unsigned char *) user_pass, (int) strlen(user_pass), (unsigned char *) autorisation, 0); strlcatbuff(req, "Proxy-Authorization: Basic ", sizeof(req)); strlcatbuff(req, autorisation, sizeof(req)); strlcatbuff(req, H_CRLF, sizeof(req)); } strlcatbuff(req, H_CRLF, sizeof(req)); // end of request headers // raw send(): sendc() would route to TLS when ssl is set (https tunnel) { const char *p = req; size_t remain = strlen(req); int stalls = 0; while (remain > 0) { const int n = (int) send(soc, p, (int) remain, 0); if (n > 0) { p += n; remain -= (size_t) n; stalls = 0; } else { #ifdef _WIN32 const int wouldblock = (WSAGetLastError() == WSAEWOULDBLOCK); #else const int wouldblock = (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR); #endif // don't spin forever on a fatal error or an unwritable socket if (!wouldblock || !check_writeinput_t(soc, timeout) || ++stalls > 100) { strcpybuff(retour->msg, "proxy CONNECT: write error"); return 0; } } } } // proxy status line: "HTTP/1.x ..." if (proxy_getline(soc, line, sizeof(line), timeout) < 0) { strcpybuff(retour->msg, "proxy CONNECT: no response"); return 0; } if (sscanf(line, "HTTP/%*d.%*d %d", &code) < 1) code = 0; if (code < 200 || code >= 300) { snprintf(retour->msg, sizeof(retour->msg), "proxy CONNECT refused: %s", strnotempty(line) ? line : "(no status)"); return 0; } // drain headers to the blank line; cap the count so a flooding proxy can't // stall the crawl { int headers = 0; for (;;) { const int n = proxy_getline(soc, line, sizeof(line), timeout); if (n < 0) { strcpybuff(retour->msg, "proxy CONNECT: truncated response"); return 0; } if (n == 0) break; // blank line: tunnel ready if (++headers > 64) { strcpybuff(retour->msg, "proxy CONNECT: too many response headers"); return 0; } } } return 1; } /* SOCKS5 client (RFC 1928, RFC 1929 auth), hostname mode only: the proxy resolves the origin name (remote DNS, curl's socks5h). The stream is the proxy socket, or a scripted buffer under -#test=socks5. */ #define SOCKS5_VERSION 0x05 #define SOCKS5_AUTH_VERSION 0x01 #define SOCKS5_METHOD_NONE 0x00 #define SOCKS5_METHOD_USERPASS 0x02 #define SOCKS5_METHOD_NOACCEPTABLE 0xFF #define SOCKS5_CMD_CONNECT 0x01 #define SOCKS5_ATYP_IPV4 0x01 #define SOCKS5_ATYP_DOMAIN 0x03 #define SOCKS5_ATYP_IPV6 0x04 #define SOCKS5_MAXFIELD 255 /* one length byte: host, user and password */ typedef struct socks5_stream { T_SOC soc; /* INVALID_SOCKET when scripted (self-test) */ int timeout; socks5_test_io *io; } socks5_stream; static int socks5_fail(char *msg, size_t msgsize, const char *text) { if (msgsize != 0) strlcpybuff(msg, text, msgsize); return 0; } /* Read exactly n bytes, or fail: SOCKS frames are not self-delimiting, so a short read would desync the stream shared with the origin traffic. */ static int socks5_read_n(socks5_stream *st, unsigned char *buf, size_t n) { size_t got = 0; int stalls = 0; if (st->soc == INVALID_SOCKET) { /* scripted */ socks5_test_io *const io = st->io; if (n > io->reply_len - io->consumed) return 0; memcpy(buf, io->reply + io->consumed, n); io->consumed += n; return 1; } while (got < n) { const int r = (int) recv(st->soc, (char *) buf + got, (int) (n - got), 0); if (r > 0) { got += (size_t) r; stalls = 0; } else if (r == 0) { return 0; // proxy closed mid-frame } else { #ifdef _WIN32 const int wouldblock = (WSAGetLastError() == WSAEWOULDBLOCK); #else const int wouldblock = (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR); #endif if (!wouldblock || !check_readinput_t(st->soc, st->timeout) || ++stalls > 100) return 0; } } return 1; } static int socks5_write_all(socks5_stream *st, const unsigned char *buf, size_t len) { size_t remain = len; int stalls = 0; if (st->soc == INVALID_SOCKET) { /* scripted */ socks5_test_io *const io = st->io; if (len > sizeof(io->sent) - io->sent_len) return 0; memcpy(io->sent + io->sent_len, buf, len); io->sent_len += len; return 1; } while (remain > 0) { // raw send: the socket is still plain here, sendc() would route to TLS const int n = (int) send(st->soc, (const char *) buf, (int) remain, 0); if (n > 0) { buf += n; remain -= (size_t) n; stalls = 0; } else { #ifdef _WIN32 const int wouldblock = (WSAGetLastError() == WSAEWOULDBLOCK); #else const int wouldblock = (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR); #endif if (!wouldblock || !check_writeinput_t(st->soc, st->timeout) || ++stalls > 100) return 0; } } return 1; } static const char *socks5_rep_message(unsigned char rep) { switch (rep) { case 0x01: return "general failure"; case 0x02: return "connection not allowed by ruleset"; case 0x03: return "network unreachable"; case 0x04: return "host unreachable"; case 0x05: return "connection refused"; case 0x06: return "TTL expired"; case 0x07: return "command not supported"; case 0x08: return "address type not supported"; default: return "unknown error"; } } /* The reply's BND.ADDR is variable-length: consume exactly what ATYP says, or the leftover bytes prepend to the first origin (or TLS) read. */ static int socks5_read_reply(socks5_stream *st, char *msg, size_t msgsize) { unsigned char head[4]; unsigned char addr[SOCKS5_MAXFIELD + 2]; size_t addrlen; if (!socks5_read_n(st, head, sizeof(head))) return socks5_fail(msg, msgsize, "SOCKS5: no reply from proxy"); if (head[0] != SOCKS5_VERSION) return socks5_fail(msg, msgsize, "SOCKS5: bad version in reply"); if (head[1] != 0x00) { snprintf(msg, msgsize, "SOCKS5 connect failed: %s", socks5_rep_message(head[1])); return 0; } switch (head[3]) { case SOCKS5_ATYP_IPV4: addrlen = 4; break; case SOCKS5_ATYP_IPV6: addrlen = 16; break; case SOCKS5_ATYP_DOMAIN: { unsigned char len; if (!socks5_read_n(st, &len, 1)) return socks5_fail(msg, msgsize, "SOCKS5: truncated reply"); addrlen = len; // <= 255, always fits addr[] break; } default: // unknown length: the stream cannot be resynchronized return socks5_fail(msg, msgsize, "SOCKS5: unknown address type in reply"); } if (addrlen != 0 && !socks5_read_n(st, addr, addrlen)) return socks5_fail(msg, msgsize, "SOCKS5: truncated reply address"); if (!socks5_read_n(st, addr, 2)) // BND.PORT, unused return socks5_fail(msg, msgsize, "SOCKS5: truncated reply port"); return 1; } static int socks5_negotiate(socks5_stream *st, const char *host, size_t hostlen, int port, const char *user, size_t userlen, const char *pass, size_t passlen, int want_auth, char *msg, size_t msgsize) { unsigned char frame[3 + SOCKS5_MAXFIELD + SOCKS5_MAXFIELD]; unsigned char rep[2]; /* greeting */ frame[0] = SOCKS5_VERSION; frame[1] = (unsigned char) (want_auth ? 2 : 1); frame[2] = SOCKS5_METHOD_NONE; frame[3] = SOCKS5_METHOD_USERPASS; if (!socks5_write_all(st, frame, (size_t) 2 + frame[1])) return socks5_fail(msg, msgsize, "SOCKS5: write error"); if (!socks5_read_n(st, rep, sizeof(rep))) return socks5_fail(msg, msgsize, "SOCKS5: no method reply from proxy"); if (rep[0] != SOCKS5_VERSION) return socks5_fail(msg, msgsize, "SOCKS5: bad version in method reply"); switch (rep[1]) { case SOCKS5_METHOD_NONE: break; case SOCKS5_METHOD_USERPASS: if (!want_auth) return socks5_fail(msg, msgsize, "SOCKS5: proxy requires authentication, none given"); /* RFC 1929 sub-negotiation; its version byte is 0x01, not 0x05 */ frame[0] = SOCKS5_AUTH_VERSION; frame[1] = (unsigned char) userlen; memcpy(frame + 2, user, userlen); frame[2 + userlen] = (unsigned char) passlen; memcpy(frame + 3 + userlen, pass, passlen); if (!socks5_write_all(st, frame, 3 + userlen + passlen)) return socks5_fail(msg, msgsize, "SOCKS5: write error"); if (!socks5_read_n(st, rep, sizeof(rep))) return socks5_fail(msg, msgsize, "SOCKS5: no authentication reply"); if (rep[1] != 0x00) return socks5_fail(msg, msgsize, "SOCKS5: authentication failed"); break; case SOCKS5_METHOD_NOACCEPTABLE: return socks5_fail( msg, msgsize, "SOCKS5: proxy accepts no authentication method we offer"); default: return socks5_fail(msg, msgsize, "SOCKS5: proxy selected an unknown method"); } /* CONNECT to the origin, by name */ frame[0] = SOCKS5_VERSION; frame[1] = SOCKS5_CMD_CONNECT; frame[2] = 0x00; // RSV frame[3] = SOCKS5_ATYP_DOMAIN; frame[4] = (unsigned char) hostlen; memcpy(frame + 5, host, hostlen); frame[5 + hostlen] = (unsigned char) (port >> 8); frame[6 + hostlen] = (unsigned char) (port & 0xFF); if (!socks5_write_all(st, frame, 7 + hostlen)) return socks5_fail(msg, msgsize, "SOCKS5: write error"); return socks5_read_reply(st, msg, msgsize); } /* Decode the proxy userinfo into the two RFC 1929 fields. Split on the first colon of the still-escaped string, so a %3A stays inside the username. */ static int socks5_credentials(httrackp *opt, const char *proxy_name, char *user, size_t user_size, size_t *userlen, char *pass, size_t pass_size, size_t *passlen, char *msg, size_t msgsize) { const char *const a = jump_identification_const(proxy_name); // past the '@' const char *const astart = jump_protocol_const(proxy_name); char userinfo[1024]; char *colon; if (a <= astart || (size_t) (a - astart) - 1 >= sizeof(userinfo)) return socks5_fail(msg, msgsize, "SOCKS5: credentials too long"); userinfo[0] = '\0'; strncatbuff(userinfo, astart, (int) (a - astart) - 1); colon = strchr(userinfo, ':'); if (colon != NULL) *colon++ = '\0'; strlcpybuff( user, unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), userinfo), user_size); strlcpybuff(pass, colon != NULL ? unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), colon) : "", pass_size); *userlen = strlen(user); *passlen = strlen(pass); // reject, never truncate: a clipped secret would authenticate as another one if (*userlen > SOCKS5_MAXFIELD || *passlen > SOCKS5_MAXFIELD) return socks5_fail(msg, msgsize, "SOCKS5: credentials too long"); if (*userlen == 0) return socks5_fail(msg, msgsize, "SOCKS5: empty proxy username"); return 1; } static int socks5_handshake_stream(httrackp *opt, socks5_stream *st, const char *adr, const char *proxy_name, int ssl, char *msg, size_t msgsize) { const char *const host = jump_identification_const(adr); const char *const portsep = jump_toport_const(adr); const size_t hostlen = portsep != NULL ? (size_t) (portsep - host) : strlen(host); // sized for the whole userinfo: decoding shrinks, so an over-long credential // lands intact and is rejected below rather than silently clipped char user[1024]; char pass[1024]; size_t userlen = 0, passlen = 0; int want_auth = 0; int port = ssl ? 443 : 80; size_t i; if (hostlen == 0 || hostlen > SOCKS5_MAXFIELD) return socks5_fail(msg, msgsize, "SOCKS5: invalid origin host"); if (host[0] == '[') // ATYP=domain cannot carry an IPv6 literal return socks5_fail(msg, msgsize, "SOCKS5: IPv6 literal origin is not supported"); for (i = 0; i < hostlen; i++) { if ((unsigned char) host[i] < ' ') return socks5_fail(msg, msgsize, "SOCKS5: invalid origin host"); } // the old range check ran after sscanf("%d") had wrapped a huge value into a // plausible port (#614). An empty "host:" stays refused here, unlike the // direct path, as it was before #614. if (portsep != NULL && !hts_parse_url_port(portsep + 1, &port)) return socks5_fail(msg, msgsize, "SOCKS5: invalid origin port"); if (link_has_authorization(proxy_name)) { if (!socks5_credentials(opt, proxy_name, user, sizeof(user), &userlen, pass, sizeof(pass), &passlen, msg, msgsize)) return 0; want_auth = 1; } return socks5_negotiate(st, host, hostlen, port, user, userlen, pass, passlen, want_auth, msg, msgsize); } int socks5_handshake(httrackp *opt, htsblk *retour, const char *adr, int timeout) { socks5_stream st; #if HTS_USEOPENSSL const int ssl = retour->ssl; #else const int ssl = 0; #endif if (retour->soc == INVALID_SOCKET) return 0; st.soc = retour->soc; st.timeout = timeout; st.io = NULL; return socks5_handshake_stream(opt, &st, adr, retour->req.proxy.name, ssl, retour->msg, sizeof(retour->msg)); } int socks5_handshake_scripted(httrackp *opt, const char *adr, const char *proxy_name, socks5_test_io *io) { socks5_stream st; st.soc = INVALID_SOCKET; st.timeout = 0; st.io = io; io->consumed = 0; io->sent_len = 0; io->msg[0] = '\0'; return socks5_handshake_stream(opt, &st, adr, proxy_name, 0, io->msg, sizeof(io->msg)); } httrack-3.49.14/src/htswarc.c0000644000175000017500000016174615230602340011435 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* HTTrack WARC/1.1 output writer (ISO 28500). See warc.h. The response record stores the body verbatim, as received: Content-Encoding kept, only the hop-by-hop Transfer-Encoding dropped, Content-Length rewritten to the stored length (like wget --warc / Heritrix). */ /* ------------------------------------------------------------ */ #define HTS_INTERNAL_BYTECODE #include "htswarc.h" #include "htscore.h" #include "htslib.h" #include "htstools.h" #include "htssafe.h" #include "htszlib.h" #include "coucal/coucal.h" #include #include #include #include #include #if HTS_USEOPENSSL #include #include #endif /* opt->state.warc value meaning "open failed once, do not retry". */ #define WARC_DISABLED ((void *) ~(uintptr_t) 0) struct warc_writer { FILE *f; httrackp *opt; /* kept for close-time logging (warc_wacz_package) */ int gz; /* 1: one gzip member per record; 0: raw */ uint64_t offset; /* running byte offset (member starts, for a future index) */ uint64_t counter; /* monotonic record counter */ uint64_t rng; /* PRNG state for the UUID fallback */ char info_id[64]; /* warcinfo WARC-Record-ID, referenced by every record */ coucal seen; /* base32 payload digest -> "uri\001date" (revisit dedup) */ /* --warc-max-size rotation: NAME-00000.warc.gz, -00001, ... (wget-style). */ uint64_t max_size; /* rotate once a segment reaches this; 0: single file */ char *seg_base; /* segment path without the .warc[.gz] suffix, or NULL */ const char *seg_ext; /* ".warc.gz" or ".warc" */ unsigned seg; /* current segment number */ char *info_fields; /* warcinfo body, re-emitted at each new segment */ /* --warc-cdx: accumulate one CDXJ line per response/revisit/resource record, sorted (LC_ALL=C) and written to .cdx at close. */ int cdx_on; /* --warc-cdx enabled */ char *cdx_path; /* .cdx output path, or NULL */ char *cur_seg; /* basename of the current segment file (CDXJ filename) */ char **cdx_lines; /* NUL-terminated CDXJ lines (no newline), owned */ size_t cdx_count; /* lines in use */ size_t cdx_cap; /* lines allocated */ /* --wacz: at crawl end, package the segment(s) + .cdx + a generated pages.jsonl into .wacz (WACZ 1.1.1). SHA-256 needs OpenSSL. */ int wacz_on; /* --wacz enabled (and OpenSSL present) */ char *base_path; /* resolved archive path minus .warc[.gz] suffix */ const char *base_ext; /* ".warc.gz" or ".warc" (static) */ char *arc_path; /* full single-file archive path (NULL under rotation) */ char **page_lines; /* one JSON page line per 200 text/html response, owned */ size_t page_count; size_t page_cap; char *main_url; /* first captured page URL (datapackage mainPageUrl) */ char *main_date; /* its WARC-Date (mainPageDate) */ }; const char *warc_truncated_reason(int code) { switch (code) { case WARC_TRUNC_LENGTH: return "length"; case WARC_TRUNC_TIME: return "time"; case WARC_TRUNC_DISCONNECT: return "disconnect"; default: return NULL; } } /* ---- growable byte buffer (overflow-safe, project allocators) ---- */ typedef struct { char *data; size_t len; size_t cap; } wbuf; static void wbuf_free(wbuf *b) { freet(b->data); b->len = b->cap = 0; } /* Append n bytes; returns 0 on success, -1 on OOM/overflow. */ static int wbuf_add(wbuf *b, const void *p, size_t n) { if (n > (size_t) -1 - b->len) return -1; if (b->len + n > b->cap) { size_t ncap = b->cap ? b->cap : 256; char *nd; while (ncap < b->len + n) { if (ncap > (size_t) -1 / 2) return -1; ncap *= 2; } nd = realloct(b->data, ncap); if (nd == NULL) return -1; b->data = nd; b->cap = ncap; } memcpy(b->data + b->len, p, n); b->len += n; return 0; } static int wbuf_puts(wbuf *b, const char *s) { return wbuf_add(b, s, strlen(s)); } static int wbuf_printf(wbuf *b, const char *fmt, ...) HTS_PRINTF_FUN(2, 3); static int wbuf_printf(wbuf *b, const char *fmt, ...) { char tmp[1024]; int n; va_list ap; va_start(ap, fmt); n = vsnprintf(tmp, sizeof(tmp), fmt, ap); va_end(ap); if (n < 0 || (size_t) n >= sizeof(tmp)) return -1; return wbuf_add(b, tmp, (size_t) n); } /* ---- gzip-per-record member writer (mirrors ae_write_packed) ---- */ typedef struct { warc_writer *w; z_stream strm; int active; /* deflate stream initialized */ } member; static int member_begin(member *m, warc_writer *w) { m->w = w; m->active = 0; if (w->gz) { memset(&m->strm, 0, sizeof(m->strm)); /* windowBits=31 => full RFC1952 gzip member */ if (deflateInit2(&m->strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) != Z_OK) return -1; m->active = 1; } return 0; } static int member_write(member *m, const void *p, size_t n) { if (!m->w->gz) return (n == 0 || fwrite(p, 1, n, m->w->f) == n) ? 0 : -1; m->strm.next_in = (const Bytef *) p; while (n > 0) { unsigned char out[8192]; size_t got; uInt chunk = (n > (uInt) -1) ? (uInt) -1 : (uInt) n; m->strm.avail_in = chunk; do { m->strm.next_out = out; m->strm.avail_out = sizeof(out); if (deflate(&m->strm, Z_NO_FLUSH) != Z_OK) return -1; got = sizeof(out) - m->strm.avail_out; if (got > 0 && fwrite(out, 1, got, m->w->f) != got) return -1; } while (m->strm.avail_out == 0); n -= chunk; } return 0; } static int member_end(member *m) { int rc = 0; if (m->active) { unsigned char out[8192]; int zerr; m->strm.avail_in = 0; do { m->strm.next_out = out; m->strm.avail_out = sizeof(out); zerr = deflate(&m->strm, Z_FINISH); { size_t got = sizeof(out) - m->strm.avail_out; if (got > 0 && fwrite(out, 1, got, m->w->f) != got) rc = -1; } } while (zerr == Z_OK); if (zerr != Z_STREAM_END) rc = -1; deflateEnd(&m->strm); m->active = 0; } return rc; } /* ---- SHA-1 + Base32 (digests are OpenSSL-only; omitted otherwise) ---- */ #if HTS_USEOPENSSL /* Streaming SHA-1 over the block (all regions) and the payload (body only). */ typedef struct { EVP_MD_CTX *block; EVP_MD_CTX *payload; } digester; static void base32_20(const unsigned char in[20], char out[33]) { static const char a[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; int i, o = 0; uint64_t buf = 0; int bits = 0; for (i = 0; i < 20; i++) { buf = (buf << 8) | in[i]; bits += 8; while (bits >= 5) { bits -= 5; out[o++] = a[(buf >> bits) & 0x1F]; } } out[o] = '\0'; /* 20 bytes => exactly 32 base32 chars, no padding */ } #endif /* Stream a block to a sink. When http_section, the HTTP header bytes (may be empty) plus their terminating CRLF are emitted first; the separator is bound to http_section, not to http_hdr being non-NULL, so an empty header still emits (and is counted in) the 2-byte separator (F3). The on-disk body is written as EXACTLY body_len octets — capped if the file grew, zero-padded if it shrank — so the declared Content-Length always equals the bytes written across every pass (F2). region 0=header, 1=body. Returns 0 on success. */ typedef int (*warc_sink)(void *ctx, int region, const void *p, size_t n); static int stream_body_pad(warc_sink sink, void *ctx, size_t remaining) { static const char zeros[4096] = {0}; while (remaining > 0) { size_t chunk = (remaining < sizeof(zeros)) ? remaining : sizeof(zeros); if (sink(ctx, 1, zeros, chunk) != 0) return -1; remaining -= chunk; } return 0; } static int stream_block(int http_section, const char *http_hdr, size_t http_hdr_len, int has_body, const char *body, size_t body_len, const char *body_path, warc_sink sink, void *ctx) { if (http_section) { if (http_hdr != NULL && http_hdr_len > 0 && sink(ctx, 0, http_hdr, http_hdr_len) != 0) return -1; if (sink(ctx, 0, "\r\n", 2) != 0) return -1; } if (has_body) { if (body != NULL) { if (body_len > 0 && sink(ctx, 1, body, body_len) != 0) return -1; } else if (body_path != NULL) { char catbuff[CATBUFF_SIZE]; size_t remaining = body_len; FILE *fp = FOPEN(fconv(catbuff, sizeof(catbuff), body_path), "rb"); if (fp == NULL) return -1; while (remaining > 0) { char b[32768]; size_t want = (remaining < sizeof(b)) ? remaining : sizeof(b); size_t nl = fread(b, 1, want, fp); if (nl == 0) break; /* short file: pad below so written == declared */ if (sink(ctx, 1, b, nl) != 0) { fclose(fp); return -1; } remaining -= nl; } fclose(fp); if (stream_body_pad(sink, ctx, remaining) != 0) return -1; } } return 0; } #if HTS_USEOPENSSL static int digest_sink(void *ctx, int region, const void *p, size_t n) { digester *d = (digester *) ctx; if (d->block != NULL && EVP_DigestUpdate(d->block, p, n) != 1) return -1; if (region == 1 && d->payload != NULL && EVP_DigestUpdate(d->payload, p, n) != 1) return -1; return 0; } #endif static int write_sink(void *ctx, int region, const void *p, size_t n) { (void) region; return member_write((member *) ctx, p, n); } /* Base32 SHA-1 of a transaction payload (body only), for revisit dedup. Returns 1 and fills out[33] on success, 0 without OpenSSL or on error. */ static int payload_digest_b32(const char *body, size_t body_len, const char *body_path, char out[33]) { #if HTS_USEOPENSSL digester d; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int mdlen = 0; int ok; d.block = NULL; d.payload = EVP_MD_CTX_new(); if (d.payload == NULL) return 0; if (EVP_DigestInit_ex(d.payload, EVP_sha1(), NULL) != 1) { EVP_MD_CTX_free(d.payload); return 0; } ok = stream_block(0, NULL, 0, 1, body, body_len, body_path, digest_sink, &d) == 0 && EVP_DigestFinal_ex(d.payload, md, &mdlen) == 1 && mdlen == 20; EVP_MD_CTX_free(d.payload); if (!ok) return 0; base32_20(md, out); return 1; #else (void) body; (void) body_len; (void) body_path; (void) out; return 0; #endif } /* ---- SHA-256 hex (WACZ digests; OpenSSL-only) ---- */ #if HTS_USEOPENSSL static void md32_to_hex(const unsigned char md[32], char out[65]) { static const char hx[] = "0123456789abcdef"; int i; for (i = 0; i < 32; i++) { out[i * 2] = hx[md[i] >> 4]; out[i * 2 + 1] = hx[md[i] & 0x0F]; } out[64] = '\0'; } /* Lowercase-hex SHA-256 of n bytes at p into out[65]. Returns 1 on success. */ static int sha256_hex_mem(const void *p, size_t n, char out[65]) { EVP_MD_CTX *c = EVP_MD_CTX_new(); unsigned char md[EVP_MAX_MD_SIZE]; unsigned int mdlen = 0; int ok; if (c == NULL) return 0; ok = EVP_DigestInit_ex(c, EVP_sha256(), NULL) == 1 && (n == 0 || EVP_DigestUpdate(c, p, n) == 1) && EVP_DigestFinal_ex(c, md, &mdlen) == 1 && mdlen == 32; EVP_MD_CTX_free(c); if (ok) md32_to_hex(md, out); return ok; } /* Lowercase-hex SHA-256 of the on-disk file at path into out[65]. */ static int sha256_hex_file(const char *path, char out[65]) { EVP_MD_CTX *c; FILE *fp; char catbuff[CATBUFF_SIZE]; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int mdlen = 0; int ok; fp = FOPEN(fconv(catbuff, sizeof(catbuff), path), "rb"); if (fp == NULL) return 0; c = EVP_MD_CTX_new(); if (c == NULL) { fclose(fp); return 0; } ok = EVP_DigestInit_ex(c, EVP_sha256(), NULL) == 1; while (ok) { unsigned char b[32768]; size_t nl = fread(b, 1, sizeof(b), fp); if (nl > 0 && EVP_DigestUpdate(c, b, nl) != 1) ok = 0; if (nl < sizeof(b)) break; } ok = ok && !ferror(fp) && EVP_DigestFinal_ex(c, md, &mdlen) == 1 && mdlen == 32; EVP_MD_CTX_free(c); fclose(fp); if (ok) md32_to_hex(md, out); return ok; } #endif /* ---- misc record helpers ---- */ static void warc_fill_random(warc_writer *w, unsigned char *b, size_t n) { size_t i; #if HTS_USEOPENSSL if (n <= (size_t) 0x7fffffff && RAND_bytes(b, (int) n) == 1) return; #endif for (i = 0; i < n; i++) { w->rng ^= w->rng << 13; w->rng ^= w->rng >> 7; w->rng ^= w->rng << 17; b[i] = (unsigned char) (w->rng >> 24); } } /* urn:uuid: v4-shaped record id (uniqueness within the run is what matters). */ static void warc_make_id(warc_writer *w, char out[64]) { unsigned char b[16]; w->counter++; warc_fill_random(w, b, sizeof(b)); b[6] = (unsigned char) ((b[6] & 0x0F) | 0x40); b[8] = (unsigned char) ((b[8] & 0x3F) | 0x80); snprintf(out, 64, "", b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]); } static void warc_now_iso8601(char out[32]) { time_t t = time(NULL); struct tm tmv; #if defined(_WIN32) struct tm *g = gmtime(&t); if (g != NULL) tmv = *g; else memset(&tmv, 0, sizeof(tmv)); #else if (gmtime_r(&t, &tmv) == NULL) memset(&tmv, 0, sizeof(tmv)); #endif strftime(out, 32, "%Y-%m-%dT%H:%M:%SZ", &tmv); } /* Case-insensitive "is this the header named name?" test, tolerating optional whitespace before the ':' (non-compliant "Name : value" is still matched). */ static int header_is(const char *line, size_t line_len, const char *name) { size_t nl = strlen(name), i; if (line_len < nl || strncasecmp(line, name, nl) != 0) return 0; for (i = nl; i < line_len && (line[i] == ' ' || line[i] == '\t'); i++) ; return i < line_len && line[i] == ':'; } /* Build the normalized HTTP header block from raw resp_hdr into out (no trailing CRLF terminator). Always drops the hop-by-hop Transfer-Encoding. When set_cl>=0 (a body is stored), drops the original Content-Length and appends "Content-Length: " (the stored, coded length) while keeping every Content-Encoding line verbatim: a faithful archive of what the server sent. Returns 0. */ static int normalize_http_headers(const char *resp_hdr, long long set_cl, wbuf *out) { const char *p = resp_hdr; int first = 1; if (resp_hdr == NULL) return -1; while (*p != '\0') { const char *eol = strchr(p, '\n'); size_t len = (eol != NULL) ? (size_t) (eol - p) : strlen(p); if (len > 0 && p[len - 1] == '\r') len--; /* strip CR; re-added as CRLF below */ if (len == 0) break; /* blank line: end of headers */ if (first) { first = 0; /* status line: keep verbatim */ } else if (header_is(p, len, "Transfer-Encoding")) { goto next; } else if (set_cl >= 0 && header_is(p, len, "Content-Length")) { goto next; } if (wbuf_add(out, p, len) != 0 || wbuf_add(out, "\r\n", 2) != 0) return -1; next: if (eol == NULL) break; p = eol + 1; } if (set_cl >= 0 && wbuf_printf(out, "Content-Length: %lld\r\n", set_cl) != 0) return -1; return 0; } /* ---- CDXJ index (--warc-cdx) ---- */ /* Duplicate the last path component (basename), or NULL on OOM. */ static char *path_basename_dup(const char *path) { const char *b = path, *p; for (p = path; *p != '\0'; p++) if (*p == '/' || *p == '\\') b = p + 1; return strdupt(b); } /* A host made only of digits and dots is an IPv4 literal (never reversed). */ static int surt_host_is_ip(const char *h, size_t n) { size_t i; int dots = 0; for (i = 0; i < n; i++) { if (h[i] == '.') dots++; else if (h[i] < '0' || h[i] > '9') return 0; } return dots > 0; } /* SURT-canonicalize url into out (no newline): scheme and userinfo dropped, host lowercased with a leading www[digits] label stripped and the scheme default port removed, labels reversed and comma-joined then ')', path+query appended verbatim (case preserved, fragment dropped). IPv4 and [IPv6] literals keep their host form. A non-default port is kept as ":port" before the ')'. Returns 0 on success. */ static int surt_canon(const char *url, wbuf *out) { const char *p, *scheme_end, *authend, *host, *hostsep, *port = NULL; size_t portlen = 0, hlen, i; int def_port = -1; int is_ipv6 = 0, is_ip = 0; char hostbuf[1024]; if (url == NULL) return -1; p = url; scheme_end = strstr(url, "://"); if (scheme_end != NULL) { size_t sl = (size_t) (scheme_end - url); if (sl == 4 && strncasecmp(url, "http", 4) == 0) def_port = 80; else if (sl == 5 && strncasecmp(url, "https", 5) == 0) def_port = 443; p = scheme_end + 3; } authend = p; while (*authend != '\0' && *authend != '/' && *authend != '?' && *authend != '#') authend++; { /* drop userinfo up to the last '@' inside the authority */ const char *q, *at = NULL; for (q = p; q < authend; q++) if (*q == '@') at = q; if (at != NULL) p = at + 1; } host = p; if (host < authend && host[0] == '[') { /* [IPv6] literal */ const char *rb = host; is_ipv6 = 1; while (rb < authend && *rb != ']') rb++; hostsep = (rb < authend) ? rb + 1 : authend; } else { const char *c = host; while (c < authend && *c != ':') c++; hostsep = c; } hlen = (size_t) (hostsep - host); if (hostsep < authend && *hostsep == ':') { port = hostsep + 1; portlen = (size_t) (authend - port); } if (hlen >= sizeof(hostbuf)) return -1; for (i = 0; i < hlen; i++) hostbuf[i] = (char) tolower((unsigned char) host[i]); hostbuf[hlen] = '\0'; if (!is_ipv6) is_ip = surt_host_is_ip(hostbuf, hlen); if (!is_ipv6 && !is_ip && hlen >= 4 && hostbuf[0] == 'w' && hostbuf[1] == 'w' && hostbuf[2] == 'w') { size_t k = 3; while (k < hlen && hostbuf[k] >= '0' && hostbuf[k] <= '9') k++; if (k < hlen && hostbuf[k] == '.') { memmove(hostbuf, hostbuf + k + 1, hlen - (k + 1)); hlen -= k + 1; hostbuf[hlen] = '\0'; } } if (is_ipv6 || is_ip) { if (wbuf_add(out, hostbuf, hlen) != 0) return -1; } else { /* reverse the dot-separated labels, comma-joined */ long idx; size_t seg_end = hlen; int first = 1; for (idx = (long) hlen; idx >= 0; idx--) { if (idx == 0 || hostbuf[idx - 1] == '.') { size_t lstart = (size_t) idx; size_t llen = seg_end - lstart; if (llen > 0) { if (!first && wbuf_add(out, ",", 1) != 0) return -1; if (wbuf_add(out, hostbuf + lstart, llen) != 0) return -1; first = 0; } seg_end = (idx > 0) ? (size_t) (idx - 1) : 0; } } } if (port != NULL && portlen > 0) { /* keep a non-default port */ int pv = 0, ok = 1; size_t k; for (k = 0; k < portlen; k++) { if (port[k] < '0' || port[k] > '9') { ok = 0; break; } pv = pv * 10 + (port[k] - '0'); } if (ok && pv != def_port && (wbuf_add(out, ":", 1) != 0 || wbuf_add(out, port, portlen) != 0)) return -1; } if (wbuf_add(out, ")", 1) != 0) return -1; { /* path + query, verbatim up to any fragment */ const char *frag = authend; while (*frag != '\0' && *frag != '#') frag++; if (wbuf_add(out, authend, (size_t) (frag - authend)) != 0) return -1; } return 0; } /* 14-digit YYYYMMDDhhmmss from a WARC-Date "YYYY-MM-DDThh:mm:ssZ" (digits * only). */ static void iso8601_to_cdx14(const char *iso, char out[15]) { int o = 0; const char *p; for (p = iso; *p != '\0' && o < 14; p++) if (*p >= '0' && *p <= '9') out[o++] = *p; while (o < 14) out[o++] = '0'; out[14] = '\0'; } /* Append s as a JSON string (quoted, with " \ and control chars escaped). */ static int cdx_json_str(wbuf *b, const char *s) { if (wbuf_add(b, "\"", 1) != 0) return -1; for (; *s != '\0'; s++) { unsigned char c = (unsigned char) *s; if (c == '"' || c == '\\') { char e[2] = {'\\', (char) c}; if (wbuf_add(b, e, 2) != 0) return -1; } else if (c < 0x20) { if (wbuf_printf(b, "\\u%04x", (unsigned) c) != 0) return -1; } else if (wbuf_add(b, s, 1) != 0) { return -1; } } return wbuf_add(b, "\"", 1); } /* Copy the media type of header "name" (up to ';'/space) from a raw HTTP header block into out; out is "" if absent. */ static void http_header_value(const char *hdr, const char *name, char *out, size_t outsz) { size_t nl = strlen(name); const char *p = hdr; out[0] = '\0'; if (hdr == NULL) return; while (*p != '\0') { const char *eol = strchr(p, '\n'); size_t len = (eol != NULL) ? (size_t) (eol - p) : strlen(p); if (len > 0 && p[len - 1] == '\r') len--; if (len == 0) break; /* end of headers */ if (len > nl && strncasecmp(p, name, nl) == 0 && p[nl] == ':') { const char *v = p + nl + 1; size_t vlen, k; while (v < p + len && (*v == ' ' || *v == '\t')) v++; vlen = (size_t) (p + len - v); for (k = 0; k < vlen; k++) if (v[k] == ';' || v[k] == ' ' || v[k] == '\t') { vlen = k; break; } if (vlen >= outsz) vlen = outsz - 1; memcpy(out, v, vlen); out[vlen] = '\0'; return; } if (eol == NULL) break; p = eol + 1; } } /* Take ownership of a CDXJ line; frees it and returns -1 on OOM. */ static int cdx_lines_add(warc_writer *w, char *line) { if (w->cdx_count == w->cdx_cap) { size_t ncap = w->cdx_cap ? w->cdx_cap * 2 : 64; char **n; if (ncap > (size_t) -1 / sizeof(char *)) { freet(line); return -1; } n = realloct(w->cdx_lines, ncap * sizeof(char *)); if (n == NULL) { freet(line); return -1; } w->cdx_lines = n; w->cdx_cap = ncap; } w->cdx_lines[w->cdx_count++] = line; return 0; } /* Build and stash one CDXJ line for a record. Best-effort: an OOM drops the line rather than failing the (already-written) record. */ static void warc_cdx_add(warc_writer *w, const char *target_uri, const char *date_iso, const char *status, const char *mime, const char *payload_digest, uint64_t offset, uint64_t length) { wbuf line; char ts[15]; memset(&line, 0, sizeof(line)); iso8601_to_cdx14(date_iso, ts); if (surt_canon(target_uri, &line) != 0 || wbuf_printf(&line, " %s {\"url\": ", ts) != 0 || cdx_json_str(&line, target_uri) != 0) goto fail; if (mime != NULL && mime[0] != '\0' && (wbuf_puts(&line, ", \"mime\": ") != 0 || cdx_json_str(&line, mime) != 0)) goto fail; if (status != NULL && status[0] != '\0' && (wbuf_puts(&line, ", \"status\": ") != 0 || cdx_json_str(&line, status) != 0)) goto fail; if (payload_digest != NULL && payload_digest[0] != '\0' && wbuf_printf(&line, ", \"digest\": \"sha1:%s\"", payload_digest) != 0) goto fail; if (wbuf_printf(&line, ", \"length\": \"%llu\", \"offset\": \"%llu\"", (unsigned long long) length, (unsigned long long) offset) != 0) goto fail; if (w->cur_seg != NULL && (wbuf_puts(&line, ", \"filename\": ") != 0 || cdx_json_str(&line, w->cur_seg) != 0)) goto fail; if (wbuf_puts(&line, "}") != 0 || wbuf_add(&line, "", 1) != 0) /* NUL */ goto fail; if (cdx_lines_add(w, line.data) == 0) return; /* ownership transferred */ return; /* cdx_lines_add already freed on failure */ fail: wbuf_free(&line); } /* LC_ALL=C (unsigned byte) order over whole lines; the searchable key " " is the line prefix, so this yields sorted CDXJ. */ static int cdx_cmp(const void *a, const void *b) { const unsigned char *x = *(const unsigned char *const *) a; const unsigned char *y = *(const unsigned char *const *) b; while (*x != '\0' && *x == *y) { x++; y++; } return (int) *x - (int) *y; } /* Sort and write the accumulated CDXJ lines to .cdx. */ static void warc_cdx_flush(warc_writer *w) { FILE *f; char catbuff[CATBUFF_SIZE]; size_t i; if (!w->cdx_on || w->cdx_path == NULL || w->cdx_count == 0) return; qsort(w->cdx_lines, w->cdx_count, sizeof(char *), cdx_cmp); f = FOPEN(fconv(catbuff, sizeof(catbuff), w->cdx_path), "wb"); if (f == NULL) return; for (i = 0; i < w->cdx_count; i++) { fputs(w->cdx_lines[i], f); fputc('\n', f); } fclose(f); } /* ---- WACZ pages + packaging (--wacz) ---- */ /* Record one pages.jsonl line for a top-level 200 text/html capture. First page also seeds datapackage mainPageUrl/mainPageDate. Best-effort. */ static void warc_page_add(warc_writer *w, const char *url, const char *date) { wbuf line; memset(&line, 0, sizeof(line)); if (wbuf_printf(&line, "{\"id\": \"p%llu\", \"url\": ", (unsigned long long) w->page_count) != 0 || cdx_json_str(&line, url) != 0 || wbuf_puts(&line, ", \"ts\": ") != 0 || cdx_json_str(&line, date) != 0 || wbuf_puts(&line, "}") != 0 || wbuf_add(&line, "", 1) != 0) { wbuf_free(&line); return; } if (w->page_count == w->page_cap) { size_t ncap = w->page_cap ? w->page_cap * 2 : 32; char **n; if (ncap > (size_t) -1 / sizeof(char *)) { wbuf_free(&line); return; } n = realloct(w->page_lines, ncap * sizeof(char *)); if (n == NULL) { wbuf_free(&line); return; } w->page_lines = n; w->page_cap = ncap; } w->page_lines[w->page_count++] = line.data; if (w->main_url == NULL) { w->main_url = strdupt(url); w->main_date = strdupt(date); } } #if HTS_USEOPENSSL /* WACZ requires every ZIP entry stored, not deflated (spec 1.1.1). */ static int wacz_open_store(zipFile zf, const char *name) { zip_fileinfo zi; memset(&zi, 0, sizeof(zi)); return zipOpenNewFileInZip(zf, name, &zi, NULL, 0, NULL, 0, NULL, 0 /*store*/, 0 /*level*/); } static int wacz_write_bytes(zipFile zf, const void *p, size_t n) { while (n > 0) { unsigned chunk = (n > 0x40000000u) ? 0x40000000u : (unsigned) n; if (zipWriteInFileInZip(zf, p, chunk) != ZIP_OK) return -1; p = (const char *) p + chunk; n -= chunk; } return 0; } /* Append one datapackage resource object; comma-prefixed unless first. */ static int wacz_resource_add(wbuf *res, int first, const char *name, const char *path, const char *hex, uint64_t bytes) { if (!first && wbuf_puts(res, ", ") != 0) return -1; if (wbuf_puts(res, "{\"name\": ") != 0 || cdx_json_str(res, name) != 0 || wbuf_puts(res, ", \"path\": ") != 0 || cdx_json_str(res, path) != 0 || wbuf_printf(res, ", \"hash\": \"sha256:%s\", \"bytes\": %llu}", hex, (unsigned long long) bytes) != 0) return -1; return 0; } /* Store an on-disk file as zipname, hash it, and list it in res. */ static int wacz_add_disk(zipFile zf, const char *zipname, const char *diskpath, const char *resname, wbuf *res, int first) { char hex[65]; char catbuff[CATBUFF_SIZE]; FILE *fp; uint64_t bytes = 0; int rc = -1; if (!sha256_hex_file(diskpath, hex)) return -1; if (wacz_open_store(zf, zipname) != ZIP_OK) return -1; fp = FOPEN(fconv(catbuff, sizeof(catbuff), diskpath), "rb"); if (fp != NULL) { rc = 0; for (;;) { char b[32768]; size_t nl = fread(b, 1, sizeof(b), fp); if (nl > 0 && wacz_write_bytes(zf, b, nl) != 0) { rc = -1; break; } bytes += nl; if (nl < sizeof(b)) { if (ferror(fp)) rc = -1; break; } } fclose(fp); } if (zipCloseFileInZip(zf) != ZIP_OK) rc = -1; if (rc == 0) rc = wacz_resource_add(res, first, resname, zipname, hex, bytes); return rc; } /* Store in-memory bytes as zipname; when res != NULL, hash and list them. */ static int wacz_add_mem(zipFile zf, const char *zipname, const void *data, size_t n, const char *resname, wbuf *res, int first) { char hex[65]; if (res != NULL && !sha256_hex_mem(data, n, hex)) return -1; if (wacz_open_store(zf, zipname) != ZIP_OK) return -1; if (wacz_write_bytes(zf, data, n) != 0) { zipCloseFileInZip(zf); return -1; } if (zipCloseFileInZip(zf) != ZIP_OK) return -1; if (res != NULL) return wacz_resource_add(res, first, resname, zipname, hex, n); return 0; } static zipFile wacz_zip_open(const char *path) { zlib_filefunc64_def ff; fill_fopen64_filefunc(&ff); return zipOpen2_64(path, 0 /*create*/, NULL, &ff); } /* Move src onto dst (UTF-8/Windows-safe); RENAME won't clobber on Windows, so fall back to unlink+rename. Returns 0 on success. */ static int wacz_rename_over(const char *src, const char *dst) { char cs[CATBUFF_SIZE], cd[CATBUFF_SIZE]; if (RENAME(fconv(cs, sizeof(cs), src), fconv(cd, sizeof(cd), dst)) == 0) return 0; (void) UNLINK(fconv(cd, sizeof(cd), dst)); return RENAME(fconv(cs, sizeof(cs), src), fconv(cd, sizeof(cd), dst)); } /* Package the segment(s) + .cdx + a generated pages.jsonl into .wacz at crawl end (the archive file(s) and .cdx are already closed on disk). */ static void warc_wacz_package(warc_writer *w) { char waczpath[HTS_URLMAXSIZE * 2]; char tmppath[HTS_URLMAXSIZE * 2]; char segpath[HTS_URLMAXSIZE * 2]; char catbuff[CATBUFF_SIZE]; zipFile zf; wbuf pages, resources, dp, digest; char *seg_name; char dp_hex[65]; char created[32]; unsigned s, nseg; int err = 0, first = 1; size_t i; if (w->base_path == NULL || w->cdx_path == NULL) return; snprintf(waczpath, sizeof(waczpath), "%s.wacz", w->base_path); snprintf(tmppath, sizeof(tmppath), "%s.wacz.tmp", w->base_path); /* Build into a temp; only full success replaces .wacz, so a zero-record re-run can't destroy a good archive (#522). */ zf = wacz_zip_open(fconv(catbuff, sizeof(catbuff), tmppath)); if (zf == NULL) { hts_log_print(w->opt, LOG_WARNING, "WACZ: could not create %s", tmppath); return; } memset(&resources, 0, sizeof(resources)); /* archive/.warc.gz for every segment (single file, or 0..seg). */ nseg = (w->max_size > 0) ? w->seg + 1 : 1; for (s = 0; s < nseg && !err; s++) { char zipname[HTS_URLMAXSIZE]; if (w->max_size > 0) snprintf(segpath, sizeof(segpath), "%s-%05u%s", w->base_path, s, w->base_ext); else strlcpybuff(segpath, w->arc_path != NULL ? w->arc_path : w->base_path, sizeof(segpath)); seg_name = path_basename_dup(segpath); if (seg_name == NULL) { err = 1; break; } snprintf(zipname, sizeof(zipname), "archive/%s", seg_name); if (wacz_add_disk(zf, zipname, segpath, seg_name, &resources, first) != 0) err = 1; freet(seg_name); first = 0; } /* indexes/index.cdx */ if (!err && wacz_add_disk(zf, "indexes/index.cdx", w->cdx_path, "index.cdx", &resources, first) != 0) err = 1; first = 0; /* pages/pages.jsonl: header line + one line per captured page. */ memset(&pages, 0, sizeof(pages)); if (!err && wbuf_puts(&pages, "{\"format\": \"json-pages-1.0\", \"id\": \"pages\", " "\"title\": \"All Pages\"}\n") != 0) err = 1; for (i = 0; i < w->page_count && !err; i++) if (wbuf_puts(&pages, w->page_lines[i]) != 0 || wbuf_add(&pages, "\n", 1) != 0) err = 1; if (!err && wacz_add_mem(zf, "pages/pages.jsonl", pages.data, pages.len, "pages.jsonl", &resources, first) != 0) err = 1; wbuf_free(&pages); /* datapackage.json listing every stored file with its sha256 + size. */ warc_now_iso8601(created); memset(&dp, 0, sizeof(dp)); if (!err && (wbuf_printf(&dp, "{\"profile\": \"data-package\", \"wacz_version\": " "\"1.1.1\", \"software\": \"HTTrack/%s\", \"created\": ", HTTRACK_VERSION) != 0 || cdx_json_str(&dp, created) != 0)) err = 1; if (!err && w->main_url != NULL && (wbuf_puts(&dp, ", \"mainPageUrl\": ") != 0 || cdx_json_str(&dp, w->main_url) != 0 || wbuf_puts(&dp, ", \"mainPageDate\": ") != 0 || cdx_json_str(&dp, w->main_date != NULL ? w->main_date : created) != 0)) err = 1; if (!err && (wbuf_puts(&dp, ", \"resources\": [") != 0 || wbuf_add(&dp, resources.data, resources.len) != 0 || wbuf_puts(&dp, "]}") != 0)) err = 1; if (!err && wacz_add_mem(zf, "datapackage.json", dp.data, dp.len, NULL, NULL, 0) != 0) err = 1; /* datapackage-digest.json chains the integrity of datapackage.json. */ memset(&digest, 0, sizeof(digest)); if (!err && sha256_hex_mem(dp.data, dp.len, dp_hex)) { if (wbuf_printf(&digest, "{\"path\": \"datapackage.json\", \"hash\": \"sha256:%s\"}", dp_hex) != 0 || wacz_add_mem(zf, "datapackage-digest.json", digest.data, digest.len, NULL, NULL, 0) != 0) err = 1; } else { err = 1; } wbuf_free(&digest); wbuf_free(&dp); wbuf_free(&resources); zipClose(zf, NULL); if (err) { (void) UNLINK(fconv(catbuff, sizeof(catbuff), tmppath)); hts_log_print(w->opt, LOG_WARNING, "WACZ: packaging failed, kept existing %s untouched", waczpath); } else if (wacz_rename_over(tmppath, waczpath) != 0) { (void) UNLINK(fconv(catbuff, sizeof(catbuff), tmppath)); hts_log_print(w->opt, LOG_WARNING | LOG_ERRNO, "WACZ: could not finalize %s", waczpath); } } #endif /* Close the current segment and open the next; writes its warcinfo. */ static int warc_rotate(warc_writer *w); /* Emit one full WARC record. When http_section, the block carries an HTTP header block (http_hdr, possibly empty) + a CRLF separator; body follows when has_body. block_len is derived here (single source of truth: separator and payload are counted exactly as stream_block emits them), so a declared Content-Length can never desync from the written bytes. The payload digest (body-only) is passed in when already known. truncated is a WARC-Truncated reason token or NULL. On success the record id is copied to out_id (may be NULL). */ static int warc_emit(warc_writer *w, const char *type, const char *content_type, const char *target_uri, const char *ip, const char *concurrent_to, const char *refers_uri, const char *refers_date, const char *profile, const char *payload_digest, const char *truncated, const char *cdx_status, const char *cdx_mime, int http_section, const char *http_hdr, size_t http_hdr_len, int has_body, const char *body, size_t body_len, const char *body_path, char out_id[64]) { wbuf hdr; member m; char id[64], date[32]; size_t sep = http_section ? 2 : 0; size_t payload = has_body ? body_len : 0; size_t block_len; int rc = -1; #if HTS_USEOPENSSL digester d; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int mdlen = 0; char block_b32[33]; int have_block_digest = 0; #endif /* Rotate to the next segment before this record when the current one is full; never split a record, and never rotate a warcinfo (it opens a segment). */ if (w->max_size > 0 && w->seg_base != NULL && w->offset >= w->max_size && strcmp(type, "warcinfo") != 0) { if (warc_rotate(w) != 0) return -1; } /* F4: overflow-safe block length; http_hdr_len+sep is provably small. */ if (payload > (size_t) -1 - http_hdr_len - sep) return -1; block_len = http_hdr_len + sep + payload; memset(&hdr, 0, sizeof(hdr)); warc_make_id(w, id); warc_now_iso8601(date); #if HTS_USEOPENSSL /* Block digest over the whole block, in one streaming pass. */ d.block = EVP_MD_CTX_new(); d.payload = NULL; if (d.block != NULL && EVP_DigestInit_ex(d.block, EVP_sha1(), NULL) == 1 && stream_block(http_section, http_hdr, http_hdr_len, has_body, body, body_len, body_path, digest_sink, &d) == 0 && EVP_DigestFinal_ex(d.block, md, &mdlen) == 1 && mdlen == 20) { base32_20(md, block_b32); have_block_digest = 1; } if (d.block != NULL) EVP_MD_CTX_free(d.block); #endif if (wbuf_puts(&hdr, "WARC/1.1\r\n") != 0 || wbuf_printf(&hdr, "WARC-Type: %s\r\n", type) != 0 || wbuf_printf(&hdr, "WARC-Record-ID: %s\r\n", id) != 0 || wbuf_printf(&hdr, "WARC-Date: %s\r\n", date) != 0) goto done; if (content_type != NULL && wbuf_printf(&hdr, "Content-Type: %s\r\n", content_type) != 0) goto done; if (wbuf_printf(&hdr, "Content-Length: %llu\r\n", (unsigned long long) block_len) != 0) goto done; if (w->info_id[0] != '\0' && strcmp(type, "warcinfo") != 0 && wbuf_printf(&hdr, "WARC-Warcinfo-ID: %s\r\n", w->info_id) != 0) goto done; if (target_uri != NULL && target_uri[0] != '\0' && wbuf_printf(&hdr, "WARC-Target-URI: %s\r\n", target_uri) != 0) goto done; if (ip != NULL && ip[0] != '\0' && wbuf_printf(&hdr, "WARC-IP-Address: %s\r\n", ip) != 0) goto done; if (concurrent_to != NULL && concurrent_to[0] != '\0' && wbuf_printf(&hdr, "WARC-Concurrent-To: %s\r\n", concurrent_to) != 0) goto done; if (profile != NULL && wbuf_printf(&hdr, "WARC-Profile: %s\r\n", profile) != 0) goto done; if (refers_uri != NULL && refers_uri[0] != '\0' && wbuf_printf(&hdr, "WARC-Refers-To-Target-URI: %s\r\n", refers_uri) != 0) goto done; if (refers_date != NULL && refers_date[0] != '\0' && wbuf_printf(&hdr, "WARC-Refers-To-Date: %s\r\n", refers_date) != 0) goto done; #if HTS_USEOPENSSL if (have_block_digest && wbuf_printf(&hdr, "WARC-Block-Digest: sha1:%s\r\n", block_b32) != 0) goto done; #endif if (payload_digest != NULL && payload_digest[0] != '\0' && wbuf_printf(&hdr, "WARC-Payload-Digest: sha1:%s\r\n", payload_digest) != 0) goto done; if (truncated != NULL && wbuf_printf(&hdr, "WARC-Truncated: %s\r\n", truncated) != 0) goto done; if (wbuf_puts(&hdr, "\r\n") != 0) goto done; if (member_begin(&m, w) != 0) goto done; { /* member start (before writing): CDXJ offset for this record */ uint64_t rec_offset = w->offset; if (member_write(&m, hdr.data, hdr.len) != 0 || stream_block(http_section, http_hdr, http_hdr_len, has_body, body, body_len, body_path, write_sink, &m) != 0 || member_write(&m, "\r\n\r\n", 4) != 0) { member_end(&m); goto done; } if (member_end(&m) != 0) goto done; { long pos = ftell(w->f); if (pos >= 0) w->offset = (uint64_t) pos; } /* Index response/revisit/resource records only (not warcinfo/request). */ if (w->cdx_on && target_uri != NULL && target_uri[0] != '\0' && (strcmp(type, "response") == 0 || strcmp(type, "revisit") == 0 || strcmp(type, "resource") == 0)) warc_cdx_add(w, target_uri, date, cdx_status, cdx_mime, payload_digest, rec_offset, w->offset - rec_offset); /* WACZ pages: top-level 200 text/html captures. */ if (w->wacz_on && target_uri != NULL && target_uri[0] != '\0' && strcmp(type, "response") == 0 && cdx_status != NULL && strcmp(cdx_status, "200") == 0 && cdx_mime != NULL && strncasecmp(cdx_mime, "text/html", 9) == 0) warc_page_add(w, target_uri, date); } if (out_id != NULL) strlcpybuff(out_id, id, 64); rc = 0; done: wbuf_free(&hdr); return rc; } /* ---- segment rotation (--warc-max-size) ---- */ /* Emit the warcinfo that heads a segment; sets w->info_id for its records. */ static int warc_write_warcinfo_record(warc_writer *w) { w->info_id[0] = '\0'; /* warcinfo itself carries no WARC-Warcinfo-ID */ return warc_emit( w, "warcinfo", "application/warc-fields", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 1, w->info_fields, w->info_fields != NULL ? strlen(w->info_fields) : 0, NULL, w->info_id); } static int warc_rotate(warc_writer *w) { char namebuf[HTS_URLMAXSIZE * 2]; char catbuff[CATBUFF_SIZE]; if (w->f != NULL) { fclose(w->f); w->f = NULL; } w->seg++; snprintf(namebuf, sizeof(namebuf), "%s-%05u%s", w->seg_base, w->seg, w->seg_ext); w->f = FOPEN(fconv(catbuff, sizeof(catbuff), namebuf), "wb"); if (w->f == NULL) return -1; w->offset = 0; if (w->cdx_on) { freet(w->cur_seg); w->cur_seg = path_basename_dup(namebuf); } return warc_write_warcinfo_record(w); } /* ---- request stash (engine hooks) ---- */ void warc_stash_request(htsblk *r, const char *reqhdr) { if (r == NULL) return; freet(r->warc_reqhdr); if (reqhdr != NULL) r->warc_reqhdr = strdupt(reqhdr); } void warc_stash_response(htsblk *r, const char *resphdr) { if (r == NULL) return; freet(r->warc_resphdr); if (resphdr != NULL) r->warc_resphdr = strdupt(resphdr); } void warc_free_request(htsblk *r) { if (r != NULL) { freet(r->warc_reqhdr); freet(r->warc_resphdr); if (r->warc_rawpath != NULL) { (void) UNLINK(r->warc_rawpath); /* owns the verbatim spool file */ freet(r->warc_rawpath); r->warc_rawpath = NULL; } } } void warc_adopt_rawspool(htsblk *r, const char *tmpfile_path) { if (r != NULL) { LLint rawsize; freet(r->warc_rawpath); r->warc_rawpath = NULL; r->warc_rawsize = 0; if (strnotempty(tmpfile_path) && (rawsize = fsize_utf8(tmpfile_path)) > 0 && (r->warc_rawpath = strdupt(tmpfile_path)) != NULL) { r->warc_rawsize = rawsize; } } } /* ---- open / close ---- */ warc_writer *warc_open(httrackp *opt, const char *path) { warc_writer *w; char namebuf[HTS_URLMAXSIZE * 2]; char catbuff[CATBUFF_SIZE]; wbuf info; const char *robots; size_t plen; if (path == NULL) return NULL; /* --warc with no name: /httrack-.warc.gz */ if (strcmp(path, WARC_AUTONAME) == 0) { char ts[32]; time_t t = time(NULL); struct tm tmv; #if defined(_WIN32) struct tm *g = gmtime(&t); if (g != NULL) tmv = *g; else memset(&tmv, 0, sizeof(tmv)); #else if (gmtime_r(&t, &tmv) == NULL) memset(&tmv, 0, sizeof(tmv)); #endif strftime(ts, sizeof(ts), "%Y%m%d%H%M%S", &tmv); snprintf(catbuff, sizeof(catbuff), "httrack-%s.warc.gz", ts); path = fconcat(namebuf, sizeof(namebuf), StringBuff(opt->path_html), catbuff); } else { /* --warc-file NAME: append .warc.gz unless already a .warc/.warc.gz name; place bare basenames under the output directory (like the auto name). */ size_t l = strlen(path); int has_warc = (l >= 5 && strcasecmp(path + l - 5, ".warc") == 0); int has_gz = (l >= 3 && strcasecmp(path + l - 3, ".gz") == 0); char named[HTS_URLMAXSIZE]; if (has_warc || has_gz) strlcpybuff(named, path, sizeof(named)); else snprintf(named, sizeof(named), "%s.warc.gz", path); if (strchr(named, '/') == NULL && strchr(named, '\\') == NULL) { path = fconcat(namebuf, sizeof(namebuf), StringBuff(opt->path_html), named); } else { strlcpybuff(namebuf, named, sizeof(namebuf)); path = namebuf; } } w = calloct(1, sizeof(*w)); if (w == NULL) return NULL; w->opt = opt; plen = strlen(path); w->gz = (plen >= 3 && strcasecmp(path + plen - 3, ".gz") == 0); w->rng = (uint64_t) time(NULL) ^ ((uint64_t) (uintptr_t) w << 16) ^ 0x9e3779b97f4a7c15ULL; w->seen = coucal_new(0); if (w->seen != NULL) coucal_value_is_malloc(w->seen, 1); w->max_size = (opt->warc_max_size > 0) ? (uint64_t) opt->warc_max_size : 0; /* Build the warcinfo body once; each segment re-emits it. */ robots = (opt->robots == HTS_ROBOTS_NEVER) ? "ignore" : "obey"; memset(&info, 0, sizeof(info)); if (wbuf_printf(&info, "software: HTTrack/%s (+https://www.httrack.com/)\r\n" "format: WARC file version 1.1\r\n" "conformsTo: http://iipc.github.io/warc-specifications/" "specifications/warc-format/warc-1.1/\r\n" "robots: %s\r\n", HTTRACK_VERSION, robots) != 0 || (StringNotEmpty(opt->path_html) && wbuf_printf(&info, "isPartOf: %s\r\n", StringBuff(opt->path_html)) != 0) || wbuf_add(&info, "", 1) != 0) { /* NUL-terminate for info_fields */ wbuf_free(&info); warc_close(w); return NULL; } w->info_fields = strdupt(info.data); wbuf_free(&info); if (w->info_fields == NULL) { warc_close(w); return NULL; } /* --warc-cdx: .cdx next to the resolved archive path (pre-rotation). */ if (opt->warc_cdx) { size_t l = strlen(path); size_t baselen = l; if (l >= 8 && strcasecmp(path + l - 8, ".warc.gz") == 0) { baselen = l - 8; w->base_ext = ".warc.gz"; } else if (l >= 5 && strcasecmp(path + l - 5, ".warc") == 0) { baselen = l - 5; w->base_ext = ".warc"; } else { w->base_ext = w->gz ? ".warc.gz" : ".warc"; } w->cdx_on = 1; w->cdx_path = malloct(baselen + 5); /* ".cdx" + NUL */ w->base_path = malloct(baselen + 1); if (w->cdx_path == NULL || w->base_path == NULL) { warc_close(w); return NULL; } memcpy(w->cdx_path, path, baselen); memcpy(w->cdx_path + baselen, ".cdx", 5); memcpy(w->base_path, path, baselen); w->base_path[baselen] = '\0'; } /* --wacz packages archive+cdx+pages at close; SHA-256 needs OpenSSL. */ if (opt->warc_wacz) { #if HTS_USEOPENSSL w->wacz_on = 1; #else hts_log_print(opt, LOG_WARNING, "WACZ requires an OpenSSL-enabled build for SHA-256 digests; " "--wacz disabled (WARC and CDXJ still written)"); #endif } /* Rotation on: the first segment is -00000 (wget-style); split the resolved path into base + suffix so later segments reuse the base. */ if (w->max_size > 0) { size_t l = strlen(path); size_t baselen; if (l >= 8 && strcasecmp(path + l - 8, ".warc.gz") == 0) { baselen = l - 8; w->seg_ext = ".warc.gz"; } else if (l >= 5 && strcasecmp(path + l - 5, ".warc") == 0) { baselen = l - 5; w->seg_ext = ".warc"; } else { baselen = l; w->seg_ext = w->gz ? ".warc.gz" : ".warc"; } w->seg_base = malloct(baselen + 1); if (w->seg_base == NULL) { warc_close(w); return NULL; } memcpy(w->seg_base, path, baselen); w->seg_base[baselen] = '\0'; w->seg = 0; snprintf(namebuf, sizeof(namebuf), "%s-%05u%s", w->seg_base, w->seg, w->seg_ext); path = namebuf; } w->f = FOPEN(fconv(catbuff, sizeof(catbuff), path), "wb"); if (w->f == NULL) { warc_close(w); return NULL; } if (w->cdx_on) w->cur_seg = path_basename_dup(path); if (w->wacz_on && w->max_size == 0) w->arc_path = strdupt(path); /* single-file: package this exact path */ if (warc_write_warcinfo_record(w) != 0) { warc_close(w); return NULL; } return w; } void warc_close(warc_writer *w) { size_t i; if (w == NULL) return; warc_cdx_flush(w); /* sort + write .cdx before tearing down */ if (w->f != NULL) fclose(w->f); w->f = NULL; #if HTS_USEOPENSSL if (w->wacz_on) /* package once the segment(s) + .cdx are closed on disk */ warc_wacz_package(w); #endif if (w->seen != NULL) coucal_delete(&w->seen); for (i = 0; i < w->cdx_count; i++) freet(w->cdx_lines[i]); freet(w->cdx_lines); freet(w->cdx_path); for (i = 0; i < w->page_count; i++) freet(w->page_lines[i]); freet(w->page_lines); freet(w->base_path); freet(w->arc_path); freet(w->main_url); freet(w->main_date); freet(w->cur_seg); freet(w->seg_base); freet(w->info_fields); freet(w); } int warc_surt(const char *url, char *out, size_t outsz) { wbuf b; int rc = -1; memset(&b, 0, sizeof(b)); if (surt_canon(url, &b) == 0 && wbuf_add(&b, "", 1) == 0 && b.len <= outsz) { strlcpybuff(out, b.data, outsz); rc = 0; } wbuf_free(&b); return rc; } void warc_close_opt(httrackp *opt) { if (opt->state.warc != NULL && opt->state.warc != WARC_DISABLED) { warc_close((warc_writer *) opt->state.warc); } opt->state.warc = NULL; } /* ---- one transaction ---- */ int warc_write_transaction(warc_writer *w, const char *target_uri, const char *ip, const char *req_hdr, const char *resp_hdr, const char *body, size_t body_len, const char *body_path, int statuscode, int is_update_unchanged, int truncated) { wbuf http; char resp_id[64]; char pdig[33]; int have_pdig; int is_revisit = 0; const char *profile = NULL; const char *refers_uri = NULL; const char *refers_date = NULL; char refers_buf[HTS_URLMAXSIZE * 2 + 64]; int has_payload; int emit_body; int rc = -1; char statusbuf[16]; char mimebuf[256]; if (resp_hdr == NULL) return -1; /* CDXJ status/mime (from the caller's status and the response Content-Type). */ snprintf(statusbuf, sizeof(statusbuf), "%d", statuscode); http_header_value(resp_hdr, "Content-Type", mimebuf, sizeof(mimebuf)); /* A payload exists (for digesting) unless this is a bodyless 304. */ has_payload = (body_len > 0 && (body != NULL || body_path != NULL) && !is_update_unchanged); /* Payload digest drives identical-payload-digest dedup (OpenSSL only). */ have_pdig = has_payload ? payload_digest_b32(body, body_len, body_path, pdig) : 0; if (is_update_unchanged) { is_revisit = 1; profile = "http://netpreserve.org/warc/1.1/revisit/server-not-modified"; } else if (have_pdig && w->seen != NULL) { void *prev = NULL; if (coucal_read_pvoid(w->seen, pdig, &prev) && prev != NULL) { char *slot = (char *) prev; char *sep = strchr(slot, '\001'); is_revisit = 1; profile = "http://netpreserve.org/warc/1.1/revisit/identical-payload-digest"; if (sep != NULL) { size_t n = (size_t) (sep - slot); if (n < sizeof(refers_buf)) { memcpy(refers_buf, slot, n); refers_buf[n] = '\0'; refers_uri = refers_buf; refers_date = sep + 1; } } } } /* Both revisit kinds (server-304 and identical-payload-digest) are bodyless; only a full response carries the payload (F1). */ emit_body = has_payload && !is_revisit; /* Full response rewrites Content-Length and keeps Content-Encoding verbatim (see normalize_http_headers); a revisit keeps the original headers. */ memset(&http, 0, sizeof(http)); if (normalize_http_headers(resp_hdr, emit_body ? (long long) body_len : -1, &http) != 0) { wbuf_free(&http); return -1; } /* Response first: its id links the request via WARC-Concurrent-To. A revisit is a deliberate dedup, not a truncation, so tag WARC-Truncated only on a full (body-carrying) response. */ resp_id[0] = '\0'; if (warc_emit(w, is_revisit ? "revisit" : "response", "application/http;msgtype=response", target_uri, ip, NULL, refers_uri, refers_date, profile, have_pdig ? pdig : NULL, emit_body ? warc_truncated_reason(truncated) : NULL, statusbuf, mimebuf, 1, http.data, http.len, emit_body, body, body_len, body_path, resp_id) != 0) { wbuf_free(&http); return -1; } wbuf_free(&http); if (req_hdr != NULL && req_hdr[0] != '\0') { size_t rlen = strlen(req_hdr); if (warc_emit(w, "request", "application/http;msgtype=request", target_uri, NULL, resp_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 1, req_hdr, rlen, NULL, NULL) != 0) return -1; } /* Record this payload for later identical-payload-digest revisits. */ if (!is_revisit && have_pdig && w->seen != NULL && target_uri != NULL) { char date[32]; char *slot; size_t need; warc_now_iso8601(date); need = strlen(target_uri) + 1 + strlen(date) + 1; slot = malloct(need); if (slot != NULL) { snprintf(slot, need, "%s\001%s", target_uri, date); if (coucal_write_pvoid(w->seen, pdig, slot) == 0) { /* replaced an existing entry: coucal freed the old value */ } } } (void) statuscode; rc = 0; return rc; } /* ---- one non-HTTP capture ---- */ int warc_write_resource(warc_writer *w, const char *target_uri, const char *ip, const char *content_type, const char *body, size_t body_len, const char *body_path, int truncated) { char pdig[33]; int has_body = (body_len > 0 && (body != NULL || body_path != NULL)); int have_pdig = has_body ? payload_digest_b32(body, body_len, body_path, pdig) : 0; /* resource: the block is the raw payload, its own MIME is the record's Content-Type, and there is no HTTP request/response envelope. */ return warc_emit(w, "resource", (content_type != NULL && content_type[0] != '\0') ? content_type : "application/octet-stream", target_uri, ip, NULL, NULL, NULL, NULL, have_pdig ? pdig : NULL, warc_truncated_reason(truncated), NULL, content_type, 0, NULL, 0, has_body, body, body_len, body_path, NULL); } /* ---- engine emit hook ---- */ void warc_write_backtransaction(httrackp *opt, lien_back *back) { warc_writer *w; char uri[HTS_URLMAXSIZE * 4 + 16]; char ip[128]; const char *body; size_t body_len; const char *body_path; const char *resp_hdr; char synth[512]; int is_unchanged; int is_ftp; if (opt->state.warc == WARC_DISABLED) return; if (opt->state.warc == NULL) { w = warc_open(opt, StringBuff(opt->warc_file)); if (w == NULL) { opt->state.warc = WARC_DISABLED; hts_log_print(opt, LOG_ERROR, "could not create WARC archive %s", StringBuff(opt->warc_file)); return; } opt->state.warc = w; } w = (warc_writer *) opt->state.warc; if (back->r.statuscode <= 0) return; is_ftp = strfield(back->url_adr, "ftp://") != 0; snprintf(uri, sizeof(uri), "%s%s%s", link_has_authority(back->url_adr) ? "" : "http://", back->url_adr, back->url_fil); ip[0] = '\0'; SOCaddr_inetntoa(ip, sizeof(ip), back->r.address); if (!back->r.is_write) { body = back->r.adr; body_len = (back->r.size > 0) ? (size_t) back->r.size : 0; body_path = NULL; } else { LLint fs; body = NULL; body_path = back->url_sav; fs = fsize_utf8(body_path); /* F4: an on-disk body past size_t (LLP32/ILP32, >4GB) would wrap the length used as Content-Length; drop the body rather than desync the record. */ if (fs > 0 && (uint64_t) fs <= (uint64_t) (size_t) -1) body_len = (size_t) fs; else body_len = 0; } /* FTP has no HTTP envelope: one resource record carrying the payload. */ if (is_ftp) { warc_write_resource(w, uri, ip, back->r.contenttype, body, body_len, body_path, back->r.warc_truncated); return; } /* Prefer the spooled coded body so the record stores it verbatim; the digest is then over the coded payload. */ if (back->r.warc_rawpath != NULL && back->r.warc_rawsize > 0 && (uint64_t) back->r.warc_rawsize <= (uint64_t) (size_t) -1) { body = NULL; body_path = back->r.warc_rawpath; body_len = (size_t) back->r.warc_rawsize; } is_unchanged = (back->r.notmodified && opt->is_update) ? 1 : 0; /* Prefer the stashed raw headers; synthesize a minimal status line for the header-less (HTTP/0.9-style) responses that never carried a header block. */ resp_hdr = back->r.warc_resphdr; if (resp_hdr == NULL) { snprintf(synth, sizeof(synth), "HTTP/1.1 %d %s\r\nContent-Type: %s\r\n\r\n", back->r.statuscode, back->r.msg[0] ? back->r.msg : "OK", back->r.contenttype[0] ? back->r.contenttype : "application/octet-stream"); resp_hdr = synth; } warc_write_transaction(w, uri, ip, back->r.warc_reqhdr, resp_hdr, body, body_len, body_path, back->r.statuscode, is_unchanged, back->r.warc_truncated); } httrack-3.49.14/src/htscodec.c0000644000175000017500000002543615230602340011551 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: HTTP content codings (gzip/deflate, brotli, zstd) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsbase.h" #include "htscore.h" #include "htscodec.h" #include "htszlib.h" #if HTS_USEBROTLI #include #endif #if HTS_USEZSTD #include /* 8 MB, the window an HTTP zstd decoder must honor (RFC 9659); libzstd defaults to 128 MB. */ #define HTS_ZSTD_WINDOWLOG_MAX 23 #endif /* Decoded-size budget, bounding a bomb: brotli and zstd reach a million to one. Deflate cannot pass 1032x, so it only meets this at the 2 GiB ceiling. */ #define HTS_CODEC_MAX_RATIO 4096 #define HTS_CODEC_MIN_MAXOUT (1024 * 1024) LLint hts_codec_maxout(LLint in_size) { LLint maxout; if (in_size <= 0 || in_size > INT_MAX / HTS_CODEC_MAX_RATIO) maxout = INT_MAX; else maxout = in_size * HTS_CODEC_MAX_RATIO; if (maxout < HTS_CODEC_MIN_MAXOUT) maxout = HTS_CODEC_MIN_MAXOUT; return maxout; } hts_codec hts_codec_parse(const char *encoding) { if (encoding == NULL || encoding[0] == '\0' || strfield2(encoding, "identity")) return HTS_CODEC_IDENTITY; if (strfield2(encoding, "gzip") || strfield2(encoding, "x-gzip") || strfield2(encoding, "deflate") || strfield2(encoding, "x-deflate")) return HTS_USEZLIB ? HTS_CODEC_DEFLATE : HTS_CODEC_UNSUPPORTED; if (strfield2(encoding, "br")) return HTS_USEBROTLI ? HTS_CODEC_BROTLI : HTS_CODEC_UNSUPPORTED; if (strfield2(encoding, "zstd")) return HTS_USEZSTD ? HTS_CODEC_ZSTD : HTS_CODEC_UNSUPPORTED; if (strfield2(encoding, "compress") || strfield2(encoding, "x-compress")) return HTS_CODEC_UNSUPPORTED; /* LZW: never advertised, no decoder here */ /* Not a coding at all: broken servers put charsets and the like here, and the plain body they sent must survive it. */ return HTS_CODEC_IDENTITY; } #if HTS_USEBROTLI #define HTS_AE_BROTLI ", br" #else #define HTS_AE_BROTLI "" #endif #if HTS_USEZSTD #define HTS_AE_ZSTD ", zstd" #else #define HTS_AE_ZSTD "" #endif const char *hts_acceptencoding(hts_boolean compressible, hts_boolean secure) { if (!compressible) return "identity"; #if HTS_USEZLIB /* br and zstd over TLS only, as browsers do: a cleartext intermediary that rewrites a coding it can not read would corrupt the mirror. */ if (secure) return "gzip, deflate" HTS_AE_BROTLI HTS_AE_ZSTD ", identity;q=0.9"; return "gzip, deflate, identity;q=0.9"; #else (void) secure; return "identity"; #endif } hts_boolean hts_codec_is_archive_ext(hts_codec codec, const char *ext) { if (ext == NULL || ext[0] == '\0') return HTS_FALSE; switch (codec) { case HTS_CODEC_DEFLATE: return strfield2(ext, "gz") || strfield2(ext, "tgz") ? HTS_TRUE : HTS_FALSE; case HTS_CODEC_BROTLI: return strfield2(ext, "br") ? HTS_TRUE : HTS_FALSE; case HTS_CODEC_ZSTD: return strfield2(ext, "zst") || strfield2(ext, "tzst") ? HTS_TRUE : HTS_FALSE; default: return HTS_FALSE; } } #if HTS_USEBROTLI || HTS_USEZSTD /* Append produced bytes to out under the decoded-size budget, advancing *total. HTS_FALSE on a short write or once the budget is exceeded (a bomb); the over-budget bytes are never written. */ static hts_boolean codec_sink(FILE *out, const void *buf, size_t produced, LLint *total, LLint maxout) { if (produced == 0) return HTS_TRUE; *total += (LLint) produced; if (*total > maxout) return HTS_FALSE; return fwrite(buf, 1, produced, out) == produced ? HTS_TRUE : HTS_FALSE; } #endif #if HTS_USEBROTLI static int codec_unpack_brotli(FILE *in, FILE *out, LLint maxout) { BrotliDecoderState *const state = BrotliDecoderCreateInstance(NULL, NULL, NULL); hts_boolean ok = HTS_TRUE, done = HTS_FALSE; LLint total = 0; if (state == NULL) return -1; while (ok && !done) { unsigned char BIGSTK inbuf[8192]; size_t avail_in = fread(inbuf, 1, sizeof(inbuf), in); const uint8_t *next_in = inbuf; if (avail_in == 0) break; /* EOF; a stream still hungry for input is truncated */ for (;;) { unsigned char BIGSTK outbuf[8192]; uint8_t *next_out = outbuf; size_t avail_out = sizeof(outbuf); size_t produced; BrotliDecoderResult res; res = BrotliDecoderDecompressStream(state, &avail_in, &next_in, &avail_out, &next_out, NULL); produced = sizeof(outbuf) - avail_out; if (!codec_sink(out, outbuf, produced, &total, maxout)) { ok = HTS_FALSE; break; } if (res == BROTLI_DECODER_RESULT_ERROR) { ok = HTS_FALSE; break; } if (res == BROTLI_DECODER_RESULT_SUCCESS) { done = HTS_TRUE; break; } if (res == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT) break; } if (ferror(in)) ok = HTS_FALSE; } BrotliDecoderDestroyInstance(state); return (ok && done && !ferror(in)) ? (int) total : -1; } static size_t codec_head_brotli(const void *in, size_t in_len, void *out, size_t out_len) { BrotliDecoderState *const state = BrotliDecoderCreateInstance(NULL, NULL, NULL); const uint8_t *next_in = (const uint8_t *) in; uint8_t *next_out = (uint8_t *) out; size_t avail_in = in_len, avail_out = out_len; BrotliDecoderResult res; if (state == NULL) return 0; res = BrotliDecoderDecompressStream(state, &avail_in, &next_in, &avail_out, &next_out, NULL); BrotliDecoderDestroyInstance(state); return (res != BROTLI_DECODER_RESULT_ERROR) ? out_len - avail_out : 0; } #endif #if HTS_USEZSTD static int codec_unpack_zstd(FILE *in, FILE *out, LLint maxout) { ZSTD_DStream *const zds = ZSTD_createDStream(); hts_boolean ok = HTS_TRUE, eof = HTS_FALSE; size_t zret = 1; /* 0 once a frame is fully flushed */ LLint total = 0; if (zds == NULL) return -1; if (ZSTD_isError(ZSTD_DCtx_setParameter(zds, ZSTD_d_windowLogMax, HTS_ZSTD_WINDOWLOG_MAX))) { ZSTD_freeDStream(zds); return -1; } while (ok && !eof) { unsigned char BIGSTK inbuf[8192]; ZSTD_inBuffer input; input.src = inbuf; input.size = fread(inbuf, 1, sizeof(inbuf), in); input.pos = 0; if (input.size == 0) { eof = HTS_TRUE; break; } while (input.pos < input.size) { unsigned char BIGSTK outbuf[8192]; ZSTD_outBuffer output; output.dst = outbuf; output.size = sizeof(outbuf); output.pos = 0; zret = ZSTD_decompressStream(zds, &output, &input); if (ZSTD_isError(zret)) { ok = HTS_FALSE; break; } if (!codec_sink(out, outbuf, output.pos, &total, maxout)) { ok = HTS_FALSE; break; } } if (ferror(in)) ok = HTS_FALSE; } ZSTD_freeDStream(zds); /* zret != 0 at EOF: the last frame never completed */ return (ok && zret == 0 && !ferror(in)) ? (int) total : -1; } static size_t codec_head_zstd(const void *in, size_t in_len, void *out, size_t out_len) { ZSTD_DStream *const zds = ZSTD_createDStream(); ZSTD_inBuffer input; ZSTD_outBuffer output; size_t zret; if (zds == NULL) return 0; if (ZSTD_isError(ZSTD_DCtx_setParameter(zds, ZSTD_d_windowLogMax, HTS_ZSTD_WINDOWLOG_MAX))) { ZSTD_freeDStream(zds); return 0; } input.src = in; input.size = in_len; input.pos = 0; output.dst = out; output.size = out_len; output.pos = 0; zret = ZSTD_decompressStream(zds, &output, &input); ZSTD_freeDStream(zds); return ZSTD_isError(zret) ? 0 : output.pos; } #endif LLint hts_codec_coded_size(FILE *in) { long size; if (fseek(in, 0, SEEK_END) != 0) return -1; size = ftell(in); if (size < 0 || fseek(in, 0, SEEK_SET) != 0) return -1; return (LLint) size; } int hts_codec_unpack(hts_codec codec, const char *filename, const char *newfile) { if (filename == NULL || newfile == NULL || !filename[0] || !newfile[0]) return -1; switch (codec) { case HTS_CODEC_DEFLATE: #if HTS_USEZLIB return hts_zunpack(filename, newfile); #else return -1; #endif case HTS_CODEC_BROTLI: case HTS_CODEC_ZSTD: break; default: /* IDENTITY never reaches the unpacker; UNSUPPORTED must fail */ return -1; } #if HTS_USEBROTLI || HTS_USEZSTD { char catbuff[CATBUFF_SIZE]; FILE *out, *in = FOPEN(fconv(catbuff, sizeof(catbuff), filename), "rb"); LLint maxout; int ret = -1; if (in == NULL) return -1; maxout = hts_codec_maxout(hts_codec_coded_size(in)); out = FOPEN(fconv(catbuff, sizeof(catbuff), newfile), "wb"); if (out == NULL) { fclose(in); return -1; } #if HTS_USEBROTLI if (codec == HTS_CODEC_BROTLI) ret = codec_unpack_brotli(in, out, maxout); #endif #if HTS_USEZSTD if (codec == HTS_CODEC_ZSTD) ret = codec_unpack_zstd(in, out, maxout); #endif fclose(out); fclose(in); return ret; } #else return -1; #endif } size_t hts_codec_head(hts_codec codec, const void *in, size_t in_len, void *out, size_t out_len) { if (in == NULL || in_len == 0 || out == NULL || out_len == 0) return 0; switch (codec) { #if HTS_USEZLIB case HTS_CODEC_DEFLATE: return hts_zhead(in, in_len, out, out_len); #endif #if HTS_USEBROTLI case HTS_CODEC_BROTLI: return codec_head_brotli(in, in_len, out, out_len); #endif #if HTS_USEZSTD case HTS_CODEC_ZSTD: return codec_head_zstd(in, in_len, out, out_len); #endif default: return 0; } } httrack-3.49.14/src/htsmd5.c0000644000175000017500000000673215230602340011157 /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsmd5.c subroutines: */ /* generate a md5 hash */ /* */ /* Written March 1993 by Branko Lankester */ /* Modified June 1993 by Colin Plumb for altered md5.c. */ /* Modified October 1995 by Erik Troan for RPM */ /* Modified 2000 by Xavier Roche for domd5mem */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include #include #include #include #include "htsmd5.h" #include "md5.h" #include "htssafe.h" int domd5mem(const char *buf, size_t len, char *digest, int asAscii) { int endian = 1; unsigned char bindigest[16]; struct MD5Context ctx; MD5Init(&ctx, *((char *) &endian)); MD5Update(&ctx, (const unsigned char *) buf, (unsigned int) len); MD5Final(bindigest, &ctx); if (!asAscii) { memcpy(digest, bindigest, 16); } else { sprintf(digest, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" "%02x%02x%02x%02x%02x", bindigest[0], bindigest[1], bindigest[2], bindigest[3], bindigest[4], bindigest[5], bindigest[6], bindigest[7], bindigest[8], bindigest[9], bindigest[10], bindigest[11], bindigest[12], bindigest[13], bindigest[14], bindigest[15]); } return 0; } unsigned long int md5sum32(const char *buff) { union { char md5digest[16]; unsigned long int hash; } u; domd5mem(buff, strlen(buff), u.md5digest, 0); return u.hash; } void md5selftest(void) { static const char str1[] = "The quick brown fox jumps over the lazy dog\n"; static const char str1m[] = "37c4b87edffc5d198ff5a185cee7ee09"; static const char str2[] = "Hello"; static const char str2m[] = "8b1a9953c4611296a827abf8c47804d7"; char digest[64]; #define MDCHECK(VAR, VARMD) do { \ memset(digest, 0xCC, sizeof(digest)); \ domd5mem(VAR, sizeof(VAR) - 1, digest, 1); \ if (strcmp(digest, VARMD) != 0) { \ fprintf(stderr, \ "error: md5 selftest failed: '%s' => '%s' (!= '%s')\n", \ VAR, digest, VARMD); \ assert(! "md5 selftest failed"); \ } \ } while(0) MDCHECK(str1, str1m); MDCHECK(str2, str2m); #undef MDCHECK fprintf(stderr, "md5 selftest succeeded\n"); } httrack-3.49.14/src/htsbauth.c0000644000175000017500000003646615230602340011604 /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* basic authentication: password storage */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsbauth.h" /* specific definitions */ #include "htsglobal.h" #include "htslib.h" #include "htscore.h" #ifdef _WIN32 #include "htscharset.h" /* hts_pathToUCS2, hts_convertUCS2StringToUTF8 */ #endif /* END specific definitions */ // gestion des cookie // ajoute, dans l'ordre // !=0 : erreur int cookie_add(t_cookie * cookie, const char *cook_name, const char *cook_value, const char *domain, const char *path) { char buffer[8192]; char *a = cookie->data; char *insert; char cook[16384]; // effacer éventuel cookie en double cookie_del(cookie, cook_name, domain, path); if (strlen(cook_value) > 1024) return -1; // trop long if (strlen(cook_name) > 256) return -1; // trop long if (strlen(domain) > 256) return -1; // trop long if (strlen(path) > 256) return -1; // trop long if (strlen(cookie->data) + strlen(cook_value) + strlen(cook_name) + strlen(domain) + strlen(path) + 256 > cookie->max_len) return -1; // impossible d'ajouter insert = a; // insérer ici while(*a) { if (strlen(cookie_get(buffer, a, 2)) < strlen(path)) // long. path (le + long est prioritaire) a = cookie->data + strlen(cookie->data); // fin else { a = strchr(a, '\n'); // prochain champ if (a == NULL) a = cookie->data + strlen(cookie->data); // fin else a++; while(*a == '\n') a++; insert = a; // insérer ici } } // construction du cookie strcpybuff(cook, domain); strcatbuff(cook, "\t"); strcatbuff(cook, "TRUE"); strcatbuff(cook, "\t"); strcatbuff(cook, path); strcatbuff(cook, "\t"); strcatbuff(cook, "FALSE"); strcatbuff(cook, "\t"); strcatbuff(cook, "1999999999"); strcatbuff(cook, "\t"); strcatbuff(cook, cook_name); strcatbuff(cook, "\t"); strcatbuff(cook, cook_value); strcatbuff(cook, "\n"); if (!((strlen(cookie->data) + strlen(cook)) < cookie->max_len)) return -1; // impossible d'ajouter cookie_insert(insert, cookie->max_len - (size_t) (insert - cookie->data), cook); #if DEBUG_COOK printf("add_new cookie: name=\"%s\" value=\"%s\" domain=\"%s\" path=\"%s\"\n", cook_name, cook_value, domain, path); #endif return 0; } // effacer cookie si existe int cookie_del(t_cookie * cookie, const char *cook_name, const char *domain, const char *path) { char *a, *b; b = cookie_find(cookie->data, cook_name, domain, path); if (b) { a = cookie_nextfield(b); cookie_delete(b, cookie->max_len - (size_t) (b - cookie->data), a - b); #if DEBUG_COOK printf("deleted old cookie: %s %s %s\n", cook_name, domain, path); #endif } return 0; } // Matches wildcard cookie domains that start with a dot // chk_dom: the domain stored in the cookie (potentially wildcard). // domain: query domain static int cookie_cmp_wildcard_domain(const char *chk_dom, const char *domain) { const size_t n = strlen(chk_dom); const size_t m = strlen(domain); const size_t l = n < m ? n : m; int i; for (i = (int) l - 1; i >= 0; i--) { if (chk_dom[n - i - 1] != domain[m - i - 1]) { return 1; } } if (m < n && chk_dom[0] == '.') { return 0; } else if (m != n) { return 1; } return 0; } // rechercher cookie à partir de la position s (par exemple s=cookie.data) // renvoie pointeur sur ligne, ou NULL si introuvable // path est aligné à droite et cook_name peut être vide (chercher alors tout cookie) // .doubleclick.net TRUE / FALSE 1999999999 id A char *cookie_find(char *s, const char *cook_name, const char *domain, const char *path) { char buffer[8192]; char *a = s; while(*a) { int t; if (strnotempty(cook_name) == 0) t = 1; // accepter par défaut else t = (strcmp(cookie_get(buffer, a, 5), cook_name) == 0); // tester si même nom if (t) { // même nom ou nom qualconque // const char *chk_dom = cookie_get(buffer, a, 0); // domaine concerné par le cookie if ((strlen(chk_dom) <= strlen(domain) && strcmp(chk_dom, domain + strlen(domain) - strlen(chk_dom)) == 0) || !cookie_cmp_wildcard_domain(chk_dom, domain)) { // même domaine // const char *chk_path = cookie_get(buffer, a, 2); // chemin concerné par le cookie if (strlen(chk_path) <= strlen(path)) { if (strncmp(path, chk_path, strlen(chk_path)) == 0) { // même chemin return a; } } } } a = cookie_nextfield(a); } return NULL; } // renvoie prochain champ char *cookie_nextfield(char *a) { char *b = a; a = strchr(a, '\n'); // prochain champ if (a == NULL) a = b + strlen(b); // fin else a++; while(*a == '\n') a++; return a; } // Read cookies.txt (+ copied IE cookies *@*.txt on Windows); !=0 on error. int cookie_load(t_cookie * cookie, const char *fpath, const char *name) { char catbuff[CATBUFF_SIZE]; char buffer[8192]; // Merge any IE cookies first #ifdef _WIN32 { WIN32_FIND_DATAW find; HANDLE h; char pth[HTS_URLMAXSIZE]; LPWSTR wpth; strcpybuff(pth, fpath); strcatbuff(pth, "*@*.txt"); // Wide glob so a long or non-ASCII IE-cookie folder is scanned (#133). wpth = hts_pathToUCS2(pth); h = wpth != NULL ? FindFirstFileW(wpth, &find) : INVALID_HANDLE_VALUE; freet(wpth); if (h != INVALID_HANDLE_VALUE) { do { if (!(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (!(find.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) { // cFileName is UTF-16: convert to UTF-8 so the mirror path and // file wrappers stay UTF-8 (no CP_ACP mojibake). char *u = hts_convertUCS2StringToUTF8(find.cFileName, -1); FILE *fp = u != NULL ? FOPEN(fconcat(catbuff, sizeof(catbuff), fpath, u), "rb") : NULL; if (fp) { char cook_name[256]; char cook_value[1000]; char domainpathpath[512]; char dummy[512]; lien_adrfil af; // host + path (/) int cookie_merged = 0; // Read all cookies while(!feof(fp)) { cook_name[0] = cook_value[0] = domainpathpath[0] = dummy[0] = af.adr[0] = af.fil[0] = '\0'; linput(fp, cook_name, 250); if (!feof(fp)) { linput(fp, cook_value, 250); if (!feof(fp)) { int i; linput(fp, domainpathpath, 500); /* Read 6 other useless values */ for(i = 0; !feof(fp) && i < 6; i++) { linput(fp, dummy, 500); } if (strnotempty(cook_name) && strnotempty(cook_value) && strnotempty(domainpathpath)) { if (ident_url_absolute(domainpathpath, &af) >= 0) { cookie_add(cookie, cook_name, cook_value, af.adr, af.fil); cookie_merged = 1; } } } } } fclose(fp); if (cookie_merged) UNLINK(fconcat(catbuff, sizeof(catbuff), fpath, u)); } // if fp freet(u); } } while (FindNextFileW(h, &find)); FindClose(h); } } #endif // Ensuite, cookies.txt { FILE *fp = FOPEN(fconcat(catbuff, sizeof(catbuff), fpath, name), "rb"); if (fp) { char BIGSTK line[8192]; while((!feof(fp)) && (((int) strlen(cookie->data)) < cookie->max_len)) { rawlinput(fp, line, 8100); if (strnotempty(line)) { if (strlen(line) < 8000) { if (line[0] != '#') { char domain[256]; // domaine cookie (.netscape.com) char path[256]; // chemin (/) char cook_name[1024]; // nom cookie (MYCOOK) char BIGSTK cook_value[8192]; // valeur (ID=toto,S=1234) strcpybuff(domain, cookie_get(buffer, line, 0)); // host strcpybuff(path, cookie_get(buffer, line, 2)); // path strcpybuff(cook_name, cookie_get(buffer, line, 5)); // name strcpybuff(cook_value, cookie_get(buffer, line, 6)); // value #if DEBUG_COOK printf("%s\n", line); #endif cookie_add(cookie, cook_name, cook_value, domain, path); } } } } fclose(fp); return 0; } } return -1; } /* Write cookies.txt; returns 0 on success. The jar holds live session cookies, so keep it owner-only on Unix (Windows inherits folder ACLs). */ int cookie_save(t_cookie * cookie, const char *name) { char catbuff[CATBUFF_SIZE]; if (strnotempty(cookie->data)) { char BIGSTK line[8192]; #ifdef _WIN32 FILE *fp = FOPEN(fconv(catbuff, sizeof(catbuff), name), "wb"); #else const int fd = open(fconv(catbuff, sizeof(catbuff), name), O_WRONLY | O_CREAT | O_TRUNC, HTS_PROTECT_FILE); FILE *fp = fd != -1 ? fdopen(fd, "wb") : NULL; if (fd != -1 && fp == NULL) close(fd); /* fdopen failed: don't leak the descriptor */ if (fp != NULL) /* O_CREAT's mode skips pre-existing jars: tighten those */ (void) fchmod(fd, HTS_PROTECT_FILE); #endif if (fp) { char *a = cookie->data; fprintf(fp, "# HTTrack Website Copier Cookie File" LF "# This file format is compatible with Netscape cookies" LF); do { a += binput(a, line, 8000); fprintf(fp, "%s" LF, line); } while(strnotempty(line)); fclose(fp); return 0; } } else return 0; return -1; } // Insert string ins before s. s_size is the capacity of the buffer at s. void cookie_insert(char *s, size_t s_size, const char *ins) { char *buff; if (strnotempty(s) == 0) { // nothing there yet: just concatenate strlcatbuff(s, ins, s_size); } else { buff = (char *) malloct(strlen(s) + 1); if (buff) { strlcpybuff(buff, s, strlen(s) + 1); // temporary copy of s strlcpybuff(s, ins, s_size); // write ins strlcatbuff(s, buff, s_size); // then the saved content freet(buff); } } } // Delete the substring of s at position pos. s_size is the capacity at s. void cookie_delete(char *s, size_t s_size, size_t pos) { char *buff; if (strnotempty(s + pos) == 0) { // nothing after pos: truncate s[0] = '\0'; } else { buff = (char *) malloct(strlen(s + pos) + 1); if (buff) { strlcpybuff(buff, s + pos, strlen(s + pos) + 1); // temporary copy strlcpybuff(s, buff, s_size); // overwrite from start freet(buff); } } } // Return field (0-based, tab-separated) of the cookie line cookie_base, // into buffer. ex: cookie_get("ceci estunexemple", 1) returns "un". // buffer must hold at least COOKIE_FIELD_BUFFER_SIZE bytes (all callers use // char[8192]). #define COOKIE_FIELD_BUFFER_SIZE 8192 const char *cookie_get(char *buffer, const char *cookie_base, int param) { const char *limit; while(*cookie_base == '\n') cookie_base++; limit = strchr(cookie_base, '\n'); if (!limit) limit = cookie_base + strlen(cookie_base); if (limit) { if (param) { int i; for(i = 0; i < param; i++) { if (cookie_base) { cookie_base = strchr(cookie_base, '\t'); // prochain tab if (cookie_base) cookie_base++; } } } if (cookie_base) { if (cookie_base < limit) { const char *a = cookie_base; htsbuff b = htsbuff_ptr(buffer, COOKIE_FIELD_BUFFER_SIZE); while((*a) && (*a != '\t') && (*a != '\n')) a++; htsbuff_catn(&b, cookie_base, (size_t) (a - cookie_base)); return buffer; } else return ""; } else return ""; } else return ""; } // fin cookies // -- basic auth -- /* déclarer un répertoire comme possédant une authentification propre */ int bauth_add(t_cookie * cookie, const char *adr, const char *fil, const char *auth) { char buffer[HTS_URLMAXSIZE * 2]; if (cookie) { if (!bauth_check(cookie, adr, fil)) { // n'existe pas déja bauth_chain *chain = &cookie->auth; char *prefix = bauth_prefix(buffer, adr, fil); /* fin de la chaine */ while(chain->next) chain = chain->next; chain->next = (bauth_chain *) calloc(sizeof(bauth_chain), 1); if (chain->next) { chain = chain->next; chain->next = NULL; strcpybuff(chain->auth, auth); strcpybuff(chain->prefix, prefix); return 1; } } } return 0; } /* tester adr et fil, et retourner authentification si nécessaire */ /* sinon, retourne NULL */ char *bauth_check(t_cookie * cookie, const char *adr, const char *fil) { char buffer[HTS_URLMAXSIZE * 2]; if (cookie) { bauth_chain *chain = &cookie->auth; char *prefix = bauth_prefix(buffer, adr, fil); while(chain) { if (strnotempty(chain->prefix)) { if (strncmp(prefix, chain->prefix, strlen(chain->prefix)) == 0) { return chain->auth; } } chain = chain->next; } } return NULL; } /* Build the auth prefix (host + path, query stripped) into prefix. Callers pass a buffer of HTS_URLMAXSIZE * 2 bytes. */ char *bauth_prefix(char *prefix, const char *adr, const char *fil) { char *a; strlcpybuff(prefix, jump_identification_const(adr), HTS_URLMAXSIZE * 2); strlcatbuff(prefix, fil, HTS_URLMAXSIZE * 2); a = strchr(prefix, '?'); if (a) *a = '\0'; if (strchr(prefix, '/')) { a = prefix + strlen(prefix) - 1; while(*a != '/') a--; *(a + 1) = '\0'; } return prefix; } httrack-3.49.14/src/htsindex.c0000644000175000017500000003536115230602340011601 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsindex.c */ /* keyword indexing system (search index) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsindex.h" #include "htsglobal.h" #include "htslib.h" #if HTS_MAKE_KEYWORD_INDEX #include "htshash.h" #include "coucal.h" /* Keyword Indexer Parameters */ // Maximum length for a keyword #define KEYW_LEN 50 // Minimum length for a keyword - MUST NOT BE NULL!!! #define KEYW_MIN_LEN 3 // What characters to accept? - MUST NOT BE EMPTY AND MUST NOT CONTAIN THE SPACE (32) CHARACTER!!! #define KEYW_ACCEPT "abcdefghijklmnopqrstuvwxyz0123456789-_." // Convert A to a, and so on.. to avoid case problems in indexing // This can be a generic table, containing characters that are in fact not accepted by KEYW_ACCEPT // MUST HAVE SAME SIZES!! #define KEYW_TRANSCODE_FROM (\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ "àâä" \ "ÀÂÄ" \ "éèêë" \ "ÈÈÊË" \ "ìîï" \ "ÌÎÃ" \ "òôö" \ "ÒÔÖ" \ "ùûü" \ "ÙÛÜ" \ "ÿ" \ ) #define KEYW_TRANSCODE_TO ( \ "abcdefghijklmnopqrstuvwxyz" \ "aaa" \ "aaa" \ "eeee" \ "eeee" \ "iii" \ "iii" \ "ooo" \ "ooo" \ "uuu" \ "uuu" \ "y" \ ) // These (accepted) characters will be ignored at beginning of a keyword #define KEYW_IGNORE_BEG "-_." // These (accepted) characters will be stripped if at the end of a keyword #define KEYW_STRIP_END "-_." // Words beginning with these (accepted) characters will be ignored #define KEYW_NOT_BEG "0123456789" // Treat these characters as space characters - MUST NOT BE EMPTY!!! #define KEYW_SPACE " ',;:!?\"\x0d\x0a\x09\x0b\x0c" // Common words (the,for..) detector // If a word represents more than KEYW_USELESS1K (%1000) of total words, then ignore it // 5 (0.5%) #define KEYW_USELESS1K 5 // If a word is present in more than KEYW_USELESS1KPG (%1000) pages, then ignore it // 800 (80%) #define KEYW_USELESS1KPG 800 // This number will be reduced by index hit for sorting purpose // leave it as it is here if you don't REALLY know what you are doing // Yes, I may be the only person, maybe #define KEYW_SORT_MAXCOUNT 999999999 /* End of Keyword Indexer Parameters */ int strcpos(const char *adr, char c); int mystrcmp(const void *_e1, const void *_e2); // Global variables int hts_index_init = 1; int hts_primindex_size = 0; FILE *fp_tmpproject = NULL; int hts_primindex_words = 0; #endif /* Init index */ void index_init(const char *indexpath) { #if HTS_MAKE_KEYWORD_INDEX /* remove(concat(indexpath,"index.txt")); */ hts_index_init = 1; hts_primindex_size = 0; hts_primindex_words = 0; fp_tmpproject = tmpfile(); #endif } /* Indexing system A little bit dirty, (quick'n dirty, in fact) But should be okay on most cases Tags and javascript handled (ignored) */ /* Note: utf-8 */ int index_keyword(const char *html_data, LLint size, const char *mime, const char *filename, const char *indexpath) { #if HTS_MAKE_KEYWORD_INDEX char catbuff[CATBUFF_SIZE]; int intag = 0, inscript = 0, incomment = 0; char keyword[KEYW_LEN + 32]; int i = 0; coucal WordIndexHash = NULL; FILE *tmpfp = NULL; // // Check parameters if (!html_data) return 0; if (!size) return 0; if (!mime) return 0; if (!filename) return 0; // Init ? if (hts_index_init) { UNLINK(concat(catbuff, sizeof(catbuff), indexpath, "index.txt")); UNLINK(concat(catbuff, sizeof(catbuff), indexpath, "sindex.html")); hts_index_init = 0; } // Check MIME type if (is_html_mime_type(mime)) { inscript = 0; } // FIXME - temporary fix for image/svg+xml (svg) // "IN XML" (html like, in fact :) ) else if ((strfield2(mime, "image/svg+xml")) || (strfield2(mime, "image/svg-xml"))) { inscript = 0; } else if ((strfield2(mime, "application/x-javascript")) || (strfield2(mime, "text/css")) ) { inscript = 1; } else return 0; // Temporary file tmpfp = tmpfile(); if (!tmpfp) return 0; // Create hash structure // Hash tables rulez da world! WordIndexHash = coucal_new(0); if (!WordIndexHash) return 0; // Start indexing this page keyword[0] = '\0'; while(i < size) { if (strfield(html_data + i, "")) { incomment = 0; } else if (html_data[i] == '<') { if (!inscript) intag = 1; } else if (html_data[i] == '>') { intag = 0; } else { // Okay, parse keywords if ((!inscript) && (!incomment) && (!intag)) { char cchar = html_data[i]; int pos; int len = (int) strlen(keyword); // Replace (ignore case, and so on..) if ((pos = strcpos(KEYW_TRANSCODE_FROM, cchar)) >= 0) cchar = KEYW_TRANSCODE_TO[pos]; if (strchr(KEYW_ACCEPT, cchar)) { /* Ignore some characters at beginning */ if ((len > 0) || (!strchr(KEYW_IGNORE_BEG, cchar))) { keyword[len++] = cchar; keyword[len] = '\0'; } } else if ((strchr(KEYW_SPACE, cchar)) || (!cchar)) { /* Avoid these words */ if (len > 0) { if (strchr(KEYW_NOT_BEG, keyword[0])) { keyword[(len = 0)] = '\0'; } } /* Strip ending . and so */ { int ok = 0; while((len = (int) strlen(keyword)) && (!ok)) { if (strchr(KEYW_STRIP_END, keyword[len - 1])) { /* strip it */ keyword[len - 1] = '\0'; } else ok = 1; } } /* Store it ? */ if (len >= KEYW_MIN_LEN) { hts_primindex_words++; if (coucal_inc(WordIndexHash, keyword)) { /* added new */ fprintf(tmpfp, "%s\n", keyword); } } keyword[(len = 0)] = '\0'; } else /* Invalid */ keyword[(len = 0)] = '\0'; if (len > KEYW_LEN) { keyword[(len = 0)] = '\0'; } } } i++; } // Reset temp file fseek(tmpfp, 0, SEEK_SET); // Process indexing for this page { if (fp_tmpproject) { while(!feof(tmpfp)) { char line[KEYW_LEN + 32]; linput(tmpfp, line, KEYW_LEN + 2); if (strnotempty(line)) { intptr_t e = 0; if (coucal_read(WordIndexHash, line, &e)) { char BIGSTK savelst[HTS_URLMAXSIZE * 2]; e++; /* 0 means "once" */ if (strncmp((const char *) fslash(catbuff, sizeof(catbuff), (const char *) indexpath), filename, strlen(indexpath)) == 0) // couper strcpybuff(savelst, filename + strlen(indexpath)); else strcpybuff(savelst, filename); // Add entry for this file and word fprintf(fp_tmpproject, "%s %d %s\n", line, (int) (KEYW_SORT_MAXCOUNT - e), savelst); hts_primindex_size++; } } } } } // Delete temp file fclose(tmpfp); tmpfp = NULL; // Clear hash table coucal_delete(&WordIndexHash); #endif return 1; } /* Sort index! */ /* Note: NOT utf-8 */ void index_finish(const char *indexpath, int mode) { #if HTS_MAKE_KEYWORD_INDEX char catbuff[CATBUFF_SIZE]; char **tab; char *blk; LLint size = fpsize(fp_tmpproject); if (size > 0) { if (fp_tmpproject) { tab = (char **) malloct(sizeof(char *) * (hts_primindex_size + 2)); if (tab) { blk = malloct(size + 1); if (blk) { fseek(fp_tmpproject, 0, SEEK_SET); if ((INTsys) fread(blk, 1, size, fp_tmpproject) == size) { char *a = blk, *b; int index = 0; int i; FILE *fp; blk[size] = '\0'; while((b = strchr(a, '\n')) && (index < hts_primindex_size)) { tab[index++] = a; *b = '\0'; a = b + 1; } // Sort it! qsort(tab, index, sizeof(char *), mystrcmp); // Delete fp_tmpproject fclose(fp_tmpproject); fp_tmpproject = NULL; // Write new file if (mode == 1) // TEXT fp = FOPEN( concat(catbuff, sizeof(catbuff), indexpath, "index.txt"), "wb"); else // HTML fp = FOPEN( concat(catbuff, sizeof(catbuff), indexpath, "sindex.html"), "wb"); if (fp) { char current_word[KEYW_LEN + 32]; char word[KEYW_LEN + 32]; int hit; int total_hit = 0; int total_line = 0; int last_pos = 0; char word0 = '\0'; current_word[0] = '\0'; if (mode == 2) { // HTML for(i = 0; i < index; i++) { if (word0 != tab[i][0]) { word0 = tab[i][0]; fprintf(fp, " %c\r\n", word0, word0); } } word0 = '\0'; fprintf(fp, "

\r\n"); fprintf(fp, "\r\n\r\n\r\n\r\n"); if (word0 != word[0]) { word0 = word[0]; fprintf(fp, "\r\n", word0); fprintf(fp, "\r\n", word0); } fprintf(fp, "\r\n\r\n\r\n
wordlocation\r\n"); } for(i = 0; i < index; i++) { if (sscanf(tab[i], "%s %d", word, &hit) == 2) { char *a = strchr(tab[i], ' '); if (a) a = strchr(a + 1, ' '); if (a++) { /* Yes, a++, not ++a :) */ hit = KEYW_SORT_MAXCOUNT - hit; if (strcmp(word, current_word)) { /* New word */ if (total_hit) { if (mode == 1) // TEXT fprintf(fp, "\t=%d\r\n", total_hit); if ((((total_hit * 1000) / hts_primindex_words) >= KEYW_USELESS1K) || (((total_line * 1000) / index) >= KEYW_USELESS1KPG) ) { fseek(fp, last_pos, SEEK_SET); if (mode == 1) // TEXT fprintf(fp, "\tignored (%d)\r\n", ((total_hit * 1000) / hts_primindex_words)); else fprintf(fp, "(ignored) [%d hits]
\r\n", total_hit); } else { if (mode == 1) // TEXT fprintf(fp, "\t(%d)\r\n", ((total_hit * 1000) / hts_primindex_words)); } } if (mode == 1) // TEXT fprintf(fp, "%s\r\n", word); else { // HTML fprintf(fp, "
%c
%s\r\n", word); } fflush(fp); last_pos = ftell(fp); strcpybuff(current_word, word); total_hit = total_line = 0; } total_hit += hit; total_line++; if (mode == 1) // TEXT fprintf(fp, "\t%d %s\r\n", hit, a); else // HTML fprintf(fp, "%s [%d hits]
\r\n", a, a, hit); } } } if (mode == 2) // HTML fprintf(fp, "
\r\n"); fclose(fp); } } freet(blk); } freet(tab); } } //qsort } if (fp_tmpproject) fclose(fp_tmpproject); fp_tmpproject = NULL; #endif } /* Subroutines */ #if HTS_MAKE_KEYWORD_INDEX int strcpos(const char *adr, char c) { const char *apos = strchr(adr, c); if (apos) return (int) (apos - adr); else return -1; } int mystrcmp(const void *_e1, const void *_e2) { const char *const*const e1 = (const char *const*) _e1; const char *const*const e2 = (const char *const*) _e2; return strcmp(*e1, *e2); } #endif httrack-3.49.14/src/htsthread.c0000644000175000017500000001373715230602340011744 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Threads */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsglobal.h" #include "htsbase.h" #include "htsthread.h" #include "httrack-library.h" #if USE_BEGINTHREAD #ifdef _WIN32 #include #endif #endif static int process_chain = 0; static htsmutex process_chain_mutex = HTSMUTEX_INIT; HTSEXT_API void htsthread_wait(void) { htsthread_wait_n(0); } HTSEXT_API void htsthread_wait_n(int n_wait) { #if USE_BEGINTHREAD int wait = 0; do { hts_mutexlock(&process_chain_mutex); wait = (process_chain > n_wait); hts_mutexrelease(&process_chain_mutex); if (wait) Sleep(100); } while(wait); #endif } /* ensure initialized */ HTSEXT_API void htsthread_init(void) { #if USE_BEGINTHREAD #if (defined(_DEBUG) || defined(DEBUG)) assertf(process_chain == 0); #endif if (process_chain_mutex == HTSMUTEX_INIT) { hts_mutexinit(&process_chain_mutex); } #endif } HTSEXT_API void htsthread_uninit(void) { htsthread_wait(); #if USE_BEGINTHREAD hts_mutexfree(&process_chain_mutex); #endif } typedef struct hts_thread_s { void *arg; void (*fun) (void *arg); } hts_thread_s; #ifdef _WIN32 static unsigned int __stdcall hts_entry_point(void *tharg) #else static void *hts_entry_point(void *tharg) #endif { hts_thread_s *s_args = (hts_thread_s *) tharg; void *const arg = s_args->arg; void (*fun) (void *arg) = s_args->fun; free(tharg); hts_mutexlock(&process_chain_mutex); process_chain++; assertf(process_chain > 0); hts_mutexrelease(&process_chain_mutex); /* run */ fun(arg); hts_mutexlock(&process_chain_mutex); process_chain--; assertf(process_chain >= 0); hts_mutexrelease(&process_chain_mutex); #ifdef _WIN32 return 0; #else return NULL; #endif } /* create a thread */ HTSEXT_API int hts_newthread(void (*fun) (void *arg), void *arg) { hts_thread_s *s_args = malloc(sizeof(hts_thread_s)); assertf(s_args != NULL); s_args->arg = arg; s_args->fun = fun; #ifdef _WIN32 { unsigned int idt; HANDLE handle = (HANDLE) _beginthreadex(NULL, 0, hts_entry_point, s_args, 0, &idt); if (handle == 0) { free(s_args); return -1; } else { /* detach the thread from the main process so that is can be independent */ CloseHandle(handle); } } #else { const size_t stackSize = 1024 * 1024 * 8; pthread_attr_t attr; pthread_t handle = 0; int retcode; if (pthread_attr_init(&attr) != 0 || pthread_attr_setstacksize(&attr, stackSize) != 0 || (retcode = pthread_create(&handle, &attr, hts_entry_point, s_args)) != 0) { free(s_args); return -1; } else { /* detach the thread from the main process so that is can be independent */ pthread_detach(handle); pthread_attr_destroy(&attr); } } #endif return 0; } #if USE_BEGINTHREAD /* Note: new 3.41 cleaned up functions. */ HTSEXT_API void hts_mutexinit(htsmutex * mutex) { htsmutex_s *smutex = malloct(sizeof(htsmutex_s)); #ifdef _WIN32 smutex->handle = CreateMutex(NULL, FALSE, NULL); #else pthread_mutex_init(&smutex->handle, 0); #endif *mutex = smutex; } HTSEXT_API void hts_mutexfree(htsmutex * mutex) { if (mutex != NULL && *mutex != NULL) { #ifdef _WIN32 CloseHandle((*mutex)->handle); #else pthread_mutex_destroy(&((*mutex)->handle)); #endif freet(*mutex); *mutex = NULL; } } HTSEXT_API void hts_mutexlock(htsmutex * mutex) { assertf(mutex != NULL); if (*mutex == HTSMUTEX_INIT) { /* must be initialized */ /* Initialize exactly once, even when several threads race to lock the same mutex for the first time. Build our own object, then publish it with a single atomic compare-and-swap; the threads that lose the race free the object they built (issue #297). No static guard is needed, which keeps this safe on Windows 2000 (no statically-initializable lock there). */ htsmutex created = HTSMUTEX_INIT; hts_mutexinit(&created); #ifdef _WIN32 if (InterlockedCompareExchangePointer((PVOID volatile *) mutex, created, HTSMUTEX_INIT) != HTSMUTEX_INIT) #else if (!__sync_bool_compare_and_swap(mutex, HTSMUTEX_INIT, created)) #endif { hts_mutexfree(&created); } } assertf(*mutex != NULL); #ifdef _WIN32 assertf((*mutex)->handle != NULL); WaitForSingleObject((*mutex)->handle, INFINITE); #else pthread_mutex_lock(&(*mutex)->handle); #endif } HTSEXT_API void hts_mutexrelease(htsmutex * mutex) { assertf(mutex != NULL && *mutex != NULL); #ifdef _WIN32 assertf((*mutex)->handle != NULL); ReleaseMutex((*mutex)->handle); #else pthread_mutex_unlock(&(*mutex)->handle); #endif } #endif httrack-3.49.14/src/htsalias.c0000644000175000017500000005364315230602340011566 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsalias.c subroutines: */ /* alias for command-line options and config files */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsbase.h" #include "htsalias.h" #include "htsglobal.h" #include "htslib.h" #define _NOT_NULL(a) ( (a!=NULL) ? (a) : "" ) /* Aliases for command-line and config file definitions These definitions can be used: in command line: --sockets=8 --cache=0 --sockets 8 --cache off --nocache -c8 -C0 in config file: sockets=8 cache=0 set sockets 8 cache off */ /* single : no options param : this option allows a number parameter (1, for example) and can be mixed with other options (R1C1c8) param1 : this option must be alone, and needs one distinct parameter (-P ) param0 : this option must be alone, but the parameter should be put together (+*.gif) */ /* clang-format off: hand-aligned table; clang-format reflows the whole initializer (2->4 space) on any edit, churning every untouched row. */ /* clang-format off */ const char *hts_optalias[][4] = { /* {"","","",""}, */ {"path", "-O", "param1", "output path"}, {"mirror", "-w", "single", ""}, {"mirror-wizard", "-W", "single", ""}, {"get-files", "-g", "single", ""}, {"quiet", "-q", "single", ""}, {"mirrorlinks", "-Y", "single", ""}, {"proxy", "-P", "param1", "proxy name:port"}, {"bind", "-%b", "param1", "hostname to bind"}, {"httpproxy-ftp", "-%f", "param", ""}, {"depth", "-r", "param", ""}, {"recurse-levels", "-r", "param", ""}, {"ext-depth", "-%e", "param", ""}, {"max-files", "-m", "param", ""}, {"max-size", "-M", "param", ""}, {"max-time", "-E", "param", ""}, {"max-rate", "-A", "param", ""}, {"max-pause", "-G", "param", ""}, {"sockets", "-c", "param", "number of simultaneous connections allowed"}, {"socket", "-c", "param", "number of simultaneous connections allowed"}, {"connection", "-c", "param", "number of simultaneous connections allowed"}, {"connection-per-second", "-%c", "param", "number of connection per second allowed"}, {"timeout", "-T", "param", ""}, {"retries", "-R", "param", "number of retries for non-fatal errors"}, {"min-rate", "-J", "param", ""}, {"host-control", "-H", "param", ""}, {"extended-parsing", "-%P", "param", ""}, {"near", "-n", "single", ""}, {"delayed-type-check", "-%N", "single", ""}, {"cached-delayed-type-check", "-%D", "single", ""}, {"delayed-type-check-always", "-%N2", "single", ""}, {"disable-security-limits", "-%!", "single", ""}, {"test", "-t", "single", ""}, {"list", "-%L", "param1", ""}, {"urllist", "-%S", "param1", ""}, {"language", "-%l", "param1", ""}, {"lang", "-%l", "param1", ""}, {"accept", "-%a", "param1", ""}, {"headers", "-%X", "param1", ""}, {"structure", "-N", "param", ""}, {"user-structure", "-N", "param1", ""}, {"long-names", "-L", "param", ""}, {"keep-links", "-K", "param", ""}, {"mime-html", "-%M", "single", ""}, {"mht", "-%M", "single", ""}, {"replace-external", "-x", "single", ""}, {"disable-passwords", "-%x", "single", ""}, {"disable-password", "-%x", "single", ""}, {"include-query-string", "-%q", "single", ""}, {"strip-query", "-%g", "param1", "strip [host/pattern=]key1,key2,... from URLs"}, {"cookies-file", "-%K", "param1", "load extra cookies from a Netscape cookies.txt"}, {"warc", "-%r", "single", "write an ISO-28500 WARC/1.1 archive of the crawl"}, {"warc-file", "-%rf", "param1", "write a WARC archive to the given base name"}, {"warc-max-size", "-%rs", "param1", "rotate the WARC archive once a segment passes N bytes (0: single file)"}, {"warc-cdx", "-%rc", "single", "write a sorted CDXJ index next to the WARC archive"}, {"warc-cdxj", "-%rc", "single", ""}, {"wacz", "-%rz", "single", "package the WARC archive, CDXJ index and pages as a WACZ file"}, {"why", "-%Y", "param1", "explain which filter rule accepts or rejects a URL, then exit"}, {"pause", "-%G", "param1", "random pause of MIN[:MAX] seconds between files"}, {"generate-errors", "-o", "single", ""}, {"do-not-generate-errors", "-o0", "single", ""}, {"purge-old", "-X", "param", ""}, {"cookies", "-b", "param", ""}, {"check-type", "-u", "param", ""}, {"assume", "-%A", "param1", ""}, {"mimetype", "-%A", "param1", ""}, {"parse-java", "-j", "param", ""}, {"protocol", "-@i", "param", ""}, {"robots", "-s", "param", ""}, {"http-10", "-%h", "single", ""}, {"http-1.0", "-%h", "single", ""}, {"keep-alive", "-%k", "single", ""}, {"build-top-index", "-%i", "single", ""}, {"disable-compression", "-%z", "single", ""}, {"tolerant", "-%B", "single", ""}, {"updatehack", "-%s", "single", ""}, {"sizehack", "-%s", "single", ""}, {"urlhack", "-%u", "single", ""}, {"keep-www-prefix", "-%j", "single", ""}, {"keep-double-slashes", "-%o", "single", ""}, {"keep-query-order", "-%y", "single", ""}, {"user-agent", "-F", "param1", "user-agent identity"}, {"referer", "-%R", "param1", "default referer URL"}, {"from", "-%E", "param1", "from email address"}, {"footer", "-%F", "param1", ""}, {"cache", "-C", "param", "number of retries for non-fatal errors"}, {"store-all-in-cache", "-k", "single", ""}, {"do-not-recatch", "-%n", "single", ""}, {"do-not-log", "-Q", "single", ""}, {"extra-log", "-z", "single", ""}, {"debug-log", "-Z", "single", ""}, {"verbose", "-v", "single", ""}, {"file-log", "-f", "single", ""}, {"single-log", "-f2", "single", ""}, {"index", "-I", "single", ""}, {"search-index", "-%I", "single", ""}, {"priority", "-p", "param", ""}, {"debug-headers", "-%H", "single", ""}, {"userdef-cmd", "-V", "param1", ""}, {"callback", "-%W", "param1", "plug an external callback"}, {"wrapper", "-%W", "param1", "plug an external callback"}, {"structure", "-N", "param1", "user-defined structure"}, {"usercommand", "-V", "param1", "user-defined command"}, {"display", "-%v", "single", "show files transferred and other funny realtime information"}, {"dos83", "-L0", "single", ""}, {"iso9660", "-L2", "single", ""}, {"disable-module", "-%w", "param1", ""}, {"no-background-on-suspend", "-y0", "single", ""}, {"background-on-suspend", "-y", "single", ""}, {"utf8-conversion", "-%T", "single", ""}, {"no-utf8-conversion", "-%T0", "single", ""}, /* */ /* DEPRECATED */ {"stay-on-same-dir", "-S", "single", "stay on the same directory - DEPRECATED"}, {"can-go-down", "-D", "single", "can only go down into subdirs - DEPRECATED"}, {"can-go-up", "-U", "single", "can only go to upper directories- DEPRECATED"}, {"can-go-up-and-down", "-B", "single", "can both go up&down into the directory structure - DEPRECATED"}, {"stay-on-same-address", "-a", "single", "stay on the same address - DEPRECATED"}, {"stay-on-same-domain", "-d", "single", "stay on the same principal domain - DEPRECATED"}, {"stay-on-same-tld", "-l", "single", "stay on the same TLD (eg: .com) - DEPRECATED"}, {"go-everywhere", "-e", "single", "go everywhere on the web - DEPRECATED"}, /* Badly documented */ {"debug-testfilters", "-#0", "param1", "debug: test filters"}, {"advanced-flushlogs", "-#f", "single", ""}, {"advanced-maxfilters", "-#F", "param", "maximum number of scan rules"}, {"version", "-#h", "single", ""}, {"debug-scanstdin", "-#K", "single", ""}, {"advanced-maxlinks", "-#L", "param", "maximum number of links (0 to disable limit)"}, {"advanced-progressinfo", "-#p", "single", "deprecated"}, {"catch-url", "-#P", "single", "catch complex URL through proxy"}, /*{"debug-oldftp","-#R","single",""}, */ {"debug-xfrstats", "-#T", "single", ""}, {"advanced-wait", "-#u", "single", ""}, {"debug-ratestats", "-#Z", "single", ""}, {"fast-engine", "-#X", "single", "Enable fast routines"}, {"debug-overflows", "-#X0", "single", "Attempt to detect buffer overflows"}, {"debug-cache", "-#C", "param1", "List files in the cache"}, {"extract-cache", "-#C", "single", "Extract meta-data"}, {"debug-parsing", "-#d", "single", "debug: test parser"}, {"repair-cache", "-#R", "single", "repair the damaged cache ZIP file"}, {"repair", "-#R", "single", ""}, /* STANDARD ALIASES */ {"spider", "-p0C0I0t", "single", ""}, {"testsite", "-p0C0I0t", "single", ""}, {"testlinks", "-r1p0C0I0t", "single", ""}, {"test", "-r1p0C0I0t", "single", ""}, {"bookmark", "-r1p0C0I0t", "single", ""}, {"mirror", "-w", "single", ""}, {"testscan", "-p0C0I0Q", "single", ""}, {"scan", "-p0C0I0Q", "single", ""}, {"check", "-p0C0I0Q", "single", ""}, {"skeleton", "-p1", "single", ""}, {"preserve", "-%p", "single", ""}, {"get", "-qg", "single", ""}, {"update", "-iC2", "single", ""}, {"continue", "-iC1", "single", ""}, {"restart", "-iC1", "single", ""}, {"continue", "-i", "single", ""}, /* for help alias */ {"sucker", "-r999", "single", ""}, {"help", "-h", "single", ""}, {"documentation", "-h", "single", ""}, {"doc", "-h", "single", ""}, {"wide", "-c32", "single", ""}, {"tiny", "-c1", "single", ""}, {"ultrawide", "-c48", "single", ""}, {"http10", "-%h", "single", ""}, {"filelist", "-%L", "single", ""}, {"list", "-%L", "single", ""}, {"filterlist", "-%S", "single", ""}, /* END OF ALIASES */ /* Filters */ {"allow", "+", "param0", "allow filter"}, {"deny", "-", "param0", "deny filter"}, /* */ /* URLs */ {"add", "", "param0", "add URLs"}, /* */ /* Internal */ {"catchurl", "--catchurl", "single", "catch complex URL through proxy"}, {"updatehttrack", "--updatehttrack", "single", "update HTTrack Website Copier"}, {"clean", "--clean", "single", "clean up log files and cache"}, {"tide", "--clean", "single", "clean up log files and cache"}, {"autotest", "-#T", "single", ""}, /* */ {"", "", "", ""} }; /* clang-format on */ /* Check for alias in command-line argc,argv as in main() n_arg argument position return_argv a char[2][] where to put result return_error buffer in case of syntax error return value: number of arguments treated (0 if error) */ int optalias_check(int argc, const char *const *argv, int n_arg, int *return_argc, char **return_argv, size_t return_argv_size, char *return_error, size_t return_error_size) { return_error[0] = '\0'; *return_argc = 1; if (argv[n_arg][0] == '-') if (argv[n_arg][1] == '-') { /* sized to HTS_CDLMAXSIZE: a long-form option value (--user-agent, --headers, ...) is copied into param, and the value is bounded by the general per-argument check in htscoremain.c (HTS_CDLMAXSIZE) */ char command[HTS_CDLMAXSIZE]; char param[HTS_CDLMAXSIZE]; char addcommand[256]; /* */ char *position; int need_param = 1; int pos; command[0] = param[0] = addcommand[0] = '\0'; /* --sockets=8 */ if ((position = strchr(argv[n_arg], '='))) { /* Copy command */ strncatbuff(command, argv[n_arg] + 2, (int) (position - (argv[n_arg] + 2))); /* Copy parameter */ strcpybuff(param, position + 1); } /* --nocache */ else if (strncmp(argv[n_arg] + 2, "no", 2) == 0) { strcpybuff(command, argv[n_arg] + 4); strcpybuff(param, "0"); } /* --sockets 8 */ else { if (strncmp(argv[n_arg] + 2, "wide-", 5) == 0) { strcpybuff(addcommand, "c32"); strcpybuff(command, strchr(argv[n_arg] + 2, '-') + 1); } else if (strncmp(argv[n_arg] + 2, "tiny-", 5) == 0) { strcpybuff(addcommand, "c1"); strcpybuff(command, strchr(argv[n_arg] + 2, '-') + 1); } else strcpybuff(command, argv[n_arg] + 2); need_param = 2; } /* Now solve the alias */ pos = optalias_find(command); if (pos >= 0) { /* Copy real name */ strcpybuff(command, hts_optalias[pos][1]); /* With parameters? */ if (strncmp(hts_optalias[pos][2], "param", 5) == 0) { /* Copy parameters? */ if (need_param == 2) { if ((n_arg + 1 >= argc) || (argv[n_arg + 1][0] == '-')) { /* no supplemental parameter */ snprintf(return_error, return_error_size, "Syntax error:\n\tOption %s needs to be followed by a " "parameter: %s \n\t%s\n", command, command, _NOT_NULL(optalias_help(command))); return 0; } strcpybuff(param, argv[n_arg + 1]); need_param = 2; } } else need_param = 1; /* Final result */ /* Must be alone (-P /tmp) */ if (strcmp(hts_optalias[pos][2], "param1") == 0) { strlcpybuff(return_argv[0], command, return_argv_size); strlcpybuff(return_argv[1], param, return_argv_size); *return_argc = 2; /* 2 parameters returned */ } /* Alone with parameter (+*.gif) */ else if (strcmp(hts_optalias[pos][2], "param0") == 0) { /* Command */ strlcpybuff(return_argv[0], command, return_argv_size); strlcatbuff(return_argv[0], param, return_argv_size); } /* Together (-c8) */ else { /* Command */ strlcpybuff(return_argv[0], command, return_argv_size); /* Parameters accepted */ if (strncmp(hts_optalias[pos][2], "param", 5) == 0) { /* --cache=off or --index=on */ if (strcmp(param, "off") == 0) strlcatbuff(return_argv[0], "0", return_argv_size); else if (strcmp(param, "on") == 0) { // on is the default } else strlcatbuff(return_argv[0], param, return_argv_size); } *return_argc = 1; /* 1 parameter returned */ } } else { snprintf(return_error, return_error_size, "Unknown option: %s\n", command); return 0; } return need_param; } /* Check -O */ { int pos; if ((pos = optreal_find(argv[n_arg])) >= 0) { if ((strcmp(hts_optalias[pos][2], "param1") == 0) || (strcmp(hts_optalias[pos][2], "param0") == 0)) { if ((n_arg + 1 >= argc) || (argv[n_arg + 1][0] == '-')) { /* no supplemental parameter */ snprintf(return_error, return_error_size, "Syntax error:\n\tOption %s needs to be followed by a " "parameter: %s \n\t%s\n", argv[n_arg], argv[n_arg], _NOT_NULL(optalias_help(argv[n_arg]))); return 0; } /* Copy parameters */ strlcpybuff(return_argv[0], argv[n_arg], return_argv_size); strlcpybuff(return_argv[1], argv[n_arg + 1], return_argv_size); /* And return */ *return_argc = 2; /* 2 parameters returned */ return 2; /* 2 parameters used */ } } } /* Copy and return other unknown option */ strlcpybuff(return_argv[0], argv[n_arg], return_argv_size); return 1; } /* Finds the option alias and returns the index, or -1 if failed */ int optalias_find(const char *token) { if (token[0] != '\0') { int i = 0; while(hts_optalias[i][0][0] != '\0') { if (strcmp(token, hts_optalias[i][0]) == 0) { return i; } i++; } } return -1; } /* Finds the real option and returns the index, or -1 if failed */ int optreal_find(const char *token) { if (token[0] != '\0') { int i = 0; while(hts_optalias[i][0][0] != '\0') { if (strcmp(token, hts_optalias[i][1]) == 0) { return i; } i++; } } return -1; } const char *optreal_value(int p) { return hts_optalias[p][1]; } const char *optalias_value(int p) { return hts_optalias[p][0]; } const char *opttype_value(int p) { return hts_optalias[p][2]; } const char *opthelp_value(int p) { return hts_optalias[p][3]; } /* Help for option , empty if not available, or NULL if unknown */ const char *optalias_help(const char *token) { int pos = optalias_find(token); if (pos >= 0) return hts_optalias[pos][3]; else return NULL; } /* Include a file to the current command line */ /* example: set sockets 8 index on allow *.gif deny ad.* */ /* Note: NOT utf-8 */ int optinclude_file(const char *name, int *argc, char **argv, char *x_argvblk, size_t x_argvblk_size, int *x_ptr) { FILE *fp; fp = fopen(name, "rb"); if (fp) { char line[256]; int insert_after = 1; /* first, insert after program filename */ while(!feof(fp)) { char *a, *b; int result; /* read line */ linput(fp, line, 250); hts_lowcase(line); if (strnotempty(line)) { /* no comment line: # // ; */ if (strchr("#/;", line[0]) == NULL) { /* right trim */ a = line + strlen(line) - 1; while(is_realspace(*a)) *(a--) = '\0'; /* jump "set " and spaces */ a = line; while(is_realspace(*a)) a++; if (strncmp(a, "set", 3) == 0) { if (is_realspace(*(a + 3))) { a += 4; } } while(is_realspace(*a)) a++; /* delete = ("sockets=8") */ if ((b = strchr(a, '='))) *b = ' '; /* isolate option and parameter */ b = a; while((!is_realspace(*b)) && (*b)) b++; if (*b) { *b = '\0'; b++; } /* a is now the option, b the parameter */ { int return_argc; char return_error[256]; char _tmp_argv[4][HTS_CDLMAXSIZE]; char *tmp_argv[4]; tmp_argv[0] = _tmp_argv[0]; tmp_argv[1] = _tmp_argv[1]; tmp_argv[2] = _tmp_argv[2]; tmp_argv[3] = _tmp_argv[3]; strcpybuff(_tmp_argv[0], "--"); strcatbuff(_tmp_argv[0], a); strcpybuff(_tmp_argv[1], b); result = optalias_check(2, (const char *const *) tmp_argv, 0, &return_argc, (tmp_argv + 2), sizeof(_tmp_argv[0]), return_error, sizeof(return_error)); if (!result) { printf("%s\n", return_error); } else { int insert_after_argc; /* Insert parameters BUT so that they can be in the same order */ /* temporary argc: Number of parameters after minus insert_after_argc */ insert_after_argc = (*argc) - insert_after; cmdl_ins((tmp_argv[2]), insert_after_argc, (argv + insert_after), x_argvblk, x_argvblk_size, (*x_ptr)); *argc = insert_after_argc + insert_after; insert_after++; /* Second one */ if (return_argc > 1) { insert_after_argc = (*argc) - insert_after; cmdl_ins((tmp_argv[3]), insert_after_argc, (argv + insert_after), x_argvblk, x_argvblk_size, (*x_ptr)); *argc = insert_after_argc + insert_after; insert_after++; } /* increment to nbr of used parameters */ /* insert_after+=result; */ } } } } } fclose(fp); return 1; } return 0; } /* Get home directory, '.' if unset or empty */ /* example: /home/smith */ const char *hts_gethome(void) { const char *home = getenv("HOME"); /* An empty $HOME would expand ~/foo into the absolute /foo */ return strnotempty(home) ? home : "."; } /* Convert ~/foo into /home/smith/foo (~user/ left alone: no getpwnam here) */ void expand_home(String * str) { if (StringNotEmpty(*str) && StringSub(*str, 0) == '~' && (StringLength(*str) == 1 || StringSub(*str, 1) == '/')) { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; const char *const home = hts_gethome(); const size_t homelen = strlen(home); const size_t taillen = StringLength(*str) - 1; /* Leave untouched rather than abort() in strcatbuff on a huge $HOME */ if (taillen < sizeof(tempo) && homelen < sizeof(tempo) - taillen) { strcpybuff(tempo, home); strcatbuff(tempo, StringBuff(*str) + 1); StringCopy(*str, tempo); } } } httrack-3.49.14/src/htswizard.c0000644000175000017500000010427715230602340011775 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* wizard system (accept/refuse links) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htscore.h" #include "htswizard.h" /* specific definitions */ #include "htsbase.h" #include /* END specific definitions */ // libérer filters[0] pour insérer un élément dans filters[0] /* Per-slot capacity of the filters array, matching the slot stride allocated by filters_init() in htscore.c (HTS_URLMAXSIZE * 2). */ #define HTS_FILTER_SLOT_SIZE (HTS_URLMAXSIZE * 2) #define HT_INSERT_FILTERS0 \ do { \ int i; \ if (*opt->filters.filptr > 0) { \ for (i = (*opt->filters.filptr) - 1; i >= 0; i--) { \ strlcpybuff((*opt->filters.filters)[i + 1], \ (*opt->filters.filters)[i], HTS_FILTER_SLOT_SIZE); \ } \ } \ (*opt->filters.filters)[0][0] = '\0'; \ (*opt->filters.filptr)++; \ assertf((*opt->filters.filptr) < opt->maxfilter); \ } while (0) typedef struct htspair_t { const char *tag; const char *attr; } htspair_t; /* "embedded" */ htspair_t hts_detect_embed[] = { {"img", "src"}, {"link", "href"}, /* embedded script hack */ {"script", ".src"}, /* style */ {"style", "import"}, {NULL, NULL} }; /* HTML5 media siblings of : same near-link treatment (#451) */ static const htspair_t hts_detect_embed_html5[] = { {"source", "src"}, {"source", "srcset"}, {"track", "src"}, {NULL, NULL}}; /* Internal */ static int hts_acceptlink_(httrackp * opt, int ptr, const char *adr, const char *fil, const char *tag, const char *attribute, int *set_prio_to, int *just_test_it); /* httrackp opt bloc d'options int ptr,int lien_tot,lien_url** liens relatif aux liens char* adr,char* fil adresse/fichier à tester char** filters,int filptr,int filter_max relatif aux filtres robots_wizard* robots relatif aux robots int* set_prio_to callback obligatoire "capturer ce lien avec prio=N-1" int* just_test_it callback optionnel "ne faire que tester ce lien éventuellement" retour: 0 accepté 1 refusé -1 pas d'avis */ int hts_acceptlink(httrackp * opt, int ptr, const char *adr, const char *fil, const char *tag, const char *attribute, int *set_prio_to, int *just_test_it) { int forbidden_url = hts_acceptlink_(opt, ptr, adr, fil, tag, attribute, set_prio_to, just_test_it); int prev_prio = set_prio_to ? *set_prio_to : 0; // -------------------- PHASE 6 -------------------- { int test_url = RUN_CALLBACK3(opt, check_link, adr, fil, forbidden_url); if (test_url != -1) { forbidden_url = test_url; if (set_prio_to) *set_prio_to = prev_prio; } } return forbidden_url; } static int cmp_token(const char *tag, const char *cmp) { int p; return (strncasecmp(tag, cmp, (p = (int) strlen(cmp))) == 0 && !isalnum((unsigned char) tag[p])); } /* TRUE if (tag, attribute) matches an embedded-asset pair in the table */ static hts_boolean is_embed_pair(const htspair_t *table, const char *tag, const char *attribute) { int i; for (i = 0; table[i].tag != NULL; i++) { if (cmp_token(tag, table[i].tag) && cmp_token(attribute, table[i].attr)) return HTS_TRUE; } return HTS_FALSE; } static int hts_acceptlink_(httrackp * opt, int ptr, const char *adr, const char *fil, const char *tag, const char *attribute, int *set_prio_to, int *just_test_it) { int forbidden_url = -1; int meme_adresse; int embedded_triggered = 0; #define _FILTERS (*opt->filters.filters) #define _FILTERS_PTR (opt->filters.filptr) #define _ROBOTS ((robots_wizard*)opt->robotsptr) int may_set_prio_to = 0; // -------------------- PHASE 0 -------------------- /* Infos */ hts_log_print(opt, LOG_DEBUG, "wizard test begins: %s%s", adr, fil); /* Already exists? Then, we know that we knew that this link had to be known */ if (adr[0] != '\0' && fil[0] != '\0' && opt->hash != NULL && hash_read(opt->hash, adr, fil, 1) >= 0) { return 0; /* Yokai */ } // -------------------- PRELUDE OF PHASE 3-BIS -------------------- /* Built-in known tags (, ..) */ if (forbidden_url != 0 && opt->nearlink && tag != NULL && attribute != NULL) { if (is_embed_pair(hts_detect_embed, tag, attribute) || is_embed_pair(hts_detect_embed_html5, tag, attribute)) { embedded_triggered = 1; } } // -------------------- PHASE 1 -------------------- /* Doit-on traiter les non html? */ if ((opt->getmode & HTS_GETMODE_NONHTML) == 0) { // non on ne doit pas if (!ishtml(opt, fil)) { // non il ne faut pas forbidden_url = 1; // interdire récupération du lien hts_log_print(opt, LOG_DEBUG, "non-html file ignored at %s : %s", adr, fil); } } /* Niveau 1: ne pas parser suivant! */ if (ptr > 0) { if ((heap(ptr)->depth <= 0) || (heap(ptr)->depth <= 1 && !embedded_triggered)) { forbidden_url = 1; // interdire récupération du lien hts_log_print(opt, LOG_DEBUG, "file from too far level ignored at %s : %s", adr, fil); } } /* en cas d'échec en phase 1, retour immédiat! */ if (forbidden_url == 1) { return forbidden_url; } // -------------------- PHASE 2 -------------------- // ------------------------------------------------------ // doit-on traiter ce lien?.. vérifier droits de déplacement meme_adresse = strfield2(adr, urladr()); if (meme_adresse) hts_log_print(opt, LOG_DEBUG, "Compare addresses: %s=%s", adr, urladr()); else hts_log_print(opt, LOG_DEBUG, "Compare addresses: %s!=%s", adr, urladr()); if (meme_adresse) { // même adresse { // tester interdiction de descendre // MODIFIE : en cas de remontée puis de redescente, il se pouvait qu'on ne puisse pas atteindre certains fichiers // problème: si un fichier est virtuellement accessible via une page mais dont le lien est sur une autre *uniquement*.. char BIGSTK tempo[HTS_URLMAXSIZE * 2]; char BIGSTK tempo2[HTS_URLMAXSIZE * 2]; tempo[0] = tempo2[0] = '\0'; // note (up/down): on calcule à partir du lien primaire, ET du lien précédent. // ex: si on descend 2 fois on peut remonter 1 fois if (lienrelatif(tempo, sizeof(tempo), fil, heap(heap(ptr)->premier)->fil) == 0) { if (lienrelatif(tempo2, sizeof(tempo2), fil, heap(ptr)->fil) == 0) { hts_log_print(opt, LOG_DEBUG, "build relative links to test: %s %s (with %s and %s)", tempo, tempo2, heap(heap(ptr)->premier)->fil, heap(ptr)->fil); // si vient de primary, ne pas tester lienrelatif avec (car host "différent") /*if (heap(heap(ptr)->premier) == 0) { // vient de primary } */ // NEW: finalement OK, sauf pour les moved repérés par link_import // PROBLEME : annulé a cause d'un lien éventuel isolé accepté..qui entrainerait un miroir // (test même niveau (NOUVEAU à cause de certains problèmes de filtres non intégrés)) // NEW if ((tempo[0] != '\0' && tempo[1] != '\0' && strchr(tempo + 1, '/') == 0) || (tempo2[0] != '\0' && tempo2[1] != '\0' && strchr(tempo2 + 1, '/') == 0) ) { if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved' forbidden_url = 0; hts_log_print(opt, LOG_DEBUG, "same level link authorized: %s%s", adr, fil); } } // down if ((strncmp(tempo, "../", 3)) || (strncmp(tempo2, "../", 3))) { // pas montée sinon ne nbous concerne pas int test1, test2; if (!strncmp(tempo, "../", 3)) test1 = 0; else test1 = (strchr(tempo + ((*tempo == '/') ? 1 : 0), '/') != NULL); if (!strncmp(tempo2, "../", 3)) test2 = 0; else test2 = (strchr(tempo2 + ((*tempo2 == '/') ? 1 : 0), '/') != NULL); if ((test1) && (test2)) { // on ne peut que descendre if ((opt->seeker & HTS_SEEKER_DOWN) == 0) { forbidden_url = 1; hts_log_print(opt, LOG_DEBUG, "lower link canceled: %s%s", adr, fil); } else { // autorisé à priori - NEW if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved' forbidden_url = 0; hts_log_print(opt, LOG_DEBUG, "lower link authorized: %s%s", adr, fil); } } } else if ((test1) || (test2)) { // on peut descendre pour accéder au lien if ((opt->seeker & HTS_SEEKER_DOWN) != 0) { if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved' forbidden_url = 0; hts_log_print(opt, LOG_DEBUG, "lower link authorized: %s%s", adr, fil); } } } } // up if ((!strncmp(tempo, "../", 3)) && (!strncmp(tempo2, "../", 3))) { // impossible sans monter if ((opt->seeker & HTS_SEEKER_UP) == 0) { forbidden_url = 1; hts_log_print(opt, LOG_DEBUG, "upper link canceled: %s%s", adr, fil); } else { // autorisé à monter - NEW if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved' forbidden_url = 0; hts_log_print(opt, LOG_DEBUG, "upper link authorized: %s%s", adr, fil); } } } else if ((!strncmp(tempo, "../", 3)) || (!strncmp(tempo2, "../", 3))) { // Possible en montant if ((opt->seeker & HTS_SEEKER_UP) != 0) { if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved' forbidden_url = 0; hts_log_print(opt, LOG_DEBUG, "upper link authorized: %s%s", adr, fil); } } // sinon autorisé en descente } } else { hts_log_print(opt, LOG_ERROR, "Error building relative link %s and %s", fil, heap(ptr)->fil); } } else { hts_log_print(opt, LOG_ERROR, "Error building relative link %s and %s", fil, heap(heap(ptr)->premier)->fil); } } // tester interdiction de descendre? { // tester interdiction de monter char BIGSTK tempo[HTS_URLMAXSIZE * 2]; char BIGSTK tempo2[HTS_URLMAXSIZE * 2]; if (lienrelatif(tempo, sizeof(tempo), fil, heap(heap(ptr)->premier)->fil) == 0) { if (lienrelatif(tempo2, sizeof(tempo2), fil, heap(ptr)->fil) == 0) { } else { hts_log_print(opt, LOG_ERROR, "Error building relative link %s and %s", fil, heap(ptr)->fil); } } else { hts_log_print(opt, LOG_ERROR, "Error building relative link %s and %s", fil, heap(heap(ptr)->premier)->fil); } } // fin tester interdiction de monter } else { // adresse différente, sortir? // doit-on traiter ce lien?.. vérifier droits de sortie switch ((opt->travel & HTS_TRAVEL_SCOPE_MASK)) { case HTS_TRAVEL_SAME_ADDRESS: if (!opt->wizard) // mode non wizard forbidden_url = 1; break; // interdicton de sortir au dela de l'adresse case HTS_TRAVEL_SAME_DOMAIN: { size_t i = strlen(adr) - 1; size_t j = strlen(urladr()) - 1; if ((i > 0) && (j > 0)) { while ((i > 0) && (adr[i] != '.')) i--; while ((j > 0) && (urladr()[j] != '.')) j--; if ((i > 0) && (j > 0)) { i--; j--; while ((i > 0) && (adr[i] != '.')) i--; while ((j > 0) && (urladr()[j] != '.')) j--; } } if ((i > 0) && (j > 0)) { if (!strfield2(adr + i, urladr() + j)) { // != if (!opt->wizard) { // mode non wizard forbidden_url = 1; // pas même domaine hts_log_print(opt, LOG_DEBUG, "foreign domain link canceled: %s%s", adr, fil); } } else { if (opt->wizard) { // mode wizard forbidden_url = 0; // même domaine hts_log_print(opt, LOG_DEBUG, "same domain link authorized: %s%s", adr, fil); } } } else forbidden_url = 1; } break; case HTS_TRAVEL_SAME_TLD: { size_t i = strlen(adr) - 1; size_t j = strlen(urladr()) - 1; while ((i > 0) && (adr[i] != '.')) i--; while ((j > 0) && (urladr()[j] != '.')) j--; if ((i > 0) && (j > 0)) { if (!strfield2(adr + i, urladr() + j)) { // !- if (!opt->wizard) { // mode non wizard forbidden_url = 1; // pas même .xx hts_log_print(opt, LOG_DEBUG, "foreign location link canceled: %s%s", adr, fil); } } else { if (opt->wizard) { // mode wizard forbidden_url = 0; // même domaine hts_log_print(opt, LOG_DEBUG, "same location link authorized: %s%s", adr, fil); } } } else forbidden_url = 1; } break; case HTS_TRAVEL_EVERYWHERE: if (opt->wizard) { // mode wizard forbidden_url = 0; break; } } // switch // ANCIENNE POS -- récupérer les liens à côtés d'un lien (nearlink) } // fin test adresse identique/différente // -------------------- PHASE 3 -------------------- // récupérer les liens à côtés d'un lien (nearlink) (nvelle pos) if (forbidden_url != 0 && opt->nearlink) { if (!ishtml(opt, fil)) { // non html forbidden_url = 0; // autoriser may_set_prio_to = 1 + 1; // set prio to 1 (parse but skip urls) if near is the winner hts_log_print(opt, LOG_DEBUG, "near link authorized: %s%s", adr, fil); } } // -------------------- PHASE 3-BIS -------------------- /* Built-in known tags (, ..) */ if (forbidden_url != 0 && embedded_triggered) { forbidden_url = 0; // autoriser may_set_prio_to = 1 + 1; // set prio to 1 (parse but skip urls) if near is the winner hts_log_print(opt, LOG_DEBUG, "near link authorized (friendly tag): %s%s", adr, fil); } // -------------------- PHASE 4 -------------------- // ------------------------------------------------------ // Si wizard, il se peut qu'on autorise ou qu'on interdise // un lien spécial avant même de tester sa position, sa hiérarchie etc. // peut court-circuiter le forbidden_url précédent if (opt->wizard) { // le wizard entre en action.. // int question = 1; // poser une question int force_mirror = 0; // pour mirror links int filters_answer = 0; // décision prise par les filtres char BIGSTK l[HTS_URLMAXSIZE * 2]; char BIGSTK lfull[HTS_URLMAXSIZE * 2]; if (forbidden_url != -1) question = 0; // pas de question, résolu // former URL complète du lien actuel strcpybuff(l, jump_identification_const(adr)); if (*fil != '/') strcatbuff(l, "/"); strcatbuff(l, fil); // full version (http://foo:bar@www.foo.com/bar.html) if (!link_has_authority(adr)) strcpybuff(lfull, "http://"); else lfull[0] = '\0'; strcatbuff(lfull, adr); if (*fil != '/') strcatbuff(lfull, "/"); strcatbuff(lfull, fil); // tester filters (URLs autorisées ou interdites explicitement) // si lien primaire on saute le joker, on est pas lémur if (ptr == 0) { // lien primaire, autoriser question = 1; // la question sera résolue automatiquement forbidden_url = 0; may_set_prio_to = 0; // clear may-set flag } else { // eternal depth first // vérifier récursivité extérieure if (opt->extdepth > 0) { if ( /*question && */ (ptr > 0) && (!force_mirror)) { // well, this is kinda a hak // we don't want to mirror EVERYTHING, and we have to decide where to stop // there is no way yet to tag "external" links, and therefore links that are // "weak" (authorized depth < external depth) are just not considered for external // hack if (heap(ptr)->depth > opt->extdepth) { // *set_prio_to = opt->extdepth + 1; *set_prio_to = 1 + (opt->extdepth); may_set_prio_to = 0; // clear may-set flag forbidden_url = 0; // autorisé question = 0; // résolution auto if (question) { hts_log_print(opt, LOG_DEBUG, "(wizard) ambiguous link accepted (external depth): link %s at %s%s", l, urladr(), urlfil()); } else { hts_log_print(opt, LOG_DEBUG, "(wizard) forced to accept link (external depth): link %s at %s%s", l, urladr(), urlfil()); } } } } // filters { int jok; const char *mdepth = ""; // filters, 0=sait pas 1=ok -1=interdit { int jokDepth = 0; jok = fa_strjoker_dual(/*url */ 0, _FILTERS, *_FILTERS_PTR, lfull, l, NULL, NULL, &jokDepth); mdepth = _FILTERS[jokDepth]; } if (jok == 1) { // autorisé filters_answer = 1; // décision prise par les filtres question = 0; // ne pas poser de question, autorisé forbidden_url = 0; // URL autorisée may_set_prio_to = 0; // clear may-set flag hts_log_print(opt, LOG_DEBUG, "(wizard) explicit authorized (%s) link: link %s at %s%s", mdepth, l, urladr(), urlfil()); } else if (jok == -1) { // forbidden filters_answer = 1; // décision prise par les filtres question = 0; // ne pas poser de question: forbidden_url = 1; // URL interdite hts_log_print(opt, LOG_DEBUG, "(wizard) explicit forbidden (%s) link: link %s at %s%s", mdepth, l, urladr(), urlfil()); } // sinon on touche à rien } } // vérifier mode mirror links if (question) { if (opt->mirror_first_page) { // mode mirror links if (heap(ptr)->precedent == 0) { // parent=primary! forbidden_url = 0; // autorisé may_set_prio_to = 0; // clear may-set flag question = 1; // résolution auto force_mirror = 5; // mirror (5) hts_log_print(opt, LOG_DEBUG, "(wizard) explicit mirror link: link %s at %s%s", l, urladr(), urlfil()); } } } // on doit poser la question.. peut on la poser? // (oui je sais quel preuve de délicatesse, merci merci) if ((question) && (ptr > 0) && (!force_mirror)) { if (opt->wizard == HTS_WIZARD_AUTO) { question = 0; forbidden_url = 1; hts_log_print(opt, LOG_DEBUG, "(wizard) ambiguous forbidden link: link %s at %s%s", l, urladr(), urlfil()); } } // vérifier robots.txt if (opt->robots) { int r = checkrobots(_ROBOTS, adr, fil); if (r == -1) { // interdiction #if DEBUG_ROBOTS printf("robots.txt forbidden: %s%s\n", adr, fil); #endif // question résolue, par les filtres, et mode robot non strict if ((!question) && (filters_answer) && (opt->robots == HTS_ROBOTS_SOMETIMES) && (forbidden_url != 1)) { r = 0; // annuler interdiction des robots if (!forbidden_url) { hts_log_print(opt, LOG_DEBUG, "Warning link followed against robots.txt: link %s at %s%s", l, adr, fil); } } if (r == -1) { // interdire forbidden_url = 1; question = 0; hts_log_print(opt, LOG_DEBUG, "(robots.txt) forbidden link: link %s at %s%s", l, adr, fil); } } } if (!question) { if (!forbidden_url) { hts_log_print(opt, LOG_DEBUG, "(wizard) shared foreign domain link: link %s at %s%s", l, urladr(), urlfil()); } else { hts_log_print(opt, LOG_DEBUG, "(wizard) cancelled foreign domain link: link %s at %s%s", l, urladr(), urlfil()); } #if BDEBUG==3 printf("at %s in %s, wizard says: url %s ", urladr(), urlfil(), l); if (forbidden_url) printf("cancelled"); else printf(">SHARED<"); printf("\n"); #endif } /* en cas de question, ou lien primaire (enregistrer autorisations) */ if (question || (ptr == 0)) { const char *s; int n = 0; // si primaire (plus bas) alors ... if ((ptr != 0) && (force_mirror == 0)) { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; tempo[0] = '\0'; strcatbuff(tempo, adr); strcatbuff(tempo, fil); s = RUN_CALLBACK1(opt, query3, tempo); if (strnotempty(s) == 0) // entrée n = 0; else if (isdigit((unsigned char) *s)) sscanf(s, "%d", &n); else { switch (*s) { case '*': n = -1; break; case '!': n = -999; { /*char *a; int i; a=copie_de_adr-128; if (aseeker & HTS_SEEKER_DOWN) == 0) { n = 7; } else { n = 5; // autoriser miroir répertoires descendants (lien primaire) } } else // forcer valeur (sub-wizard) n = force_mirror; } /* sanity check - reallocate filters HERE */ if ((*_FILTERS_PTR) + 1 >= opt->maxfilter) { opt->maxfilter += HTS_FILTERSINC; if (filters_init(&_FILTERS, opt->maxfilter, HTS_FILTERSINC) == 0) { printf("PANIC! : Too many filters : >%d [%d]\n", (*_FILTERS_PTR), __LINE__); fflush(stdout); hts_log_print(opt, LOG_PANIC, "Too many filters, giving up..(>%d)", (*_FILTERS_PTR)); hts_log_print(opt, LOG_INFO, "To avoid that: use #F option for more filters (example: -#F5000)"); assertf("too many filters - giving up" == NULL); // wild.. } } // here we have enough room for a new filter if necessary switch (n) { case -1: // sauter tout le reste forbidden_url = 1; opt->wizard = HTS_WIZARD_AUTO; // sauter tout le reste break; case 0: // forbid the same link: adr/fil forbidden_url = 1; HT_INSERT_FILTERS0; // insert at slot 0 { htsbuff f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "-"); htsbuff_cat(&f, jump_identification_const(adr)); if (*fil != '/') htsbuff_cat(&f, "/"); htsbuff_cat(&f, fil); } break; case 1: // forbid the whole directory and subdirs: adr/path/* forbidden_url = 1; { size_t i = strlen(fil) - 1; while((fil[i] != '/') && (i > 0)) i--; if (fil[i] == '/') { htsbuff f; HT_INSERT_FILTERS0; // insert at slot 0 f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "-"); htsbuff_cat(&f, jump_identification_const(adr)); if (*fil != '/') htsbuff_cat(&f, "/"); htsbuff_catn(&f, fil, i); if (f.len > 0 && f.buf[f.len - 1] != '/') htsbuff_cat(&f, "/"); htsbuff_cat(&f, "*"); } } // ** ... break; case 2: // the whole address: adr* forbidden_url = 1; HT_INSERT_FILTERS0; // insert at slot 0 { htsbuff f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "-"); htsbuff_cat(&f, jump_identification_const(adr)); htsbuff_cat(&f, "*"); } break; case 3: // ** A FAIRE forbidden_url = 1; /* { int i=strlen(adr)-1; while((adr[i]!='/') && (i>0)) i--; if (i>0) { } } */ break; // case 4: // same link // PAS BESOIN!! /*HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"+"); strcatbuff(_FILTERS[0],adr); if (*fil!='/') strcatbuff(_FILTERS[0],"/"); strcatbuff(_FILTERS[0],fil); */ // étant donné le renversement wizard/primary filter (les primary autorisent up/down ET interdisent) // il faut éviter d'un lien isolé effectue un miroir total.. *set_prio_to = 0 + 1; // niveau de récursion=0 (pas de miroir) break; case 5: // allow the whole directory and its children if ((opt->seeker & HTS_SEEKER_UP) == 0) { // not allowed to go up size_t i = strlen(fil) - 1; while((fil[i] != '/') && (i > 0)) i--; if (fil[i] == '/') { HT_INSERT_FILTERS0; // insert at slot 0 { htsbuff f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "+"); htsbuff_cat(&f, jump_identification_const(adr)); if (*fil != '/') htsbuff_cat(&f, "/"); htsbuff_catn(&f, fil, i + 1); htsbuff_cat(&f, "*"); } } } else { // then allow the domain HT_INSERT_FILTERS0; // insert at slot 0 { htsbuff f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "+"); htsbuff_cat(&f, jump_identification_const(adr)); htsbuff_cat(&f, "*"); } } break; case 6: // same domain HT_INSERT_FILTERS0; // insert at slot 0 { htsbuff f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "+"); htsbuff_cat(&f, jump_identification_const(adr)); htsbuff_cat(&f, "*"); } break; // case 7: // allow this directory { size_t i = strlen(fil) - 1; while ((fil[i] != '/') && (i > 0)) i--; if (fil[i] == '/') { HT_INSERT_FILTERS0; // insert at slot 0 { htsbuff f = htsbuff_ptr(_FILTERS[0], HTS_FILTER_SLOT_SIZE); htsbuff_cpy(&f, "+"); htsbuff_cat(&f, jump_identification_const(adr)); if (*fil != '/') htsbuff_cat(&f, "/"); htsbuff_catn(&f, fil, i + 1); htsbuff_cat(&f, "*[file]"); } } } break; case 50: // on fait rien break; } // switch } // test du wizard sur l'url } // fin du test wizard.. // -------------------- PHASE 5 -------------------- // lien non autorisé, peut-on juste le tester? if (just_test_it) { if (forbidden_url == 1) { if (opt->travel & HTS_TRAVEL_TEST_ALL) { // tester tout de même if (strfield(adr, "ftp://") == 0) { // PAS ftp! forbidden_url = 1; // oui oui toujours interdit (note: sert à rien car ==1 mais c pour comprendre) *just_test_it = 1; // mais on teste hts_log_print(opt, LOG_DEBUG, "Testing link %s%s", adr, fil); } } } } // -------------------- FINAL PHASE -------------------- // Test if the "Near" test won if (may_set_prio_to && forbidden_url == 0) { *set_prio_to = may_set_prio_to; } return forbidden_url; #undef _FILTERS #undef _FILTERS_PTR #undef _ROBOTS } int hts_acceptmime(httrackp * opt, int ptr, const char *adr, const char *fil, const char *mime) { #define _FILTERS (*opt->filters.filters) #define _FILTERS_PTR (opt->filters.filptr) #define _ROBOTS ((robots_wizard*)opt->robotsptr) int forbidden_url = -1; const char *mdepth = ""; int jokDepth = 0; int jok = 0; /* Authorized ? */ jok = fa_strjoker( /*mime */ 1, _FILTERS, *_FILTERS_PTR, mime, NULL, NULL, &jokDepth); if (jok != 0) { mdepth = _FILTERS[jokDepth]; if (jok == 1) { // autorisé forbidden_url = 0; // URL autorisée hts_log_print(opt, LOG_DEBUG, "(wizard) explicit authorized (%s) link %s%s: mime '%s'", mdepth, adr, fil, mime); } else if (jok == -1) { // forbidden forbidden_url = 1; // URL interdite hts_log_print(opt, LOG_DEBUG, "(wizard) explicit forbidden (%s) link %s%s: mime '%s'", mdepth, adr, fil, mime); } // sinon on touche à rien } /* userdef test */ { int test_url = RUN_CALLBACK4(opt, check_mime, adr, fil, mime, forbidden_url); if (test_url != -1) { forbidden_url = test_url; } } return forbidden_url; #undef _FILTERS #undef _FILTERS_PTR #undef _ROBOTS } // tester taille int hts_testlinksize(httrackp * opt, const char *adr, const char *fil, LLint size) { int jok = 0; if (size >= 0) { char BIGSTK l[HTS_URLMAXSIZE * 2]; char BIGSTK lfull[HTS_URLMAXSIZE * 2]; if (size >= 0) { LLint sz = size; int size_flag = 0; // former URL complète du lien actuel strcpybuff(l, jump_identification_const(adr)); if (*fil != '/') strcatbuff(l, "/"); strcatbuff(l, fil); // if (!link_has_authority(adr)) strcpybuff(lfull, "http://"); else lfull[0] = '\0'; strcatbuff(lfull, adr); if (*fil != '/') strcatbuff(l, "/"); strcatbuff(lfull, fil); // filters, 0=sait pas 1=ok -1=interdit { sz = size; jok = fa_strjoker_dual(/*url */ 0, *opt->filters.filters, *opt->filters.filptr, lfull, l, &sz, &size_flag, NULL); } // log if (jok == 1) { hts_log_print(opt, LOG_DEBUG, "File confirmed (size test): %s%s (" LLintP ")", adr, fil, (LLint) (size)); } else if (jok == -1) { if (size_flag) { /* interdit à cause de la taille */ hts_log_print(opt, LOG_DEBUG, "File cancelled due to its size: %s%s (" LLintP ", limit: " LLintP ")", adr, fil, (LLint) (size), (LLint) (sz)); } else { jok = 1; } } } } return jok; } #undef HT_INSERT_FILTERS0 httrack-3.49.14/src/htstools.c0000644000175000017500000011614615230602340011633 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* various tools (filename analyzing ..) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE /* String */ #include #include "htscore.h" #include "htstools.h" #include "htsstrings.h" #include "htscharset.h" #ifdef _WIN32 #include "windows.h" #else #include #ifdef HAVE_UNISTD_H #include #endif #include #endif // Portable directory find functions #ifndef HTS_DEF_FWSTRUCT_find_handle_struct #define HTS_DEF_FWSTRUCT_find_handle_struct typedef struct find_handle_struct find_handle_struct; #endif #ifdef _WIN32 struct find_handle_struct { WIN32_FIND_DATAA hdata; HANDLE handle; }; #else struct find_handle_struct { DIR *hdir; struct dirent *dirp; STRUCT_STAT filestat; char path[2048]; }; #endif /* Tools */ static int ehexh(char c) { if ((c >= '0') && (c <= '9')) return c - '0'; if ((c >= 'a') && (c <= 'f')) c -= ('a' - 'A'); if ((c >= 'A') && (c <= 'F')) return (c - 'A' + 10); return 0; } static int ehex(const char *s) { return 16 * ehexh(*s) + ehexh(*(s + 1)); } static void unescapehttp(const char *s, String * tempo) { size_t i; for(i = 0; s[i] != '\0'; i++) { if (s[i] == '%' && s[i + 1] == '%') { i++; StringAddchar(*tempo, '%'); } else if (s[i] == '%') { char hc; i++; hc = (char) ehex(s + i); StringAddchar(*tempo, (char) hc); i++; // sauter 2 caractères finalement } else if (s[i] == '+') { StringAddchar(*tempo, ' '); } else StringAddchar(*tempo, s[i]); } } // forme à partir d'un lien et du contexte (origin_fil et origin_adr d'où il est tiré) adr et fil // [adr et fil sont des buffers de 1ko] // 0 : ok // -1 : erreur // -2 : protocole non supporté (ftp) int ident_url_relatif(const char *lien, const char *origin_adr, const char *origin_fil, lien_adrfil* const adrfil) { int ok = 0; int scheme = 0; assertf(adrfil != NULL); adrfil->adr[0] = '\0'; adrfil->fil[0] = '\0'; //effacer buffers // lien non vide! if (strnotempty(lien) == 0) return -1; // erreur! // Scheme? { const char *a = lien; while(isalpha((unsigned char) *a)) a++; if (*a == ':') scheme = 1; } // filtrer les parazites (mailto & cie) // scheme+authority (//) if ((strfield(lien, "http://")) // scheme+// || (strfield(lien, "file://")) // scheme+// || (strncmp(lien, "//", 2) == 0) // // sans scheme (-> default) ) { if (ident_url_absolute(lien, adrfil) == -1) { ok = -1; // erreur URL } } else if (strfield(lien, "ftp://")) { // Note: ftp:foobar.gif is not valid if (ftp_available()) { // ftp supporté if (ident_url_absolute(lien, adrfil) == -1) { ok = -1; // erreur URL } } else { ok = -2; // non supporté } #if HTS_USEOPENSSL } else if (strfield(lien, "https://")) { // Note: ftp:foobar.gif is not valid if (ident_url_absolute(lien, adrfil) == -1) { ok = -1; // erreur URL } #endif } else if ((scheme) && ((!strfield(lien, "http:")) && (!strfield(lien, "https:")) && (!strfield(lien, "ftp:")) )) { ok = -1; // unknown scheme } else { // c'est un lien relatif // On forme l'URL complète à partie de l'url actuelle // et du chemin actuel si besoin est. // sanity check if (origin_adr == NULL || origin_fil == NULL || *origin_adr == '\0' || *origin_fil == '\0') { return -1; } // copier adresse if (((int) strlen(origin_adr) < HTS_URLMAXSIZE) && ((int) strlen(origin_fil) < HTS_URLMAXSIZE) && ((int) strlen(lien) < HTS_URLMAXSIZE)) { /* patch scheme if necessary */ if (strfield(lien, "http:")) { lien += 5; strcpybuff(adrfil->adr, jump_protocol_const(origin_adr)); // même adresse ; protocole vide (http) } else if (strfield(lien, "https:")) { lien += 6; strcpybuff(adrfil->adr, "https://"); // même adresse forcée en https strcatbuff(adrfil->adr, jump_protocol_const(origin_adr)); } else if (strfield(lien, "ftp:")) { lien += 4; strcpybuff(adrfil->adr, "ftp://"); // même adresse forcée en ftp strcatbuff(adrfil->adr, jump_protocol_const(origin_adr)); } else { strcpybuff(adrfil->adr, origin_adr); // même adresse ; et même éventuel protocole } if (*lien != '/') { // sinon c'est un lien absolu if (*lien == '\0') { strcpybuff(adrfil->fil, origin_fil); } else if (*lien == '?') { // example: a href="?page=2" char *a; strcpybuff(adrfil->fil, origin_fil); a = strchr(adrfil->fil, '?'); if (a) *a = '\0'; strcatbuff(adrfil->fil, lien); } else { const char *a = strchr(origin_fil, '?'); if (a == NULL) a = origin_fil + strlen(origin_fil); while((*a != '/') && (a > origin_fil)) a--; if (*a == '/') { // ok on a un '/' if ((((int) (a - origin_fil)) + 1 + strlen(lien)) < HTS_URLMAXSIZE) { // copier chemin strncpy(adrfil->fil, origin_fil, ((int) (a - origin_fil)) + 1); *(adrfil->fil + ((int) (a - origin_fil)) + 1) = '\0'; // copier chemin relatif if (((int) strlen(adrfil->fil) + (int) strlen(lien)) < HTS_URLMAXSIZE) { strcatbuff(adrfil->fil, lien + ((*lien == '/') ? 1 : 0)); // simplifier url pour les ../ fil_simplifie(adrfil->fil); } else ok = -1; // erreur } else { // erreur ok = -1; // erreur URL } } else { // erreur ok = -1; // erreur URL } } } else { // chemin absolu // copier chemin directement strcatbuff(adrfil->fil, lien); fil_simplifie(adrfil->fil); } // *lien!='/' } else ok = -1; } // test news: etc. // case insensitive pour adresse { char *a = jump_identification(adrfil->adr); while(*a) { if ((*a >= 'A') && (*a <= 'Z')) *a += 'a' - 'A'; a++; } } // IDNA / RFC 3492 (Punycode) handling for HTTP(s) if (!link_has_authority(adrfil->adr) || strfield(adrfil->adr, "https:")) { char *const a = jump_identification(adrfil->adr); // Non-ASCII characters (theorically forbidden, but browsers are lenient) if (!hts_isStringAscii(a, strlen(a))) { char *const idna = hts_convertStringUTF8ToIDNA(a, strlen(a)); if (idna != NULL) { if (strlen(idna) < HTS_URLMAXSIZE) { /* a points within adrfil->adr; bound by the remaining capacity */ strlcpybuff(a, idna, sizeof(adrfil->adr) - (size_t) (a - adrfil->adr)); } free(idna); } } } return ok; } // créer dans s, à partir du chemin courant curr_fil, le lien vers link (absolu) // un ident_url_relatif a déja été fait avant, pour que link ne soit pas un chemin relatif int lienrelatif(char *s, size_t ssize, const char *link, const char *curr_fil) { char BIGSTK _curr[HTS_URLMAXSIZE * 2]; char BIGSTK newcurr_fil[HTS_URLMAXSIZE * 2], newlink[HTS_URLMAXSIZE * 2]; char *curr; char *a; int slash = 0; // newcurr_fil[0] = '\0'; newlink[0] = '\0'; // // patch: éliminer les ? (paramètres) sinon bug { const char *a; if ((a = strchr(curr_fil, '?'))) { strncatbuff(newcurr_fil, curr_fil, (int) (a - curr_fil)); curr_fil = newcurr_fil; } if ((a = strchr(link, '?'))) { strncatbuff(newlink, link, (int) (a - link)); link = newlink; } } // copy only the current path curr = _curr; strlcpybuff(curr, curr_fil, sizeof(_curr)); if ((a = strchr(curr, '?')) == NULL) // couper au ? (params) a = curr + strlen(curr) - 1; // pas de params: aller à la fin while((*a != '/') && (a > curr)) a--; // chercher dernier / du chemin courant if (*a == '/') *(a + 1) = '\0'; // couper dernier / // "effacer" s s[0] = '\0'; // sauter ce qui est commun aux 2 chemins { const char *l; if (*link == '/') link++; // sauter slash if (*curr == '/') curr++; l = link; // couper ce qui est commun while((streql(*link, *curr)) && (*link != 0)) { link++; curr++; } // mais on veut un répertoirer entier! // si on a /toto/.. et /toto2/.. on ne veut pas sauter /toto ! while(((*link != '/') || (*curr != '/')) && (link > l)) { link--; curr--; } } // calculer la profondeur du répertoire courant et remonter // LES ../ ONT ETE SIMPLIFIES a = curr; if (*a == '/') a++; while(*a) if (*(a++) == '/') strlcatbuff(s, "../", ssize); if (slash) strlcatbuff(s, "/", ssize); // keep it absolute! // we are in the starting directory, copy strlcatbuff(s, link + ((*link == '/') ? 1 : 0), ssize); /* Security check */ if (strlen(s) >= HTS_URLMAXSIZE) return -1; // on a maintenant une chaine de la forme ../../test/truc.html return 0; } /* Is the link absolute (http://www..) or relative (/bar/foo.html) ? */ int link_has_authority(const char *lien) { const char *a = lien; if (isalpha((unsigned char) *a)) { // Skip scheme? while(isalpha((unsigned char) *a)) a++; if (*a == ':') a++; else return 0; } if (strncmp(a, "//", 2) == 0) return 1; return 0; } int link_has_authorization(const char *lien) { const char *adr = jump_protocol_const(lien); const char *firstslash = strchr(adr, '/'); const char *detect = strchr(adr, '@'); if (firstslash) { if (detect) { return (detect < firstslash); } } else { return (detect != NULL); } return 0; } // conversion chemin de fichier/dossier vers 8-3 ou ISO9660 void long_to_83(int mode, char *n83, size_t n83size, char *save) { n83[0] = '\0'; while(*save) { char fn83[256], fnl[256]; size_t i, j; fn83[0] = fnl[0] = '\0'; for(i = j = 0 ; save[i] && save[i] != '/' ; i++) { if (j + 1 < sizeof(fnl)) { fnl[j++] = save[i]; } } fnl[j] = '\0'; // conversion longfile_to_83(mode, fn83, sizeof(fn83), fnl); strlcatbuff(n83, fn83, n83size); save += i; if (*save == '/') { strlcatbuff(n83, "/", n83size); save++; } } } // conversion nom de fichier/dossier isolé vers 8-3 ou ISO9660 void longfile_to_83(int mode, char *n83, size_t n83size, char *save) { int j = 0, max = 0; int i = 0; char nom[256]; char ext[256]; nom[0] = ext[0] = '\0'; switch (mode) { case 1: max = 8; break; case 2: max = 31; break; default: max = 8; break; } /* No starting . */ if (save[0] == '.') { save[0] = '_'; } /* No multiple dots */ { char *last_dot = strrchr(save, '.'); char *dot; while((dot = strchr(save, '.'))) { *dot = '_'; } if (last_dot) { *last_dot = '.'; } } /* Avoid: (ISO9660, but also suitable for 8-3) (Thanks to jonat@cellcast.com for te hint) /:;?\#*~ 0x00-0x1f and 0x80-0xff */ for(i = 0, j = 0; save[i] != 0; i++) { char a = save[i]; if (a >= 'a' && a <= 'z') { a -= 'a' - 'A'; } else if (! ((a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9') || a == '_' || a == '.')) { if (j != 0 && save[j - 1] == '_') { continue; // avoid __ } a = '_'; } save[j++] = a; } save[j] = '\0'; i = j = 0; while((i < max) && (save[j]) && (save[j] != '.')) { if (save[j] != ' ') { nom[i] = save[j]; i++; } j++; } // recopier nom nom[i] = '\0'; if (save[j]) { // il reste au moins un point i = (int) strlen(save) - 1; while((i > 0) && (save[i] != '.') && (save[i] != '/')) i--; // rechercher dernier . if (save[i] == '.') { // point! int j = 0; i++; while((j < 3) && (save[i])) { if (save[i] != ' ') { ext[j] = save[i]; j++; } i++; } ext[j] = '\0'; } } // corriger vers 8-3 n83[0] = '\0'; strlncatbuff(n83, nom, n83size, max); if (strnotempty(ext)) { strlcatbuff(n83, ".", n83size); strlncatbuff(n83, ext, n83size, 3); } } // écrire backblue.gif /* Note: utf-8 */ int verif_backblue(httrackp * opt, const char *base) { int ret = 0; // if (!base) { // init opt->state.verif_backblue_done = 0; return 0; } if ((!opt->state.verif_backblue_done) || (fsize_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), base, "backblue.gif")) != HTS_DATA_BACK_GIF_LEN)) { FILE *fp = filecreate(&opt->state.strc, fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), base, "backblue.gif")); opt->state.verif_backblue_done = 1; if (fp) { if (fwrite(HTS_DATA_BACK_GIF, HTS_DATA_BACK_GIF_LEN, 1, fp) != HTS_DATA_BACK_GIF_LEN) ret = 1; fclose(fp); usercommand(opt, 0, NULL, fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), base, "backblue.gif"), "", ""); } else ret = 1; // fp = filecreate(&opt->state.strc, fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), base, "fade.gif")); if (fp) { if (fwrite(HTS_DATA_FADE_GIF, HTS_DATA_FADE_GIF_LEN, 1, fp) != HTS_DATA_FADE_GIF_LEN) ret = 1; fclose(fp); usercommand(opt, 0, NULL, fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), base, "fade.gif"), "", ""); } else ret = 1; } return ret; } // flag int verif_external(httrackp * opt, int nb, int test) { const int flag = 1 << nb; int *const status = &opt->state.verif_external_status; if (!test) *status &= ~flag; // reset else if ((*status & flag) == 0) { *status |= flag; return 1; } return 0; } // recherche chaîne de type truc= // renvoi décalage à effectuer ou 0 si non trouvé /* SECTION OPTIMISEE: #define rech_tageq(adr,s) ( \ ( (*(adr-1)=='<') || (is_space(*(adr-1))) ) ? \ ( (streql(*adr,*s)) ? \ (__rech_tageq(adr,s)) \ : 0 \ ) \ : 0\ ) */ /* HTS_INLINE int rech_tageq(const char* adr,const char* s) { if ( (*(adr-1)=='<') || (is_space(*(adr-1))) ) { // ') { break; } else { /* note: bogus for bogus foo = bar */ if (token == NULL) { if (strncasecmp(&adr[p], s, s_len) == 0 && (is_realspace(adr[p + s_len]) || adr[p + s_len] == '=') ) { for(p += s_len; is_realspace(adr[p]) || adr[p] == '='; p++) ; return p; } token = &adr[p]; } } } else if (adr[p] == quot) { quot = 0; } } return 0; } HTS_INLINE int rech_endtoken(const char *adr, const char **start) { char quote = '\0'; int length = 0; while(is_space(*adr)) adr++; if (*adr == '"' || *adr == '\'') quote = *adr++; *start = adr; while(*adr != 0 && *adr != quote && (quote != '\0' || !is_space(*adr))) { length++; adr++; } return length; } // same, but check beginning of adr with s (for ) HTS_INLINE int __rech_tageqbegdigits(const char *adr, const char *s) { int p; p = strfield(adr, s); if (p) { while(isdigit((unsigned char) adr[p])) p++; // jump digits while(is_space(adr[p])) p++; if (adr[p] == '=') { return p + 1; } } return 0; } // tag sans = HTS_INLINE int rech_sampletag(const char *adr, const char *s) { int p; if ((*(adr - 1) == '<') || (is_space(*(adr - 1)))) { // 0) { if (is_hypertext_mime(opt, type, "")) { if (maxhtml > 0) { if (size > maxhtml) ok = 0; } } else { if (maxnhtml > 0) { if (size > maxnhtml) ok = 0; } } } return (!ok); } static int sortTopIndexFnc(const void *a_, const void *b_) { int cmp; const topindex_chain *const*const a = (const topindex_chain *const*) a_; const topindex_chain *const*const b = (const topindex_chain *const*) b_; /* Category first, then name */ if ((cmp = (*a)->level - (*b)->level) == 0) { if ((cmp = strcmpnocase((*a)->category, (*b)->category)) == 0) { cmp = strcmpnocase((*a)->name, (*b)->name); } } return cmp; } typedef struct hts_template_format_buf { FILE *fp; char *buffer; size_t size; size_t offset; } hts_template_format_buf; // Bounded append to a template buffer (or FILE); returns -1 on overflow/error. static int htsfmt_putc(hts_template_format_buf *buf, char c) { if (buf->fp != NULL) { assertf(buf->buffer == NULL); if (fputc(c, buf->fp) < 0) return -1; } else { assertf(buf->buffer != NULL); if (buf->offset + 1 < buf->size) buf->buffer[buf->offset++] = c; else return -1; } return 0; } static int htsfmt_puts(hts_template_format_buf *buf, const char *s) { size_t i; assertf(s != NULL); for (i = 0; s[i] != '\0'; i++) { if (htsfmt_putc(buf, s[i]) < 0) return -1; } return 0; } // note: upstream arg list MUST be NULL-terminated for safety // returns a negative value upon error static int hts_template_formatv(hts_template_format_buf *buf, const char *format, va_list args) { #undef FPUTC #undef FPUTS #define FPUTC(C) \ do { \ if (htsfmt_putc(buf, (C)) < 0) \ return -1; \ } while (0) #define FPUTS(S) \ do { \ if (htsfmt_puts(buf, (S)) < 0) \ return -1; \ } while (0) if (buf != NULL && format != NULL) { const char *arg_expanded[32]; size_t i, nbArgs, posArgs; /* Expand internal code args. */ const char *str; for(nbArgs = 0 ; ( str = va_arg(args, const char*) ) != NULL ; nbArgs++) { assertf(nbArgs < sizeof(arg_expanded)/sizeof(arg_expanded[0])); arg_expanded[nbArgs] = str; } /* Expand user-injected format string. */ for(posArgs = 0, i = 0 ; format[i] != '\0' ; i++) { const unsigned char c = format[i]; if (c == '%') { const unsigned char cFormat = format[++i]; switch(cFormat) { case '%': FPUTC('%'); break; case 's': if (posArgs < nbArgs) { assertf(arg_expanded[posArgs] != NULL); FPUTS(arg_expanded[posArgs]); posArgs++; } else { FPUTS("???"); /* error (args overflow) */ } break; default: /* ignored */ FPUTC('%'); FPUTC(cFormat); break; } } else { FPUTC(c); } } /* Terminating NULL. */ if (buf->buffer != NULL) { buf->buffer[buf->offset] = 0; } return 1; } else { return -1; } #undef FPUTC #undef FPUTS } // note: upstream arg list MUST be NULL-terminated for safety // returns a negative value upon error int hts_template_format(FILE *const out, const char *format, ...) { int success; hts_template_format_buf buf = { NULL, NULL, 0, 0 }; va_list args; buf.fp = out; va_start(args, format); success = hts_template_formatv(&buf, format, args); va_end(args); return success; } // note: upstream arg list MUST be NULL-terminated for safety // returns a negative value upon error int hts_template_format_str(char *buffer, size_t size, const char *format, ...) { int success; hts_template_format_buf buf = { NULL, NULL, 0, 0 }; va_list args; buf.buffer = buffer; buf.size = size; va_start(args, format); success = hts_template_formatv(&buf, format, args); va_end(args); return success; } // Value of the named field, or "" if absent (never NULL, so callers can pass it // straight to a formatter). static const char *footer_field_value(const hts_footer_field *fields, size_t nfields, const char *name) { size_t j; for (j = 0; j < nfields; j++) { if (strcmp(fields[j].name, name) == 0) return fields[j].value != NULL ? fields[j].value : ""; } return ""; } int hts_footer_format(char *buffer, size_t size, const char *footer, const hts_footer_field *fields, size_t nfields) { hts_template_format_buf buf = {NULL, buffer, size, 0}; size_t i; if (footer == NULL || buffer == NULL || size == 0) return -1; // %s keeps the legacy positional model, byte-for-byte for existing -%F // strings: addr, path, date, version, looked up by name and // order-independent. if (strstr(footer, "%s") != NULL) return hts_template_format_str( buffer, size, footer, footer_field_value(fields, nfields, "addr"), footer_field_value(fields, nfields, "path"), footer_field_value(fields, nfields, "date"), footer_field_value(fields, nfields, "version"), /* EOF */ NULL); // "{{"/"}}" emit a literal brace; an unknown "{...}" is left verbatim so // typos stay visible. for (i = 0; footer[i] != '\0'; i++) { const char c = footer[i]; if (c == '{' && footer[i + 1] == '{') { if (htsfmt_putc(&buf, '{') < 0) return -1; i++; } else if (c == '}' && footer[i + 1] == '}') { if (htsfmt_putc(&buf, '}') < 0) return -1; i++; } else if (c == '{') { const char *const end = strchr(footer + i + 1, '}'); int matched = 0; if (end != NULL) { const size_t namelen = (size_t) (end - (footer + i + 1)); size_t j; for (j = 0; j < nfields; j++) { if (strlen(fields[j].name) == namelen && strncmp(fields[j].name, footer + i + 1, namelen) == 0) { if (htsfmt_puts(&buf, fields[j].value != NULL ? fields[j].value : "") < 0) return -1; i += namelen + 1; // consume the name and its closing '}' matched = 1; break; } } } if (!matched && htsfmt_putc(&buf, '{') < 0) return -1; } else if (htsfmt_putc(&buf, c) < 0) { return -1; } } buffer[buf.offset] = '\0'; return 1; } /* Note: NOT utf-8 */ HTSEXT_API int hts_buildtopindex(httrackp * opt, const char *path, const char *binpath) { FILE *fpo; int retval = 0; char BIGSTK rpath[1024 * 2]; char *toptemplate_header = NULL, *toptemplate_body = NULL, *toptemplate_footer = NULL, *toptemplate_bodycat = NULL; char catbuff[CATBUFF_SIZE]; // et templates html toptemplate_header = readfile_or(fconcat(catbuff, sizeof(catbuff), binpath, "templates/topindex-header.html"), HTS_INDEX_HEADER); toptemplate_body = readfile_or(fconcat(catbuff, sizeof(catbuff), binpath, "templates/topindex-body.html"), HTS_INDEX_BODY); toptemplate_bodycat = readfile_or(fconcat(catbuff, sizeof(catbuff), binpath, "templates/topindex-bodycat.html"), HTS_INDEX_BODYCAT); toptemplate_footer = readfile_or(fconcat(catbuff, sizeof(catbuff), binpath, "templates/topindex-footer.html"), HTS_INDEX_FOOTER); if (toptemplate_header && toptemplate_body && toptemplate_footer && toptemplate_bodycat) { strcpybuff(rpath, path); if (rpath[0]) { if (rpath[strlen(rpath) - 1] == '/') rpath[strlen(rpath) - 1] = '\0'; } fpo = fopen(fconcat(catbuff, sizeof(catbuff), rpath, "/index.html"), "wb"); if (fpo) { find_handle h; // générer gif. verif_backblue() is utf-8, but our path is the system // charset, so on Windows convert it or the gifs land in a mangled twin // dir (#217). Elsewhere the system charset is already utf-8. #ifdef _WIN32 { const char *const base = concat(catbuff, sizeof(catbuff), rpath, "/"); char *const base_utf8 = hts_convertStringSystemToUTF8(base, strlen(base)); verif_backblue(opt, base_utf8 != NULL ? base_utf8 : base); free(base_utf8); } #else verif_backblue(opt, concat(catbuff, sizeof(catbuff), rpath, "/")); #endif // Header hts_template_format(fpo, toptemplate_header, "", /* EOF */ NULL); /* Find valid project names */ h = hts_findfirst(rpath); if (h) { struct topindex_chain *chain = NULL; struct topindex_chain *startchain = NULL; String iname = STRING_EMPTY; int chainSize = 0; do { if (hts_findisdir(h)) { StringCopy(iname, rpath); StringCat(iname, "/"); StringCat(iname, hts_findgetname(h)); StringCat(iname, "/index.html"); if (fexist(StringBuff(iname))) { int level = 0; char *category = NULL; struct topindex_chain *oldchain = chain; /* Check for an existing category */ StringCopy(iname, rpath); StringCat(iname, "/"); StringCat(iname, hts_findgetname(h)); StringCat(iname, "/hts-cache/winprofile.ini"); if (fexist(StringBuff(iname))) { category = hts_getcategory(StringBuff(iname)); if (category != NULL) { if (*category == '\0') { freet(category); category = NULL; } #ifdef _WIN32 /* category is ANSI-codepage, doc is utf-8: convert (#216) */ else { char *cat_utf8 = hts_convertStringSystemToUTF8( category, strlen(category)); if (cat_utf8 != NULL) { freet(category); category = cat_utf8; } } #endif } } if (category == NULL) { category = strdupt("No categories"); level = 1; } chain = calloc(sizeof(struct topindex_chain), 1); chainSize++; if (!startchain) { startchain = chain; } if (chain) { if (oldchain) { oldchain->next = chain; } chain->next = NULL; #ifdef _WIN32 /* name is ANSI-codepage, doc is utf-8: convert (#216) */ { const char *const name = hts_findgetname(h); char *name_utf8 = hts_convertStringSystemToUTF8(name, strlen(name)); strcpybuff(chain->name, name_utf8 != NULL ? name_utf8 : name); freet(name_utf8); } #else strcpybuff(chain->name, hts_findgetname(h)); #endif chain->category = category; chain->level = level; } } } } while(hts_findnext(h)); hts_findclose(h); StringFree(iname); /* Sort chain */ { struct topindex_chain **sortedElts = (struct topindex_chain **) calloct(sizeof(topindex_chain *), chainSize); assertf(sortedElts != NULL); if (sortedElts != NULL) { int i; const char *category = ""; /* Build array */ struct topindex_chain *chain = startchain; for(i = 0; i < chainSize; i++) { assertf(chain != NULL); sortedElts[i] = chain; chain = chain->next; } qsort(sortedElts, chainSize, sizeof(topindex_chain *), sortTopIndexFnc); /* Build sorted index */ for(i = 0; i < chainSize; i++) { char BIGSTK hname[HTS_URLMAXSIZE * 2]; escape_uri_utf(sortedElts[i]->name, hname, sizeof(hname)); /* Changed category */ if (strcmp(category, sortedElts[i]->category) != 0) { category = sortedElts[i]->category; hts_template_format(fpo, toptemplate_bodycat, category, /* EOF */ NULL); } hts_template_format(fpo, toptemplate_body, hname, sortedElts[i]->name, /* EOF */ NULL); } /* Wipe elements */ for(i = 0; i < chainSize; i++) { freet(sortedElts[i]->category); freet(sortedElts[i]); sortedElts[i] = NULL; } freet(sortedElts); /* Return value */ retval = 1; } } } // Footer hts_template_format(fpo, toptemplate_footer, "", /* EOF */ NULL); fclose(fpo); } } if (toptemplate_header) freet(toptemplate_header); if (toptemplate_body) freet(toptemplate_body); if (toptemplate_footer) freet(toptemplate_footer); if (toptemplate_body) freet(toptemplate_body); return retval; } /* Note: NOT utf-8 */ HTSEXT_API char *hts_getcategory(const char *filename) { String categ = STRING_EMPTY; if (fexist(filename)) { FILE *fp = fopen(filename, "rb"); if (fp != NULL) { int done = 0; while(!feof(fp) && !done) { char BIGSTK line[1024]; int n = linput(fp, line, sizeof(line) - 2); if (n > 0) { if (strfield(line, "category=")) { unescapehttp(line + 9, &categ); done = 1; } } } fclose(fp); } } return StringBuffRW(categ); } /* Note: NOT utf-8 */ HTSEXT_API char *hts_getcategories(char *path, int type) { String categ = STRING_EMPTY; String profiles = STRING_EMPTY; char *rpath = path; find_handle h; coucal hashCateg = NULL; if (rpath[0]) { if (rpath[strlen(rpath) - 1] == '/') { rpath[strlen(rpath) - 1] = '\0'; /* note: patching stored (inhash) value */ } } h = hts_findfirst(rpath); if (h) { String iname = STRING_EMPTY; if (type == 1) { hashCateg = coucal_new(0); coucal_set_name(hashCateg, "hashCateg"); StringCat(categ, "Test category 1"); StringCat(categ, "\r\nTest category 2"); } do { if (hts_findisdir(h)) { char BIGSTK line2[1024]; StringCopy(iname, rpath); StringCat(iname, "/"); StringCat(iname, hts_findgetname(h)); StringCat(iname, "/hts-cache/winprofile.ini"); if (fexist(StringBuff(iname))) { if (type == 1) { FILE *fp = fopen(StringBuff(iname), "rb"); if (fp != NULL) { int done = 0; while(!feof(fp) && !done) { int n = linput(fp, line2, sizeof(line2) - 2); if (n > 0) { if (strfield(line2, "category=")) { if (*(line2 + 9)) { if (!coucal_read(hashCateg, line2 + 9, NULL)) { coucal_write(hashCateg, line2 + 9, 0); if (StringLength(categ) > 0) { StringCat(categ, "\r\n"); } unescapehttp(line2 + 9, &categ); } } done = 1; } } } line2[0] = '\0'; fclose(fp); } } else { if (StringLength(profiles) > 0) { StringCat(profiles, "\r\n"); } StringCat(profiles, hts_findgetname(h)); } } } } while(hts_findnext(h)); hts_findclose(h); StringFree(iname); } if (hashCateg) { coucal_delete(&hashCateg); hashCateg = NULL; } if (type == 1) return StringBuffRW(categ); else return StringBuffRW(profiles); } // Portable directory find functions /* // Example: find_handle h = hts_findfirst("/tmp"); if (h) { do { if (hts_findisfile(h)) printf("File: %s (%d octets)\n",hts_findgetname(h),hts_findgetsize(h)); else if (hts_findisdir(h)) printf("Dir: %s\n",hts_findgetname(h)); } while(hts_findnext(h)); hts_findclose(h); } */ HTSEXT_API find_handle hts_findfirst(char *path) { if (path) { if (strnotempty(path)) { find_handle_struct *find = (find_handle_struct *) calloc(1, sizeof(find_handle_struct)); if (find) { memset(find, 0, sizeof(find_handle_struct)); #ifdef _WIN32 { char BIGSTK rpath[1024 * 2]; strcpybuff(rpath, path); if (rpath[0]) { if (rpath[strlen(rpath) - 1] != '\\') strcatbuff(rpath, "\\"); } strcatbuff(rpath, "*.*"); find->handle = FindFirstFileA(rpath, &find->hdata); if (find->handle != INVALID_HANDLE_VALUE) return find; } #else strcpybuff(find->path, path); { if (find->path[0]) { if (find->path[strlen(find->path) - 1] != '/') strcatbuff(find->path, "/"); } } find->hdir = opendir(path); if (find->hdir != NULL) { if (hts_findnext(find) == 1) return find; } #endif free((void *) find); } } } return NULL; } HTSEXT_API hts_boolean hts_findnext(find_handle find) { if (find) { #ifdef _WIN32 if ((FindNextFileA(find->handle, &find->hdata))) return 1; #else char catbuff[CATBUFF_SIZE]; memset(&(find->filestat), 0, sizeof(find->filestat)); if ((find->dirp = readdir(find->hdir))) if (find->dirp->d_name) if (!STAT (concat(catbuff, sizeof(catbuff), find->path, find->dirp->d_name), &find->filestat)) return 1; #endif } return 0; } HTSEXT_API int hts_findclose(find_handle find) { if (find) { #ifdef _WIN32 if (find->handle) { FindClose(find->handle); find->handle = NULL; } #else if (find->hdir) { closedir(find->hdir); find->hdir = NULL; } #endif free((void *) find); } return 0; } HTSEXT_API char *hts_findgetname(find_handle find) { if (find) { #ifdef _WIN32 return find->hdata.cFileName; #else if (find->dirp) return find->dirp->d_name; #endif } return NULL; } HTSEXT_API int hts_findgetsize(find_handle find) { if (find) { #ifdef _WIN32 return find->hdata.nFileSizeLow; #else return find->filestat.st_size; #endif } return -1; } HTSEXT_API hts_boolean hts_findisdir(find_handle find) { if (find) { if (!hts_findissystem(find)) { #ifdef _WIN32 if (find->hdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) return 1; #else if (S_ISDIR(find->filestat.st_mode)) return 1; #endif } } return 0; } HTSEXT_API hts_boolean hts_findisfile(find_handle find) { if (find) { if (!hts_findissystem(find)) { #ifdef _WIN32 if (!(find->hdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) return 1; #else if (S_ISREG(find->filestat.st_mode)) return 1; #endif } } return 0; } HTSEXT_API hts_boolean hts_findissystem(find_handle find) { if (find) { #ifdef _WIN32 if (find->hdata. dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_TEMPORARY)) return 1; else if ((!strcmp(find->hdata.cFileName, "..")) || (!strcmp(find->hdata.cFileName, "."))) return 1; #else if ((S_ISCHR(find->filestat.st_mode)) || (S_ISBLK(find->filestat.st_mode)) || (S_ISFIFO(find->filestat.st_mode)) || (S_ISSOCK(find->filestat.st_mode)) ) return 1; else if ((!strcmp(find->dirp->d_name, "..")) || (!strcmp(find->dirp->d_name, "."))) return 1; #endif } return 0; } httrack-3.49.14/src/htsrobots.c0000644000175000017500000001726615230602340012006 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* robots.txt (website robot file) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE /* specific definitions */ #include "htscore.h" #include "htsbase.h" #include "htslib.h" /* END specific definitions */ #include "htsrobots.h" // -- robots -- /* RFC 9309 path-prefix match; '*' any run, '$' anchors end; linear. */ static hts_boolean robots_pattern_match(const char *pattern, const char *path) { size_t patlen = strlen(pattern); hts_boolean anchored = HTS_FALSE; const char *p, *pend, *s; const char *star = NULL, *star_s = NULL; if (patlen > 0 && pattern[patlen - 1] == '$') { anchored = HTS_TRUE; patlen--; } p = pattern; pend = pattern + patlen; s = path; while (*s != '\0') { if (p == pend) { if (!anchored) return HTS_TRUE; // prefix matched if (star != NULL) { // anchored: '*' must eat the rest p = star + 1; s = ++star_s; continue; } return HTS_FALSE; } if (*p == '*') { star = p++; star_s = s; } else if (*p == *s) { p++; s++; } else if (star != NULL) { p = star + 1; s = ++star_s; } else { return HTS_FALSE; } } while (p < pend && *p == '*') p++; return (p == pend) ? HTS_TRUE : HTS_FALSE; } // fil="" : vérifier si règle déja enregistrée int checkrobots(robots_wizard * robots, const char *adr, const char *fil) { while(robots) { if (strfield2(robots->adr, adr)) { if (fil[0]) { /* RFC 9309: longest pattern wins, Allow beats Disallow on ties. */ int ptr = 0; char line[HTS_ROBOTS_TOKEN_SIZE]; size_t toklen = strlen(robots->token); size_t best_len = 0; hts_boolean matched = HTS_FALSE; hts_boolean best_allow = HTS_FALSE; while (ptr < (int) toklen) { ptr += binput(robots->token + ptr, line, sizeof(line) - 1); if (line[0] != 'A' && line[0] != 'D') continue; { const hts_boolean is_allow = (line[0] == 'A') ? HTS_TRUE : HTS_FALSE; const char *pat = line + 1; if (robots_pattern_match(pat, fil)) { const size_t len = strlen(pat); if (!matched || len > best_len || (len == best_len && is_allow)) { matched = HTS_TRUE; best_len = len; best_allow = is_allow; } } } } if (matched && !best_allow) return -1; // forbidden } else { return -1; } } robots = robots->next; } return 0; } /* Append "\n" to the bounded rule blob if it fits. */ static void robots_blob_add(char *blob, size_t blobsize, char marker, const char *pat) { const size_t used = strlen(blob); const size_t need = strlen(pat) + 2; // marker + '\n' if (need < blobsize - used) { // overflow-safe: used <= blobsize-1 blob[used] = marker; blob[used + 1] = '\0'; strlcatbuff(blob, pat, blobsize); strlcatbuff(blob, "\n", blobsize); } } void robots_parse(robots_wizard *robots, const char *adr, const char *body, size_t bodysize, char *info, size_t infosize, hts_boolean keep_root_disallow) { size_t bptr = 0; int record = 0; char BIGSTK line[1024]; char BIGSTK blob[HTS_ROBOTS_TOKEN_SIZE]; blob[0] = '\0'; if (info != NULL && infosize > 0) info[0] = '\0'; #if DEBUG_ROBOTS printf("robots.txt dump:\n%s\n", body); #endif while (bptr < bodysize) { char *comm; int llen; bptr += binput(body + bptr, line, sizeof(line) - 2); comm = strchr(line, '#'); // strip comment if (comm != NULL) *comm = '\0'; llen = (int) strlen(line); // strip trailing spaces while (llen > 0 && is_realspace(line[llen - 1])) { line[llen - 1] = '\0'; llen--; } if (strfield(line, "user-agent:")) { char *a = line + 11; while (is_realspace(*a)) a++; if (*a == '*') { if (record != 2) record = 1; // generic group applies to us } else if (strfield(a, "httrack") || strfield(a, "winhttrack") || strfield(a, "webhttrack")) { blob[0] = '\0'; // explicit group: restart capture if (info != NULL && infosize > 0) info[0] = '\0'; record = 2; // locked to the httrack group } else record = 0; } else if (record) { hts_boolean is_allow = strfield(line, "allow:"); hts_boolean is_disallow = !is_allow && strfield(line, "disallow:"); if (is_allow || is_disallow) { char *a = line + (is_allow ? 6 : 9); while (is_realspace(*a)) a++; if (strnotempty(a)) { if (is_disallow && !keep_root_disallow && strcmp(a, "/") == 0) { // dropped: site-wide disallow ignored by option } else { robots_blob_add(blob, sizeof(blob), is_allow ? 'A' : 'D', a); if (is_disallow && info != NULL && strlen(a) + 2 < infosize - strlen(info)) { if (strnotempty(info)) strlcatbuff(info, ", ", infosize); strlcatbuff(info, a, infosize); } } } } } } if (strnotempty(blob)) checkrobots_set(robots, adr, blob); } int checkrobots_set(robots_wizard * robots, const char *adr, const char *data) { if (((int) strlen(adr)) >= sizeof(robots->adr) - 2) return 0; if (((int) strlen(data)) >= sizeof(robots->token) - 2) return 0; while(robots) { if (strfield2(robots->adr, adr)) { // entrée existe strcpybuff(robots->token, data); #if DEBUG_ROBOTS printf("robots.txt: set %s to %s\n", adr, data); #endif return -1; } else if (!robots->next) { robots->next = (robots_wizard *) calloct(1, sizeof(robots_wizard)); if (robots->next) { robots->next->next = NULL; strcpybuff(robots->next->adr, adr); strcpybuff(robots->next->token, data); #if DEBUG_ROBOTS printf("robots.txt: new set %s to %s\n", adr, data); #endif } #if DEBUG_ROBOTS else printf("malloc error!!\n"); #endif } robots = robots->next; } return 0; } void checkrobots_free(robots_wizard * robots) { if (robots->next) { checkrobots_free(robots->next); freet(robots->next); robots->next = NULL; } } // -- robots -- httrack-3.49.14/src/htsname.c0000644000175000017500000020075015230602340011406 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* savename routine (compute output filename) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htscore.h" #include "htsname.h" #include "md5.h" #include "htsmd5.h" #include "htstools.h" #include "htscharset.h" #include "htsencoding.h" #include "htssniff.h" #include "htscodec.h" #if HTS_USEZLIB #include "htszlib.h" #endif #include #include #define ADD_STANDARD_PATH \ { /* ajout nom */\ char BIGSTK buff[HTS_URLMAXSIZE*2];\ buff[0]='\0';\ strncatbuff(buff,start_pos,nom_pos - start_pos);\ url_savename_addstr(afs->save, buff);\ } #define ADD_STANDARD_NAME(shortname) \ { /* add name */ \ char BIGSTK buff[HTS_URLMAXSIZE * 2]; \ standard_name(buff, sizeof(buff), dot_pos, nom_pos, fil_complete, \ (shortname)); \ url_savename_addstr(afs->save, buff); \ } /* Avoid stupid DOS system folders/file such as 'nul' */ /* Based on linux/fs/umsdos/mangle.c */ static const char *hts_tbdev[] = { "/prn", "/con", "/aux", "/nul", "/lpt1", "/lpt2", "/lpt3", "/lpt4", "/com1", "/com2", "/com3", "/com4", "/clock$", "/emmxxxx0", "/xmsxxxx0", "/setverxx", "" }; /* Strip all // */ static void cleanDoubleSlash(char *s) { int i, j; for(i = 0, j = 0; s[i] != '\0'; i++) { if (s[i] == '/' && i != 0 && s[i - 1] == '/') { continue; } if (i != j) { s[j] = s[i]; } j++; } // terminating \0 if (i != j) { s[j] = s[i]; } } /* Strip all ending . or ' ' (windows-forbidden) */ static void cleanEndingSpaceOrDot(char *s) { int i, j, lastWriteEnd; for(i = 0, j = 0, lastWriteEnd = 0; i == 0 || s[i - 1] != '\0'; i++) { if (s[i] == '/' || s[i] == '\0') { // Last write was not good, revert if (j != lastWriteEnd) { j = lastWriteEnd; } } if (i != j) { s[j] = s[i]; } j++; // Commit good candidate for terminating character if (s[i] != ' ' && s[i] != '.') { lastWriteEnd = j; } } } /* Wire Content-Type vs URL extension: a patchable wire type wins over an unspecific ext, the HTS_UNKNOWN_MIME sentinel keeps a specific non-HTML ext (#267 guard), a declared disagreement is CONTESTED (sniffed below). */ typedef enum wire_verdict { WIRE_KEEPS_EXT, WIRE_WINS, WIRE_CONTESTED } wire_verdict; static wire_verdict wire_ext_verdict(httrackp *opt, const char *wiremime, const char *file, char *urlmime, size_t urlmime_size) { if (may_unknown2(opt, wiremime, file)) return WIRE_KEEPS_EXT; /* type kept verbatim (keep-list / bogus-multiple) */ urlmime[0] = '\0'; /* type implied by the URL extension, only when confidently known (flag 0) */ if (!get_httptype_sized(opt, urlmime, urlmime_size, file, 0)) return WIRE_WINS; /* URL ext implies no known type */ if (strfield2(wiremime, urlmime)) return WIRE_KEEPS_EXT; /* agreement (no .htm->.html churn) */ if (!is_hypertext_mime(opt, urlmime, file) && strfield2(wiremime, HTS_UNKNOWN_MIME)) return WIRE_KEEPS_EXT; /* no declared type */ return WIRE_CONTESTED; } /* Optional evidence for a contested wire-vs-ext verdict. */ typedef struct sniff_src { struct_back *sback; /* live backing (looked up by adr/fil) */ const lien_back *headers; /* snapshot: r.adr, else the url_sav file */ const char *adr, *fil; const char *prev_save; /* previous run's save name (cache X-Save) */ } sniff_src; static size_t sniff_read_head(const char *path, void *buf, size_t len) { char catbuff[CATBUFF_SIZE]; FILE *const fp = FOPEN(fconv(catbuff, sizeof(catbuff), path), "rb"); size_t n = 0; if (fp != NULL) { n = fread(buf, 1, len, fp); fclose(fp); } return n; } /* Body head of one slot: memory, else its flushed on-disk file (url_sav, or tmpfile for a compressed stream); inflated so the sniff sees the final body. */ static size_t sniff_slot_head(const lien_back *slot, void *buf, size_t len) { const htsblk *const r = &slot->r; size_t n = 0; if (r->adr != NULL && r->size > 0) { n = (size_t) r->size < len ? (size_t) r->size : len; memcpy(buf, r->adr, n); } else { if (r->out != NULL) fflush(r->out); if (slot->url_sav[0] != '\0') n = sniff_read_head(slot->url_sav, buf, len); if (n == 0 && slot->tmpfile != NULL && slot->tmpfile[0] != '\0') n = sniff_read_head(slot->tmpfile, buf, len); } if (n > 0 && r->compressed) { unsigned char raw[HTS_SNIFF_LEN]; if (n > sizeof(raw)) n = sizeof(raw); memcpy(raw, buf, n); n = hts_codec_head(hts_codec_parse(r->contentencoding), raw, n, buf, len); } return n; } /* Up to len leading body bytes; 0 when unavailable, and always in non-delayed mode (its HEAD-probe first run couldn't sniff either). */ static size_t sniff_body_head(httrackp *opt, const sniff_src *src, void *buf, size_t len) { size_t n = 0; if (src == NULL || opt->savename_delayed == HTS_SAVENAME_DELAYED_NONE) return 0; /* live backing slot: a snapshot (back_copy_static) loses r.adr/r.out */ if (src->sback != NULL && src->adr != NULL && src->fil != NULL) { const int b = back_index(opt, src->sback, src->adr, src->fil, NULL); if (b >= 0) n = sniff_slot_head(&src->sback->lnk[b], buf, len); } if (n == 0 && src->headers != NULL) n = sniff_slot_head(src->headers, buf, len); return n; } /* Contested verdicts: magic proving the URL ext keeps it, else wire wins. */ static int wire_patches_ext(httrackp *opt, const sniff_src *src, const char *wiremime, const char *file) { char urlmime[256]; switch (wire_ext_verdict(opt, wiremime, file, urlmime, sizeof(urlmime))) { case WIRE_KEEPS_EXT: return 0; case WIRE_WINS: return 1; case WIRE_CONTESTED: break; } if (src != NULL) { if (hts_sniff_mime_known(urlmime)) { unsigned char head[HTS_SNIFF_LEN]; const size_t n = sniff_body_head(opt, src, head, sizeof(head)); if (n > 0) return hts_sniff_mime_consistent(head, n, urlmime) ? 0 : 1; } /* no bytes: reproduce the previous run's verdict (cached X-Save name) */ if (src->prev_save != NULL && src->prev_save[0] != '\0') { char prevmime[256]; prevmime[0] = '\0'; if (get_httptype_sized(opt, prevmime, sizeof(prevmime), src->prev_save, 0) && strfield2(prevmime, urlmime)) return 0; } } return 1; } int hts_ext_sniff_wanted(httrackp *opt, const char *wiremime, const char *file) { char urlmime[256]; return wiremime != NULL && strnotempty(wiremime) && wire_ext_verdict(opt, wiremime, file, urlmime, sizeof(urlmime)) == WIRE_CONTESTED && hts_sniff_mime_known(urlmime); } /* Wire-metadata name change: a Content-Disposition filename wins (returns 2), else the declared type's ext when wire_patches_ext() allows (returns 1), else 0. ext receives the new extension or replacement filename. */ static int resolve_extension(httrackp *opt, const sniff_src *src, const char *cdispo, const char *contenttype, const char *fil, char *ext, size_t ext_size) { if (strnotempty(cdispo)) { strlcpybuff(ext, cdispo, ext_size); return 2; } if (wire_patches_ext(opt, src, contenttype, fil) && give_mimext(ext, ext_size, contenttype)) return 1; return 0; } // Build the local save name (save) from adr/fil; renames on collision // (e.g. INDEX.HTML vs index.html). int url_savename(lien_adrfilsave *const afs, lien_adrfil *const former, const char *referer_adr, const char *referer_fil, httrackp * opt, struct_back * sback, cache_back * cache, hash_struct * hash, int ptr, int numero_passe, const lien_back * headers) { char catbuff[CATBUFF_SIZE]; const int is_redirect = headers != NULL && HTTP_IS_REDIRECT(headers->r.statuscode); const char *mime_type = headers != NULL && !is_redirect ? headers->r.contenttype : NULL; /*const char* mime_type = ( headers && HTTP_IS_OK(headers->r.statuscode) ) ? headers->r.contenttype : NULL; */ lien_back *const back = sback->lnk; /* */ char BIGSTK fil[HTS_URLMAXSIZE * 2]; /* ="" */ const char *const adr_complete = afs->af.adr; const char *const fil_complete = afs->af.fil; /*char BIGSTK normadr_[HTS_URLMAXSIZE*2]; */ char BIGSTK normadr_[HTS_URLMAXSIZE * 2], normfil_[HTS_URLMAXSIZE * 2]; enum { PROTOCOL_HTTP, PROTOCOL_HTTPS, PROTOCOL_FTP, PROTOCOL_FILE, PROTOCOL_UNKNOWN }; static const char *protocol_str[] = { "http", "https", "ftp", "file", "unknown" }; int protocol = PROTOCOL_HTTP; const char *const adr = jump_identification_const(adr_complete); // copy of fil, used for lookups (see urlhack) const char *normadr = adr; const char *normfil = fil_complete; /* query keys to strip for this URL (NULL = none); decoupled from urlhack */ char BIGSTK stripkeys[HTS_URLMAXSIZE]; const char *const strip = StringNotEmpty(opt->strip_query) ? hts_query_strip_keys(StringBuff(opt->strip_query), adr, fil_complete, stripkeys, sizeof(stripkeys)) : NULL; const char *const print_adr = jump_protocol_const(adr); const char *start_pos = NULL, *nom_pos = NULL, *dot_pos = NULL; // Position nom et point // pour changement d'extension ou de nom (content-disposition) int ext_chg = 0, ext_chg_delayed = 0; int is_html = 0; char ext[256]; int max_char = 0; //CLEAR fil[0] = ext[0] = '\0'; afs->save[0] = '\0'; /* 8-3 ? */ switch (opt->savename_83) { case HTS_SAVENAME_83_DOS: // 8-3 max_char = 8; break; case HTS_SAVENAME_83_ISO9660: // Level 2 File names may be up to 31 // characters. max_char = 31; break; default: max_char = 8; break; } // normalize the URL: // www.foo.com -> foo.com // www-42.foo.com -> foo.com // foo.com/bar//foobar -> foo.com/bar/foobar if (opt->urlhack) { // dedup-lookup key; honor the per-feature negatives like htshash.c so // distinct URLs keep distinct savenames (else keep normadr = adr) if (!opt->no_www_dedup) normadr = adr_normalized_sized(adr, normadr_, sizeof(normadr_)); normfil = fil_normalized_filtered_ex(fil_complete, normfil_, strip, !opt->no_slash_dedup, !opt->no_query_dedup); } else { if (link_has_authority(adr_complete)) { // https or other protocols : in "http/" subfolder char *pos = strchr(adr_complete, ':'); if (pos != NULL) { normadr_[0] = '\0'; strncatbuff(normadr_, adr_complete, (int) (pos - adr_complete)); strcatbuff(normadr_, "://"); strcatbuff(normadr_, normadr); normadr = normadr_; } } // strip still applies with urlhack off (host left untouched); no // or // query-sort here, to match the hash key (norm_slash/norm_query are 0 when // urlhack is off) so a URL is looked up under the key it was stored with if (strip != NULL) normfil = fil_normalized_filtered_ex(fil_complete, normfil_, strip, 0, 0); } // à afficher sans ftp:// if (strfield(adr_complete, "https:")) { protocol = PROTOCOL_HTTPS; } else if (strfield(adr_complete, "ftp:")) { protocol = PROTOCOL_FTP; } else if (strfield(adr_complete, "file:")) { protocol = PROTOCOL_FILE; } else { protocol = PROTOCOL_HTTP; } // court-circuit pour lien primaire if (strnotempty(adr) == 0) { if (strcmp(fil_complete, "primary") == 0) { strcatbuff(afs->save, "primary.html"); return 0; } } /* Declare adr (IDNA-decoded if necessary) */ #define DECLARE_ADR(FINAL_ADR) \ char *idna_adr =\ /* http or https */\ (\ protocol == PROTOCOL_HTTP\ || protocol == PROTOCOL_HTTPS \ )\ /* and contains IDNA */\ && hts_isStringIDNA(adr_complete, strlen(print_adr))\ ? hts_convertStringIDNAToUTF8(print_adr, strlen(print_adr))\ : NULL;\ const char *const FINAL_ADR = idna_adr != NULL \ ? idna_adr : ( protocol == PROTOCOL_FILE ? "file" : print_adr ) /* Release adr */ #define RELEASE_ADR() do {\ if (idna_adr != NULL) {\ free(idna_adr);\ idna_adr = NULL;\ }\ } while(0) // vérifier que le nom n'a pas déja été calculé (si oui le renvoyer tel que) // vérifier que le nom n'est pas déja pris... // NOTE: si on cherche /toto/ et que /toto est trouvé on le prend (et réciproquqment) ** // ** if (opt->liens != NULL) { int i; i = hash_read(hash, normadr, normfil, HASH_STRUCT_ADR_PATH); // recherche table 1 (adr+fil) if (i >= 0) { // ok, trouvé strcpybuff(afs->save, heap(i)->sav); return 0; } i = hash_read(hash, normadr, normfil, HASH_STRUCT_ORIGINAL_ADR_PATH); // recherche table 2 (former->adr+former->fil) if (i >= 0) { // ok, trouvé // copier location moved! strcpybuff(afs->af.adr, heap(i)->adr); strcpybuff(afs->af.fil, heap(i)->fil); // et save strcpybuff(afs->save, heap(i)->sav); // copier (formé à partir du nouveau lien!) return 0; } // chercher sans / ou avec / dans former { char BIGSTK fil_complete_patche[HTS_URLMAXSIZE * 2]; strcpybuff(fil_complete_patche, normfil); // Version avec ou sans / if (fil_complete_patche[strlen(fil_complete_patche) - 1] == '/') fil_complete_patche[strlen(fil_complete_patche) - 1] = '\0'; else strcatbuff(fil_complete_patche, "/"); i = hash_read(hash, normadr, fil_complete_patche, HASH_STRUCT_ORIGINAL_ADR_PATH); // recherche table 2 (former->adr+former->fil) if (i >= 0) { // écraser fil et adr (pas former->fil?????) strcpybuff(afs->af.adr, heap(i)->adr); strcpybuff(afs->af.fil, heap(i)->fil); // écrire save strcpybuff(afs->save, heap(i)->sav); return 0; } } } // vérifier la non présence de paramètres dans le nom de fichier // si il y en a, les supprimer (ex: truc.cgi?subj=aspirateur) // néanmoins, gardé pour vérifier la non duplication (voir après) { char *a; a = strchr(fil_complete, '?'); if (a != NULL) { strncatbuff(fil, fil_complete, a - fil_complete); } else { strcpybuff(fil, fil_complete); } } // decode remaining % (normally not necessary; already done in htsparse.c) // this will NOT decode buggy %xx (ie. not UTF-8) ones if (hts_unescapeUrl(fil, catbuff, sizeof(catbuff)) == 0) { strcpybuff(fil, catbuff); } else { hts_log_print(opt, LOG_WARNING, "could not URL-decode string '%s'", fil); } /* replace shtml to html.. */ /* HARD delays every type, except one the user pinned with --assume: honor it immediately (ishtml() consults the user type), no delayed name (#56) */ if (opt->savename_delayed == HTS_SAVENAME_DELAYED_HARD && !is_userknowntype(opt, fil)) is_html = -1; /* ALWAYS delay type */ else is_html = ishtml(opt, fil); switch (is_html) { /* .html,.shtml,.. */ case 1: if ((strfield2(get_ext(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fil), "html") == 0) && (strfield2(get_ext(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fil), "htm") == 0) ) { strcpybuff(ext, "html"); ext_chg = 1; } break; case 0: if (!strnotempty(ext)) { if (is_userknowntype(opt, fil)) { // mime known by user char BIGSTK mime[1024]; mime[0] = ext[0] = '\0'; get_userhttptype(opt, mime, fil); if (strnotempty(mime)) { if (give_mimext(ext, sizeof(ext), mime)) { ext_chg = 1; } } } } break; } // si option check_type activée if (is_html < 0 && opt->check_type && !ext_chg) { if (protocol != PROTOCOL_FILE && protocol != PROTOCOL_FTP ) { // tester type avec requète HEAD si on ne connait pas le type du fichier if (!((opt->check_type == 1) && (fil[strlen(fil) - 1] == '/'))) // slash doit être html? if (opt->savename_delayed == HTS_SAVENAME_DELAYED_HARD || ishtml(opt, fil) < 0) { // unsure whether it's html or a file // lire dans le cache char BIGSTK previous_save[HTS_URLMAXSIZE * 2]; htsblk r; previous_save[0] = '\0'; r = cache_read_including_broken(opt, cache, adr, fil, previous_save); // test uniquement if (r.statuscode != -1) { // cache entry read OK hts_log_print(opt, LOG_DEBUG, "Testing link type (from cache) %s%s", adr_complete, fil_complete); if (!HTTP_IS_REDIRECT(r.statuscode)) { const sniff_src src = {sback, NULL, adr, fil, previous_save}; ext_chg = resolve_extension(opt, &src, r.cdispo, r.contenttype, fil, ext, sizeof(ext)); } } else if (opt->savename_delayed != HTS_SAVENAME_DELAYED_HARD && is_userknowntype(opt, fil)) { /* PATCH BY BRIAN SCHRÖDER. Lookup mimetype not only by extension, but also by filename */ /* Note: "foo.cgi => text/html" means that foo.cgi shall have the text/html MIME file type, that is, ".html" */ char BIGSTK mime[1024]; mime[0] = ext[0] = '\0'; get_userhttptype(opt, mime, fil); if (strnotempty(mime)) { if (give_mimext(ext, sizeof(ext), mime)) { ext_chg = 1; } } } // note: if savename_delayed is enabled, the naming will be temporary // (and slightly invalid!) // // note: if we are about to stop (opt->state.stop), back_add() will // fail later else if (opt->savename_delayed != HTS_SAVENAME_DELAYED_NONE && !opt->state.stop) { // Check if the file is ready in backing. if (headers != NULL && headers->status >= 0 && !is_redirect) { const sniff_src src = {sback, headers, adr, fil, NULL}; ext_chg = resolve_extension(opt, &src, headers->r.cdispo, headers->r.contenttype, headers->url_fil, ext, sizeof(ext)); } else if (mime_type != NULL) { ext[0] = '\0'; if (*mime_type) { give_mimext(ext, sizeof(ext), mime_type); } if (strnotempty(ext)) { char mime_from_file[128]; mime_from_file[0] = 0; get_httptype_sized(opt, mime_from_file, sizeof(mime_from_file), fil, 1); if (!strnotempty(mime_from_file) || strcasecmp(mime_type, mime_from_file) != 0) { /* different mime for this type */ /* type change not forbidden (or no extension at all) */ if (!may_unknown2(opt, mime_type, fil)) { ext_chg = 1; } } else { ext_chg = 0; } } } else { /* Avoid collisions (no collisionning detection) */ sprintf(ext, "%x.%s", opt->state.delayedId++, DELAYED_EXT); ext_chg = 1; ext_chg_delayed = 1; /* due to naming system */ } } // test imposible dans le cache, faire une requête else { // int hihp = opt->state._hts_in_html_parsing; int has_been_moved = 0; lien_adrfil current; /* Wait for an available test slot, honoring the connection limits */ if (!hts_wait_available_socket(sback, opt, cache, ptr)) return -1; /* Rock'in */ current.adr[0] = current.fil[0] = '\0'; opt->state._hts_in_html_parsing = 2; // test hts_log_print(opt, LOG_DEBUG, "Testing link type %s%s", adr_complete, fil_complete); strcpybuff(current.adr, adr_complete); strcpybuff(current.fil, fil_complete); // ajouter dans le backing le fichier en mode test // savename: rien car en mode test if (back_add(sback, opt, cache, current.adr, current.fil, BACK_ADD_TEST, referer_adr, referer_fil, 1, HTS_FALSE) != -1) { int b; b = back_index(opt, sback, current.adr, current.fil, BACK_ADD_TEST); if (b >= 0) { int stop_looping = 0; int petits_tours = 0; int get_test_request = 0; // en cas de bouclage sur soi même avec HEAD, tester avec GET.. parfois c'est la cause des problèmes do { // temps à attendre, et remplir autant que l'on peut le cache (backing) if (back[b].status > 0) { back_wait(sback, opt, cache, 0); } if (ptr >= 0) { back_fillmax(sback, opt, cache, ptr, numero_passe); } if (!hts_loop_tick(sback, opt, b, ptr)) { return -1; } else if (opt->state._hts_cancel || !back_checkmirror( opt)) { // cancel level 2 or 1 (cancel parsing) back_delete(opt, cache, sback, b); // cancel test stop_looping = 1; } // traitement des 304,303.. if (back[b].status <= 0) { if (HTTP_IS_REDIRECT(back[b].r.statuscode)) { // agh moved.. un tit tour de plus if ((petits_tours < 5) && former != NULL) { // on va pas tourner en rond non plus! if (strnotempty(back[b].r.location)) { // location existe! char BIGSTK mov_url[HTS_URLMAXSIZE * 2]; lien_adrfil moved; mov_url[0] = moved.adr[0] = moved.fil[0] = '\0'; // strcpybuff(mov_url, back[b].r.location); // copier URL if (ident_url_relatif (mov_url, current.adr, current.fil, &moved) >= 0) { // si non bouclage sur soi même, ou si test avec GET non testé if ((strcmp(moved.adr, current.adr)) || (strcmp(moved.fil, current.fil)) || (get_test_request == 0)) { // bouclage? if ((!strcmp(moved.adr, current.adr)) && (!strcmp(moved.fil, current.fil))) get_test_request = 1; // faire requète avec GET // recopier former->adr/fil? if (former != NULL) { if (strnotempty(former->adr) == 0) { // Pas déja noté strcpybuff(former->adr, current.adr); strcpybuff(former->fil, current.fil); } } // check explicit forbidden - don't follow 3xx in this case { int set_prio_to = 0; if (hts_acceptlink(opt, ptr, moved.adr, moved.fil, NULL, NULL, &set_prio_to, NULL) == 1) { /* forbidden */ has_been_moved = 1; back_maydelete(opt, cache, sback, b); // ok strcpybuff(current.adr, moved.adr); strcpybuff(current.fil, moved.fil); mov_url[0] = '\0'; stop_looping = 1; } } // ftp: stop! if (strfield(mov_url, "ftp://") ) { // ftp, ok on arrête has_been_moved = 1; back_maydelete(opt, cache, sback, b); // ok strcpybuff(current.adr, moved.adr); strcpybuff(current.fil, moved.fil); stop_looping = 1; } else if (*mov_url) { const char *methode; if (!get_test_request) methode = BACK_ADD_TEST; // tester avec HEAD else { methode = BACK_ADD_TEST2; // tester avec GET hts_log_print(opt, LOG_WARNING, "Loop with HEAD request (during prefetch) at %s%s", current.adr, current.fil); } if (!hts_wait_available_socket(sback, opt, cache, ptr)) return -1; if (back_add(sback, opt, cache, moved.adr, moved.fil, methode, referer_adr, referer_fil, 1, HTS_FALSE) != -1) { // OK hts_log_print(opt, LOG_DEBUG, "(during prefetch) %s (%d) to link %s at %s%s", back[b].r.msg, back[b].r.statuscode, back[b].r.location, current.adr, current.fil); // libérer emplacement backing actuel et attendre le prochain back_maydelete(opt, cache, sback, b); strcpybuff(current.adr, moved.adr); strcpybuff(current.fil, moved.fil); b = back_index(opt, sback, current.adr, current.fil, methode); if (!get_test_request) has_been_moved = 1; // sinon ne pas forcer has_been_moved car non déplacé petits_tours++; // } else { // sinon on fait rien et on s'en va.. // (ftp etc) hts_log_print(opt, LOG_DEBUG, "Warning: Savename redirect backing error at %s%s", moved.adr, moved.fil); } } } else { hts_log_print(opt, LOG_WARNING, "Unable to test %s%s (loop to same filename)", adr_complete, fil_complete); } } } } else { // arrêter les frais hts_log_print(opt, LOG_WARNING, "Unable to test %s%s (loop)", adr_complete, fil_complete); } } // ok, leaving } } while(!stop_looping && back[b].status > 0 && back[b].status < 1000); // Si non déplacé, forcer type? if (!has_been_moved) { if (back[b].r.statuscode != -10) { // erreur if (strnotempty(back[b].r.contenttype) == 0) strcpybuff(back[b].r.contenttype, HTS_UNKNOWN_MIME); // no declared type // Finalement on, renvoie un erreur, pour ne toucher à rien dans le code // libérer emplacement backing } // no error: change the type? ext_chg = resolve_extension( opt, NULL, back[b].r.cdispo, back[b].r.contenttype, back[b].url_fil, ext, sizeof(ext)); } // FIN Si non déplacé, forcer type? // libérer emplacement backing back_maydelete(opt, cache, sback, b); // --- --- --- // oops, a été déplacé.. on recalcule en récursif (osons!) if (has_been_moved) { // copier adr, fil (optionnel, mais sinon marche pas pour le rip) strcpybuff(afs->af.adr, current.adr); strcpybuff(afs->af.fil, current.fil); // copier adr, fil return url_savename(afs, NULL, referer_adr, referer_fil, opt, sback, cache, hash, ptr, numero_passe, NULL); } // --- --- --- } } else { printf ("PANIC! : Savename Crash adding error, unexpected error found.. [%d]\n", __LINE__); #if BDEBUG==1 printf("error while savename crash adding\n"); #endif hts_log_print(opt, LOG_ERROR, "Unexpected savename backing error at %s%s", adr, fil_complete); } // restaurer opt->state._hts_in_html_parsing = hihp; } // caché? } } } // - - - DEBUT NOMMAGE - - - // Donner nom par défaut? if (fil[strlen(fil) - 1] == '/') { if (!strfield(adr_complete, "ftp://") ) { strcatbuff(fil, DEFAULT_HTML); // nommer page par défaut!! } else { if (!opt->proxy.active) strcatbuff(fil, DEFAULT_FTP); // nommer page par défaut (texte) else strcatbuff(fil, DEFAULT_HTML); // nommer page par défaut (à priori ici html depuis un proxy http) } } // Change the extension? e.g. php3 saved as html, cgi as html or gif/xbm // depending on the resolved type. if (ext_chg && !opt->no_type_change) { char *a = fil + strlen(fil) - 1; if ((opt->debug > 1) && (opt->log != NULL)) { if (ext_chg == 1) hts_log_print(opt, LOG_DEBUG, "Changing link extension %s%s to .%s", adr_complete, fil_complete, ext); else hts_log_print(opt, LOG_DEBUG, "Changing link name %s%s to %s", adr_complete, fil_complete, ext); } if (ext_chg == 1) { // Cut the old extension only when it is empty (a bare trailing dot), the // new one, or a recognized one; an unknown trailing ".token" (e.g. // /article-1.884291, #115) is part of the name, not an extension. const char *const old_ext = get_ext(catbuff, sizeof(catbuff), fil); const int known_ext = !*old_ext || strfield2(old_ext, ext) || is_knowntype(opt, fil) || is_dyntype(old_ext) || ishtml_ext(old_ext) != -1; while((a > fil) && (*a != '.') && (*a != '/')) a--; if (*a == '.' && known_ext) *a = '\0'; // cut strcatbuff(fil, "."); // re-add the dot } else { while((a > fil) && (*a != '/')) a--; if (*a == '/') a++; *a = '\0'; } strcatbuff(fil, ext); // append ext/name } // Rechercher premier / et dernier . { const char *a = fil + strlen(fil) - 1; // passer structures start_pos = fil; while((a > fil) && (*a != '/') && (*a != '\\')) { if (*a == '.') // point? noter position if (!dot_pos) dot_pos = a; a--; } if ((*a == '/') || (*a == '\\')) a++; nom_pos = a; } // un nom de fichier est généré // s'il existe déja, alors on le mofifie légèrement // ajouter nom du site éventuellement en premier if (opt->savename_type == -1) { // utiliser savename_userdef! (%h%p/%n%q.%t) const char *a = StringBuff(opt->savename_userdef); htsbuff sb = htsbuff_array(afs->save); /*char *nom_pos=NULL,*dot_pos=NULL; // Position nom et point */ char tok; /* { // Rechercher premier / char* a=fil+strlen(fil)-1; // passer structures while(((int) a>(int) fil) && (*a != '/') && (*a != '\\')) { if (*a == '.') // point? noter position if (!dot_pos) dot_pos=a; a--; } if ((*a=='/') || (*a=='\\')) a++; nom_pos = a; } */ // build the name while ((*a) && (sb.len < HTS_URLMAXSIZE)) { // parse, but not too long if (*a == '%') { int short_ver = 0; a++; if (*a == 's') { // '%s...' selects the short (8.3) form short_ver = 1; a++; } switch (tok = *a++) { case '[': // %[param:prefix_if_not_empty:suffix_if_not_empty:empty_replacement:notfound_replacement] if (strchr(a, ']')) { int pos = 0; char name[5][256]; char *c = name[0]; for(pos = 0; pos < 5; pos++) { name[pos][0] = '\0'; } pos = 0; while(*a != '\0' && *a != ']') { if (pos < 5) { if (*a == ':') { // next token c = name[++pos]; a++; } else { *c++ = *a++; *c = '\0'; } } } if (*a == ']') { a++; } strcatbuff(name[0], "="); /* param=.. */ c = strchr(fil_complete, '?'); /* parameters exists */ if (c) { char *cp; while((cp = strstr(c + 1, name[0])) && *(cp - 1) != '?' && *(cp - 1) != '&') { /* finds [?&]param= */ c = cp; } if (cp) { c = cp + strlen(name[0]); /* jumps "param=" */ htsbuff_cat(&sb, name[1]); /* prefix */ if (*c != '\0' && *c != '&') { char *d = name[0]; /* */ while(*c != '\0' && *c != '&') { *d++ = *c++; } *d = '\0'; d = unescape_http(catbuff, sizeof(catbuff), name[0]); if (d && *d) { htsbuff_cat(&sb, d); /* value */ } else { htsbuff_cat(&sb, name[3]); /* empty replacement if any */ } } else { htsbuff_cat(&sb, name[3]); /* empty replacement if any */ } htsbuff_cat(&sb, name[2]); /* suffix */ } else { htsbuff_cat(&sb, name[4]); /* not found replacement if any */ } } else { htsbuff_cat(&sb, name[4]); /* not found replacement if any */ } } break; case '%': htsbuff_catc(&sb, '%'); break; case 'n': // name without extension if (dot_pos) { if (!short_ver) htsbuff_catn(&sb, nom_pos, (int) (dot_pos - nom_pos)); else htsbuff_catn(&sb, nom_pos, min((int) (dot_pos - nom_pos), 8)); } else { if (!short_ver) htsbuff_cat(&sb, nom_pos); else htsbuff_catn(&sb, nom_pos, 8); } break; case 'N': // name with extension if (dot_pos) { if (!short_ver) htsbuff_catn(&sb, nom_pos, (int) (dot_pos - nom_pos)); else htsbuff_catn(&sb, nom_pos, min((int) (dot_pos - nom_pos), 8)); } else { if (!short_ver) htsbuff_cat(&sb, nom_pos); else htsbuff_catn(&sb, nom_pos, 8); } htsbuff_catc(&sb, '.'); if (dot_pos) { if (!short_ver) htsbuff_cat(&sb, dot_pos + 1); else htsbuff_catn(&sb, dot_pos + 1, 3); } else { if (!short_ver) htsbuff_cat(&sb, DEFAULT_EXT + 1); // skip the leading dot else htsbuff_cat(&sb, DEFAULT_EXT_SHORT + 1); // skip the leading dot } break; case 't': // extension if (dot_pos) { if (!short_ver) htsbuff_cat(&sb, dot_pos + 1); else htsbuff_catn(&sb, dot_pos + 1, 3); } else { if (!short_ver) htsbuff_cat(&sb, DEFAULT_EXT + 1); // skip the leading dot else htsbuff_cat(&sb, DEFAULT_EXT_SHORT + 1); // skip the leading dot } break; case 'p': // path without trailing / if (nom_pos != fil + 1) { // skip when the path is empty (e.g. /index.html) if (!short_ver) { htsbuff_catn(&sb, fil, (int) (nom_pos - fil) - 1); } else { char BIGSTK pth[HTS_URLMAXSIZE * 2], n83[HTS_URLMAXSIZE * 2]; pth[0] = n83[0] = '\0'; strncatbuff(pth, fil, (int) (nom_pos - fil) - 1); long_to_83(opt->savename_83, n83, sizeof(n83), pth); htsbuff_cat(&sb, n83); } } break; case 'h': // host (IDNA decoded if suitable) // IDNA / RFC 3492 (Punycode) handling for HTTP(s) { DECLARE_ADR(final_adr); /* Copy address */ if (!short_ver) htsbuff_cat(&sb, final_adr); else htsbuff_cat(&sb, final_adr); /* release */ RELEASE_ADR(); } break; case 'H': // host, raw (old mode) if (protocol == PROTOCOL_FILE) { if (!short_ver) htsbuff_cat(&sb, "localhost"); else htsbuff_cat(&sb, "local"); } else { if (!short_ver) htsbuff_cat(&sb, print_adr); else htsbuff_catn(&sb, print_adr, 8); } break; case 'M': /* host/address?query MD5 (128-bits) */ { char digest[32 + 2]; char BIGSTK buff[HTS_URLMAXSIZE * 2]; digest[0] = buff[0] = '\0'; strcpybuff(buff, adr); strcatbuff(buff, fil_complete); domd5mem(buff, strlen(buff), digest, 1); htsbuff_cat(&sb, digest); } break; case 'Q': case 'q': /* query MD5 (128-bits/16-bits) GENERATED ONLY IF query string exists! */ { char md5[32 + 2]; htsbuff_catn(&sb, url_md5(md5, fil_complete), (tok == 'Q') ? 32 : 4); } break; case 'r': case 'R': // protocol htsbuff_cat(&sb, protocol_str[protocol]); break; /* Patch by Juan Fco Rodriguez to get the full query string */ case 'k': { char *d = strchr(fil_complete, '?'); if (d != NULL) { htsbuff_cat(&sb, d); } } break; } } else htsbuff_catc(&sb, *a++); } // // predefined types // } // // Structure originale else if (opt->savename_type % 100 == 0) { /* recopier www.. */ if (opt->savename_type != 100) { if (((opt->savename_type / 1000) % 2) == 0) { // >1000 signifie "pas de www/" DECLARE_ADR(final_adr); // adresse url if (!opt->savename_83) { // noms longs (et pas de .) strcatbuff(afs->save, final_adr); } else { // noms 8-3 if (strlen(final_adr) > 4) { if (strfield(final_adr, "www.")) hts_appendStringUTF8(afs->save, final_adr + 4, max_char); else hts_appendStringUTF8(afs->save, final_adr, max_char); } else hts_appendStringUTF8(afs->save, final_adr, max_char); } /* release */ RELEASE_ADR(); if (*fil != '/') strcatbuff(afs->save, "/"); } } hts_lowcase(afs->save); /* // ne sert à rien car a déja été filtré normalement if ((*fil=='.') && (*(fil+1)=='/')) // ./index.html ** // url_savename_addstr(save,fil+2); else // index.html ou /index.html url_savename_addstr(save,fil); if (save[strlen(save)-1]=='/') strcatbuff(save,DEFAULT_HTML); // nommer page par défaut!! */ /* add name */ ADD_STANDARD_PATH; ADD_STANDARD_NAME(0); } // // Structure html/image else { // dossier "web" ou "www.xxx" ? if (((opt->savename_type / 1000) % 2) == 0) { // >1000 signifie "pas de www/" if ((opt->savename_type / 100) % 2) { DECLARE_ADR(final_adr); if (!opt->savename_83) { // noms longs strcatbuff(afs->save, final_adr); strcatbuff(afs->save, "/"); } else { // noms 8-3 if (strlen(final_adr) > 4) { if (strfield(final_adr, "www.")) hts_appendStringUTF8(afs->save, final_adr + 4, max_char); else hts_appendStringUTF8(afs->save, final_adr, max_char); strcatbuff(afs->save, "/"); } else { hts_appendStringUTF8(afs->save, final_adr, max_char); strcatbuff(afs->save, "/"); } } /* release */ RELEASE_ADR(); } else { strcatbuff(afs->save, "web/"); // répertoire général } } // si un html à coup sûr if ((ext_chg != 0) ? (ishtml_ext(ext) == 1) : (ishtml(opt, fil) == 1)) { if (opt->savename_type % 100 == 2) { // html/ strcatbuff(afs->save, "html/"); } } else { if ((opt->savename_type % 100 == 1) || (opt->savename_type % 100 == 2)) { // html & images strcatbuff(afs->save, "images/"); } } switch (opt->savename_type % 100) { case 4: case 5:{ // séparer par types const char *a = fil + strlen(fil) - 1; // passer structures while((a > fil) && (*a != '/') && (*a != '\\')) a--; if ((*a == '/') || (*a == '\\')) a++; // html? if ((ext_chg != 0) ? (ishtml_ext(ext) == 1) : (ishtml(opt, fil) == 1)) { if (opt->savename_type % 100 == 5) strcatbuff(afs->save, "html/"); } else { const char *a = fil + strlen(fil) - 1; while((a > fil) && (*a != '/') && (*a != '.')) a--; if (*a != '.') strcatbuff(afs->save, "other"); else strcatbuff(afs->save, a + 1); strcatbuff(afs->save, "/"); } /*strcatbuff(save,a); */ /* add name */ ADD_STANDARD_NAME(0); } break; case 99:{ // 'codé' .. c'est un gadget size_t i; size_t j; const char *a; char C[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-"; int L; // pseudo-CRC sur fil et adr pour initialiser générateur aléatoire.. unsigned int s = 0; L = (int) strlen(C); for(i = 0; fil_complete[i] != '\0'; i++) { s += (unsigned int) fil_complete[i]; } for(i = 0; adr_complete[i] != '\0'; i++) { s += (unsigned int) adr_complete[i]; } srand(s); j = strlen(afs->save); for(i = 0; i < 8; i++) { char c = C[(rand() % L)]; afs->save[i + j] = c; } afs->save[i + j] = '\0'; // ajouter extension a = fil + strlen(fil) - 1; while((a > fil) && (*a != '/') && (*a != '.')) a--; if (*a == '.') { strcatbuff(afs->save, a); // ajouter } } break; default:{ // noms sans les noms des répertoires // ne garder que le nom, pas la structure /* char* a=fil+strlen(fil)-1; while(((int) a>(int) fil) && (*a != '/') && (*a != '\\')) a--; if ((*a=='/') || (*a=='\\')) a++; strcatbuff(save,a); */ /* add name */ ADD_STANDARD_NAME(0); } break; } hts_lowcase(afs->save); if (afs->save[strlen(afs->save) - 1] == '/') strcatbuff(afs->save, DEFAULT_HTML); // nommer page par défaut!! } // vérifier qu'on ne doit pas forcer l'extension // par exemple, asp sera sauvé en html, cgi en html ou gif, xbm etc.. selon les cas /*if (ext_chg) { char* a=save+strlen(save)-1; while(((int) a>(int) save) && (*a!='.') && (*a!='/')) a--; if (*a=='.') *a='\0'; // couper // recopier extension strcatbuff(save,"."); strcatbuff(save,ext); // copier ext } */ // Not used anymore unless non-delayed types. // de même en cas de manque d'extension on en place une de manière forcée.. // cela évite les /chez/toto et les /chez/toto/index.html incompatibles if (opt->savename_type != -1 && opt->savename_delayed != HTS_SAVENAME_DELAYED_HARD) { char *a = afs->save + strlen(afs->save) - 1; while((a > afs->save) && (*a != '.') && (*a != '/')) a--; if (*a != '.') { // agh pas de point strcatbuff(afs->save, ".html"); // préférable! hts_log_print(opt, LOG_DEBUG, "Default HTML type set for %s%s => %s", adr_complete, fil_complete, afs->save); } } // effacer pass au besoin pour les autentifications // (plus la peine : masqué au début) /* { char* a = jump_identification(afs->save); if (a!=afs->save) { char BIGSTK tempo[HTS_URLMAXSIZE*2]; char *b; tempo[0]='\0'; strcpybuff(tempo,"["); b=strchr(save,':'); if (!b) b=strchr(save,'@'); if (b) strncatbuff(tempo,save,(int) b-(int) a); strcatbuff(tempo,"]"); strcatbuff(tempo,a); strcpybuff(save,a); } } */ // éviter les / au début (cause: N100) if (afs->save[0] == '/') { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; strcpybuff(tempo, afs->save + 1); strcpybuff(afs->save, tempo); } /* Cleanup reserved or forbidden characters. */ { size_t i; for(i = 0 ; afs->save[i] != '\0' ; i++) { unsigned char c = (unsigned char) afs->save[i]; if (c < 32 // control || c == 127 // unwise || c == '~' // unix unwise || c == '\\' // windows separator || c == ':' // windows forbidden || c == '*' // windows forbidden || c == '?' // windows forbidden || c == '\"' // windows forbidden || c == '<' // windows forbidden || c == '>' // windows forbidden || c == '|' // windows forbidden //|| c == '@' // ? || (opt->savename_83 == HTS_SAVENAME_83_ISO9660 // CDROM && (c == '-' || c == '=' || c == '+'))) { afs->save[i] = '_'; } } } // éliminer les // (comme ftp://) cleanDoubleSlash(afs->save); #if HTS_OVERRIDE_DOS_FOLDERS /* Replace /foo/nul/bar by /foo/nul_/bar */ { int i = 0; while(hts_tbdev[i][0]) { const char *a = afs->save; while((a = strstrcase(a, hts_tbdev[i]))) { switch ((int) a[strlen(hts_tbdev[i])]) { case '\0': case '/': case '.': { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; tempo[0] = '\0'; strncatbuff(tempo, afs->save, (int) (a - afs->save) + strlen(hts_tbdev[i])); strcatbuff(tempo, "_"); strcatbuff(tempo, a + strlen(hts_tbdev[i])); strcpybuff(afs->save, tempo); } break; } a += strlen(hts_tbdev[i]); } i++; } } /* Strip ending . or ' ' forbidden on windoz */ cleanEndingSpaceOrDot(afs->save); #endif // conversion 8-3 .. y compris pour les répertoires if (opt->savename_83) { char BIGSTK n83[HTS_URLMAXSIZE * 2]; long_to_83(opt->savename_83, n83, sizeof(n83), afs->save); strcpybuff(afs->save, n83); } // enforce stricter ISO9660 compliance (bug reported by Steffo Carlsson) // Level 1 File names are restricted to 8 characters with a 3 character extension, // upper case letters, numbers and underscore; maximum depth of directories is 8. // This will be our "DOS mode" // L2: 31 characters // A-Z,0-9,_ if (opt->savename_83 > 0) { char *a, *last; for(last = afs->save + strlen(afs->save) - 1; last != afs->save && *last != '/' && *last != '\\' && *last != '.'; last--) ; if (*last != '.') { last = NULL; } for(a = afs->save; *a != '\0'; a++) { if (*a >= 'a' && *a <= 'z') { *a -= 'a' - 'A'; } else if (*a == '.') { if (a != last) { *a = '_'; } } else if (! ((*a >= 'A' && *a <= 'Z') || (*a >= '0' && *a <= '9') || *a == '_' || *a == '/' || *a == '\\')) { *a = '_'; } } } /* ensure that there is no ../ (potential vulnerability) */ fil_simplifie(afs->save); /* convert name to UTF-8 ? Note: already done while parsing. */ /* callback */ RUN_CALLBACK5(opt, savename, adr_complete, fil_complete, referer_adr, referer_fil, afs->save); hts_log_print(opt, LOG_DEBUG, "engine: save-name: local name: %s%s -> %s", adr, fil, afs->save); /* Ensure that the MANDATORY "temporary" extension is set */ if (ext_chg_delayed) { char *ptr; char *lastDot = NULL; for(ptr = afs->save; *ptr != 0; ptr++) { if (*ptr == '.') { lastDot = ptr; } else if (*ptr == '/' || *ptr == '\\') { lastDot = NULL; } } if (lastDot == NULL) { strcatbuff(afs->save, "." DELAYED_EXT); } else if (!IS_DELAYED_EXT(afs->save)) { /* lastDot points within afs->save; bound by the remaining capacity */ strlcatbuff(lastDot, "." DELAYED_EXT, sizeof(afs->save) - (size_t) (lastDot - afs->save)); } } // Cap the save path: the final parent+name is copied into a fixed buffer that // aborts() on overflow (htssafe.h), so clamp every ceiling to fit it. #define HTS_SAVE_BUFSIZE (HTS_URLMAXSIZE * 2) /* sizeof(afs->save) */ #define HTS_PATH_TAIL_RESERVE 64 /* collision suffix + ".delayed" + NUL */ #ifdef _WIN32 // MAX_PATH minus 8.3 headroom (MSDN) minus the ".delayed" marker; raising it // needs the engine to "\\?\"-prefix its paths, which is separate work. #define HTS_MAX_PATH_LEN (260 - 12 - 12) #define MAX_SEG_LEN 48 #else // #133: use the platform's own PATH_MAX/NAME_MAX (Linux/Android 4096, macOS // 1024) rather than the far smaller Windows MAX_PATH. #ifdef PATH_MAX #define HTS_PATH_MAX_ PATH_MAX #else #define HTS_PATH_MAX_ 1024 #endif #ifdef NAME_MAX #define HTS_NAME_MAX_ NAME_MAX #else #define HTS_NAME_MAX_ 255 #endif #define HTS_MAX_PATH_LEN \ ((HTS_PATH_MAX_ - HTS_PATH_TAIL_RESERVE) < \ (HTS_SAVE_BUFSIZE - HTS_PATH_TAIL_RESERVE) \ ? (HTS_PATH_MAX_ - HTS_PATH_TAIL_RESERVE) \ : (HTS_SAVE_BUFSIZE - HTS_PATH_TAIL_RESERVE)) #define MAX_SEG_LEN (HTS_NAME_MAX_ > 64 ? HTS_NAME_MAX_ - 16 : HTS_NAME_MAX_) #endif #define MIN_LAST_SEG_RESERVE 12 #define MAX_LAST_SEG_RESERVE 24 if (hts_stringLengthUTF8(afs->save) + hts_stringLengthUTF8(StringBuff(opt->path_html_utf8)) >= HTS_MAX_PATH_LEN) { // convert to Unicode (much simpler) size_t wsaveLen; hts_UCS4 *const wsave = hts_convertUTF8StringToUCS4(afs->save, strlen(afs->save), &wsaveLen); if (wsave != NULL) { const size_t parentLen = hts_stringLengthUTF8(StringBuff(opt->path_html_utf8)); // parent path length is not insane (otherwise, ignore and pick 200 as // suffix length) const size_t maxLen = parentLen < HTS_MAX_PATH_LEN - HTS_MAX_PATH_LEN / 4 ? HTS_MAX_PATH_LEN - parentLen : HTS_MAX_PATH_LEN; size_t i, j, lastSeg, lastSegSize, dirSize; char *saveFinal; // pick up last segment for(i = 0, lastSeg = 0; wsave[i] != '\0'; i++) { if (wsave[i] == '/') { lastSeg = i + 1; } } lastSegSize = wsaveLen - lastSeg; if (lastSegSize > MAX_LAST_SEG_RESERVE) { lastSegSize = MAX_LAST_SEG_RESERVE; } else if (lastSegSize < MIN_LAST_SEG_RESERVE) { lastSegSize = MIN_LAST_SEG_RESERVE; } // add as much pathes as we can. // note: i is in bytes, iUtf in characters for(i = 0, j = 0, dirSize = 0 ; i + 1 < lastSeg && j + lastSegSize < maxLen; i++) { // reset segment counting if (wsave[i] == '/') { dirSize = 0; } // copy if not too long if (dirSize < MAX_SEG_LEN) { wsave[j++] = wsave[i]; dirSize++; } } // last segment wsave[j++] = '/'; #define MAX_UTF8_SEQ_CHARS 4 { // #623: the ".delayed" placeholder marker sits at the tail; cutting // through it drops IS_DELAYED_EXT, so the file is never renamed to its // final name. Reserve the trailing "..delayed" across the cut. size_t markStart = wsaveLen; if (IS_DELAYED_EXT(afs->save)) { const size_t extDot = wsaveLen - strlen("." DELAYED_EXT); size_t p = extDot; /* walk back over a dot-separated "." tag */ while (p > lastSeg && ((wsave[p - 1] >= '0' && wsave[p - 1] <= '9') || (wsave[p - 1] >= 'a' && wsave[p - 1] <= 'f'))) p--; // keep the tag only if truly "..delayed"; else the bare marker // (a wholly-hex base, e.g. a hashed #133 name, must not be absorbed) markStart = (p > lastSeg && p < extDot && wsave[p - 1] == '.') ? p - 1 : extDot; } // head, bounded so the marker still fits, then the marker itself for (i = lastSeg; i < markStart && j + (wsaveLen - markStart) < maxLen; i++) wsave[j++] = wsave[i]; for (i = markStart; i < wsaveLen && j < maxLen; i++) wsave[j++] = wsave[i]; } // terminating \0 wsave[j++] = '\0'; // copy final name and cleanup saveFinal = hts_convertUCS4StringToUTF8(wsave, j); if (saveFinal != NULL) { strcpybuff(afs->save, saveFinal); free(saveFinal); } else { hts_log_print(opt, LOG_ERROR, "Could not revert to UTF-8: %s%s", adr_complete, fil_complete); } free(wsave); // log in debug hts_log_print(opt, LOG_DEBUG, "Too long filename shortened: %s%s => %s", adr_complete, fil_complete, afs->save); } else { hts_log_print(opt, LOG_ERROR, "Could not read UTF-8: %s", afs->save); } // Re-check again ending space or dot after cut (see bug #5) cleanEndingSpaceOrDot(afs->save); } // The cut above counts UTF-8 codepoints, but parent+name lands in a fixed // byte buffer that aborts() on overflow (htssafe.h). A multibyte name can // pass the codepoint cap yet overflow in bytes, so hard-cut on a codepoint // boundary to keep parent+name inside the buffer regardless (#133). { const size_t parentBytes = strlen(StringBuff(opt->path_html_utf8)); const size_t cap = HTS_SAVE_BUFSIZE - HTS_PATH_TAIL_RESERVE; // Shrink only the name. A parent that alone fills the buffer is left to the // existing prepend abort, not collapsed to an empty name that would collide // across URLs and overrun the unbounded collision-suffix sprintf. if (parentBytes < cap) { size_t budget = cap - parentBytes; if (strlen(afs->save) > budget) { while (budget > 0 && ((unsigned char) afs->save[budget] & 0xC0) == 0x80) budget--; // back off a continuation byte, never split a char afs->save[budget] = '\0'; cleanEndingSpaceOrDot(afs->save); } } } #undef MAX_UTF8_SEQ_CHARS #undef MIN_LAST_SEG_RESERVE #undef MAX_LAST_SEG_RESERVE #undef MAX_SEG_LEN #undef HTS_MAX_PATH_LEN #undef HTS_PATH_TAIL_RESERVE #undef HTS_SAVE_BUFSIZE #ifndef _WIN32 #undef HTS_PATH_MAX_ #undef HTS_NAME_MAX_ #endif // chemin primaire éventuel A METTRE AVANT if (strnotempty(StringBuff(opt->path_html_utf8))) { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; strcpybuff(tempo, StringBuff(opt->path_html_utf8)); strcatbuff(tempo, afs->save); strcpybuff(afs->save, tempo); } // vérifier que le nom n'est pas déja pris... if (opt->liens != NULL) { int nom_ok; do { int i; // nom_ok = 1; // à priori bon // on part de la fin pour optimiser, plus les opti de taille pour // aller encore plus vite.. #if DEBUG_SAVENAME printf("\nStart search\n"); #endif i = hash_read(hash, afs->save, NULL, HASH_STRUCT_FILENAME); // lecture type 0 (sav) if (i >= 0) { int sameAdr = (strfield2(heap(i)->adr, normadr) != 0); int sameFil; sameFil = (strcmp(heap(i)->fil, normfil) == 0); if (sameAdr && sameFil) { // ok c'est le même lien, adresse déja définie /* Take the existing name not to screw up with cAsE sEnSiTiViTy of Linux/Unix */ if (strcmp(heap(i)->sav, afs->save) != 0) { strcpybuff(afs->save, heap(i)->sav); } i = 0; #if DEBUG_SAVENAME printf("\nOK ALREADY DEFINED\n", 13, i); #endif } else { // utilisé par un AUTRE, changer de nom char BIGSTK tempo[HTS_URLMAXSIZE * 2]; char *a = afs->save + strlen(afs->save) - 1; char *b; int n = 2; char collisionSeparator = ((opt->savename_83 != HTS_SAVENAME_83_ISO9660) ? '-' : '_'); tempo[0] = '\0'; #if DEBUG_SAVENAME printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n", heap(i)->fil, fil_complete); #endif nom_ok = 0; i = 0; while((a > afs->save) && (*a != '.') && (*a != '\\') && (*a != '/')) a--; if (*a == '.') strncatbuff(tempo, afs->save, a - afs->save); else strcatbuff(tempo, afs->save); // tester la présence d'un -xx (ex: index-2.html -> index-3.html) b = tempo + strlen(tempo) - 1; while(isdigit((unsigned char) *b)) b--; if (*b == collisionSeparator) { sscanf(b + 1, "%d", &n); *b = '\0'; // couper n++; // plus un } // en plus il faut gérer le 8-3 .. pas facile le client if (opt->savename_83) { int max; char *a = tempo + strlen(tempo) - 1; while((a > tempo) && (*a != '/')) a--; if (*a == '/') a++; max = max_char - 1 - nombre_digit(n); if ((int) strlen(a) > max) *(a + max) = '\0'; // couper sinon il n'y aura pas la place! } // ajouter -xx (ex: index.html -> index-2.html) sprintf(tempo + strlen(tempo), "%c%d", collisionSeparator, n); // ajouter extension if (*a == '.') strcatbuff(tempo, a); strcpybuff(afs->save, tempo); } // if } #if DEBUG_SAVENAME printf("\nEnd search, %s\n", fil_complete); #endif } while (!nom_ok); } return 0; } /* md5-based name used everywhere; builds into b (capacity bsize) */ void standard_name(char *b, size_t bsize, const char *dot_pos, const char *nom_pos, const char *fil, int short_ver) { char md5[32 + 2]; htsbuff bb = htsbuff_ptr(b, bsize); /* Name */ if (dot_pos) { if (!short_ver) // long names htsbuff_catn(&bb, nom_pos, (size_t) (dot_pos - nom_pos)); else htsbuff_catn(&bb, nom_pos, (size_t) min(dot_pos - nom_pos, 8)); } else { if (!short_ver) // long names htsbuff_cat(&bb, nom_pos); else htsbuff_catn(&bb, nom_pos, 8); } /* MD5 - 16 bits */ htsbuff_catn(&bb, url_md5(md5, fil), 4); /* Ext */ if (dot_pos) { htsbuff_catc(&bb, '.'); if (!short_ver) // long names htsbuff_cat(&bb, dot_pos + 1); else htsbuff_catn(&bb, dot_pos + 1, 3); } // Allow extensionless #ifdef DO_NOT_ALLOW_EXTENSIONLESS else { if (!short_ver) // long names htsbuff_cat(&bb, DEFAULT_EXT); else htsbuff_cat(&bb, DEFAULT_EXT_SHORT); } #endif } /* Petit md5 */ char *url_md5(char *digest, const char *fil) { char *a; digest[0] = '\0'; a = strchr(fil, '?'); if (a) { if (strlen(a)) { char BIGSTK buff[HTS_URLMAXSIZE * 2]; a++; digest[0] = buff[0] = '\0'; strcatbuff(buff, a); /* query string MD5 */ domd5mem(buff, strlen(buff), digest, 1); } } return digest; } // interne à url_savename: ajoute une chaîne à une autre avec \ -> / void url_savename_addstr(char *d, const char *s) { int i = (int) strlen(d); while(*s) { if (*s == '\\') // remplacer \ par des / d[i++] = '/'; else d[i++] = *s; s++; } d[i] = '\0'; } /* "filename" should be at least 64 bytes. */ void url_savename_refname(const char *adr, const char *fil, char *filename) { unsigned char bindigest[16]; struct MD5Context ctx; MD5Init(&ctx, 0); MD5Update(&ctx, (const unsigned char *) adr, (int) strlen(adr)); MD5Update(&ctx, (const unsigned char *) ",", 1); MD5Update(&ctx, (const unsigned char *) fil, (int) strlen(fil)); MD5Final(bindigest, &ctx); sprintf(filename, CACHE_REFNAME "/" "%02x%02x%02x%02x%02x%02x%02x%02x" "%02x%02x%02x%02x%02x%02x%02x%02x" ".ref", bindigest[0], bindigest[1], bindigest[2], bindigest[3], bindigest[4], bindigest[5], bindigest[6], bindigest[7], bindigest[8], bindigest[9], bindigest[10], bindigest[11], bindigest[12], bindigest[13], bindigest[14], bindigest[15]); } /* note: return a local filename */ char *url_savename_refname_fullpath(httrackp * opt, const char *adr, const char *fil) { char digest_filename[64]; url_savename_refname(adr, fil, digest_filename); return fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), digest_filename); } /* remove refname if any; HTS_TRUE if it was removed */ hts_boolean url_savename_refname_remove(httrackp *opt, const char *adr, const char *fil) { char *filename = url_savename_refname_fullpath(opt, adr, fil); return UNLINK(filename) == 0 ? HTS_TRUE : HTS_FALSE; } httrack-3.49.14/src/htscoremain.c0000644000175000017500000031746515230602340012277 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: opt->c subroutines: */ /* main routine (first called) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htscoremain.h" #include "htsglobal.h" #include "htscore.h" #include "htsdefines.h" #include "htsalias.h" #include "htswarc.h" #include "htsbauth.h" #include "htswrap.h" #include "htsmodules.h" #include "htszlib.h" #include "htscharset.h" #include "htsselftest.h" #include "htsmd5.h" #include #if USE_BEGINTHREAD #ifdef _WIN32 #include #endif #endif #ifdef _WIN32 #else #ifndef HTS_DO_NOT_USE_UID /* setuid */ #include #ifdef HAVE_UNISTD_H #include #endif #endif #endif /* Resolver */ extern int IPV6_resolver; #define htsmain_free() do { \ if (url != NULL) { \ free(url); \ } \ } while(0) #define ensureUrlCapacity(url, urlsize, size) do { \ if (urlsize < size || url == NULL) { \ urlsize = size; \ if (url == NULL) { \ url = (char*) malloct(urlsize); \ if (url != NULL) url[0]='\0'; \ } else { \ url = (char*) realloct(url, urlsize); \ } \ if (url == NULL) { \ HTS_PANIC_PRINTF("* memory exhausted"); \ htsmain_free(); \ return -1; \ } \ } \ } while(0) #ifdef HTS_CRASH_TEST static __attribute__ ((noinline)) void fourty_two(void) { char *const ptr = (char*) (uintptr_t) 0x42; (*ptr)++; } static __attribute__ ((noinline)) void do_really_crash(void) { fourty_two(); } static __attribute__ ((noinline)) void do_crash(void) { do_really_crash(); } #endif HTSEXT_API int hts_main(int argc, char **argv) { httrackp *opt = hts_create_opt(); int ret = hts_main2(argc, argv, opt); hts_free_opt(opt); return ret; } static int hts_main_internal(int argc, char **argv, httrackp * opt); static hts_boolean cmdl_shortopt_has(const char *s, char c); // Main, récupère les paramètres et appelle le robot HTSEXT_API int hts_main2(int argc, char **argv, httrackp * opt) { int code; // Set ended state (3.48-14) hts_mutexlock(&opt->state.lock); opt->state.is_ended = 0; hts_mutexrelease(&opt->state.lock); code = hts_main_internal(argc, argv, opt); // Set ended state (3.48-14) hts_mutexlock(&opt->state.lock); opt->state.is_ended = 1; hts_mutexrelease(&opt->state.lock); return code; } static int hts_main_internal(int argc, char **argv, httrackp * opt) { char **x_argv = NULL; // Patch pour argv et argc: en cas de récupération de ligne de commande char *x_argvblk = NULL; // (reprise ou update) size_t x_argvblk_size = 0; // total capacity of x_argvblk int x_ptr = 0; // offset // int argv_url = -1; // ==0 : utiliser cache et doit.log char *argv_firsturl = NULL; // utilisé pour nommage par défaut char *url = NULL; // URLS séparées par un espace int url_sz = 65535; // the parametres int httrack_logmode = 3; // ONE log file ensureUrlCapacity(url, url_sz, 65536); // Create options _DEBUG_HEAD = 0; // pas de debuggage en têtes /* command max-size check (3.43 ; 3.42-4) */ { int i; for(i = 0; i < argc; i++) { if (strlen(argv[i]) >= HTS_CDLMAXSIZE) { HTS_PANIC_PRINTF("argument too long"); htsmain_free(); return -1; } } } /* Init root dir */ hts_rootdir(argv[0]); #ifdef _WIN32 #else /* Terminal is a tty, may ask questions and display funny information */ if (isatty(1)) { opt->quiet = 0; opt->verbosedisplay = HTS_VERBOSE_SIMPLE; } /* Not a tty, no stdin input or funny output! */ else { opt->quiet = 1; opt->verbosedisplay = HTS_VERBOSE_NONE; } #endif // Binary program path? #ifndef HTS_HTTRACKDIR { char catbuff[CATBUFF_SIZE]; char *path = fslash(catbuff, sizeof(catbuff), argv[0]); char *a; if ((a = strrchr(path, '/'))) { StringCopyN(opt->path_bin, argv[0], a - path); } } #else StringCopy(opt->path_bin, HTS_HTTRACKDIR); #endif /* filter CR, LF, TAB.. */ { int na; for(na = 1; na < argc; na++) { char *a; while((a = strchr(argv[na], '\x0d'))) *a = ' '; while((a = strchr(argv[na], '\x0a'))) *a = ' '; while((a = strchr(argv[na], 9))) *a = ' '; /* equivalent to "empty parameter" */ if ((strcmp(argv[na], HTS_NOPARAM) == 0) || (strcmp(argv[na], HTS_NOPARAM2) == 0)) // (none) /* replacing "(none)"/"\"(none)\"" with "\"\"" always fits in place */ strlcpybuff(argv[na], "\"\"", strlen(argv[na]) + 1); if (strncmp(argv[na], "-&", 2) == 0) argv[na][1] = '%'; } } /* create x_argvblk buffer for transformed command line */ { int current_size = 0; int size; int na; for(na = 0; na < argc; na++) current_size += (int) (strlen(argv[na]) + 1); if ((size = fsize("config")) > 0) current_size += size; x_argvblk = (char *) malloct(current_size + 32768); if (x_argvblk == NULL) { HTS_PANIC_PRINTF("Error, not enough memory"); htsmain_free(); return -1; } x_argvblk_size = (size_t) (current_size + 32768); x_argvblk[0] = '\0'; x_ptr = 0; /* Create argv */ x_argv = (char **) malloct(sizeof(char *) * (argc + 1024)); } /* Create new argc/argv, replace alias, count URLs, treat -h, -q, -i */ { char BIGSTK _tmp_argv[2][HTS_CDLMAXSIZE]; char BIGSTK tmp_error[HTS_CDLMAXSIZE]; char *tmp_argv[2]; int tmp_argc; int x_argc = 0; int na; tmp_argv[0] = _tmp_argv[0]; tmp_argv[1] = _tmp_argv[1]; // argv_url = 0; /* pour comptage */ // cmdl_add(argv[0], x_argc, x_argv, x_argvblk, x_argvblk_size, x_ptr); na = 1; /* commencer après nom_prg */ while(na < argc) { int result = 1; tmp_argv[0][0] = tmp_argv[1][0] = '\0'; /* Vérifier argv[] non vide */ if (strnotempty(argv[na])) { /* Resolve an option alias, if any */ result = optalias_check(argc, (const char *const *) argv, na, &tmp_argc, (char **) tmp_argv, sizeof(_tmp_argv[0]), tmp_error, sizeof(tmp_error)); if (!result) { HTS_PANIC_PRINTF(tmp_error); htsmain_free(); return -1; } /* Copier */ cmdl_add(tmp_argv[0], x_argc, x_argv, x_argvblk, x_argvblk_size, x_ptr); if (tmp_argc > 1) { cmdl_add(tmp_argv[1], x_argc, x_argv, x_argvblk, x_argvblk_size, x_ptr); } /* Compter URLs et détecter -i,-q.. */ if (tmp_argc == 1) { /* pas -P & co */ if (!cmdl_opt(tmp_argv[0])) { /* pas -c0 & co */ if (argv_url < 0) argv_url = 0; // -1==force -> 1=one url already detected, wipe all // previous options argv_url++; if (!argv_firsturl) argv_firsturl = x_argv[x_argc - 1]; } else { if (strcmp(tmp_argv[0], "-h") == 0) { help(argv[0], !opt->quiet); htsmain_free(); return 0; } else if (strcmp(tmp_argv[0], "-#h") == 0) { printf("HTTrack version " HTTRACK_VERSION "%s\n", hts_get_version_info(opt)); return 0; } else { if (strncmp(tmp_argv[0], "--", 2)) { /* not a long option */ if (cmdl_shortopt_has(tmp_argv[0], 'q')) opt->quiet = HTS_TRUE; // never ask questions (nohup) if (cmdl_shortopt_has(tmp_argv[0], 'i')) { // doit.log! argv_url = -1; opt->quiet = HTS_TRUE; } } else if (strcmp(tmp_argv[0] + 2, "quiet") == 0) { opt->quiet = 1; // ne pas poser de questions! (nohup par exemple) } else if (strcmp(tmp_argv[0] + 2, "continue") == 0) { argv_url = -1; /* forcer */ opt->quiet = 1; } } } } else if (tmp_argc == 2) { if ((strcmp(tmp_argv[0], "-%L") == 0)) { // liste d'URLs if (argv_url < 0) argv_url = 0; // -1==force -> 1=one url already detected, wipe all // previous options argv_url++; /* forcer */ } } } na += result; } if (argv_url < 0) argv_url = 0; /* Nouveaux argc et argv */ argv = x_argv; argc = x_argc; } // Option O and includerc { int loops = 0; while(loops < 2) { char *com; int na; for(na = 1; na < argc; na++) { if (argv[na][0] == '"') { char BIGSTK tempo[HTS_CDLMAXSIZE]; strcpybuff(tempo, argv[na] + 1); if (tempo[0] == '\0' || tempo[strlen(tempo) - 1] != '"') { char BIGSTK s[HTS_CDLMAXSIZE]; sprintf(s, "Missing quote in %s", argv[na]); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } tempo[strlen(tempo) - 1] = '\0'; /* tempo is argv[na] minus its surrounding quotes, so it fits in place */ strlcpybuff(argv[na], tempo, strlen(argv[na]) + 1); } if (cmdl_opt(argv[na])) { // option com = argv[na] + 1; while(*com) { switch (*com) { case 'O': // output path if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option O needs to be followed by a blank space, and a path (or path,path)"); printf("Example: -O /binary/\n"); printf("Example: -O /binary/,/log/\n"); htsmain_free(); return -1; } else { int i /*, j */ ; int inQuote; String *path; int noDbl = 0; if (com[1] == '1') { /* only 1 arg */ com++; noDbl = 1; } na++; StringClear(opt->path_html); StringClear(opt->path_log); for(i = 0 /*, j = 0 */ , inQuote = 0, path = &opt->path_html; argv[na][i] != 0; i++) { if (argv[na][i] == '"') { if (inQuote) inQuote = 0; else inQuote = 1; } else if (!inQuote && !noDbl && argv[na][i] == ',') { path = &opt->path_log; } else { StringAddchar(*path, argv[na][i]); } } if (StringLength(opt->path_log) == 0) { StringCopyS(opt->path_log, opt->path_html); } check_path(&opt->path_log, argv_firsturl); if (check_path(&opt->path_html, argv_firsturl)) { opt->dir_topindex = 1; // rebuilt top index } } break; } // switch com++; } // while } // arg } // for // path_html is already UTF-8 (argv is UTF-8 on Windows via // hts_argv_utf8), so no re-encoding. StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html), StringLength(opt->path_html)); /* if doit.log exists, or if new URL(s) defined, then DO NOT load standard config files */ /* (config files are added in doit.log) */ #if DEBUG_STEPS printf("Loading httrackrc/doit.log\n"); #endif /* recreate a doit.log (no old doit.log or new URLs (and parameters)) */ if ((strnotempty(StringBuff(opt->path_log))) || (strnotempty(StringBuff(opt->path_html)))) loops++; // do not loop once again and do not include rc file (O option exists) else { if ((!fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log"))) || (argv_url > 0)) { if (!optinclude_file( fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), HTS_HTTRACKRC), &argc, argv, x_argvblk, x_argvblk_size, &x_ptr)) if (!optinclude_file(HTS_HTTRACKRC, &argc, argv, x_argvblk, x_argvblk_size, &x_ptr)) { if (!optinclude_file( fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), hts_gethome(), "/" HTS_HTTRACKRC), &argc, argv, x_argvblk, x_argvblk_size, &x_ptr)) { #ifdef HTS_HTTRACKCNF optinclude_file(HTS_HTTRACKCNF, &argc, argv, x_argvblk, x_argvblk_size, &x_ptr); #endif } } } else loops++; // do not loop once again } loops++; } // while } // traiter -O /* load doit.log and insert in current command line */ if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log")) && (argv_url <= 0)) { FILE *fp = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log"), "rb"); if (fp) { int insert_after = 1; /* insérer après nom au début */ // char BIGSTK buff[8192]; char *p, *lastp; linput(fp, buff, 8000); fclose(fp); fp = NULL; p = buff; do { int insert_after_argc; int quoted; /* "" unquotes to empty but is still a real token (#106) */ // read next lastp = p; quoted = (p != NULL && *p == '"'); if (p) { p = next_token(p, 1); if (p) { *p = 0; // null p++; } } /* Insert parameters BUT so that they can be in the same order */ if (lastp) { if (strnotempty(lastp) || quoted) { insert_after_argc = argc - insert_after; cmdl_ins(lastp, insert_after_argc, (argv + insert_after), x_argvblk, x_argvblk_size, x_ptr); argc = insert_after_argc + insert_after; insert_after++; } } } while (lastp != NULL); } } // No new cache but an old one? promote it #if DEBUG_STEPS printf("Checking cache\n"); #endif hts_cache_reconcile(opt, CACHE_RECONCILE_PROMOTE); /* Interrupted mirror detected */ if (!opt->quiet) { if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-in_progress.lock"))) { /* Old cache */ if ((fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.dat"))) && (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.ndx")))) { if (opt->log != NULL) { fprintf(opt->log, "Warning!\n"); fprintf(opt->log, "An aborted mirror has been detected!\nThe current temporary cache is required for any update operation and only contains data downloaded during the last aborted session.\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\nThis can easily be done here by erasing the hts-cache/new.* files\n"); fprintf(opt->log, "Please restart HTTrack with --continue (-iC1) option to override this message!\n"); } return 0; } } } // remplacer "macros" comme --spider // permet de lancer httrack sans a avoir à se rappeler de syntaxes comme p0C0I0Qc32 .. #if DEBUG_STEPS printf("Checking last macros\n"); #endif { int i; for(i = 0; i < argc; i++) { #if DEBUG_STEPS printf("Checking #%d:\n", argv[i]); printf("%s\n", argv[i]); #endif if (argv[i][0] == '-') { if (argv[i][1] == '-') { // --xxx if ((strfield2(argv[i] + 2, "clean")) || (strfield2(argv[i] + 2, "tide"))) { // nettoyer argv[i][1] = '\0'; if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "index.html"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "index.html")); /* */ if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.zip"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.zip")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.dat"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.dat")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.ndx"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.ndx")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.dat"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.dat")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.ndx"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.ndx")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.lst"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.lst")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.lst"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.lst")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.txt"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.txt")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.txt"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.txt")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-in_progress.lock"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-in_progress.lock")); RMDIR(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache")); // } else if (strfield2(argv[i] + 2, "catchurl")) { // capture d'URL via proxy temporaire! argv_url = 1; // forcer a passer les parametres /* argv[i] is "--catchurl"; "#P" fits after its first char */ strlcpybuff(argv[i] + 1, "#P", strlen(argv[i] + 1) + 1); // } else if (strfield2(argv[i] + 2, "updatehttrack")) { #ifdef _WIN32 char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "%s not available in this version", argv[i]); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; #endif } // else { char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "%s not recognized", argv[i]); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } } } } } /* Engine self-tests: -#test lists them, -#test=NAME [args] runs one. Handled here, ahead of the no-URL usage gate below, so they need no dummy URL. */ { int k; for (k = 1; k < argc; k++) { const char *const a = argv[k]; if (a[0] == '-' && a[1] == '#' && strncmp(a + 2, "test", 4) == 0 && (a[6] == '\0' || a[6] == '=')) { const char *const name = a[6] == '=' ? a + 7 : NULL; const int code = hts_selftest(opt, name, argc - (k + 1), &argv[k + 1]); htsmain_free(); return code; } } } // Pas d'URL #if DEBUG_STEPS printf("Checking URLs\n"); #endif if (argv_url == 0) { // Présence d'un cache, que faire?.. if ((fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip"))) || (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.dat")) && fexist_utf8( fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.ndx")))) { // il existe déja un cache // précédent.. renommer if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log"))) { // un cache est présent if (x_argvblk != NULL) { int m; // établir mode - mode cache: 1 (cache valide) 2 (cache à vérifier) if (fexist_utf8( fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-in_progress.lock"))) { // cache prioritaire m = 1; } else { m = 2; } opt->cache = m; if (opt->quiet == 0) { // sinon on continue automatiquement HT_REQUEST_START; HT_PRINT("A cache (hts-cache/) has been found in the directory "); HT_PRINT(StringBuff(opt->path_log)); HT_PRINT(LF); if (m == 1) { HT_PRINT("That means that a transfer has been aborted" LF); HT_PRINT("OK to Continue "); } else { HT_PRINT("That means you can update faster the remote site(s)" LF); HT_PRINT("OK to Update "); } HT_PRINT("httrack "); HT_PRINT(x_argvblk); HT_PRINT("?" LF); HT_REQUEST_END; if (!ask_continue(opt)) { htsmain_free(); return 0; } } } else { HTS_PANIC_PRINTF("Error, not enough memory"); htsmain_free(); return -1; } } else { // log existe pas HTS_PANIC_PRINTF("A cache has been found, but no command line"); printf ("Please launch httrack with proper parameters to reuse the cache\n"); htsmain_free(); return -1; } } else { // aucune URL définie et pas de cache if (opt->quiet) { help(argv[0], !opt->quiet); htsmain_free(); return -1; } else { help_wizard(opt); htsmain_free(); return -1; } htsmain_free(); return 0; } } else { // plus de 2 paramètres // un fichier log existe? if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-in_progress.lock"))) { // fichier lock? opt->cache = HTS_CACHE_PRIORITY; // cache prioritaire if (opt->quiet == 0) { if ((fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip"))) || (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.dat")) && fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.ndx")))) { HT_REQUEST_START; HT_PRINT("There is a lock-file in the directory "); HT_PRINT(StringBuff(opt->path_log)); HT_PRINT(LF "That means that a mirror has not been terminated" LF); HT_PRINT("Be sure you call httrack with proper parameters" LF); HT_PRINT("(The cache allows you to restart faster the transfer)" LF); HT_REQUEST_END; if (!ask_continue(opt)) { htsmain_free(); return 0; } } } } else if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "index.html"))) { opt->cache = HTS_CACHE_TEST_UPDATE; if (opt->quiet == 0) { if ((fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip"))) || (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.dat")) && fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.ndx")))) { HT_REQUEST_START; HT_PRINT ("There is an index.html and a hts-cache folder in the directory "); HT_PRINT(StringBuff(opt->path_log)); HT_PRINT(LF "A site may have been mirrored here, that could mean that you want to update it" LF); HT_PRINT("Be sure parameters are ok" LF); HT_REQUEST_END; if (!ask_continue(opt)) { htsmain_free(); return 0; } } else { HT_REQUEST_START; HT_PRINT("There is an index.html in the directory "); HT_PRINT(StringBuff(opt->path_log)); HT_PRINT(" but no cache" LF); HT_PRINT("There is an index.html in the directory, but no cache" LF); HT_PRINT("A site may have been mirrored here, and erased.." LF); HT_PRINT("Be sure parameters are ok" LF); HT_REQUEST_END; if (!ask_continue(opt)) { htsmain_free(); return 0; } } } } } // Treat parameters // Traiter les paramètres #if DEBUG_STEPS printf("Analyze parameters\n"); #endif { char *com; int na; for(na = 1; na < argc; na++) { if (argv[na][0] == '"') { char BIGSTK tempo[HTS_CDLMAXSIZE + 256]; strcpybuff(tempo, argv[na] + 1); if (tempo[0] == '\0' || tempo[strlen(tempo) - 1] != '"') { char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "Missing quote in %s", argv[na]); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } tempo[strlen(tempo) - 1] = '\0'; /* tempo is argv[na] minus its surrounding quotes, so it fits in place */ strlcpybuff(argv[na], tempo, strlen(argv[na]) + 1); } if (cmdl_opt(argv[na])) { // option com = argv[na] + 1; while(*com) { switch (*com) { case ' ': case 9: case '-': case '\0': break; // case 'h': help(argv[0], 0); htsmain_free(); return 0; // déja fait normalement // case 'g': // récupérer un (ou plusieurs) fichiers isolés opt->wizard = HTS_WIZARD_AUTO; opt->cache = HTS_CACHE_NONE; // ni de cache opt->makeindex = 0; // ni d'index httrack_logmode = 1; // erreurs à l'écran opt->savename_type = 1003; // mettre dans le répertoire courant opt->depth = 0; // ne pas explorer la page opt->accept_cookie = 0; // pas de cookies opt->robots = HTS_ROBOTS_NEVER; // pas de robots break; case 'w': opt->wizard = HTS_WIZARD_AUTO; opt->travel = HTS_TRAVEL_SAME_ADDRESS; opt->seeker = HTS_SEEKER_DOWN; break; case 'W': opt->wizard = HTS_WIZARD_ASK; // Wizard-Help (pose des questions) opt->travel = HTS_TRAVEL_SAME_ADDRESS; opt->seeker = HTS_SEEKER_DOWN; break; case 'r': // n'est plus le recurse get bestial mais wizard itou! if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", &opt->depth); while(isdigit((unsigned char) *(com + 1))) com++; } else opt->depth = 3; break; /* case 'r': opt->wizard=0; if (isdigit((unsigned char)*(com+1))) { sscanf(com+1,"%d",&opt->depth); while(isdigit((unsigned char)*(com+1))) com++; } else opt->depth=3; break; */ // // note: les tests opt->depth sont pour éviter de faire // un miroir du web (:-O) accidentelement ;-) case 'a': /*if (opt->depth==9999) opt->depth=3; */ opt->travel = HTS_TRAVEL_SAME_ADDRESS + (opt->travel & HTS_TRAVEL_TEST_ALL); break; case 'd': /*if (opt->depth==9999) opt->depth=3; */ opt->travel = HTS_TRAVEL_SAME_DOMAIN + (opt->travel & HTS_TRAVEL_TEST_ALL); break; case 'l': /*if (opt->depth==9999) opt->depth=3; */ opt->travel = HTS_TRAVEL_SAME_TLD + (opt->travel & HTS_TRAVEL_TEST_ALL); break; case 'e': /*if (opt->depth==9999) opt->depth=3; */ opt->travel = HTS_TRAVEL_EVERYWHERE + (opt->travel & HTS_TRAVEL_TEST_ALL); break; case 't': opt->travel |= HTS_TRAVEL_TEST_ALL; break; case 'n': opt->nearlink = 1; break; case 'x': opt->external = 1; break; // case 'U': opt->seeker = HTS_SEEKER_UP; break; case 'D': opt->seeker = HTS_SEEKER_DOWN; break; case 'S': opt->seeker = 0; break; case 'B': opt->seeker = HTS_SEEKER_DOWN | HTS_SEEKER_UP; break; // case 'Y': opt->mirror_first_page = 1; break; // case 'q': case 'i': opt->quiet = 1; break; // case 'Q': httrack_logmode = 0; opt->debug = LOG_NOTICE; break; case 'v': httrack_logmode = 1; break; case 'f': httrack_logmode = 2; if (*(com + 1) == '2') httrack_logmode = 3; while(isdigit((unsigned char) *(com + 1))) com++; break; case 'K': opt->urlmode = HTS_URLMODE_ABSOLUTE; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", (int *) &opt->urlmode); if (opt->urlmode == HTS_URLMODE_ABSOLUTE) { // in fact K0 ==> K2 // and K ==> K0 opt->urlmode = HTS_URLMODE_RELATIVE; } while(isdigit((unsigned char) *(com + 1))) com++; } break; case 'c': if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", &opt->maxsoc); while(isdigit((unsigned char) *(com + 1))) com++; opt->maxsoc = max(opt->maxsoc, 1); // FORCER A 1 } else opt->maxsoc = 4; break; // case 'p': sscanf(com + 1, "%d", &opt->getmode); while(isdigit((unsigned char) *(com + 1))) com++; break; // case 'G': sscanf(com + 1, LLintP, &opt->fragment); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'M': sscanf(com + 1, LLintP, &opt->maxsite); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'm': // -m,10000 variant if (*(com + 1) != ',') { sscanf(com + 1, LLintP, &opt->maxfile_nonhtml); while(isdigit((unsigned char) *(com + 1))) com++; } if (*(com + 1) == ',' && isdigit((unsigned char) *(com + 2))) { com++; sscanf(com + 1, LLintP, &opt->maxfile_html); while(isdigit((unsigned char) *(com + 1))) com++; } else opt->maxfile_html = -1; break; // case 'T': sscanf(com + 1, "%d", &opt->timeout); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'J': sscanf(com + 1, "%d", &opt->rateout); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'R': sscanf(com + 1, "%d", &opt->retry); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'E': sscanf(com + 1, "%d", &opt->maxtime); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'H': sscanf(com + 1, "%d", &opt->hostcontrol); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'A': sscanf(com + 1, "%d", &opt->maxrate); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'j': opt->parsejava = HTSPARSE_DEFAULT; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", &opt->parsejava); while(isdigit((unsigned char) *(com + 1))) com++; } break; // case 'I': opt->makeindex = 1; if (*(com + 1) == '0') { opt->makeindex = 0; com++; } break; // case 'X': opt->delete_old = 1; if (*(com + 1) == '0') { opt->delete_old = 0; com++; } break; // case 'y': opt->background_on_suspend = 1; if (*(com + 1) == '0') { opt->background_on_suspend = 0; com++; } break; // case 'b': sscanf(com + 1, "%d", (int *) &opt->accept_cookie); while(isdigit((unsigned char) *(com + 1))) com++; break; // case 'N': if (strcmp(argv[na], "-N") == 0) { // Tout seul if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { // erreur HTS_PANIC_PRINTF ("Option N needs a number, or needs to be followed by a blank space, and a string"); printf("Example: -N4\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 127) { HTS_PANIC_PRINTF("Userdef structure string too long"); htsmain_free(); return -1; } StringCopy(opt->savename_userdef, argv[na]); if (StringLength(opt->savename_userdef) > 0) opt->savename_type = -1; // userdef! else opt->savename_type = 0; // -N "" : par défaut } } else { sscanf(com + 1, "%d", &opt->savename_type); while(isdigit((unsigned char) *(com + 1))) com++; } break; case 'L': { sscanf(com + 1, "%d", (int *) &opt->savename_83); switch (opt->savename_83) { case 0: // 8-3 (ISO9660 L1) opt->savename_83 = HTS_SAVENAME_83_DOS; break; case 1: opt->savename_83 = HTS_SAVENAME_83_LONG; break; default: // 2 == ISO9660 (ISO9660 L2) opt->savename_83 = HTS_SAVENAME_83_ISO9660; break; } while (isdigit((unsigned char) *(com + 1))) com++; } break; case 's': if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", (int *) &opt->robots); while(isdigit((unsigned char) *(com + 1))) com++; } else opt->robots = HTS_ROBOTS_SOMETIMES; #if DEBUG_ROBOTS printf("robots.txt mode set to %d\n", opt->robots); #endif break; case 'o': sscanf(com + 1, "%d", (int *) &opt->errpage); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'u': sscanf(com + 1, "%d", (int *) &opt->check_type); while(isdigit((unsigned char) *(com + 1))) com++; break; // case 'C': if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", (int *) &opt->cache); while(isdigit((unsigned char) *(com + 1))) com++; } else opt->cache = HTS_CACHE_PRIORITY; break; case 'k': opt->all_in_cache = 1; break; // case 'z': if (opt->debug > LOG_INFO) { opt->debug = LOG_DEBUG; /* -Zz */ } else { opt->debug = LOG_INFO; } break; // petit debug case 'Z': if (opt->debug >= LOG_DEBUG) { opt->debug = LOG_TRACE; /* -Zz */ } else { opt->debug = LOG_DEBUG; } break; // GROS debug // case '&': case '%':{ // deuxième jeu d'options com++; switch (*com) { case 'M': opt->mimehtml = 1; if (*(com + 1) == '0') { opt->mimehtml = 0; com++; } break; case 'k': opt->nokeepalive = 0; if (*(com + 1) == '0') { opt->nokeepalive = 1; com++; } break; case 'x': opt->passprivacy = 1; if (*(com + 1) == '0') { opt->passprivacy = 0; com++; } break; // No passwords in html files case 'q': opt->includequery = 1; if (*(com + 1) == '0') { opt->includequery = 0; com++; } break; // No passwords in html files case 'I': opt->kindex = 1; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", (int *) &opt->kindex); while(isdigit((unsigned char) *(com + 1))) com++; } break; // Keyword Index case 'c': sscanf(com + 1, "%f", &opt->maxconn); while(isdigit((unsigned char) *(com + 1)) || *(com + 1) == '.') com++; break; case 'e': sscanf(com + 1, "%d", &opt->extdepth); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'B': opt->tolerant = 1; if (*(com + 1) == '0') { opt->tolerant = 0; com++; } break; // HTTP/1.0 notamment case 'h': opt->http10 = 1; if (*(com + 1) == '0') { opt->http10 = 0; com++; } break; // HTTP/1.0 case 'z': opt->nocompression = 1; if (*(com + 1) == '0') { opt->nocompression = 0; com++; } break; // pas de compression case 'f': opt->ftp_proxy = 1; if (*(com + 1) == '0') { opt->ftp_proxy = 0; com++; } break; // proxy http pour ftp case 'P': opt->parseall = 1; if (*(com + 1) == '0') { opt->parseall = 0; com++; } break; // tout parser case 'n': opt->norecatch = 1; if (*(com + 1) == '0') { opt->norecatch = 0; com++; } break; // ne pas reprendre fichiers effacés localement case 's': opt->sizehack = 1; if (*(com + 1) == '0') { opt->sizehack = 0; com++; } break; // hack sur content-length case 'u': opt->urlhack = 1; if (*(com + 1) == '0') { opt->urlhack = 0; com++; } break; // url hack case 'j': opt->no_www_dedup = HTS_TRUE; // --keep-www-prefix: keep www.X != X if (*(com + 1) == '0') { opt->no_www_dedup = HTS_FALSE; com++; } break; case 'o': opt->no_slash_dedup = HTS_TRUE; // --keep-double-slashes: keep // if (*(com + 1) == '0') { opt->no_slash_dedup = HTS_FALSE; com++; } break; case 'y': opt->no_query_dedup = HTS_TRUE; // --keep-query-order: keep ?b&a order if (*(com + 1) == '0') { opt->no_query_dedup = HTS_FALSE; com++; } break; case 'v': opt->verbosedisplay = HTS_VERBOSE_FULL; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", (int *) &opt->verbosedisplay); while(isdigit((unsigned char) *(com + 1))) com++; } break; case 'i': opt->dir_topindex = 1; if (*(com + 1) == '0') { opt->dir_topindex = 0; com++; } break; case 'N': opt->savename_delayed = HTS_SAVENAME_DELAYED_HARD; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", (int *) &opt->savename_delayed); while(isdigit((unsigned char) *(com + 1))) com++; } break; case 'D': opt->delayed_cached = 1; if (*(com + 1) == '0') { opt->delayed_cached = 0; com++; } break; // url hack case 'T': opt->convert_utf8 = 1; if (*(com + 1) == '0') { opt->convert_utf8 = 0; com++; } break; // convert to utf-8 case '!': opt->bypass_limits = 1; if (*(com + 1) == '0') { opt->bypass_limits = 0; com++; } break; case 'w': // disable specific plugin if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %w needs to be followed by a blank space, and a module name"); printf("Example: -%%w httrack-plugin\n"); htsmain_free(); return -1; } else { na++; StringCat(opt->mod_blacklist, argv[na]); StringCat(opt->mod_blacklist, "\n"); } break; // preserve: no footer, original links case 'p': StringClear(opt->footer); opt->urlmode = HTS_URLMODE_KEEP_ORIGINAL; break; case 'L': // URL list if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %L needs to be followed by a blank space, and a text filename"); printf("Example: -%%L \"mylist.txt\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 254) { HTS_PANIC_PRINTF("File list string too long"); htsmain_free(); return -1; } StringCopy(opt->filelist, argv[na]); } break; case 'b': // bind if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %b needs to be followed by a blank space, and a local hostname"); printf("Example: -%%b \"ip4.localhost\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 254) { HTS_PANIC_PRINTF("Hostname string too long"); htsmain_free(); return -1; } StringCopy(opt->proxy.bindhost, argv[na]); } break; case 'S': // Scan Rules list if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %S needs to be followed by a blank space, and a text filename"); printf("Example: -%%S \"myfilterlist.txt\"\n"); htsmain_free(); return -1; } else { LLint fz; na++; fz = fsize_utf8(argv[na]); if (fz < 0) { HTS_PANIC_PRINTF("File url list could not be opened"); htsmain_free(); return -1; } else { FILE *fp = FOPEN(argv[na], "rb"); if (fp != NULL) { int cl = (int) strlen(url); ensureUrlCapacity(url, url_sz, cl + fz + 8192); if (cl > 0) { /* don't stick! (3.43) */ url[cl] = ' '; cl++; } if (fread(url + cl, 1, fz, fp) != fz) { HTS_PANIC_PRINTF("File url list could not be read"); htsmain_free(); return -1; } fclose(fp); *(url + cl + fz) = '\0'; } } } break; case 'A': // assume if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %A needs to be followed by a blank space, and a filesystemtype=mimetype/mimesubtype parameters"); printf("Example: -%%A php3=text/html,asp=text/html\n"); htsmain_free(); return -1; } else { na++; // --assume standard if (strcmp(argv[na], "standard") == 0) { StringCopy(opt->mimedefs, "\n"); StringCat(opt->mimedefs, HTS_ASSUME_STANDARD); StringCat(opt->mimedefs, "\n"); } else { char *a; for(a = argv[na]; *a != '\0'; a++) { if (*a == ';') { /* next one */ StringAddchar(opt->mimedefs, '\n'); //*b++ = '\n'; } else if (*a == ',' || *a == '\n' || *a == '\r' || *a == '\t') { StringAddchar(opt->mimedefs, ' '); //*b++ = ' '; } else { StringAddchar(opt->mimedefs, *a); //*b++ = *a; } } StringAddchar(opt->mimedefs, '\n'); //*b++ = '\n'; /* next def */ //*b++ = '\0'; } } break; // case 'l': // Accept-language if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %l needs to be followed by a blank space, and an ISO language code"); printf("Example: -%%l \"en\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 62) { HTS_PANIC_PRINTF("Lang list string too long"); htsmain_free(); return -1; } StringCopy(opt->lang_iso, argv[na]); } break; // case 'a': // Accept if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %a needs to be followed by a blank space, and a list of formats"); printf("Example: -%%a \"text/html,*/*;q=0.1\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 256) { HTS_PANIC_PRINTF("Accept list string too long"); htsmain_free(); return -1; } StringCopy(opt->accept, argv[na]); } break; // case 'X': // HTTP header line if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %X needs to be followed by a blank space, and a raw HTTP header line"); printf("Example: -%%X \"X-Magic: 42\"\n"); htsmain_free(); return -1; } else { na++; if (argv[na][0] == '\0') { HTS_PANIC_PRINTF("Empty string given"); htsmain_free(); return -1; } StringCat(opt->headers, argv[na]); StringCat(opt->headers, "\r\n"); /* separator */ } break; // case 'F': // footer id if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %F needs to be followed by a blank space, and a footer string"); printf("Example: -%%F \"\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 254) { HTS_PANIC_PRINTF("Footer string too long"); htsmain_free(); return -1; } StringCopy(opt->footer, argv[na]); } break; case 'H': // debug headers _DEBUG_HEAD = 1; break; case 'O': printf ("Warning option -%%O is no longer supported\n"); break; case 'U': // setuid ; removed because insane HTS_PANIC_PRINTF ("Option %U is no longer supported"); htsmain_free(); return -1; break; case 'W': // Wrapper callback // --wrapper check-link=obj.so:check_link if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %W needs to be followed by a blank space, and a =: field"); printf("Example: -%%W check-link=checklink.so:check\n"); htsmain_free(); return -1; } else { char *pos; na++; for(pos = argv[na]; *pos != '\0' && *pos != '=' && *pos != ',' && *pos != ':'; pos++) ; /* httrack --wrapper callback[,foo] */ if (*pos == 0 || *pos == ',' || *pos == ':') { int ret; char *moduleName; if (*pos == ',' || *pos == ':') { *pos = '\0'; moduleName = strdupt(argv[na]); *pos = ','; /* foce seperator to ',' */ } else { moduleName = strdupt(argv[na]); } ret = plug_wrapper(opt, moduleName, argv[na]); freet(moduleName); if (ret == 0) { char BIGSTK tmp[1024 * 2]; sprintf(tmp, "option %%W : unable to plug the module %s (returncode != 1)", argv[na]); HTS_PANIC_PRINTF(tmp); htsmain_free(); return -1; } else if (ret == -1) { char BIGSTK tmp[1024 * 2]; int last_errno = errno; sprintf(tmp, "option %%W : unable to load the module %s: %s (check the library path ?)", argv[na], strerror(last_errno)); HTS_PANIC_PRINTF(tmp); htsmain_free(); return -1; } } /* Old style */ /* httrack --wrapper save-name=callback:process,string */ else if (*pos == '=') { fprintf(stderr, "Syntax error in option %%W : the old (<3.41) API is no more supported!\n"); HTS_PANIC_PRINTF ("Syntax error in option %W : the old (<3.41) API is no more supported!"); printf("Example: -%%W check-link=checklink.so:check\n"); htsmain_free(); return -1; } else { HTS_PANIC_PRINTF ("Syntax error in option %W : this function needs to be followed by a blank space, and a module name"); printf("Example: -%%W check-link=checklink.so:check\n"); htsmain_free(); return -1; } } break; case 'R': // Referer if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %R needs to be followed by a blank space, and a referer URL"); printf("Example: -%%R \"http://www.example.com/\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 254) { HTS_PANIC_PRINTF("Referer URL too long"); htsmain_free(); return -1; } StringCopy(opt->referer, argv[na]); } break; case 'E': // From Email address if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option %E needs to be followed by a blank space, and an email"); printf("Example: -%%E \"postmaster@example.com\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 254) { HTS_PANIC_PRINTF("From email too long"); htsmain_free(); return -1; } StringCopy(opt->from, argv[na]); } break; case 'g': // strip-query: accumulate "[pattern=]keys" entries if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF("Option strip-query needs a blank space and " "[host/pattern=]key1,key2,..."); printf("Example: --strip-query " "\"www.example.com/*=utm_source,sid\"\n"); htsmain_free(); return -1; } else { na++; if (StringNotEmpty(opt->strip_query)) StringCat(opt->strip_query, "\n"); StringCat(opt->strip_query, argv[na]); } break; case 'K': // cookies-file: extra Netscape cookies.txt to preload if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF( "Option cookies-file needs a blank space and " "a cookies.txt path"); printf("Example: --cookies-file \"/home/me/cookies.txt\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 1024) { HTS_PANIC_PRINTF("Cookie file path too long"); htsmain_free(); return -1; } StringCopy(opt->cookies_file, argv[na]); } break; case 'r': // warc / warc-file: write an ISO-28500 WARC archive if (*(com + 1) == 'f') { // --warc-file NAME: explicit basename com++; if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF( "Option warc-file needs a blank space and a WARC name"); htsmain_free(); return -1; } na++; if (strlen(argv[na]) >= 1024) { HTS_PANIC_PRINTF("WARC file name too long"); htsmain_free(); return -1; } StringCopy(opt->warc_file, argv[na]); } else if (*(com + 1) == 's') { // --warc-max-size N: rotation com++; if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF( "Option warc-max-size needs a blank space and a size"); htsmain_free(); return -1; } na++; { // reject non-numeric/negative/overflow; keep default 0 // (single file) char *end; LLint v; errno = 0; v = strtoll(argv[na], &end, 10); if (isdigit((unsigned char) argv[na][0]) && *end == '\0' && errno != ERANGE) opt->warc_max_size = v; } } else if (*(com + 1) == 'c') { // --warc-cdx: sorted CDXJ index com++; opt->warc_cdx = 1; } else if (*(com + 1) == 'z') { // --wacz: WACZ package com++; opt->warc_wacz = 1; opt->warc_cdx = 1; // WACZ embeds the CDXJ index if (!StringNotEmpty(opt->warc_file)) StringCopy(opt->warc_file, WARC_AUTONAME); } else { // --warc: auto-named archive under the output dir StringCopy(opt->warc_file, WARC_AUTONAME); } break; case 'Y': // why: explain the filter verdict for a URL, no crawl if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF("Option why needs a blank space and a URL"); printf( "Example: --why \"http://www.example.com/file.zip\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= HTS_URLMAXSIZE) { HTS_PANIC_PRINTF("why URL too long"); htsmain_free(); return -1; } StringCopy(opt->why_url, argv[na]); } break; case 'G': // pause: randomized inter-file delay MIN[:MAX] seconds if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF("Option pause needs a blank space and a " "delay in seconds (MIN[:MAX])"); printf("Example: --pause 5:10\n"); htsmain_free(); return -1; } else { double pmin = 0, pmax = 0; int nf; na++; nf = sscanf(argv[na], "%lf:%lf", &pmin, &pmax); if (nf < 2) pmax = pmin; /* a single value means a fixed delay */ /* positive-form bounds: NaN fails every comparison, so this rejects it before the undefined (int)(NaN*1000) cast */ if (nf < 1 || !(pmin >= 0 && pmax >= pmin && pmax <= 86400)) { HTS_PANIC_PRINTF("Invalid --pause range (expected " "MIN[:MAX] seconds, 0<=MIN<=MAX<=86400)"); htsmain_free(); return -1; } opt->pause_min_ms = (int) (pmin * 1000.0); opt->pause_max_ms = (int) (pmax * 1000.0); } break; case 't': /* do not change type (ending) of filenames according to the MIME type */ opt->no_type_change = 1; if (*(com+1)=='0') { opt->no_type_change = 0; com++; } break; default:{ char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "invalid option %%%c\n", *com); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } break; } } break; // case '@':{ // troisième jeu d'options com++; switch (*com) { case 'i': #if HTS_INET6==0 printf ("Warning, option @i has no effect (v6 routines not compiled)\n"); #else { int res = 0; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", &res); while(isdigit((unsigned char) *(com + 1))) com++; } switch (res) { case 1: case 4: IPV6_resolver = 1; break; case 2: case 6: IPV6_resolver = 2; break; case 0: IPV6_resolver = 0; break; default: printf("Unknown flag @i%d\n", res); htsmain_free(); return -1; break; } } #endif break; default:{ char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "invalid option %%%c\n", *com); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } break; } } break; // case '#':{ // non documenté com++; switch (*com) { case 'C': // list cache files : httrack -#C '*spid*.gif' will attempt to find the matching file { int hasFilter = 0; int found = 0; char *filter = NULL; cache_back cache; coucal cache_hashtable = coucal_new(0); int sendb = 0; if (isdigit((unsigned char) *(com + 1))) { sscanf(com + 1, "%d", &sendb); while(isdigit((unsigned char) *(com + 1))) com++; } else sendb = 0; if (!((na + 1 >= argc) || (argv[na + 1][0] == '-'))) { na++; hasFilter = 1; filter = argv[na]; } memset(&cache, 0, sizeof(cache_back)); cache.type = 1; // cache? cache.log = stdout; // log? cache.errlog = stderr; // err log? cache.ptr_ant = cache.ptr_last = 0; // pointeur pour anticiper cache.hashtable = (void *) cache_hashtable; /* copy backcache hash */ cache.ro = 1; /* read only */ if (cache.hashtable) { lien_adrfilsave afs; char BIGSTK url[HTS_URLMAXSIZE * 2]; char linepos[256]; int pos; LLint cacheNdxLen = 0; char *cacheNdx = readfile2( fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.ndx"), &cacheNdxLen); cache_init(&cache, opt); /* load cache */ if (cacheNdx != NULL) { char firstline[256]; char *a = cacheNdx; const char *const end = cacheNdx + cacheNdxLen; a += cache_brstr(a, firstline, sizeof(firstline)); a += cache_brstr(a, firstline, sizeof(firstline)); while (a != NULL && a < end) { a = strchr(a + 1, '\n'); /* start of line */ if (a) { htsblk r; /* */ a++; /* read "host/file" */ a += cache_binput(a, end, afs.af.adr, HTS_URLMAXSIZE); a += cache_binput(a, end, afs.af.fil, HTS_URLMAXSIZE); url[0] = '\0'; if (!link_has_authority(afs.af.adr)) strcatbuff(url, "http://"); strcatbuff(url, afs.af.adr); strcatbuff(url, afs.af.fil); /* read position */ a += cache_binput(a, end, linepos, 200); sscanf(linepos, "%d", &pos); if (!hasFilter || (strjoker(url, filter, NULL, NULL) != NULL) ) { r = cache_read_ro(opt, &cache, afs.af.adr, afs.af.fil, "", NULL); // lire entrée cache + data if (r.statuscode != -1) { // No errors found++; if (!hasFilter) { fprintf(stdout, "%s%s%s\r\n", (link_has_authority(afs.af.adr)) ? "" : "http://", afs.af.adr, afs.af.fil); } else { char msg[256], cdate[256]; infostatuscode(msg, r.statuscode); time_gmt_rfc822(cdate); fprintf(stdout, "HTTP/1.1 %d %s\r\n", r.statuscode, r.msg[0] ? r.msg : msg); fprintf(stdout, "X-Host: %s\r\n", afs.af.adr); fprintf(stdout, "X-File: %s\r\n", afs.af.fil); fprintf(stdout, "X-URL: %s%s%s\r\n", (link_has_authority(afs.af.adr)) ? "" : "http://", afs.af.adr, afs.af.fil); if (url_savename (&afs, /*former */ NULL, /*referer_adr */ NULL, /*referer_fil */ NULL, /*opt */ opt, /*sback */ NULL, /*cache */ &cache, /*hash */ NULL, /*ptr */ 0, /*numero_passe */ 0, /*mime_type */ NULL) != -1) { if (fexist_utf8(afs.save)) { fprintf(stdout, "Content-location: %s\r\n", afs.save); } } fprintf(stdout, "Date: %s\r\n", cdate); fprintf(stdout, "Server: HTTrack Website Copier/" HTTRACK_VERSION "\r\n"); if (r.lastmodified[0]) { fprintf(stdout, "Last-Modified: %s\r\n", r.lastmodified); } if (r.etag[0]) { fprintf(stdout, "Etag: %s\r\n", r.etag); } if (r.totalsize >= 0) { fprintf(stdout, "Content-Length: " LLintP "\r\n", r.totalsize); } fprintf(stdout, "X-Content-Length: " LLintP "\r\n", (r.size >= 0) ? r.size : (-r.size)); if (r.contenttype >= 0) { fprintf(stdout, "Content-Type: %s\r\n", hts_effective_mime(r.contenttype)); } if (r.cdispo[0]) { fprintf(stdout, "Content-Disposition: %s\r\n", r.cdispo); } if (r.contentencoding[0]) { fprintf(stdout, "Content-Encoding: %s\r\n", r.contentencoding); } if (r.is_chunk) { fprintf(stdout, "Transfer-Encoding: chunked\r\n"); } #if HTS_USEOPENSSL if (r.ssl) { fprintf(stdout, "X-SSL: yes\r\n"); } #endif if (r.is_write) { fprintf(stdout, "X-Direct-To-Disk: yes\r\n"); } if (r.compressed) { fprintf(stdout, "X-Compressed: yes\r\n"); } if (r.notmodified) { fprintf(stdout, "X-Not-Modified: yes\r\n"); } if (r.is_chunk) { fprintf(stdout, "X-Chunked: yes\r\n"); } fprintf(stdout, "\r\n"); /* Send the body */ if (sendb && r.adr) { fprintf(stdout, "%s\r\n", r.adr); } } } } } } freet(cacheNdx); } } if (!found) { fprintf(stderr, "No cache entry found%s%s%s\r\n", (hasFilter) ? " for '" : "", (hasFilter) ? filter : "", (hasFilter) ? "'" : ""); } return 0; } break; case 'E': // extract cache if (!hts_extract_meta(StringBuff(opt->path_log))) { fprintf(stderr, "* error extracting meta-data\n"); return 1; } fprintf(stderr, "* successfully extracted meta-data\n"); return 0; break; case 'X': fprintf(stderr, "warning: option has no effect\n"); if (*(com + 1) == '0') { com++; } break; case 'R': { char *name; uLong repaired = 0; uLong repairedBytes = 0; if (fexist_utf8(fconcat( OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip"))) { name = fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip"); } else if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.zip"))) { name = fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/old.zip"); } else { fprintf(stderr, "* error: no cache found in %s\n", fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/new.zip")); return 1; } fprintf(stderr, "Cache: trying to repair %s\n", name); if (unzRepair (name, fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/repair.zip"), fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/repair.tmp"), &repaired, &repairedBytes) == Z_OK) { UNLINK(name); RENAME(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/repair.zip"), name); fprintf(stderr, "Cache: %d bytes successfully recovered in %d entries\n", (int) repairedBytes, (int) repaired); } else { fprintf(stderr, "Cache: could not repair the cache\n"); } } return 0; break; case '~': /* internal lib test */ HTS_PANIC_PRINTF("Option #~ is disabled for security reasons"); break; case 'f': opt->flush = 1; break; case 'h': printf("HTTrack version " HTTRACK_VERSION "%s\n", hts_get_version_info(opt)); return 0; break; case 'p': /* opt->aff_progress=1; deprecated */ break; case 'S': opt->shell = 1; break; // stdin sur un shell case 'K': opt->keyboard = 1; break; // vérifier stdin // case 'L': sscanf(com + 1, "%d", &opt->maxlink); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'F': sscanf(com + 1, "%d", &opt->maxfilter); while(isdigit((unsigned char) *(com + 1))) com++; break; case 'Z': opt->makestat = 1; break; case 'T': opt->maketrack = 1; break; case 'u': sscanf(com + 1, "%d", &opt->waittime); while(isdigit((unsigned char) *(com + 1))) com++; break; /*case 'R': // ohh ftp, catch->ftpget HTS_PANIC_PRINTF("Unexpected internal error with -#R command"); htsmain_free(); return -1; break; */ case 'P':{ // catchurl help_catchurl(StringBuff(opt->path_log)); htsmain_free(); return 0; } break; case '!': HTS_PANIC_PRINTF ("Option #! is disabled for security reasons"); htsmain_free(); return -1; break; case 'd': opt->parsedebug = 1; break; /* autotest */ case 't': /* not yet implemented */ fprintf(stderr, "** AUTOCHECK OK\n"); return 0; break; #ifdef HTS_CRASH_TEST case 'c': /* crash test */ do_crash(); break; #endif default: printf("Internal option %c not recognized\n", *com); break; } } break; case 'O': // output path while(isdigit(com[1])) { com++; } na++; // sauter, déja traité break; case 'P': // proxy if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option P needs to be followed by a blank space, and a proxy proxy:port or user:id@proxy:port"); printf("Example: -P proxy.myhost.com:8080\n"); htsmain_free(); return -1; } else { char BIGSTK pname[HTS_URLMAXSIZE * 2]; na++; opt->proxy.active = 1; hts_parse_proxy(argv[na], pname, sizeof(pname), &opt->proxy.port); StringCopy(opt->proxy.name, pname); } break; case 'F': // user-agent field if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option F needs to be followed by a blank space, and a user-agent name"); printf("Example: -F \"my_user_agent/1.0\"\n"); htsmain_free(); return -1; } else { na++; StringCopy(opt->user_agent, argv[na]); if (StringNotEmpty(opt->user_agent)) opt->user_agent_send = 1; else opt->user_agent_send = 0; // -F "" désactive l'option } break; // case 'V': // execute command if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) { HTS_PANIC_PRINTF ("Option V needs to be followed by a system-command string"); printf("Example: -V \"tar uvf some.tar \\$0\"\n"); htsmain_free(); return -1; } else { na++; if (strlen(argv[na]) >= 2048) { HTS_PANIC_PRINTF("System-command length too long"); htsmain_free(); return -1; } StringCopy(opt->sys_com, argv[na]); if (StringNotEmpty(opt->sys_com)) opt->sys_com_exec = 1; else opt->sys_com_exec = 0; // -V "" désactive l'option } break; // default:{ char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "invalid option %c\n", *com); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } break; } // switch com++; } // while } else { // URL/filters char catbuff[CATBUFF_SIZE]; const int urlSize = (int) strlen(argv[na]); const int capa = (int) (strlen(url) + urlSize + 32); assertf(urlSize < HTS_URLMAXSIZE); if (urlSize < HTS_URLMAXSIZE) { ensureUrlCapacity(url, url_sz, capa); if (strnotempty(url)) strlcatbuff(url, " ", url_sz); // separator space append_escape_spc_url(unescape_http_unharm(catbuff, sizeof(catbuff), argv[na], 1), url, url_sz); } } // if argv=- etc. } // for } #if BDEBUG==3 printf("URLs/filters=%s\n", url); #endif #if DEBUG_STEPS printf("Analyzing parameters done\n"); #endif #ifdef _WIN32 #else #ifndef HTS_DO_NOT_USE_UID /* Check we do not run as r00t */ { uid_t userid = getuid(); if (userid == 0) { /* running as r00t */ printf("WARNING! You are running this program as root!\n"); printf ("It might be a good idea to run as a different user\n"); } } #endif #endif io_flush; #if DEBUG_STEPS printf("Cache & log settings\n"); #endif // If both cache generations exist, keep the most complete one hts_cache_reconcile(opt, CACHE_RECONCILE_INTERRUPTED); // Débuggage des en têtes if (_DEBUG_HEAD) { ioinfo = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-ioinfo.txt"), "wb"); } { /* Sized to the concat-buffer capacity so it can always hold the lock-file path produced by fconcat(), even with a long log path (issue #183). */ char n_lock[OPT_GET_BUFF_SIZE(opt)]; // on peut pas avoir un affichage ET un fichier log // ca sera pour la version 2 if (httrack_logmode == 1) { opt->log = stdout; opt->errlog = stderr; } else if (httrack_logmode >= 2) { // deux fichiers log // path_log holds UTF-8 bytes (argv is UTF-8): the ANSI file calls would // read them as the codepage and drop the logs into a mangled twin (#630). structcheck_utf8(StringBuff(opt->path_log)); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt")); if (fexist_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt"))) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt")); /* Check FS directory structure created */ structcheck_utf8(StringBuff(opt->path_log)); opt->log = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt"), "w"); if (httrack_logmode == 2) opt->errlog = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt"), "w"); else opt->errlog = opt->log; if (opt->log == NULL) { char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "Unable to create log file %s", fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-log.txt")); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } else if (opt->errlog == NULL) { char s[HTS_CDLMAXSIZE + 256]; sprintf(s, "Unable to create log file %s", fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-err.txt")); HTS_PANIC_PRINTF(s); htsmain_free(); return -1; } } else { opt->log = NULL; opt->errlog = NULL; } // un petit lock-file pour indiquer un miroir en cours, ainsi qu'un éventuel fichier log { FILE *fp = NULL; char t[256]; time_local_rfc822(t); // faut bien que ca serve quelque part l'heure RFC1945 arf' /* readme for information purpose */ { FILE *fp = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/readme.txt"), "wb"); if (fp) { fprintf(fp, "What's in this folder?" LF); fprintf(fp, "" LF); fprintf(fp, "This folder (hts-cache) has been generated by WinHTTrack " HTTRACK_VERSION "%s" LF, hts_get_version_info(opt)); fprintf(fp, "and is used for updating this website." LF); fprintf(fp, "(The HTML website structure is stored here to allow fast updates)" LF "" LF); fprintf(fp, "DO NOT delete this folder unless you do not want to update the mirror in the future!!" LF); fprintf(fp, "(you can safely delete old.zip and old.lst files, however)" LF); fprintf(fp, "" LF); fprintf(fp, HTS_LOG_SECURITY_WARNING); fclose(fp); } } strcpybuff(n_lock, fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-in_progress.lock")); /*do { if (!n) sprintf(n_lock,fconcat(OPT_GET_BUFF(opt), StringBuff(opt->path_log),"hts-in_progress.lock"),n); else sprintf(n_lock,fconcat(OPT_GET_BUFF(opt), StringBuff(opt->path_log),"hts-in_progress%d.lock"),n); n++; } while((fexist(n_lock)) && opt->quiet); if (fexist(n_lock)) { if (!recuperer) { remove(n_lock); } } */ // vérifier existence de la structure (path_html/path_log are UTF-8, use // the UTF-8 mkdir path) structcheck_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "/")); structcheck_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "/")); // reprise/update if (opt->cache) { FILE *fp; int i; #ifdef _WIN32 hts_mkdir_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache")); #else mkdir(fconcat (OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache"), HTS_PROTECT_FOLDER); #endif fp = FOPEN(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "hts-cache/doit.log"), "wb"); if (fp) { for(i = 0 + 1; i < argc; i++) { if (((strchr(argv[i], ' ') != NULL) || (strchr(argv[i], '"') != NULL) || (strchr(argv[i], '\\') != NULL)) && (argv[i][0] != '"')) { size_t j; fprintf(fp, "\""); for(j = 0; argv[i][j] != '\0'; j++) { if (argv[i][j] == 34) fprintf(fp, "\\\""); else if (argv[i][j] == '\\') fprintf(fp, "\\\\"); else fprintf(fp, "%c", argv[i][j]); } fprintf(fp, "\""); } else if (strnotempty(argv[i]) == 0) { // "" fprintf(fp, "\"\""); } else { // non critique fprintf(fp, "%s", argv[i]); } if (i < argc - 1) fprintf(fp, " "); } fprintf(fp, LF); fprintf(fp, "File generated automatically on %s, do NOT edit" LF, t); fprintf(fp, LF); fprintf(fp, "To update a mirror, just launch httrack without any parameters" LF); fprintf(fp, "The existing cache will be used (and modified)" LF); fprintf(fp, "To have other options, retype all parameters and launch HTTrack" LF); fprintf(fp, "To continue an interrupted mirror, just launch httrack without any parameters" LF); fprintf(fp, LF); fclose(fp); fp = NULL; } } // petit message dans le lock if ((fp = FOPEN(n_lock, "wb")) != NULL) { int i; fprintf(fp, "Mirror in progress since %s .. please wait!" LF, t); for(i = 0; i < argc; i++) { if (strchr(argv[i], ' ') == NULL) fprintf(fp, "%s ", argv[i]); else // entre "" fprintf(fp, "\"%s\" ", argv[i]); } fprintf(fp, LF); fprintf(fp, "To pause the engine: create an empty file named 'hts-stop.lock'" LF); #if USE_BEGINTHREAD fprintf(fp, "PID=%d\n", (int) getpid()); #ifndef _WIN32 fprintf(fp, "UID=%d\n", (int) getuid()); fprintf(fp, "GID=%d\n", (int) getuid()); #endif fprintf(fp, "START=%d\n", (int) time(NULL)); #endif fclose(fp); fp = NULL; } // fichier log if (opt->log) { int i; fprintf(opt->log, "HTTrack" HTTRACK_VERSION "%s launched on %s at %s" LF, hts_get_version_info(opt), t, url); fprintf(opt->log, "("); for(i = 0; i < argc; i++) { const char *arg = argv[i]; // already UTF-8 on every platform if (strchr(arg, ' ') == NULL || strchr(arg, '\"') != NULL) fprintf(opt->log, "%s ", arg); else // entre "" (si espace(s) et pas déja de ") fprintf(opt->log, "\"%s\" ", arg); } fprintf(opt->log, ")" LF); fprintf(opt->log, LF); fprintf(opt->log, "Information, Warnings and Errors reported for this mirror:" LF); fprintf(opt->log, HTS_LOG_SECURITY_WARNING); fprintf(opt->log, LF); } if (httrack_logmode) { printf("Mirror launched on %s by HTTrack Website Copier/" HTTRACK_VERSION "%s " HTTRACK_AFF_AUTHORS "" LF, t, hts_get_version_info(opt)); if (opt->wizard == HTS_WIZARD_NONE) { printf ("mirroring %s with %d levels, %d sockets,t=%d,s=%d,logm=%d,lnk=%d,mdg=%d\n", url, opt->depth, opt->maxsoc, opt->travel, opt->seeker, httrack_logmode, opt->urlmode, opt->getmode); } else { // the magic wizard printf("mirroring %s with the wizard help..\n", url); } } } io_flush; /* Enforce limits to avoid bandwidth abuse. The bypass_limits should only be used by administrators and experts. */ if (!opt->bypass_limits) { if (opt->maxsoc <= 0 || opt->maxsoc > 8) { opt->maxsoc = 8; hts_log_print(opt, LOG_WARNING, "* security warning: maximum number of simultaneous connections limited to %d to avoid server overload", (int) opt->maxsoc); } if (opt->maxrate <= 0 || opt->maxrate > 10000000) { opt->maxrate = 10000000; hts_log_print(opt, LOG_WARNING, "* security warning: maximum bandwidth limited to %d to avoid server overload", (int) opt->maxrate); } if (opt->maxconn <= 0 || opt->maxconn > 5.0) { opt->maxconn = 5.0; hts_log_print(opt, LOG_WARNING, "* security warning: maximum number of connections per second limited to %f to avoid server overload", (float) opt->maxconn); } } else { hts_log_print(opt, LOG_WARNING, "* security warning: !!! BYPASSING SECURITY LIMITS - MONITOR THIS SESSION WITH EXTREME CARE !!!"); } /* Info for wrappers */ hts_log_print(opt, LOG_DEBUG, "engine: init"); /* Init external */ RUN_CALLBACK_NOARG(opt, init); // détourner SIGHUP etc. #if DEBUG_STEPS printf("Launching the mirror\n"); #endif // Lancement du miroir // ------------------------------------------------------------ opt->state._hts_in_mirror = 1; if (httpmirror(url, opt) == 0) { printf ("Error during operation (see log file), site has not been successfully mirrored\n"); } else { if (opt->shell) { HTT_REQUEST_START; HT_PRINT("TRANSFER DONE" LF); HTT_REQUEST_END} else { printf("Done.\n"); } } opt->state._hts_in_mirror = 0; // ------------------------------------------------------------ // // Build top index if (opt->dir_topindex) { char BIGSTK rpath[1024 * 2]; char *a; strcpybuff(rpath, StringBuff(opt->path_html)); if (rpath[0]) { if (rpath[strlen(rpath) - 1] == '/') rpath[strlen(rpath) - 1] = '\0'; } a = strrchr(rpath, '/'); if (a) { *a = '\0'; hts_buildtopindex(opt, rpath, StringBuff(opt->path_bin)); hts_log_print(opt, LOG_INFO, "Top index rebuilt (done)"); } } if (opt->state.exit_xh == 1) { if (opt->log) { fprintf(opt->log, "* * MIRROR ABORTED! * *\nThe current temporary cache is required for any update operation and only contains data downloaded during the present aborted session.\nThe former cache might contain more complete information; if you do not want to lose that information, you have to restore it and delete the current cache.\nThis can easily be done here by erasing the hts-cache/new.* files]\n"); } } /* Not or cleanly interrupted; erase hts-cache/ref temporary directory */ if (opt->state.exit_xh == 0) { // erase ref files if not interrupted DIR *dir; struct dirent *entry; for(dir = opendir(fconcat (OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), CACHE_REFNAME)); dir != NULL && (entry = readdir(dir)) != NULL;) { if (entry->d_name[0] != '\0' && entry->d_name[0] != '.') { char *f = OPT_GET_BUFF(opt); sprintf(f, "%s/%s", CACHE_REFNAME, entry->d_name); (void) UNLINK(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), f)); } } if (dir != NULL) { (void) closedir(dir); } (void) RMDIR(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), CACHE_REFNAME)); } /* Info for wrappers */ hts_log_print(opt, LOG_DEBUG, "engine: free"); /* UnInit */ RUN_CALLBACK_NOARG(opt, uninit); if (httrack_logmode != 1) { if (opt->errlog == opt->log) opt->errlog = NULL; if (opt->log) { fclose(opt->log); opt->log = NULL; } if (opt->errlog) { fclose(opt->errlog); opt->errlog = NULL; } } // Débuggage des en têtes if (_DEBUG_HEAD) { if (ioinfo) { fclose(ioinfo); } } // supprimer lock UNLINK(n_lock); } if (x_argvblk) freet(x_argvblk); if (x_argv) freet(x_argv); if (url) freet(url); #ifdef HTS_TRACE_MALLOC hts_freeall(); #endif printf("Thanks for using HTTrack!\n"); io_flush; htsmain_free(); return 0; // OK } // main() subroutines // vérifier chemin path int check_path(String * s, char *defaultname) { int i; int return_value = 0; // Replace name: ~/mywebsites/# -> /home/foo/mywebsites/# expand_home(s); for(i = 0; i < (int) StringLength(*s); i++) // conversion \ -> / if (StringSub(*s, i) == '\\') StringSubRW(*s, i) = '/'; // remove ending / if (StringNotEmpty(*s) && StringRight(*s, 1) == '/') StringPopRight(*s); // Replace name: /home/foo/mywebsites/# -> /home/foo/mywebsites/wonderfulsite if (StringNotEmpty(*s)) { if (StringRight(*s, 1) == '#') { if (strnotempty((defaultname ? defaultname : ""))) { char *a = strchr(defaultname, '#'); // we never know.. if (a) *a = '\0'; StringPopRight(*s); StringCat(*s, defaultname); } else { StringClear(*s); // Clear path (no name/default url given) } return_value = 1; // expanded } } // ending / if (StringNotEmpty(*s) && StringRight(*s, 1) != '/') // ajouter slash à la fin StringCat(*s, "/"); return return_value; } /* Does the short-option cluster s carry c from the main option set (-i, -iC2, -%Mi)? Walked as the parser does below: %, &, @ and # each take the letter after them into another set, so the i of -%i is not the main-set -i. */ static hts_boolean cmdl_shortopt_has(const char *s, char c) { const char *com; if (s[0] != '-' || s[1] == '-') return HTS_FALSE; for (com = s + 1; *com != '\0'; com++) { switch (*com) { case '%': case '&': case '@': case '#': if (*(com + 1) != '\0') com++; /* skip the other set's letter */ break; default: if (*com == c) return HTS_TRUE; break; } } return HTS_FALSE; } // détermine si l'argument est une option int cmdl_opt(char *s) { if (s[0] == '-') { // c'est peut être une option if (strchr(s, '.') != NULL && strchr(s, '%') == NULL) return 0; // sans doute un -www.truc.fr (note: -www n'est pas compris) else if (strchr(s, '/') != NULL) return 0; // idem, -*cgi-bin/ else if (strchr(s, '*') != NULL) return 0; // joker, idem else return 1; } else return 0; } httrack-3.49.14/src/htsurlport.c0000644000175000017500000000351715230602340012177 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: TCP port parser, shared by the engine, htsserver and */ /* proxytrack */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ #include "htsurlport.h" #include #include hts_boolean hts_parse_url_port(const char *a, int *port) { char *end; long p; if (!isdigit((unsigned char) *a)) // strtol would eat a sign or leading space return HTS_FALSE; p = strtol(a, &end, 10); if (*end != '\0' || p < 1 || p > 65535) // ERANGE lands out of range too return HTS_FALSE; *port = (int) p; return HTS_TRUE; } httrack-3.49.14/src/htslib.c0000644000175000017500000057320415230602340011243 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: Subroutines */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE // Fichier librairie .c #include "htscore.h" #include "htswarc.h" /* specific definitions */ #include "htsbase.h" #include "htsnet.h" #include "htsbauth.h" #include "htsthread.h" #include "htsback.h" #include "htswrap.h" #include "htsmd5.h" #include "htsmodules.h" #include "htscharset.h" #include "htsencoding.h" #include "htscodec.h" #ifdef _WIN32 #include #else #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #endif /* _WIN32 */ #include #include #include #include #include #ifndef _WIN32 #include #else #include #endif #include // pour utimbuf #ifdef _WIN32 #include #else #include #endif /* _WIN32 */ #include #ifdef __ANDROID__ #define timezone 0 #endif /* END specific definitions */ /* Windows might be missing va_copy */ #ifdef _WIN32 #ifndef va_copy #define va_copy(dst, src) ((dst) = (src)) #endif #endif // Debugging #if _HTS_WIDE FILE *DEBUG_fp = NULL; #endif /* variables globales */ int _DEBUG_HEAD; FILE *ioinfo; #if HTS_USEOPENSSL SSL_CTX *openssl_ctx = NULL; #endif int IPV6_resolver = 0; /* détection complémentaire */ const char *hts_detect[] = { "archive", "background", "data", // OBJECT "data-src", "data-srcset", "dynsrc", "lowsrc", "profile", // element META "src", "srcset", // HTML5 responsive images (, ) "swurl", "url", "usemap", "longdesc", // accessibility "xlink:href", // xml/svg tag "poster", // HTML5 "" }; /* détecter début */ const char *hts_detectbeg[] = { "hotspot", /* hotspot1=..,hotspot2=.. */ "" }; /* ne pas détcter de liens dedans */ const char *hts_nodetect[] = { "accept-charset", "accesskey", "action", "align", "alt", "axes", "axis", "char", "charset", "cite", "class", "classid", "code", "color", "datetime", "dir", "enctype", "face", "height", "id", "lang", "language", "media", "method", "name", "prompt", "scheme", "size", "style", "target", "title", "type", "valign", "version", "width", "" }; /* détection de mini-code javascript */ /* ALSO USED: detection based on the name: onXXX="" where XXX starts with upper case letter */ const char *hts_detect_js[] = { "onAbort", "onBlur", "onChange", "onClick", "onDblClick", "onDragDrop", "onError", "onFocus", "onKeyDown", "onKeyPress", "onKeyUp", "onLoad", "onMouseDown", "onMouseMove", "onMouseOut", "onMouseOver", "onMouseUp", "onMove", "onReset", "onResize", "onSelect", "onSubmit", "onUnload", "style", /* hack for CSS code data */ "" }; const char *hts_main_mime[] = { "application", "audio", "image", "message", "multipart", "text", "video", "" }; /* détection "...URL=" */ const char *hts_detectURL[] = { "content", "" }; /* tags où l'URL doit être réécrite mais non capturée */ const char *hts_detectandleave[] = { "action", "" }; /* ne pas renommer les types renvoyés (souvent types inconnus) */ const char *hts_mime_keep[] = { "application/octet-stream", "text/plain", "application/xml", "text/xml", "" }; /* bogus servers returns these mime types when the extension is seen within the filename */ const char *hts_mime_bogus_multiple[] = { "application/x-wais-source", /* src (src.rpm) */ "" }; /* pas de type mime connu, mais extension connue */ const char *hts_ext_dynamic[] = { "php3", "php", "php4", "php2", "cgi", "asp", "jsp", "pl", /*"exe", */ "cfm", "nsf", /* lotus */ "" }; /* types MIME note: application/octet-stream should not be used here */ const char *hts_mime[][2] = { {"application/acad", "dwg"}, {"application/arj", "arj"}, {"application/clariscad", "ccad"}, {"application/drafting", "drw"}, {"application/dxf", "dxf"}, {"application/excel", "xls"}, {"application/i-deas", "unv"}, {"application/iges", "isg"}, {"application/iges", "iges"}, {"application/mac-binhex40", "hqx"}, {"application/mac-compactpro", "cpt"}, {"application/msword", "doc"}, {"application/msword", "w6w"}, {"application/msword", "word"}, {"application/mswrite", "wri"}, /*{"application/octet-stream","dms"}, */ /*{"application/octet-stream","lzh"}, */ /*{"application/octet-stream","lha"}, */ /*{"application/octet-stream","bin"}, */ {"application/oda", "oda"}, {"application/pdf", "pdf"}, {"application/postscript", "ps"}, {"application/postscript", "ai"}, {"application/postscript", "eps"}, {"application/powerpoint", "ppt"}, {"application/pro_eng", "prt"}, {"application/pro_eng", "part"}, {"application/rtf", "rtf"}, {"application/set", "set"}, {"application/sla", "stl"}, {"application/smil", "smi"}, {"application/smil", "smil"}, {"application/smil", "sml"}, {"application/solids", "sol"}, {"application/STEP", "stp"}, {"application/STEP", "step"}, {"application/vda", "vda"}, {"application/x-authorware-map", "aam"}, {"application/x-authorware-seg", "aas"}, {"application/x-authorware-bin", "aab"}, {"application/x-bzip2", "bz2"}, {"application/x-cocoa", "cco"}, {"application/x-csh", "csh"}, {"application/x-director", "dir"}, {"application/x-director", "dcr"}, {"application/x-director", "dxr"}, {"application/x-mif", "mif"}, {"application/x-dvi", "dvi"}, {"application/x-gzip", "gz"}, {"application/x-gzip", "gzip"}, {"application/x-hdf", "hdf"}, {"application/x-javascript", "js"}, {"application/x-koan", "skp"}, {"application/x-koan", "skd"}, {"application/x-koan", "skt"}, {"application/x-koan", "skm"}, {"application/x-latex", "latex"}, {"application/x-netcdf", "nc"}, {"application/x-netcdf", "cdf"}, /* {"application/x-sh","sh"}, */ /* {"application/x-csh","csh"}, */ /* {"application/x-ksh","ksh"}, */ {"application/x-shar", "shar"}, {"application/x-stuffit", "sit"}, {"application/x-tcl", "tcl"}, {"application/x-tex", "tex"}, {"application/x-texinfo", "texinfo"}, {"application/x-texinfo", "texi"}, {"application/x-troff", "t"}, {"application/x-troff", "tr"}, {"application/x-troff", "roff"}, {"application/x-troff-man", "man"}, {"application/x-troff-me", "ms"}, {"application/x-wais-source", "src"}, {"application/zip", "zip"}, {"application/x-zip-compressed", "zip"}, {"application/x-bcpio", "bcpio"}, {"application/x-cdlink", "vcd"}, {"application/x-cpio", "cpio"}, {"application/x-gtar", "tgz"}, {"application/x-gtar", "gtar"}, {"application/x-shar", "shar"}, {"application/x-shockwave-flash", "swf"}, {"application/x-sv4cpio", "sv4cpio"}, {"application/x-sv4crc", "sv4crc"}, {"application/x-tar", "tar"}, {"application/x-ustar", "ustar"}, {"application/x-winhelp", "hlp"}, {"application/xml", "xml"}, {"audio/midi", "mid"}, {"audio/midi", "midi"}, {"audio/midi", "kar"}, {"audio/mpeg", "mp3"}, {"audio/mpeg", "mpga"}, {"audio/mpeg", "mp2"}, {"audio/basic", "au"}, {"audio/basic", "snd"}, {"audio/x-aiff", "aif"}, {"audio/x-aiff", "aiff"}, {"audio/x-aiff", "aifc"}, {"audio/x-pn-realaudio", "rm"}, {"audio/x-pn-realaudio", "ram"}, {"audio/x-pn-realaudio", "ra"}, {"audio/x-pn-realaudio-plugin", "rpm"}, {"audio/x-wav", "wav"}, {"chemical/x-pdb", "pdb"}, {"chemical/x-pdb", "xyz"}, {"drawing/x-dwf", "dwf"}, {"image/gif", "gif"}, {"image/ief", "ief"}, {"image/jpeg", "jpg"}, {"image/jpeg", "jpe"}, {"image/jpeg", "jpeg"}, {"image/pict", "pict"}, {"image/png", "png"}, {"image/tiff", "tiff"}, {"image/tiff", "tif"}, {"image/svg+xml", "svg"}, {"image/svg-xml", "svg"}, {"image/x-cmu-raster", "ras"}, {"image/x-freehand", "fh4"}, {"image/x-freehand", "fh7"}, {"image/x-freehand", "fh5"}, {"image/x-freehand", "fhc"}, {"image/x-freehand", "fh"}, {"image/x-portable-anymap", "pnm"}, {"image/x-portable-bitmap", "pgm"}, {"image/x-portable-pixmap", "ppm"}, {"image/x-rgb", "rgb"}, {"image/x-xbitmap", "xbm"}, {"image/x-xpixmap", "xpm"}, {"image/x-xwindowdump", "xwd"}, {"model/mesh", "msh"}, {"model/mesh", "mesh"}, {"model/mesh", "silo"}, {"multipart/x-zip", "zip"}, {"multipart/x-gzip", "gzip"}, {"text/css", "css"}, {"text/html", "html"}, {"text/html", "htm"}, {"text/plain", "txt"}, {"text/plain", "g"}, {"text/plain", "h"}, {"text/plain", "c"}, {"text/plain", "cc"}, {"text/plain", "hh"}, {"text/plain", "m"}, {"text/plain", "f90"}, {"text/richtext", "rtx"}, {"text/tab-separated-values", "tsv"}, {"text/x-setext", "etx"}, {"text/x-sgml", "sgml"}, {"text/x-sgml", "sgm"}, {"text/xml", "xml"}, {"text/xml", "dtd"}, {"video/mpeg", "mpeg"}, {"video/mpeg", "mpg"}, {"video/mpeg", "mpe"}, {"video/quicktime", "qt"}, {"video/quicktime", "mov"}, {"video/x-msvideo", "avi"}, {"video/x-sgi-movie", "movie"}, {"x-conference/x-cooltalk", "ice"}, /*{"application/x-httpd-cgi","cgi"}, */ {"x-world/x-vrml", "wrl"}, /* More from w3schools.com */ {"application/envoy", "evy"}, {"application/fractals", "fif"}, {"application/futuresplash", "spl"}, {"application/hta", "hta"}, {"application/internet-property-stream", "acx"}, {"application/msword", "dot"}, {"application/olescript", "axs"}, {"application/pics-rules", "prf"}, {"application/pkcs10", "p10"}, {"application/pkix-crl", "crl"}, {"application/set-payment-initiation", "setpay"}, {"application/set-registration-initiation", "setreg"}, {"application/vnd.ms-excel", "xls"}, {"application/vnd.ms-excel", "xla"}, {"application/vnd.ms-excel", "xlc"}, {"application/vnd.ms-excel", "xlm"}, {"application/vnd.ms-excel", "xlt"}, {"application/vnd.ms-excel", "xlw"}, {"application/vnd.ms-pkicertstore", "sst"}, {"application/vnd.ms-pkiseccat", "cat"}, {"application/vnd.ms-powerpoint", "ppt"}, {"application/vnd.ms-powerpoint", "pot"}, {"application/vnd.ms-powerpoint", "pps"}, {"application/vnd.ms-project", "mpp"}, {"application/vnd.ms-works", "wcm"}, {"application/vnd.ms-works", "wdb"}, {"application/vnd.ms-works", "wks"}, {"application/vnd.ms-works", "wps"}, {"application/vnd.oasis.opendocument.chart", "odc"}, {"application/vnd.oasis.opendocument.database", "odb"}, {"application/vnd.oasis.opendocument.formula", "odf"}, {"application/vnd.oasis.opendocument.graphics", "odg"}, {"application/vnd.oasis.opendocument.graphics-template", "otg"}, {"application/vnd.oasis.opendocument.image", "odi"}, {"application/vnd.oasis.opendocument.presentation", "odp"}, {"application/vnd.oasis.opendocument.presentation-template", "otp"}, {"application/vnd.oasis.opendocument.spreadsheet", "ods"}, {"application/vnd.oasis.opendocument.spreadsheet-template", "ots"}, {"application/vnd.oasis.opendocument.text", "odt"}, {"application/vnd.oasis.opendocument.text-master", "odm"}, {"application/vnd.oasis.opendocument.text-template", "ott"}, {"application/vnd.oasis.opendocument.text-web", "oth"}, {"application/vnd.openxmlformats-officedocument.presentationml.presentation", "pptx"}, {"application/vnd.openxmlformats-officedocument.presentationml.slide", "sldx"}, {"application/vnd.openxmlformats-officedocument.presentationml.slideshow", "ppsx"}, {"application/vnd.openxmlformats-officedocument.presentationml.template", "potx"}, {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xlsx"}, {"application/vnd.openxmlformats-officedocument.spreadsheetml.template", "xltx"}, {"application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx"}, {"application/vnd.openxmlformats-officedocument.wordprocessingml.template", "dotx"}, {"application/x-compress", "z"}, {"application/x-compressed", "tgz"}, {"application/x-internet-signup", "ins"}, {"application/x-internet-signup", "isp"}, {"application/x-iphone", "iii"}, {"application/x-javascript", "js"}, {"application/x-msaccess", "mdb"}, {"application/x-mscardfile", "crd"}, {"application/x-msclip", "clp"}, {"application/x-msmediaview", "m13"}, {"application/x-msmediaview", "m14"}, {"application/x-msmediaview", "mvb"}, {"application/x-msmetafile", "wmf"}, {"application/x-msmoney", "mny"}, {"application/x-mspublisher", "pub"}, {"application/x-msschedule", "scd"}, {"application/x-msterminal", "trm"}, {"application/x-perfmon", "pma"}, {"application/x-perfmon", "pmc"}, {"application/x-perfmon", "pml"}, {"application/x-perfmon", "pmr"}, {"application/x-perfmon", "pmw"}, {"application/x-pkcs12", "p12"}, {"application/x-pkcs12", "pfx"}, {"application/x-pkcs7-certificates", "p7b"}, {"application/x-pkcs7-certificates", "spc"}, {"application/x-pkcs7-certreqresp", "p7r"}, {"application/x-pkcs7-mime", "p7c"}, {"application/x-pkcs7-mime", "p7m"}, {"application/x-pkcs7-signature", "p7s"}, {"application/x-troff-me", "me"}, {"application/x-x509-ca-cert", "cer"}, {"application/x-x509-ca-cert", "crt"}, {"application/x-x509-ca-cert", "der"}, {"application/ynd.ms-pkipko", "pko"}, {"audio/mid", "mid"}, {"audio/mid", "rmi"}, {"audio/mpeg", "mp3"}, {"audio/x-mpegurl", "m3u"}, {"image/bmp", "bmp"}, {"image/cis-cod", "cod"}, {"image/pipeg", "jfif"}, {"image/x-cmx", "cmx"}, {"image/x-icon", "ico"}, {"image/x-portable-bitmap", "pbm"}, {"message/rfc822", "mht"}, {"message/rfc822", "mhtml"}, {"message/rfc822", "nws"}, {"text/css", "css"}, {"text/h323", "323"}, {"text/html", "stm"}, {"text/iuls", "uls"}, {"text/plain", "bas"}, {"text/scriptlet", "sct"}, {"text/webviewhtml", "htt"}, {"text/x-component", "htc"}, {"text/x-vcard", "vcf"}, {"video/mpeg", "mp2"}, {"video/mpeg", "mpa"}, {"video/mpeg", "mpv2"}, {"video/x-la-asf", "lsf"}, {"video/x-la-asf", "lsx"}, {"video/x-ms-asf", "asf"}, {"video/x-ms-asf", "asr"}, {"video/x-ms-asf", "asx"}, {"video/x-ms-wmv", "wmv"}, {"x-world/x-vrml", "flr"}, {"x-world/x-vrml", "vrml"}, {"x-world/x-vrml", "wrz"}, {"x-world/x-vrml", "xaf"}, {"x-world/x-vrml", "xof"}, /* Various */ {"application/ogg", "ogg"}, {"application/x-java-vm", "class"}, {"application/x-bittorrent","torrent"}, {"", ""} }; /* Modern web formats (post-2010), kept in their own table: appending to the legacy hts_mime[] above makes clang-format reflow its whole initializer. Scanned after hts_mime[], so it never shadows a legacy mapping. */ static const char *hts_mime_modern[][2] = { {"image/webp", "webp"}, {"image/avif", "avif"}, {"image/heic", "heic"}, {"font/woff", "woff"}, {"font/woff2", "woff2"}, {"font/ttf", "ttf"}, {"font/otf", "otf"}, {"application/json", "json"}, {"application/ld+json", "jsonld"}, {"application/manifest+json", "webmanifest"}, {"application/wasm", "wasm"}, {"text/javascript", "js"}, {"text/javascript", "mjs"}, {"text/markdown", "md"}, {"video/mp4", "mp4"}, {"video/webm", "webm"}, {"video/ogg", "ogv"}, {"video/mp2t", "ts"}, {"audio/mp4", "m4a"}, {"audio/aac", "aac"}, {"audio/ogg", "oga"}, {"audio/opus", "opus"}, {"audio/flac", "flac"}, {"audio/webm", "weba"}, {"application/x-7z-compressed", "7z"}, {"application/x-rar-compressed", "rar"}, {"application/zstd", "zst"}, {"", ""}}; // Reserved (RFC2396) #define CIS(c,ch) ( ((unsigned char)(c)) == (ch) ) #define CHAR_RESERVED(c) \ (CIS(c, ';') || CIS(c, '/') || CIS(c, '?') || CIS(c, ':') || CIS(c, '@') || \ CIS(c, '&') || CIS(c, '=') || CIS(c, '+') || CIS(c, '$') || CIS(c, ',')) // Delimiters (RFC2396) #define CHAR_DELIM(c) \ (CIS(c, '<') || CIS(c, '>') || CIS(c, '#') || CIS(c, '%') || CIS(c, '\"')) // Unwise (RFC2396) #define CHAR_UNWISE(c) \ (CIS(c, '{') || CIS(c, '}') || CIS(c, '|') || CIS(c, '\\') || CIS(c, '^') || \ CIS(c, '[') || CIS(c, ']') || CIS(c, '`')) // Special (escape chars) (RFC2396 + >127 ) #define CHAR_LOW(c) ( ((unsigned char)(c) <= 31) ) #define CHAR_HIG(c) ( ((unsigned char)(c) >= 127) ) #define CHAR_SPECIAL(c) ( CHAR_LOW(c) || CHAR_HIG(c) ) // We try to avoid them and encode them instead #define CHAR_XXAVOID(c) \ (CIS(c, ' ') || CIS(c, '*') || CIS(c, '\'') || CIS(c, '\"') || \ CIS(c, '&') || CIS(c, '!')) #define CHAR_MARK(c) \ (CIS(c, '-') || CIS(c, '_') || CIS(c, '.') || CIS(c, '!') || CIS(c, '~') || \ CIS(c, '*') || CIS(c, '\'') || CIS(c, '(') || CIS(c, ')')) // conversion éventuelle / vers antislash #ifdef _WIN32 char *antislash(char *catbuff, const char *s) { char *a; strcpybuff(catbuff, s); while(a = strchr(catbuff, '/')) *a = '\\'; return catbuff; } #endif // Initialize a htsblk structure void hts_init_htsblk(htsblk * r) { memset(r, 0, sizeof(htsblk)); // effacer r->soc = INVALID_SOCKET; r->msg[0] = '\0'; r->statuscode = STATUSCODE_INVALID; r->totalsize = -1; } // ouvre une liaison http, envoie une requète GET et réceptionne le header // retour: socket T_SOC http_fopen(httrackp * opt, const char *adr, const char *fil, htsblk * retour) { // / GET, traiter en-tête return http_xfopen(opt, 0, 1, 1, NULL, adr, fil, retour); } // ouverture d'une liaison http, envoi d'une requète // mode: 0 GET 1 HEAD [2 POST] // treat: traiter header? // waitconnect: attendre le connect() // note: dans retour, on met les params du proxy T_SOC http_xfopen(httrackp *opt, int mode, int treat, int waitconnect, const char *xsend, const char *adr, const char *fil, htsblk *retour) { T_SOC soc = INVALID_SOCKET; char BIGSTK tempo_fil[HTS_URLMAXSIZE * 2]; // retour prédéfini: erreur if (retour) { retour->adr = NULL; retour->size = 0; retour->msg[0] = '\0'; retour->statuscode = STATUSCODE_NON_FATAL; // a priori erreur non fatale } #if HDEBUG printf("adr=%s\nfichier=%s\n", adr, fil); #endif // ouvrir liaison #if HDEBUG printf("Création d'une socket sur %s\n", adr); #endif #if CNXDEBUG printf("..newhttp\n"); #endif /* connexion */ if (retour) { /* no proxy, or proxy not usable here (local file) */ if ((!(retour->req.proxy.active)) || (strcmp(adr, "file://") == 0)) { soc = newhttp(opt, adr, retour, -1, waitconnect); } else { // to the proxy; https tunnels to the origin via CONNECT in back_wait // (#85) soc = newhttp(opt, retour->req.proxy.name, retour, retour->req.proxy.port, waitconnect); } } else { soc = newhttp(opt, adr, NULL, -1, waitconnect); } // copier index socket retour if (retour) retour->soc = soc; /* Check for errors */ if (soc == INVALID_SOCKET) { if (retour) { if (retour->msg) { if (!strnotempty(retour->msg)) { #ifdef _WIN32 int last_errno = WSAGetLastError(); sprintf(retour->msg, "Connect error: %s", strerror(last_errno)); #else int last_errno = errno; sprintf(retour->msg, "Connect error: %s", strerror(last_errno)); #endif } } } } // -------------------- // court-circuit (court circuite aussi le proxy..) // LOCAL_SOCKET_ID est une pseudo-socket locale if (soc == LOCAL_SOCKET_ID) { retour->is_file = 1; // fichier local if (mode == 0) { // GET // Test en cas de file:///C|... if (!fexist (fconv(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fil)))) if (fexist (fconv (OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fil + 1)))) { strcpybuff(tempo_fil, fil + 1); fil = tempo_fil; } // Ouvrir retour->totalsize = fsize(fconv(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fil))); // taille du fichier retour->msg[0] = '\0'; soc = INVALID_SOCKET; if (retour->totalsize < 0) strcpybuff(retour->msg, "Unable to open local file"); else { // Note: On passe par un FILE* (plus propre) retour->fp = FOPEN(fconv(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fil)), "rb"); // ouvrir if (retour->fp == NULL) soc = INVALID_SOCKET; else soc = LOCAL_SOCKET_ID; } retour->soc = soc; if (soc != INVALID_SOCKET) { retour->statuscode = HTTP_OK; // OK strcpybuff(retour->msg, "OK"); guess_httptype_sized(opt, retour->contenttype, sizeof(retour->contenttype), fil); } else if (strnotempty(retour->msg) == 0) strcpybuff(retour->msg, "Unable to open local file"); return soc; // renvoyer } else { // HEAD ou POST : interdit sur un local!!!! (c'est idiot!) strcpybuff(retour->msg, "Unexpected Head/Post local request"); soc = INVALID_SOCKET; // erreur retour->soc = soc; return soc; } } // -------------------- if (soc != INVALID_SOCKET) { char rcvd[1100]; rcvd[0] = '\0'; #if HDEBUG printf("Ok, connexion réussie, id=%d\n", soc); #endif // connecté? if (waitconnect) { http_sendhead(opt, NULL, mode, xsend, adr, fil, NULL, NULL, retour); } if (soc != INVALID_SOCKET) { #if HDEBUG printf("Attente de la réponse:\n"); #endif // si GET (réception d'un fichier), réceptionner en-tête d'abord, // et ensuite le corps // si POST on ne réceptionne rien du tout, c'est après que l'on fera // une réception standard pour récupérer l'en tête if ((treat) && (waitconnect)) { // traiter (attendre!) en-tête // Réception de la status line et de l'en-tête (norme RFC1945) // status-line à récupérer finput(soc, rcvd, 1024); if (strnotempty(rcvd) == 0) finput(soc, rcvd, 1024); // "certains serveurs buggés envoient un \n au début" (RFC) // traiter status-line treatfirstline(retour, rcvd); #if HDEBUG printf("Status-Code=%d\n", retour->statuscode); #endif // en-tête // header // ** !attention! HTTP/0.9 non supporté do { finput(soc, rcvd, 1024); #if HDEBUG printf(">%s\n", rcvd); #endif if (strnotempty(rcvd)) treathead(NULL, NULL, NULL, retour, rcvd); // traiter } while(strnotempty(rcvd)); } else { // si GET, on recevra l'en tête APRES if (retour) retour->totalsize = -1; } } } return soc; } /* Buffer printing */ typedef struct buff_struct { /** Buffer **/ char *buffer; /** Buffer capacity in bytes **/ size_t capacity; /** Buffer write position ; MUST point to a valid \0. **/ size_t pos; } buff_struct; static void print_buffer(buff_struct*const str, const char *format, ...) HTS_PRINTF_FUN(2, 3); /* Prints on a static buffer. asserts in case of overflow. */ static void print_buffer(buff_struct*const str, const char *format, ...) { size_t result; va_list args; size_t remaining; char *position; /* Security check. */ assertf(str != NULL); assertf(str->pos < str->capacity); /* Print */ position = &str->buffer[str->pos]; remaining = str->capacity - str->pos; va_start(args, format); result = (size_t) vsnprintf(position, remaining, format, args); va_end(args); assertf(result < remaining); /* Increment. */ str->pos += strlen(position); assertf(str->pos < str->capacity); } /* Append the request "Cookie:" header line for every stored cookie matching domain/path. RFC 6265 form: bare "name=value" pairs joined by "; ", no $Version/$Path attributes (those are RFC 2965 syntax that modern servers reject, issue #151). Returns the number of cookies emitted. */ static int append_cookie_header(buff_struct *bstr, t_cookie *cookie, const char *domain, const char *path) { char buffer[8192]; char *b; int cook = 0; int max_cookies = 8; if (cookie == NULL) return 0; b = cookie->data; do { b = cookie_find(b, "", domain, path); // next matching cookie if (b != NULL) { max_cookies--; if (!cook) { print_buffer(bstr, "Cookie: "); cook = 1; } else print_buffer(bstr, "; "); print_buffer(bstr, "%s", cookie_get(buffer, b, 5)); print_buffer(bstr, "=%s", cookie_get(buffer, b, 6)); b = cookie_nextfield(b); } } while (b != NULL && max_cookies > 0); if (cook) print_buffer(bstr, H_CRLF); return cook; } /* Build the request Cookie line for domain/path into dst (always NUL-terminated). Returns the number of cookies emitted. */ int http_cookie_header(t_cookie *cookie, const char *domain, const char *path, char *dst, size_t dst_size) { buff_struct bstr = {dst, dst_size, 0}; assertf(dst != NULL && dst_size > 0); dst[0] = '\0'; return append_cookie_header(&bstr, cookie, domain, path); } // envoi d'une requète int http_sendhead(httrackp * opt, t_cookie * cookie, int mode, const char *xsend, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * retour) { char BIGSTK buffer_head_request[16384]; buff_struct bstr = { buffer_head_request, sizeof(buffer_head_request), 0 }; int direct_url = 0; // ne pas analyser l'url (exemple: ftp://) const char *search_tag = NULL; // Initialize buffer buffer_head_request[0] = '\0'; // possibilité non documentée: >post: et >postfile: // si présence d'un tag >post: alors executer un POST // exemple: http://www.example.com/test.cgi?foo>post:posteddata=10&foo=5 // si présence d'un tag >postfile: alors envoyer en tête brut contenu dans le fichier en question // exemple: http://www.example.com/test.cgi?foo>postfile:post0.txt search_tag = strstr(fil, POSTTOK ":"); if (!search_tag) { search_tag = strstr(fil, POSTTOK "file:"); if (search_tag) { // postfile if (mode == 0) { // GET! FILE *fp = FOPEN(unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), search_tag + strlen(POSTTOK) + 5), "rb"); if (fp) { char BIGSTK line[1100]; char BIGSTK protocol[256], url[HTS_URLMAXSIZE * 2], method[256]; linput(fp, line, 1000); /* widths bound method[256], url[HTS_URLMAXSIZE*2], protocol[256] */ if (sscanf(line, "%255s %2047s %255s", method, url, protocol) == 3) { size_t ret; // http proxy: absolute-URI; socks/CONNECT tunnel: origin-form if (retour->req.proxy.active && !hts_proxy_is_socks(retour->req.proxy.name) && !hts_proxy_is_connect(retour->req.proxy.name)) { print_buffer(&bstr, "%s http://%s%s %s\r\n", method, adr, url, protocol); } else { print_buffer(&bstr, "%s %s %s\r\n", method, url, protocol); } // lire le reste en brut ret = fread(&bstr.buffer[bstr.pos], bstr.capacity - bstr.pos, 1, fp); if ((int) ret < 0) { return -1; } bstr.pos += strlen(&bstr.buffer[bstr.pos]); } fclose(fp); } } } } // Fin postfile if (bstr.pos == 0) { // PAS POSTFILE // Type de requète? if ((search_tag) && (mode == 0)) { print_buffer(&bstr, "POST "); } else if (mode == 0) { // GET print_buffer(&bstr, "GET "); } else { // if (mode==1) { if (!retour->req.http11) // forcer HTTP/1.0 print_buffer(&bstr, "GET "); // certains serveurs (cgi) buggent avec HEAD else print_buffer(&bstr, "HEAD "); } // an http proxy needs an absolute URI; a socks or CONNECT tunnel does not if (retour->req.proxy.active && !hts_proxy_is_socks(retour->req.proxy.name) && !hts_proxy_is_connect(retour->req.proxy.name) && (strncmp(adr, "https://", 8) != 0)) { if (!link_has_authority(adr)) { // default http #if HDEBUG printf("Proxy Use: for %s%s proxy %d port %d\n", adr, fil, retour->req.proxy.name, retour->req.proxy.port); #endif print_buffer(&bstr, "http://%s", jump_identification_const(adr)); } else { // ftp:// en proxy http #if HDEBUG printf("Proxy Use for ftp: for %s%s proxy %d port %d\n", adr, fil, retour->req.proxy.name, retour->req.proxy.port); #endif direct_url = 1; // ne pas analyser user/pass print_buffer(&bstr, "%s", adr); } } // NOM DU FICHIER // on slash doit être présent en début, sinon attention aux bad request! (400) if (*fil != '/') print_buffer(&bstr, "/"); { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; tempo[0] = '\0'; if (search_tag) strncatbuff(tempo, fil, (int) (search_tag - fil)); else strcpybuff(tempo, fil); inplace_escape_check_url(tempo, sizeof(tempo)); print_buffer(&bstr, "%s", tempo); // avec échappement } // protocole if (!retour->req.http11) { // forcer HTTP/1.0 print_buffer(&bstr, " HTTP/1.0\x0d\x0a"); } else { // Requète 1.1 print_buffer(&bstr, " HTTP/1.1\x0d\x0a"); } /* supplemental data */ if (xsend) print_buffer(&bstr, "%s", xsend); // éventuelles autres lignes // https/connect://: auth rides the CONNECT; socks: the handshake if (retour->req.proxy.active && !hts_proxy_is_socks(retour->req.proxy.name) && !hts_proxy_is_connect(retour->req.proxy.name) && strncmp(adr, "https://", 8) != 0) { if (link_has_authorization(retour->req.proxy.name)) { // et hop, authentification proxy! const char *a = jump_identification_const(retour->req.proxy.name); const char *astart = jump_protocol_const(retour->req.proxy.name); char autorisation[1100]; char user_pass[256]; autorisation[0] = user_pass[0] = '\0'; // strncatbuff(user_pass, astart, (int) (a - astart) - 1); strcpybuff(user_pass, unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), user_pass)); code64((unsigned char *) user_pass, (int) strlen(user_pass), (unsigned char *) autorisation, 0); print_buffer(&bstr, "Proxy-Authorization: Basic %s"H_CRLF, autorisation); #if HDEBUG printf("Proxy-Authenticate, %s (code: %s)\n", user_pass, autorisation); #endif } } // Referer? if (referer_adr != NULL && referer_fil != NULL && strnotempty(referer_adr) && strnotempty(referer_fil) ) { // non vide if ((strcmp(referer_adr, "file://") != 0) && ( /* no https referer to http urls */ (strncmp(referer_adr, "https://", 8) != 0) /* referer is not https */ ||(strncmp(adr, "https://", 8) == 0) /* or referer AND addresses are https */ ) ) { // PAS file:// print_buffer(&bstr, "Referer: http://%s%s"H_CRLF, jump_identification_const(referer_adr), referer_fil); } } // HTTP field: referer else if (strnotempty(retour->req.referer)) { print_buffer(&bstr, "Referer: %s"H_CRLF, retour->req.referer); } // POST? if (mode == 0) { // GET! if (search_tag) { print_buffer(&bstr, "Content-length: %d" H_CRLF, (int) (strlen (unescape_http (OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), search_tag + strlen(POSTTOK) + 1)))); } } // send stored cookies matching this host/path if (cookie) { append_cookie_header(&bstr, cookie, jump_identification_const(adr), fil); } // gérer le keep-alive (garder socket) if (retour->req.http11 && !retour->req.nokeepalive) { print_buffer(&bstr, "Connection: keep-alive" H_CRLF); } else { print_buffer(&bstr, "Connection: close" H_CRLF); } { const char *real_adr = jump_identification_const(adr); // Mandatory per RFC2616 if (!direct_url) { // pas ftp:// par exemple print_buffer(&bstr, "Host: %s"H_CRLF, real_adr); } // HTTP field: from if (strnotempty(retour->req.from)) { // HTTP from print_buffer(&bstr, "From: %s" H_CRLF, retour->req.from); } // Présence d'un user-agent? if (retour->req.user_agent_send && strnotempty(retour->req.user_agent)) { print_buffer(&bstr, "User-Agent: %s" H_CRLF, retour->req.user_agent); } // Accept if (strnotempty(retour->req.accept)) { print_buffer(&bstr, "Accept: %s" H_CRLF, retour->req.accept); } // Accept-language if (strnotempty(retour->req.lang_iso)) { print_buffer(&bstr, "Accept-Language: %s"H_CRLF, retour->req.lang_iso); } // Compression accepted ? if (retour->req.http11) { hts_boolean compressible = HTS_FALSE; hts_boolean secure = HTS_FALSE; #if HTS_USEZLIB compressible = (!retour->req.range_used && !retour->req.nocompression); #endif #if HTS_USEOPENSSL secure = retour->ssl ? HTS_TRUE : HTS_FALSE; #endif print_buffer(&bstr, "Accept-Encoding: %s" H_CRLF, hts_acceptencoding(compressible, secure)); } /* Authentification */ { char autorisation[1100]; const char *a; autorisation[0] = '\0'; if (link_has_authorization(adr)) { // ohh une authentification! const char *a = jump_identification_const(adr); const char *astart = jump_protocol_const(adr); if (!direct_url) { // pas ftp:// par exemple char user_pass[256]; user_pass[0] = '\0'; strncatbuff(user_pass, astart, (int) (a - astart) - 1); strcpybuff(user_pass, unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), user_pass)); code64((unsigned char *) user_pass, (int) strlen(user_pass), (unsigned char *) autorisation, 0); if (strcmp(fil, "/robots.txt")) /* pas robots.txt */ bauth_add(cookie, astart, fil, autorisation); } } else if ((a = bauth_check(cookie, real_adr, fil))) strcpybuff(autorisation, a); /* On a une autorisation a donner? */ if (strnotempty(autorisation)) { print_buffer(&bstr, "Authorization: Basic %s"H_CRLF, autorisation); } } } // Custom header(s) if (strnotempty(retour->req.headers)) { print_buffer(&bstr, "%s", retour->req.headers); } // CRLF de fin d'en tête print_buffer(&bstr, H_CRLF); // données complémentaires? if (search_tag) if (mode == 0) // GET! print_buffer(&bstr, "%s", unescape_http(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), search_tag + strlen(POSTTOK) + 1)); } #if HDEBUG #endif if (_DEBUG_HEAD) { if (ioinfo) { fprintf(ioinfo, "[%d] request for %s%s:\r\n", retour->debugid, jump_identification_const(adr), fil); fprintfio(ioinfo, bstr.buffer, "<<< "); fprintf(ioinfo, "\r\n"); fflush(ioinfo); } } // Fin test pas postfile // // Stash the raw request for the WARC request record (freed at // back_clear_entry) if (StringNotEmpty(opt->warc_file)) warc_stash_request(retour, bstr.buffer); // Callback { int test_head = RUN_CALLBACK6(opt, sendhead, bstr.buffer, adr, fil, referer_adr, referer_fil, retour); if (test_head != 1) { deletesoc_r(retour); strcpybuff(retour->msg, "Header refused by external wrapper"); retour->soc = INVALID_SOCKET; } } // Envoi HTS_STAT.last_request = mtime_local(); if (sendc(retour, bstr.buffer) < 0) { // ERREUR, socket rompue?... deletesoc_r(retour); // fermer tout de même // et tenter de reconnecter strcpybuff(retour->msg, "Write error"); retour->soc = INVALID_SOCKET; } // RX'98 return 0; } // traiter 1ere ligne d'en tête void treatfirstline(htsblk * retour, const char *rcvd) { const char *a = rcvd; // exemple: // HTTP/1.0 200 OK if (*a) { // note: certains serveurs buggés renvoient HTTP/1.0\n200 OK ou " HTTP/1.0 200 OK" while((*a == ' ') || (*a == 10) || (*a == 13) || (*a == 9)) a++; // épurer espaces au début if (strfield(a, "HTTP/")) { // sauter HTTP/1.x while((*a != ' ') && (*a != '\0') && (*a != 10) && (*a != 13) && (*a != 9)) a++; if (*a != '\0') { while((*a == ' ') || (*a == 10) || (*a == 13) || (*a == 9)) a++; // épurer espaces if ((*a >= '0') && (*a <= '9')) { sscanf(a, "%d", &(retour->statuscode)); // sauter 200 while((*a != ' ') && (*a != '\0') && (*a != 10) && (*a != 13) && (*a != 9)) a++; while((*a == ' ') || (*a == 10) || (*a == 13) || (*a == 9)) a++; // épurer espaces if ((strlen(a) > 1) && (strlen(a) < 64)) // message retour strcpybuff(retour->msg, a); else infostatuscode(retour->msg, retour->statuscode); // type MIME par défaut2 strcpybuff(retour->contenttype, HTS_UNKNOWN_MIME); } else { // pas de code! retour->statuscode = STATUSCODE_INVALID; strcpybuff(retour->msg, "Unknown response structure"); } } else { // euhh?? retour->statuscode = STATUSCODE_INVALID; strcpybuff(retour->msg, "Unknown response structure"); } } else { if (*a == '<') { /* This is dirty .. */ retour->statuscode = HTTP_OK; retour->keep_alive = 0; strcpybuff(retour->msg, "Unknown, assuming junky server"); strcpybuff(retour->contenttype, HTS_UNKNOWN_MIME); } else if (strnotempty(a)) { retour->statuscode = STATUSCODE_INVALID; strcpybuff(retour->msg, "Unknown (not HTTP/xx) response structure"); } else { /* This is dirty .. */ retour->statuscode = HTTP_OK; retour->keep_alive = 0; strcpybuff(retour->msg, "Unknown, assuming junky server"); strcpybuff(retour->contenttype, HTS_UNKNOWN_MIME); } } } else { // vide! /* retour->statuscode=STATUSCODE_INVALID; strcpybuff(retour->msg,"Empty reponse or internal error"); */ /* This is dirty .. */ retour->statuscode = HTTP_OK; strcpybuff(retour->msg, "Unknown, assuming junky server"); strcpybuff(retour->contenttype, HTS_UNKNOWN_MIME); } } // traiter ligne par ligne l'en tête // gestion des cookies void treathead(t_cookie * cookie, const char *adr, const char *fil, htsblk * retour, char *rcvd) { int p; if ((p = strfield(rcvd, "Content-length:")) != 0) { #if HDEBUG printf("ok, Content-length: détecté\n"); #endif if (sscanf(rcvd + p, LLintP, &(retour->totalsize)) == 1) { if (retour->totalsize == 0) { retour->empty = 1; } } } else if ((p = strfield(rcvd, "Content-Disposition:")) != 0) { while(is_realspace(*(rcvd + p))) p++; // sauter espaces if ((int) strlen(rcvd + p) < 250) { // pas trop long? char tmp[256]; char *a = NULL, *b = NULL; strcpybuff(tmp, rcvd + p); a = strstr(tmp, "filename="); if (a) { a += strlen("filename="); while(is_space(*a)) a++; if (a) { char *c = NULL; while((c = strchr(a, '/'))) /* skip all / (see RFC2616) */ a = c + 1; b = a + strlen(a) - 1; while(is_space(*b)) b--; b++; if (b) { *b = '\0'; if ((int) strlen(a) < 200) { // pas trop long? strcpybuff(retour->cdispo, a); } } } } } } else if ((p = strfield(rcvd, "Last-Modified:")) != 0) { while(is_realspace(*(rcvd + p))) p++; // sauter espaces if ((int) strlen(rcvd + p) < 64) { // pas trop long? strcpybuff(retour->lastmodified, rcvd + p); } } else if ((p = strfield(rcvd, "Date:")) != 0) { if (strnotempty(retour->lastmodified) == 0) { /* pas encore de last-modified */ while(is_realspace(*(rcvd + p))) p++; // sauter espaces if ((int) strlen(rcvd + p) < 64) { // pas trop long? strcpybuff(retour->lastmodified, rcvd + p); } } } else if ((p = strfield(rcvd, "Etag:")) != 0) { /* Etag */ if (retour) { while(is_realspace(*(rcvd + p))) p++; // sauter espaces if ((int) strlen(rcvd + p) < 64) // pas trop long? strcpybuff(retour->etag, rcvd + p); else // erreur.. ignorer retour->etag[0] = '\0'; } } else if ((p = strfield(rcvd, "Transfer-Encoding:")) != 0) { // chunk! while(is_realspace(*(rcvd + p))) p++; // sauter espaces if (strfield(rcvd + p, "chunked")) { retour->is_chunk = 1; // chunked #if HDEBUG printf("ok, Transfer-Encoding: détecté\n"); #endif } } else if ((p = strfield(rcvd, "Content-type:")) != 0) { if (retour) { char tempo[1100]; // éviter les text/html; charset=foo { char *a = strchr(rcvd + p, ';'); if (a) { // extended information *a = '\0'; a++; while(is_space(*a)) a++; if (strfield(a, "charset")) { a += 7; while(is_space(*a)) a++; if (*a == '=') { a++; while(is_space(*a)) a++; if (*a == '\"') a++; while(is_space(*a)) a++; if (*a) { char *chs = a; while(*a && !is_space(*a) && *a != '\"' && *a != ';') a++; *a = '\0'; if (*chs) { if (strlen(chs) < sizeof(retour->charset) - 2) { strcpybuff(retour->charset, chs); } } } } } } } // An empty/whitespace Content-Type value yields no token: keep the // sentinel default rather than reading an uninitialized tempo. if (sscanf(rcvd + p, "%1099s", tempo) == 1) { // tempo[1100], server data if (strlen(tempo) < sizeof(retour->contenttype) - 2) // pas trop long!! strcpybuff(retour->contenttype, tempo); else strcpybuff(retour->contenttype, "application/octet-stream-unknown"); // erreur } } } else if ((p = strfield(rcvd, "Content-Range:")) != 0) { // Content-Range: bytes 0-70870/70871 const char *a; for(a = rcvd + p; is_space(*a); a++) ; if (strncasecmp(a, "bytes ", 6) == 0) { for(a += 6; is_space(*a); a++) ; if (sscanf (a, LLintP "-" LLintP "/" LLintP, &retour->crange_start, &retour->crange_end, &retour->crange) != 3) { retour->crange_start = 0; retour->crange_end = 0; retour->crange = 0; a = strchr(rcvd + p, '/'); if (a != NULL) { a++; if (sscanf(a, LLintP, &retour->crange) == 1 && retour->crange >= 0) { retour->crange_start = 0; retour->crange_end = retour->crange - 1; } else { retour->crange = 0; } } } // A valid Content-Range has no negative field; reject hostile values so // the crange +/- 1 arithmetic downstream cannot sign-overflow (UB). if (retour->crange_start < 0 || retour->crange_end < 0 || retour->crange < 0) { retour->crange_start = retour->crange_end = retour->crange = 0; } } } else if ((p = strfield(rcvd, "Connection:")) != 0) { char *a = rcvd + p; while(is_space(*a)) a++; if (*a) { if (strfield(a, "Keep-Alive")) { if (!retour->keep_alive) { retour->keep_alive_max = 10; retour->keep_alive_t = 15; } retour->keep_alive = 1; } else { retour->keep_alive = 0; } } } else if ((p = strfield(rcvd, "Keep-Alive:")) != 0) { char *a = rcvd + p; while(is_space(*a)) a++; if (*a) { char *p; retour->keep_alive = 1; retour->keep_alive_max = 10; retour->keep_alive_t = 15; if ((p = strstr(a, "timeout="))) { p += strlen("timeout="); sscanf(p, "%d", &retour->keep_alive_t); } if ((p = strstr(a, "max="))) { p += strlen("max="); sscanf(p, "%d", &retour->keep_alive_max); } if (retour->keep_alive_max <= 1 || retour->keep_alive_t < 1) { retour->keep_alive = 0; } } } else if ((p = strfield(rcvd, "TE:")) != 0) { char *a = rcvd + p; while(is_space(*a)) a++; if (*a) { if (strfield(a, "trailers")) { retour->keep_alive_trailers = 1; } } } else if ((p = strfield(rcvd, "Content-Encoding:")) != 0) { if (retour) { char tempo[1100]; char *a = rcvd + p; while(is_space(*a)) a++; { char *a = strchr(rcvd + p, ';'); if (a) *a = '\0'; } // Bound to tempo[1100]; no token => leave empty, don't read uninit tempo. if (sscanf(a, "%1099s", tempo) == 1 && strlen(tempo) < 64) strcpybuff(retour->contentencoding, tempo); else retour->contentencoding[0] = '\0'; /* A coding to undo (or one we can not undo, which must fail the fetch rather than save the coded bytes as the page) */ if (hts_codec_parse(retour->contentencoding) != HTS_CODEC_IDENTITY) retour->compressed = 1; } } else if ((p = strfield(rcvd, "Location:")) != 0) { if (retour) { if (retour->location) { while(is_realspace(*(rcvd + p))) p++; // sauter espaces if ((int) strlen(rcvd + p) < HTS_URLMAXSIZE) // not too long? /* location aliases location_buffer[HTS_URLMAXSIZE * 2] */ strlcpybuff(retour->location, rcvd + p, HTS_URLMAXSIZE * 2); else // erreur.. ignorer retour->location[0] = '\0'; } } } else if (((p = strfield(rcvd, "Set-Cookie:")) != 0) && (cookie)) { // ohh un cookie char *a = rcvd + p; // pointeur char domain[256]; // domaine cookie (.netscape.com) char path[256]; // chemin (/) char cook_name[256]; // nom cookie (MYCOOK) char BIGSTK cook_value[8192]; // valeur (ID=toto,S=1234) #if DEBUG_COOK printf("set-cookie detected\n"); #endif /* Over-long host overflows the fail-safe domain[] copy (abort); drop it. */ if (adr && strlen(jump_identification_const(adr)) >= sizeof(domain)) return; while(*a) { char *token_st, *token_end; char *value_st, *value_end; char name[256]; char BIGSTK value[8192]; int next = 0; name[0] = value[0] = '\0'; // // initialiser cookie lu actuellement if (adr) strcpybuff(domain, jump_identification_const(adr)); // domaine strcpybuff(path, "/"); // chemin (/) strcpybuff(cook_name, ""); // nom cookie (MYCOOK) strcpybuff(cook_value, ""); // valeur (ID=toto,S=1234) // boucler jusqu'au prochain cookie ou la fin do { char *start_loop = a; while(is_space(*a)) a++; // sauter espaces token_st = a; // départ token while((!is_space(*a)) && (*a) && (*a != ';') && (*a != '=')) a++; // arrêter si espace, point virgule token_end = a; while(is_space(*a)) a++; // sauter espaces if (*a == '=') { // name=value a++; while(is_space(*a)) a++; // sauter espaces value_st = a; while((*a != ';') && (*a)) a++; // prochain ; value_end = a; // vérifier débordements if ((((int) (token_end - token_st)) < 200) && (((int) (value_end - value_st)) < 8000) && (((int) (token_end - token_st)) > 0) && (((int) (value_end - value_st)) > 0)) { int name_len = (int) (token_end - token_st); int value_len = (int) (value_end - value_st); name[0] = '\0'; value[0] = '\0'; strncatbuff(name, token_st, name_len); strncatbuff(value, value_st, value_len); #if DEBUG_COOK printf("detected cookie-av: name=\"%s\" value=\"%s\"\n", name, value); #endif if (strfield2(name, "domain")) { if (value_len < sizeof(domain) - 1) { strcpybuff(domain, value); } else { cook_name[0] = 0; break; } } else if (strfield2(name, "path")) { if (value_len < sizeof(path) - 1) { strcpybuff(path, value); } else { cook_name[0] = 0; break; } } else if (strfield2(name, "max-age")) { // ignoré.. } else if (strfield2(name, "expires")) { // ignoré.. } else if (strfield2(name, "version")) { // ignoré.. } else if (strfield2(name, "comment")) { // ignoré } else if (strfield2(name, "secure")) { // ne devrait pas arriver ici // ignoré } else { if (value_len < sizeof(cook_value) - 1 && name_len < sizeof(cook_name) - 1) { if (strnotempty(cook_name) == 0) { // noter premier: nom et valeur cookie strcpybuff(cook_name, name); strcpybuff(cook_value, value); } else { // prochain cookie a = start_loop; // on devra recommencer à cette position next = 1; // enregistrer } } else { cook_name[0] = 0; break; } } } } if (!next) { while((*a != ';') && (*a)) a++; // prochain while(*a == ';') a++; // sauter ; } } while((*a) && (!next)); if (strnotempty(cook_name)) { // cookie? #if DEBUG_COOK printf ("new cookie: name=\"%s\" value=\"%s\" domain=\"%s\" path=\"%s\"\n", cook_name, cook_value, domain, path); #endif cookie_add(cookie, cook_name, cook_value, domain, path); } } } } // HTTP status code -> reason phrase (per RFC), or NULL if unknown. HTSEXT_API const char *infostatuscode_const(int statuscode) { // O(1) dispatch (the compiler builds a jump table); the phrases are static. switch (statuscode) { case 100: return "Continue"; case 101: return "Switching Protocols"; case 200: return "OK"; case 201: return "Created"; case 202: return "Accepted"; case 203: return "Non-Authoritative Information"; case 204: return "No Content"; case 205: return "Reset Content"; case 206: return "Partial Content"; case 300: return "Multiple Choices"; case 301: return "Moved Permanently"; case 302: return "Moved Temporarily"; case 303: return "See Other"; case 304: return "Not Modified"; case 305: return "Use Proxy"; case 306: return "Undefined 306 error"; case 307: return "Temporary Redirect"; case 400: return "Bad Request"; case 401: return "Unauthorized"; case 402: return "Payment Required"; case 403: return "Forbidden"; case 404: return "Not Found"; case 405: return "Method Not Allowed"; case 406: return "Not Acceptable"; case 407: return "Proxy Authentication Required"; case 408: return "Request Time-out"; case 409: return "Conflict"; case 410: return "Gone"; case 411: return "Length Required"; case 412: return "Precondition Failed"; case 413: return "Request Entity Too Large"; case 414: return "Request-URI Too Large"; case 415: return "Unsupported Media Type"; case 416: return "Requested Range Not Satisfiable"; case 417: return "Expectation Failed"; case 429: return "Too Many Requests"; case 451: return "Unavailable For Legal Reasons"; case 500: return "Internal Server Error"; case 501: return "Not Implemented"; case 502: return "Bad Gateway"; case 503: return "Service Unavailable"; case 504: return "Gateway Time-out"; case 505: return "HTTP Version Not Supported"; default: return NULL; } } // Write the status code's reason phrase into msg. For an unknown code, keep any // caller-provided message, otherwise fall back to a default. Callers provide a // buffer of at least 64 bytes (the longest reason phrase is 31). HTSEXT_API void infostatuscode(char *msg, int statuscode) { const char *const text = infostatuscode_const(statuscode); if (text != NULL) { strlcpybuff(msg, text, 64); } else if (strnotempty(msg) == 0) { strlcpybuff(msg, "Unknown error", 64); } } // check if data is available int check_readinput(htsblk * r) { if (r->soc != INVALID_SOCKET) { fd_set fds; // poll structures struct timeval tv; // structure for select const int soc = (int) r->soc; assertf(soc == r->soc); FD_ZERO(&fds); FD_SET(soc, &fds); tv.tv_sec = 0; tv.tv_usec = 0; select(soc + 1, &fds, NULL, NULL, &tv); if (FD_ISSET(soc, &fds)) return 1; else return 0; } else return 0; } // check if data is available int check_readinput_t(T_SOC soc, int timeout) { if (soc != INVALID_SOCKET) { fd_set fds; // poll structures struct timeval tv; // structure for select const int isoc = (int) soc; assertf(isoc == soc); FD_ZERO(&fds); FD_SET(isoc, &fds); tv.tv_sec = timeout; tv.tv_usec = 0; select(isoc + 1, &fds, NULL, NULL, &tv); if (FD_ISSET(isoc, &fds)) return 1; else return 0; } else return 0; } // wait until the socket is writable, up to timeout seconds int check_writeinput_t(T_SOC soc, int timeout) { if (soc != INVALID_SOCKET) { fd_set fds; struct timeval tv; const int isoc = (int) soc; assertf(isoc == soc); FD_ZERO(&fds); FD_SET(isoc, &fds); tv.tv_sec = timeout; tv.tv_usec = 0; select(isoc + 1, NULL, &fds, NULL, &tv); return FD_ISSET(isoc, &fds) ? 1 : 0; } else return 0; } // idem, sauf qu'ici on peut choisir la taille max de données à recevoir // SI bufl==0 alors le buffer est censé être de 8kos, et on recoit par bloc de lignes // en éliminant les cr (ex: header), arrêt si double-lf // SI bufl==-1 alors le buffer est censé être de 8kos, et on recoit ligne par ligne // en éliminant les cr (ex: header), arrêt si double-lf // Note: les +1 dans les malloc sont dûs à l'octet nul rajouté en fin de fichier LLint http_xfread1(htsblk * r, int bufl) { int nl = -1; // EOF if (r->totalsize >= 0 && r->size == r->totalsize) { return READ_EOF; } if (bufl > 0) { if (!r->is_write) { // stocker en mémoire // In-memory content must fit a 32-bit index (allocs below add 1, reads // use int offsets): reject a hostile Content-Length or endless stream. const LLint inmem_want = (r->totalsize >= 0) ? r->totalsize : (r->size + bufl); if (inmem_want >= INT32_MAX) { r->statuscode = STATUSCODE_INVALID; strcpybuff(r->msg, "In-memory content too large"); return READ_ERROR; } if (r->totalsize >= 0) { // totalsize déterminé ET ALLOUE if (r->adr == NULL) { r->adr = (char *) malloct((size_t) r->totalsize + 1); r->size = 0; } if (r->adr != NULL) { // lecture const size_t req_size = r->totalsize - r->size; nl = req_size > 0 ? hts_read(r, r->adr + ((int) r->size), (int) req_size) : 0; /* NO 32 bit overlow possible here (no 4GB html!) */ // nouvelle taille if (nl >= 0) r->size += nl; /* if (r->size >= r->totalsize) nl = -1; // break */ r->adr[r->size] = '\0'; // caractère NULL en fin au cas où l'on traite des HTML } } else { // inconnu.. // réserver de la mémoire? if (r->adr == NULL) { #if HDEBUG printf("..alloc xfread\n"); #endif r->adr = (char *) malloct(bufl + 1); r->size = 0; } else { #if HDEBUG printf("..realloc xfread1\n"); #endif r->adr = (char *) realloct(r->adr, (int) r->size + bufl + 1); } if (r->adr != NULL) { // lecture nl = hts_read(r, r->adr + (int) r->size, bufl); if (nl > 0) { // resize r->adr = (char *) realloct(r->adr, (int) r->size + nl + 1); // nouvelle taille r->size += nl; // octet nul if (r->adr) r->adr[r->size] = '\0'; } // sinon on a fini #if HDEBUG else if (nl < 0) printf("..end read (%d)\n", nl); #endif } #if HDEBUG else printf("..-> error\n"); #endif } // pas de adr=erreur if (r->adr == NULL) nl = READ_ERROR; } else { // stocker sur disque char *buff; buff = (char *) malloct(bufl); if (buff != NULL) { // lecture nl = hts_read(r, buff, bufl); // nouvelle taille if (nl > 0) { r->size += nl; if (fwrite(buff, 1, nl, r->out) != nl) { r->statuscode = STATUSCODE_INVALID; strcpybuff(r->msg, "Write error on disk"); nl = READ_ERROR; } } // libérer bloc tempo freet(buff); } else nl = READ_ERROR; if ((nl < 0) && (r->out != NULL)) { fflush(r->out); } } // stockage disque ou mémoire } else if (bufl == -2) { // force reserve if (r->adr == NULL) { r->adr = (char *) malloct(8192); r->size = 0; return 0; } return -1; } else { // réception d'un en-tête octet par octet int count = 256; int tot_nl = 0; int lf_detected = 0; int at_beginning = 1; do { nl = READ_INTERNAL_ERROR; count--; if (r->adr == NULL) { r->adr = (char *) malloct(8192); r->size = 0; } if (r->adr != NULL) { if (r->size < 8190) { // lecture nl = hts_read(r, r->adr + r->size, 1); if (nl > 0) { // exit if: // lf detected AND already detected before // or // lf detected AND first character read if (*(r->adr + r->size) == 10) { if (lf_detected || (at_beginning) || (bufl < 0)) count = -1; lf_detected = 1; } if (*(r->adr + r->size) != 13) { // sauter caractères 13 if ((*(r->adr + r->size) != 10) && (*(r->adr + r->size) != 13) ) { // restart for new line lf_detected = 0; } (r->size)++; at_beginning = 0; } *(r->adr + r->size) = '\0'; // terminer par octet nul } } } if (nl >= 0) { tot_nl += nl; if (!check_readinput(r)) count = -1; } } while((nl >= 0) && (count > 0)); if (nl >= 0) { nl = tot_nl; } } // EOF if (r->totalsize >= 0 && r->size == r->totalsize) { return READ_EOF; } else { return nl; } } // teste si une URL (validité, header, taille) // retourne 200 ou le code d'erreur (404=NOT FOUND, etc) // en cas de moved xx, dans location // abandonne désormais au bout de 30 secondes (aurevoir les sites // qui nous font poireauter 5 heures..) -> -2=timeout htsblk http_test(httrackp * opt, const char *adr, const char *fil, char *loc) { T_SOC soc; htsblk retour; TStamp tl; int timeout = 30; // timeout pour un check (arbitraire) // ** // pour abandonner un site trop lent tl = time_local(); loc[0] = '\0'; hts_init_htsblk(&retour); retour.location = loc; // si non nul, contiendra l'adresse véritable en cas de moved xx // on ouvre en head, et on traite l'en tête soc = http_xfopen(opt, 1, 0, 1, NULL, adr, fil, &retour); // ouvrir HEAD, + envoi header if (soc != INVALID_SOCKET) { int e = 0; // tant qu'on a des données, et qu'on ne recoit pas deux LF, et que le timeout n'arrie pas do { if (http_xfread1(&retour, 0) < 0) e = 1; else { if (retour.adr != NULL) { if ((retour.adr[retour.size - 1] != 10) || (retour.adr[retour.size - 2] != 10)) e = 1; } } if (!e) { if ((time_local() - tl) >= timeout) { e = -1; } } } while(!e); if (e == 1) { if (adr != NULL) { int ptr = 0; char rcvd[1100]; // note: en gros recopie du traitement de back_wait() // // ---------------------------------------- // traiter en-tête! // status-line à récupérer ptr += binput(retour.adr + ptr, rcvd, 1024); if (strnotempty(rcvd) == 0) ptr += binput(retour.adr + ptr, rcvd, 1024); // "certains serveurs buggés envoient un \n au début" (RFC) // traiter status-line treatfirstline(&retour, rcvd); #if HDEBUG printf("(Buffer) Status-Code=%d\n", retour.statuscode); #endif // en-tête // header // ** !attention! HTTP/0.9 non supporté do { ptr += binput(retour.adr + ptr, rcvd, 1024); #if HDEBUG printf("(buffer)>%s\n", rcvd); #endif if (strnotempty(rcvd)) treathead(NULL, NULL, NULL, &retour, rcvd); // traiter } while(strnotempty(rcvd)); // ---------------------------------------- // libérer mémoire if (retour.adr != NULL) { freet(retour.adr); retour.adr = NULL; } } } else { retour.statuscode = STATUSCODE_TIMEOUT; strcpybuff(retour.msg, "Timeout While Testing"); } #if HTS_DEBUG_CLOSESOCK DEBUG_W("http_test: deletehttp\n"); #endif // this probe's htsblk is discarded by callers, so free any WARC stash here warc_free_request(&retour); deletehttp(&retour); retour.soc = INVALID_SOCKET; } return retour; } // Crée un lien (http) vers une adresse internet iadr // retour: structure (adresse, taille, message si erreur (si !adr)) // peut ouvrir avec des connect() non bloquants: waitconnect=0/1 T_SOC newhttp(httrackp * opt, const char *_iadr, htsblk * retour, int port, int waitconnect) { return newhttp_addr(opt, _iadr, retour, port, waitconnect, 0, NULL); } T_SOC newhttp_addr(httrackp *opt, const char *_iadr, htsblk *retour, int port, int waitconnect, int addr_index, int *addr_count) { T_SOC soc; // descipteur de la socket if (addr_count != NULL) { *addr_count = 0; } if (strcmp(_iadr, "file://") != 0) { /* non fichier */ SOCaddr server; SOCaddr addrs[HTS_MAXADDRNUM]; int naddr; const char *error = "unknown error"; // tester un éventuel id:pass et virer id:pass@ si détecté const char *const iadr = jump_identification_const(_iadr); const char *resolve_host = iadr; char BIGSTK iadr2[HTS_URLMAXSIZE * 2]; SOCaddr_clear(server); #if HDEBUG printf("gethostbyname\n"); #endif // tester un éventuel port if (port == -1) { const char *a = jump_toport_const(iadr); #if HTS_USEOPENSSL if (retour->ssl) port = 443; else port = 80; // port par défaut #else port = 80; // port par défaut #endif if (a != NULL) { // folding a nonsense port into 0..65535 crawls one neither the link nor // a port filter named; an empty "host:" just means the default (#614) if (a[1] != '\0' && !hts_parse_url_port(a + 1, &port)) { if (retour != NULL) { snprintf(retour->msg, sizeof(retour->msg), "Invalid port: %s", a + 1); } return INVALID_SOCKET; } iadr2[0] = '\0'; // the address itself, without the ":port" strncatbuff(iadr2, iadr, (int) (a - iadr)); resolve_host = iadr2; } } // resolve the full address list and pick the requested candidate; the // scheduler retries the next index when a connect fails (dead IPv6 etc.) naddr = hts_dns_resolve_all(opt, resolve_host, addrs, HTS_MAXADDRNUM, &error); if (addr_count != NULL) { *addr_count = naddr; } if (addr_index >= 0 && addr_index < naddr) { SOCaddr_copy_SOCaddr(server, addrs[addr_index]); } if (!SOCaddr_is_valid(server)) { #if DEBUG printf("erreur gethostbyname\n"); #endif if (retour && retour->msg) { #ifdef _WIN32 snprintf(retour->msg, sizeof(retour->msg), "Unable to get server's address: %s", error); #else snprintf(retour->msg, sizeof(retour->msg), "Unable to get server's address: %s", error); #endif } return INVALID_SOCKET; } // make a copy for external clients SOCaddr_copy_SOCaddr(retour->address, server); retour->address_size = SOCaddr_size(retour->address); // créer ("attachement") une socket (point d'accès) internet,en flot #if HDEBUG printf("socket\n"); #endif #if HTS_WIDE_DEBUG DEBUG_W("socket\n"); #endif soc = (T_SOC) socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0); if (retour != NULL) { retour->debugid = HTS_STAT.stat_sockid++; } #if HTS_WIDE_DEBUG DEBUG_W("socket()=%d\n" _(int) soc); #endif if (soc == INVALID_SOCKET) { if (retour && retour->msg) { #ifdef _WIN32 int last_errno = WSAGetLastError(); sprintf(retour->msg, "Unable to create a socket: %s", strerror(last_errno)); #else int last_errno = errno; sprintf(retour->msg, "Unable to create a socket: %s", strerror(last_errno)); #endif } return INVALID_SOCKET; // erreur création socket impossible } // bind this address if (retour != NULL && strnotempty(retour->req.proxy.bindhost)) { const char *error = "unknown error"; SOCaddr bind_addr; if (hts_dns_resolve2(opt, retour->req.proxy.bindhost, &bind_addr, &error) == NULL || bind(soc, &SOCaddr_sockaddr(bind_addr), SOCaddr_size(bind_addr)) != 0) { if (retour && retour->msg) { #ifdef _WIN32 snprintf(retour->msg, sizeof(retour->msg), "Unable to bind the specificied server address: %s", error); #else snprintf(retour->msg, sizeof(retour->msg), "Unable to bind the specificied server address: %s", error); #endif } deletesoc(soc); return INVALID_SOCKET; } } // structure: connexion au domaine internet, port 80 (ou autre) SOCaddr_initport(server, port); #if HDEBUG printf("==%d\n", soc); #endif // connexion non bloquante? if (!waitconnect) { #ifdef _WIN32 unsigned long p = 1; // non bloquant if (ioctlsocket(soc, FIONBIO, &p)) { const int last_errno = WSAGetLastError(); snprintf(retour->msg, sizeof(retour->msg), "Non-blocking socket failed: %s", strerror(last_errno)); deletesoc(soc); return INVALID_SOCKET; } #else const int flags = fcntl(soc, F_GETFL, 0); if (flags == -1 || fcntl(soc, F_SETFL, flags | O_NONBLOCK) == -1) { snprintf(retour->msg, sizeof(retour->msg), "Non-blocking socket failed: %s", strerror(errno)); deletesoc(soc); return INVALID_SOCKET; } #endif } // Connexion au serveur lui même #if HDEBUG printf("connect\n"); #endif HTS_STAT.last_connect = mtime_local(); #if HTS_WIDE_DEBUG DEBUG_W("connect\n"); #endif if (connect(soc, &SOCaddr_sockaddr(server), SOCaddr_size(server)) != 0) { // bloquant if (waitconnect) { #if HDEBUG printf("unable to connect!\n"); #endif if (retour != NULL && retour->msg) { #ifdef _WIN32 const int last_errno = WSAGetLastError(); sprintf(retour->msg, "Unable to connect to the server: %s", strerror(last_errno)); #else const int last_errno = errno; sprintf(retour->msg, "Unable to connect to the server: %s", strerror(last_errno)); #endif } /* Close the socket and notify the error!!! */ deletesoc(soc); return INVALID_SOCKET; } } #if HTS_WIDE_DEBUG DEBUG_W("connect done\n"); #endif #if HDEBUG printf("connexion établie\n"); #endif // A partir de maintenant, on peut envoyer et recevoir des données // via le flot identifié par soc (socket): write(soc,adr,taille) et // read(soc,adr,taille) } else { // on doit ouvrir un fichier local! // il sera géré de la même manière qu'une socket (c'est idem!) soc = LOCAL_SOCKET_ID; // pseudo-socket locale.. // soc sera remplacé lors d'un http_fopen() par un handle véritable! } // teste fichier local ou http return soc; } // couper http://www.truc.fr/pub/index.html -> www.truc.fr /pub/index.html // retour=-1 si erreur. // si file://... alors adresse=file:// (et coupe le ?query dans ce cas) int ident_url_absolute(const char *url, lien_adrfil *adrfil) { int pos = 0; int scheme = 0; // effacer adrfil->adr et adrfil->fil adrfil->adr[0] = adrfil->fil[0] = '\0'; // Reject an over-long URL: a root-relative path is copied whole into fil[]. if (strlen(url) >= HTS_URLMAXSIZE * 2) return -1; #if HDEBUG printf("protocol: %s\n", url); #endif // Scheme? { const char *a = url; while(isalpha((unsigned char) *a)) a++; if (*a == ':') scheme = 1; } // 1. optional scheme ":" if ((pos = strfield(url, "file:"))) { // fichier local!! (pour les tests) //!!p+=3; strcpybuff(adrfil->adr, "file://"); } else if ((pos = strfield(url, "http:"))) { // HTTP //!!p+=3; } else if ((pos = strfield(url, "ftp:"))) { // FTP strcpybuff(adrfil->adr, "ftp://"); // FTP!! //!!p+=3; #if HTS_USEOPENSSL } else if ((pos = strfield(url, "https:"))) { // HTTPS strcpybuff(adrfil->adr, "https://"); #endif } else if (scheme) { return -1; // erreur non reconnu } else pos = 0; // 2. optional "//" authority if (strncmp(url + pos, "//", 2) == 0) pos += 2; // (url+pos) now points to the path (not net path) //## if (adrfil->adr[0]!=lOCAL_CHAR) { // adrfil->adresse normale http if (!strfield(adrfil->adr, "file:")) { // PAS adrfil->file:// const char *p, *q; p = url + pos; // p pointe sur le début de l'adrfil->adresse, ex: www.truc.fr/sommaire/index.html q = strchr(jump_identification_const(p), '/'); if (q == 0) q = strchr(jump_identification_const(p), '?'); // http://www.foo.com?bar=1 if (q == 0) q = p + strlen(p); // pointe sur \0 // q pointe sur le chemin, ex: index.html?query=recherche // chemin www... trop long!! if ((((int) (q - p))) > HTS_URLMAXSIZE) { return -1; // erreur } // recopier adrfil->adresse www.. strncatbuff(adrfil->adr, p, ((int) (q - p))); // *( adrfil->adr+( ((int) q) - ((int) p) ) )=0; // faut arrêter la fumette! // fil[] holds the path plus a possible leading '/' the top strlen() misses. if (strlen(q) >= sizeof(adrfil->fil) - (q[0] != '/' ? 1 : 0)) return -1; // recopier chemin /pub/.. if (q[0] != '/') // page par défaut (/) strcatbuff(adrfil->fil, "/"); strcatbuff(adrfil->fil, q); // SECURITE: // simplifier url pour les ../ fil_simplifie(adrfil->fil); } else { // localhost adrfil->file:// const char *p; size_t i; char *a; p = url + pos; if (*p == '/' || *p == '\\') { /* adrfil->file:///.. */ strcatbuff(adrfil->fil, p); // fichier local ; adrfil->adr="#" } else { if (*p == '\0' || p[1] != ':') { /* empty path: not a DOS drive letter */ strcatbuff(adrfil->fil, "//"); /* adrfil->file://server/foo */ strcatbuff(adrfil->fil, p); } else { strcatbuff(adrfil->fil, p); // adrfil->file://C:\.. } } a = strchr(adrfil->fil, '?'); if (a) *a = '\0'; /* couper query (inutile pour adrfil->file:// lors de la requête) */ // adrfil->filtrer les \\ -> / pour les fichiers DOS for(i = 0; adrfil->fil[i] != '\0'; i++) if (adrfil->fil[i] == '\\') adrfil->fil[i] = '/'; // collapse ../ like the http branch above (path-traversal safety) fil_simplifie(adrfil->fil); } // no hostname if (!strnotempty(adrfil->adr)) return -1; // erreur non reconnu // nommer au besoin.. (non utilisé normalement) if (!strnotempty(adrfil->fil)) strcpybuff(adrfil->fil, "default-index.html"); // case insensitive pour adrfil->adresse { char *a = jump_identification(adrfil->adr); while(*a) { if ((*a >= 'A') && (*a <= 'Z')) *a += 'a' - 'A'; a++; } } return 0; } /* simplify ../ and ./ */ void fil_simplifie(char *f) { char *a, *b; char *rollback[128]; int rollid = 0; char lc = '/'; int query = 0; int wasAbsolute = (*f == '/'); for(a = b = f; *a != '\0';) { if (*a == '?') query = 1; if (query == 0 && lc == '/' && a[0] == '.' && a[1] == '/') { /* foo/./bar or ./foo */ a += 2; } else if (query == 0 && lc == '/' && a[0] == '.' && a[1] == '.' && (a[2] == '/' || a[2] == '\0')) { /* foo/../bar or ../foo or .. */ if (a[2] == '\0') a += 2; else a += 3; if (rollid > 1) { rollid--; b = rollback[rollid - 1]; } else { /* too many ../ */ rollid = 0; b = f; if (wasAbsolute) b++; /* after the / */ } } else { *b++ = lc = *a; if (*a == '/') { rollback[rollid++] = b; if (rollid >= 127) { *f = '\0'; /* ERROR */ break; } } a++; } } *b = '\0'; if (*f == '\0') { if (wasAbsolute) { f[0] = '/'; f[1] = '\0'; } else { f[0] = '.'; f[1] = '/'; f[2] = '\0'; } } } // fermer liaison fichier ou socket void deletehttp(htsblk * r) { #if HTS_DEBUG_CLOSESOCK DEBUG_W("deletehttp: (htsblk*) 0x%p\n" _(void *)r); #endif #if HTS_USEOPENSSL /* Free OpenSSL structures */ if (r->ssl_con) { SSL_shutdown(r->ssl_con); SSL_free(r->ssl_con); r->ssl_con = NULL; } #endif if (r->soc != INVALID_SOCKET) { if (r->is_file) { if (r->fp) fclose(r->fp); r->fp = NULL; } else { if (r->soc != LOCAL_SOCKET_ID) deletesoc_r(r); } r->soc = INVALID_SOCKET; } } // free the addr buffer // always returns 1 int deleteaddr(htsblk * r) { if (r->adr != NULL) { freet(r->adr); r->adr = NULL; } if (r->headers != NULL) { freet(r->headers); r->headers = NULL; } return 1; } // fermer une socket void deletesoc(T_SOC soc) { if (soc != INVALID_SOCKET && soc != LOCAL_SOCKET_ID) { #if HTS_WIDE_DEBUG DEBUG_W("close %d\n" _(int) soc); #endif #ifdef _WIN32 if (closesocket(soc) != 0) { int err = WSAGetLastError(); fprintf(stderr, "* error closing socket %d: %s\n", soc, strerror(err)); } #else if (close(soc) != 0) { const int err = errno; fprintf(stderr, "* error closing socket %d: %s\n", soc, strerror(err)); } #endif #if HTS_WIDE_DEBUG DEBUG_W(".. done\n"); #endif } } /* Will also clean other things */ void deletesoc_r(htsblk * r) { #if HTS_USEOPENSSL if (r->ssl_con) { SSL_shutdown(r->ssl_con); SSL_free(r->ssl_con); r->ssl_con = NULL; } #endif if (r->soc != INVALID_SOCKET) { deletesoc(r->soc); r->soc = INVALID_SOCKET; } } // renvoi le nombre de secondes depuis 1970 TStamp time_local(void) { return ((TStamp) time(NULL)); } // number of millisec since 1970 HTSEXT_API TStamp mtime_local(void) { #ifndef _WIN32 struct timeval tv; if (gettimeofday(&tv, NULL) != 0) { assert(! "gettimeofday"); } return (TStamp) (((TStamp) tv.tv_sec * (TStamp) 1000) + ((TStamp) tv.tv_usec / (TStamp) 1000)); #else struct timeb B; ftime(&B); return (TStamp) (((TStamp) B.time * (TStamp) 1000) + ((TStamp) B.millitm)); #endif } // convertit un nombre de secondes en temps (chaine) void sec2str(char *st, TStamp t) { int j, h, m, s; j = (int) (t / (3600 * 24)); t -= ((TStamp) j) * (3600 * 24); h = (int) (t / (3600)); t -= ((TStamp) h) * 3600; m = (int) (t / 60); t -= ((TStamp) m) * 60; s = (int) t; if (j > 0) sprintf(st, "%d days, %d hours %d minutes %d seconds", j, h, m, s); else if (h > 0) sprintf(st, "%d hours %d minutes %d seconds", h, m, s); else if (m > 0) sprintf(st, "%d minutes %d seconds", m, s); else sprintf(st, "%d seconds", s); } // idem, plus court (chaine) HTSEXT_API void qsec2str(char *st, TStamp t) { int j, h, m, s; j = (int) (t / (3600 * 24)); t -= ((TStamp) j) * (3600 * 24); h = (int) (t / (3600)); t -= ((TStamp) h) * 3600; m = (int) (t / 60); t -= ((TStamp) m) * 60; s = (int) t; if (j > 0) sprintf(st, "%dd,%02dh,%02dmin%02ds", j, h, m, s); else if (h > 0) sprintf(st, "%dh,%02dmin%02ds", h, m, s); else if (m > 0) sprintf(st, "%dmin%02ds", m, s); else sprintf(st, "%ds", s); } // heure actuelle, GMT, format rfc (taille buffer 256o) void time_gmt_rfc822(char *s) { time_t tt; struct tm *A; tt = time(NULL); A = gmtime(&tt); if (A == NULL) A = localtime(&tt); time_rfc822(s, A); } // heure actuelle, format rfc (taille buffer 256o) void time_local_rfc822(char *s) { time_t tt; struct tm *A; tt = time(NULL); A = localtime(&tt); time_rfc822_local(s, A); } /* convertir une chaine en temps */ struct tm *convert_time_rfc822(struct tm *result, const char *s) { char months[] = "jan feb mar apr may jun jul aug sep oct nov dec"; char str[256]; char *a; /* */ int result_mm = -1; int result_dd = -1; int result_n1 = -1; int result_n2 = -1; int result_n3 = -1; int result_n4 = -1; /* */ if ((int) strlen(s) > 200) return NULL; strcpybuff(str, s); hts_lowcase(str); /* éliminer :,- */ while((a = strchr(str, '-'))) *a = ' '; while((a = strchr(str, ':'))) *a = ' '; while((a = strchr(str, ','))) *a = ' '; /* tokeniser */ a = str; while(*a) { char *first, *last; char tok[256]; /* découper mot */ while(*a == ' ') a++; /* sauter espaces */ first = a; while((*a) && (*a != ' ')) a++; last = a; tok[0] = '\0'; if (first != last) { char *pos; strncatbuff(tok, first, (int) (last - first)); /* analyser */ if ((pos = strstr(months, tok))) { /* month always in letters */ result_mm = ((int) (pos - months)) / 4; } else { int number; if (sscanf(tok, "%d", &number) == 1) { /* number token */ if (result_dd < 0) /* day always first number */ result_dd = number; else if (result_n1 < 0) result_n1 = number; else if (result_n2 < 0) result_n2 = number; else if (result_n3 < 0) result_n3 = number; else if (result_n4 < 0) result_n4 = number; } /* sinon, bruit de fond(+1GMT for exampel) */ } } } if ((result_n1 >= 0) && (result_mm >= 0) && (result_dd >= 0) && (result_n2 >= 0) && (result_n3 >= 0) && (result_n4 >= 0)) { if (result_n4 >= 1000) { /* Sun Nov 6 08:49:37 1994 */ result->tm_year = result_n4 - 1900; result->tm_hour = result_n1; result->tm_min = result_n2; result->tm_sec = max(result_n3, 0); } else { /* Sun, 06 Nov 1994 08:49:37 GMT or Sunday, 06-Nov-94 08:49:37 GMT */ result->tm_hour = result_n2; result->tm_min = result_n3; result->tm_sec = max(result_n4, 0); if (result_n1 <= 50) /* 00 means 2000 */ result->tm_year = result_n1 + 100; else if (result_n1 < 1000) /* 99 means 1999 */ result->tm_year = result_n1; else /* 2000 */ result->tm_year = result_n1 - 1900; } result->tm_isdst = 0; /* assume GMT */ result->tm_yday = -1; /* don't know */ result->tm_wday = -1; /* don't know */ result->tm_mon = result_mm; result->tm_mday = result_dd; return result; } return NULL; } static time_t getGMT(struct tm *tm) { time_t t = timegm(tm); if (t != (time_t) - 1 && t != (time_t) 0) { return (time_t) t; } return (time_t) -1; } /* sets file time. -1 if error */ /* Note: utf-8 */ int set_filetime(const char *file, struct tm *tm_time) { time_t t = getGMT(tm_time); if (t != (time_t) - 1) { STRUCT_UTIMBUF tim; memset(&tim, 0, sizeof(tim)); tim.actime = tim.modtime = t; return UTIME(file, &tim); } return -1; } /* sets file time from RFC822 date+time, -1 if error*/ /* Note: utf-8 */ int set_filetime_rfc822(const char *file, const char *date) { struct tm buffer; struct tm *tm_s = convert_time_rfc822(&buffer, date); if (tm_s) { return set_filetime(file, tm_s); } else return -1; } /* Note: utf-8 */ int get_filetime_rfc822(const char *file, char *date) { STRUCT_STAT buf; date[0] = '\0'; if (STAT(file, &buf) == 0) { struct tm *A; time_t tt = buf.st_mtime; A = gmtime(&tt); if (A == NULL) A = localtime(&tt); if (A != NULL) { time_rfc822(date, A); return 1; } } return 0; } // heure au format rfc (taille buffer 256o) void time_rfc822(char *s, struct tm *A) { if (A == NULL) { int localtime_returned_null = 0; assertf(localtime_returned_null); } strftime(s, 256, "%a, %d %b %Y %H:%M:%S GMT", A); } // heure locale au format rfc (taille buffer 256o) void time_rfc822_local(char *s, struct tm *A) { if (A == NULL) { int localtime_returned_null = 0; assertf(localtime_returned_null); } strftime(s, 256, "%a, %d %b %Y %H:%M:%S", A); } // conversion en b,Kb,Mb HTSEXT_API char *int2bytes(strc_int2bytes2 * strc, LLint n) { char **a = int2bytes2(strc, n); strcpybuff(strc->catbuff, a[0]); strcatbuff(strc->catbuff, a[1]); return strc->catbuff; } // conversion en b/s,Kb/s,Mb/s HTSEXT_API char *int2bytessec(strc_int2bytes2 * strc, long int n) { char buff[256]; char **a = int2bytes2(strc, n); strcpybuff(buff, a[0]); strcatbuff(buff, a[1]); return concat(strc->catbuff, sizeof(strc->catbuff), buff, "/s"); } HTSEXT_API char *int2char(strc_int2bytes2 * strc, int n) { sprintf(strc->buff2, "%d", n); return strc->buff2; } // conversion en b,Kb,Mb, nombre et type séparés // limite: 2.10^9.10^6B /* See http://physics.nist.gov/cuu/Units/binary.html */ #define ToLLint(a) ((LLint)(a)) #define ToLLintKiB (ToLLint(1024)) #define ToLLintMiB (ToLLintKiB * ToLLintKiB) #define ToLLintGiB (ToLLintKiB * ToLLintKiB * ToLLintKiB) #define ToLLintTiB (ToLLintKiB * ToLLintKiB * ToLLintKiB * ToLLintKiB) #define ToLLintPiB \ (ToLLintKiB * ToLLintKiB * ToLLintKiB * ToLLintKiB * ToLLintKiB) HTSEXT_API char **int2bytes2(strc_int2bytes2 * strc, LLint n) { if (n < ToLLintKiB) { sprintf(strc->buff1, "%d", (int) (LLint) n); strcpybuff(strc->buff2, "B"); } else if (n < ToLLintMiB) { sprintf(strc->buff1, "%d,%02d", (int) ((LLint) (n / ToLLintKiB)), (int) ((LLint) ((n % ToLLintKiB) * 100) / ToLLintKiB)); strcpybuff(strc->buff2, "KiB"); } else if (n < ToLLintGiB) { sprintf(strc->buff1, "%d,%02d", (int) ((LLint) (n / (ToLLintMiB))), (int) ((LLint) (((n % (ToLLintMiB)) * 100) / (ToLLintMiB)))); strcpybuff(strc->buff2, "MiB"); } else if (n < ToLLintTiB) { sprintf(strc->buff1, "%d,%02d", (int) ((LLint) (n / (ToLLintGiB))), (int) ((LLint) (((n % (ToLLintGiB)) * 100) / (ToLLintGiB)))); strcpybuff(strc->buff2, "GiB"); } else if (n < ToLLintPiB) { sprintf(strc->buff1, "%d,%02d", (int) ((LLint) (n / (ToLLintTiB))), (int) ((LLint) (((n % (ToLLintTiB)) * 100) / (ToLLintTiB)))); strcpybuff(strc->buff2, "TiB"); } else { sprintf(strc->buff1, "%d,%02d", (int) ((LLint) (n / (ToLLintPiB))), (int) ((LLint) (((n % (ToLLintPiB)) * 100) / (ToLLintPiB)))); strcpybuff(strc->buff2, "PiB"); } strc->buffadr[0] = strc->buff1; strc->buffadr[1] = strc->buff2; return strc->buffadr; } #ifdef _WIN32 #else // ignore sigpipe? int sig_ignore_flag(int setflag) { // flag ignore static int flag = 0; /* YES, this one is true static */ if (setflag >= 0) flag = setflag; return flag; } #endif // envoi de texte (en têtes généralement) sur la socket soc int sendc(htsblk * r, const char *s) { int n, ssz = (int) strlen(s); #ifdef _WIN32 #else sig_ignore_flag(1); #endif #if HDEBUG write(0, s, ssz); #endif #if HTS_USEOPENSSL if (r->ssl) { n = SSL_write(r->ssl_con, s, ssz); } else #endif n = send(r->soc, s, ssz, 0); #ifdef _WIN32 #else sig_ignore_flag(0); #endif return (n == ssz) ? n : -1; } // Remplace read int finput(T_SOC fd, char *s, int max) { char c; int j = 0; do { if (read((int) fd, &c, 1) <= 0) { c = 0; } if (c != 0) { switch (c) { case 10: c = 0; break; case 13: break; // sauter ces caractères default: s[j++] = c; break; } } } while ((c != 0) && (j < max - 1)); s[j] = '\0'; return j; } // Like linput, but in memory (optimized) int binput(char *buff, char *s, int max) { int count = 0; int destCount = 0; // Note: \0 will return 1 while(destCount < max && buff != NULL && buff[count] != '\0' && buff[count] != '\n') { if (buff[count] != '\r') { s[destCount++] = buff[count]; } count++; } s[destCount] = '\0'; // then return the supplemental jump offset return count + 1; } // Lecture d'une ligne (peut être unicode à priori) int linput(FILE * fp, char *s, int max) { int c; int j = 0; do { c = fgetc(fp); if (c != EOF) { switch (c) { case 13: break; // sauter CR case 10: c = -1; break; case 9: case 12: break; // sauter ces caractères default: s[j++] = (char) c; break; } } } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j] = '\0'; return j; } int linputsoc(T_SOC soc, char *s, int max) { int c; int j = 0; do { unsigned char ch; if (recv(soc, &ch, 1, 0) == 1) { c = ch; } else { c = EOF; } if (c != EOF) { switch (c) { case 13: break; // sauter CR case 10: c = -1; break; case 9: case 12: break; // sauter ces caractères default: s[j++] = (char) c; break; } } } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j] = '\0'; return j; } int linputsoc_t(T_SOC soc, char *s, int max, int timeout) { if (check_readinput_t(soc, timeout)) { return linputsoc(soc, s, max); } return -1; } int linput_trim(FILE * fp, char *s, int max) { int rlen = 0; char *ls = (char *) malloct(max + 1); s[0] = '\0'; if (ls) { char *a; // lire ligne rlen = linput(fp, ls, max); if (rlen) { // sauter espaces et tabs en fin while((rlen > 0) && ((ls[max(rlen - 1, 0)] == ' ') || (ls[max(rlen - 1, 0)] == '\t'))) ls[--rlen] = '\0'; // sauter espaces en début a = ls; while((rlen > 0) && ((*a == ' ') || (*a == '\t'))) { a++; rlen--; } if (rlen > 0) { memcpy(s, a, rlen); // can copy \0 chars s[rlen] = '\0'; } } // freet(ls); } return rlen; } int linput_cpp(FILE * fp, char *s, int max) { int rlen = 0; s[0] = '\0'; do { int ret; if (rlen > 0) if (s[rlen - 1] == '\\') s[--rlen] = '\0'; // couper \ final // lire ligne ret = linput_trim(fp, s + rlen, max - rlen); if (ret > 0) rlen += ret; } while((s[max(rlen - 1, 0)] == '\\') && (rlen < max)); return rlen; } // idem avec les car spéciaux void rawlinput(FILE * fp, char *s, int max) { int c; int j = 0; do { c = fgetc(fp); if (c != EOF) { switch (c) { case 13: break; // sauter CR case 10: c = -1; break; default: s[j++] = (char) c; break; } } } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j++] = '\0'; } //cherche chaine, case insensitive const char *strstrcase(const char *s, const char *o) { while(*s && strfield(s, o) == 0) s++; if (*s == '\0') return NULL; return s; } // Unicode detector // See http://www.unicode.org/unicode/reports/tr28/ // (sect Table 3.1B. Legal UTF-8 Byte Sequences) typedef struct { unsigned int pos; unsigned char data[4]; } t_auto_seq; // char between a and b #define CHAR_BETWEEN(c, a, b) ( (c) >= 0x##a ) && ( (c) <= 0x##b ) // sequence start #define SEQBEG ( inseq == 0 ) // in this block #define BLK(n,a, b) ( (seq.pos >= n) && ((err = CHAR_BETWEEN(seq.data[n], a, b))) ) #define ELT(n,a) BLK(n,a,a) // end #define SEQEND ((ok = 1)) // sequence started, character will fail if error #define IN_SEQ ( (inseq = 1) ) // decoding error #define BAD_SEQ ( (ok == 0) && (inseq != 0) && (!err) ) // no sequence started #define NO_SEQ ( inseq == 0 ) // is this block an UTF unicode textfile? // 0 : no // 1 : yes // -1: don't know int is_unicode_utf8(const char *buffer_, const size_t size) { const unsigned char *buffer = (const unsigned char *) buffer_; t_auto_seq seq; size_t i; int is_utf = -1; RUNTIME_TIME_CHECK_SIZE(size); seq.pos = 0; for(i = 0; i < size; i++) { unsigned int ok = 0; unsigned int inseq = 0; unsigned int err = 0; seq.data[seq.pos] = buffer[i]; /**/ if (SEQBEG && BLK(0, 00, 7F) && IN_SEQ && SEQEND) { } else if (SEQBEG && BLK(0, C2, DF) && IN_SEQ && BLK(1, 80, BF) && SEQEND) { } else if (SEQBEG && ELT(0, E0) && IN_SEQ && BLK(1, A0, BF) && BLK(2, 80, BF) && SEQEND) { } else if (SEQBEG && BLK(0, E1, EC) && IN_SEQ && BLK(1, 80, BF) && BLK(2, 80, BF) && SEQEND) { } else if (SEQBEG && ELT(0, ED) && IN_SEQ && BLK(1, 80, 9F) && BLK(2, 80, BF) && SEQEND) { } else if (SEQBEG && BLK(0, EE, EF) && IN_SEQ && BLK(1, 80, BF) && BLK(2, 80, BF) && SEQEND) { } else if (SEQBEG && ELT(0, F0) && IN_SEQ && BLK(1, 90, BF) && BLK(2, 80, BF) && BLK(3, 80, BF) && SEQEND) { } else if (SEQBEG && BLK(0, F1, F3) && IN_SEQ && BLK(1, 80, BF) && BLK(2, 80, BF) && BLK(3, 80, BF) && SEQEND) { } else if (SEQBEG && ELT(0, F4) && IN_SEQ && BLK(1, 80, 8F) && BLK(2, 80, BF) && BLK(3, 80, BF) && SEQEND) { } else if (NO_SEQ) { // bad, unknown return 0; } /* */ /* Error */ if (BAD_SEQ) { return 0; } /* unicode character */ if (seq.pos > 0) is_utf = 1; /* Next */ if (ok) seq.pos = 0; else seq.pos++; /* Internal error */ if (seq.pos >= 4) return 0; } return is_utf; } void map_characters(unsigned char *buffer, unsigned int size, unsigned int *map) { unsigned int i; memset(map, 0, sizeof(unsigned int) * 256); for(i = 0; i < size; i++) { map[buffer[i]]++; } } // le fichier est-il un fichier html? // 0 : non // 1 : oui // -1 : on sait pas // -2 : on sait pas, pas d'extension int ishtml(httrackp * opt, const char *fil) { /* User-defined MIME types (overrides ishtml()) */ char BIGSTK fil_noquery[HTS_URLMAXSIZE * 2]; char mime[256]; char *a; strcpybuff(fil_noquery, fil); if ((a = strchr(fil_noquery, '?')) != NULL) { *a = '\0'; } if (get_userhttptype(opt, mime, fil_noquery)) { if (is_html_mime_type(mime)) { return 1; } else { return 0; } } if (!strnotempty(fil_noquery)) { return -2; } /* Search for known ext */ for(a = fil_noquery + strlen(fil_noquery) - 1; *a != '.' && *a != '/' && a > fil_noquery; a--) ; if (*a == '.') { // a une extension char BIGSTK fil_noquery[HTS_URLMAXSIZE * 2]; char *b; int ret; char *dotted = a; fil_noquery[0] = '\0'; a++; // pointer sur extension strncatbuff(fil_noquery, a, HTS_URLMAXSIZE); b = strchr(fil_noquery, '?'); if (b) *b = '\0'; ret = ishtml_ext(fil_noquery); // retour if (ret == -1) { switch (is_knowntype(opt, dotted)) { case 1: ret = 0; // connu, non html break; case 2: ret = 1; // connu, html break; default: ret = -1; // inconnu.. break; } } return ret; } else return -2; // indéterminé, par exemple /truc } // idem, mais pour uniquement l'extension int ishtml_ext(const char *a) { int html = 0; // if (strfield2(a, "html")) html = 1; else if (strfield2(a, "htm")) html = 1; else if (strfield2(a, "shtml")) html = 1; else if (strfield2(a, "phtml")) html = 1; else if (strfield2(a, "htmlx")) html = 1; else if (strfield2(a, "shtm")) html = 1; else if (strfield2(a, "phtm")) html = 1; else if (strfield2(a, "htmx")) html = 1; // // insuccès.. else { #if 1 html = -1; // inconnu.. #else // XXXXXX not suitable (ext) switch (is_knownext(a)) { case 1: html = 0; // connu, non html break; case 2: html = 1; // connu, html break; default: html = -1; // inconnu.. break; } #endif } return html; } // error (404,500..) int ishttperror(int err) { switch (err / 100) { case 4: case 5: return 1; break; } return 0; } /* Declare a non-const version of FUN */ #define DECLARE_NON_CONST_VERSION(FUN) \ char *FUN(char *source) { \ const char *const ret = FUN ##_const(source); \ return ret != NULL ? source + ( ret - source ) : NULL; \ } // retourne le pointeur ou le pointeur + offset si il existe dans la chaine un @ signifiant // une identification HTSEXT_API const char *jump_identification_const(const char *source) { const char *a, *trytofind; if (strcmp(source, "file://") == 0) return source; // rechercher dernier @ (car parfois email transmise dans adresse!) // mais sauter ftp:// éventuel a = jump_protocol_const(source); trytofind = strrchr_limit(a, '@', strchr(a, '/')); return trytofind != NULL ? trytofind : a; } HTSEXT_API DECLARE_NON_CONST_VERSION(jump_identification) HTSEXT_API const char *jump_normalized_const(const char *source) { if (strcmp(source, "file://") == 0) return source; source = jump_identification_const(source); if (strfield(source, "www") && source[3] != '\0') { if (source[3] == '.') { // www.foo.com -> foo.com source += 4; } else { // www-4.foo.com -> foo.com const char *a = source + 3; while(*a && (isdigit(*a) || *a == '-')) a++; if (*a == '.') { source = a + 1; } } } return source; } HTSEXT_API DECLARE_NON_CONST_VERSION(jump_normalized) static int sortNormFnc(const void *a_, const void *b_) { const char *const*const a = (const char *const*) a_; const char *const*const b = (const char *const*) b_; return strcmp(*a + 1, *b + 1); } /* Path normalizer core: optionally collapse redundant '//' (DO_SLASH) and/or sort query arguments (DO_QUERY) so equivalent URLs dedupe. */ static char *fil_normalized_ex(const char *source, char *dest, int do_slash, int do_query) { char lastc = 0; int gotquery = 0; int ampargs = 0; size_t i, j; char *query = NULL; for(i = j = 0; source[i] != '\0'; i++) { if (!gotquery && source[i] == '?') gotquery = ampargs = 1; if (do_slash && !gotquery && lastc == '/' && source[i] == '/') { // foo//bar -> foo/bar } else { if (gotquery && source[i] == '&') { ampargs++; } dest[j++] = source[i]; } lastc = source[i]; } dest[j++] = '\0'; /* Sort arguments (&foo=1&bar=2 == &bar=2&foo=1) */ if (do_query && ampargs > 1) { char **amps = malloct(ampargs * sizeof(char *)); char *copyBuff = NULL; size_t qLen = 0; assertf(amps != NULL); gotquery = 0; for(i = j = 0; dest[i] != '\0'; i++) { if ((gotquery && dest[i] == '&') || (!gotquery && dest[i] == '?')) { if (!gotquery) { gotquery = 1; query = &dest[i]; qLen = strlen(query); } assertf(j < ampargs); amps[j++] = &dest[i]; dest[i] = '\0'; } } assertf(gotquery); assertf(j == ampargs); /* Sort 'em all */ qsort(amps, ampargs, sizeof(char *), sortNormFnc); /* Replace query by sorted query */ copyBuff = malloct(qLen + 1); assertf(copyBuff != NULL); { htsbuff cb = htsbuff_ptr(copyBuff, qLen + 1); for (i = 0; i < ampargs; i++) { htsbuff_cat(&cb, i == 0 ? "?" : "&"); htsbuff_cat(&cb, amps[i] + 1); } assertf(cb.len == qLen); } /* query points into dest where the original qLen-byte query was */ strlcpybuff(query, copyBuff, qLen + 1); /* Cleanup */ freet(amps); freet(copyBuff); } return dest; } HTSEXT_API char *fil_normalized(const char *source, char *dest) { return fil_normalized_ex(source, dest, 1, 1); } /* Is query key ARG[0..keylen) in the comma-separated STRIP list? "*" = all; case-sensitive, space-trimmed tokens. */ static int hts_query_key_stripped(const char *arg, size_t keylen, const char *strip) { const char *p = strip; while (*p != '\0') { const char *start = p; size_t toklen; while (*p != '\0' && *p != ',') p++; toklen = (size_t) (p - start); while (toklen > 0 && *start == ' ') { start++; toklen--; } while (toklen > 0 && start[toklen - 1] == ' ') toklen--; if (toklen == 1 && start[0] == '*') return 1; if (toklen == keylen && strncmp(start, arg, keylen) == 0) return 1; if (*p == ',') p++; } return 0; } /* see htscore.h */ char *fil_normalized_filtered_ex(const char *source, char *dest, const char *strip, int do_slash, int do_query) { const char *query; char BIGSTK tmp[HTS_URLMAXSIZE * 2]; htsbuff cb; int wrote = 0; /* No strip list, or no query: plain normalization. */ if (strip == NULL || *strip == '\0' || (query = strchr(source, '?')) == NULL) { return fil_normalized_ex(source, dest, do_slash, do_query); } /* Copy the path, re-emit kept query args, let fil_normalized() sort. Walk every field incl. empty/trailing ("a&","?&&") so the result is a fixpoint (the read re-normalizes it; a dropped empty arg would miss dedup). */ cb = htsbuff_ptr(tmp, sizeof(tmp)); htsbuff_catn(&cb, source, (size_t) (query - source)); for (query++;;) { const char *const arg = query; const char *eq = NULL; size_t keylen, arglen; while (*query != '\0' && *query != '&') { if (eq == NULL && *query == '=') eq = query; query++; } arglen = (size_t) (query - arg); keylen = eq != NULL ? (size_t) (eq - arg) : arglen; if (!hts_query_key_stripped(arg, keylen, strip)) { htsbuff_catc(&cb, wrote ? '&' : '?'); htsbuff_catn(&cb, arg, arglen); wrote = 1; } if (*query == '\0') break; query++; } return fil_normalized_ex(tmp, dest, do_slash, do_query); } /* see htscore.h */ char *fil_normalized_filtered(const char *source, char *dest, const char *strip) { return fil_normalized_filtered_ex(source, dest, strip, 1, 1); } /* see htscore.h */ const char *hts_query_strip_keys(const char *rules, const char *adr, const char *fil, char *dest, size_t destsize) { const char *p, *q; const char *result = NULL; char BIGSTK url[HTS_URLMAXSIZE * 2]; if (rules == NULL || *rules == '\0' || destsize == 0) return NULL; /* Match string = normalized host/path, query removed. jump_normalized_const collapses www+scheme/auth so read and write (double-normalized) agree; query excluded keeps the decision on host/path only. */ url[0] = '\0'; strcatbuff(url, jump_normalized_const(adr)); if (fil[0] != '/') strcatbuff(url, "/"); q = strchr(fil, '?'); if (q != NULL) strncatbuff(url, fil, (int) (q - fil)); else strcatbuff(url, fil); /* Walk the '\n' entries; last match wins (like the +/- filter eval). Each is "pattern=keys"; no '=' is the bare form, pattern "*". */ for (p = rules; *p != '\0';) { const char *const line = p; const char *eol, *eq, *keys; char BIGSTK pat[HTS_URLMAXSIZE * 2]; while (*p != '\0' && *p != '\n') p++; eol = p; if (*p == '\n') p++; if (eol == line) continue; eq = memchr(line, '=', (size_t) (eol - line)); if (eq != NULL) { size_t patlen = (size_t) (eq - line); if (patlen >= sizeof(pat)) patlen = sizeof(pat) - 1; memcpy(pat, line, patlen); pat[patlen] = '\0'; keys = eq + 1; } else { pat[0] = '*'; pat[1] = '\0'; keys = line; } if (strjoker(url, pat, NULL, NULL) != NULL) { size_t klen = (size_t) (eol - keys); if (klen >= destsize) klen = destsize - 1; memcpy(dest, keys, klen); dest[klen] = '\0'; result = dest; } } return result; } #define endwith(a) ( (len >= (sizeof(a)-1)) ? ( strncmp(dest, a+len-(sizeof(a)-1), sizeof(a)-1) == 0 ) : 0 ); HTSEXT_API char *adr_normalized_sized(const char *source, char *dest, size_t destsize) { /* not yet too aggressive (no com<->net<->org checkings) */ strlcpybuff(dest, jump_normalized_const(source), destsize); return dest; } // deprecated variant; kept for ABI compatibility. Bounds to the implicit // contract the old callers relied on (an HTS_URLMAXSIZE*2 URL buffer). HTSEXT_API char *adr_normalized(const char *source, char *dest) { return adr_normalized_sized(source, dest, HTS_URLMAXSIZE * 2); } #undef endwith // find port (:80) or NULL if not found // can handle IPV6 addresses HTSEXT_API const char *jump_toport_const(const char *source) { const char *a, *trytofind; a = jump_identification_const(source); trytofind = strrchr_limit(a, ']', strchr(source, '/')); // find last ] (http://[3ffe:b80:1234::1]:80/foo.html) a = strchr((trytofind) ? trytofind : a, ':'); return a; } HTSEXT_API DECLARE_NON_CONST_VERSION(jump_toport) // strrchr, but not too far const char *strrchr_limit(const char *s, char c, const char *limit) { if (limit == NULL) { const char *p = strrchr(s, c); return p ? (p + 1) : NULL; } else { const char *a = NULL, *p; for(;;) { p = strchr((a) ? a : s, c); if ((p >= limit) || (p == NULL)) return a; a = p + 1; } } } // retourner adr sans ftp:// const char *jump_protocol_const(const char *source) { int p; // scheme // "Comparisons of scheme names MUST be case-insensitive" (RFC2616) if ((p = strfield(source, "http:"))) source += p; else if ((p = strfield(source, "ftp:"))) source += p; else if ((p = strfield(source, "https:"))) source += p; else if ((p = strfield(source, "file:"))) source += p; else if ((p = strfield(source, "socks5h:"))) source += p; else if ((p = strfield(source, "socks5:"))) source += p; else if ((p = strfield(source, "connect:"))) source += p; // net_path if (strncmp(source, "//", 2) == 0) source += 2; return source; } DECLARE_NON_CONST_VERSION(jump_protocol) hts_boolean hts_proxy_is_socks(const char *name) { if (name == NULL) return HTS_FALSE; return (strfield(name, "socks5h:") || strfield(name, "socks5:")) ? HTS_TRUE : HTS_FALSE; } hts_boolean hts_proxy_is_connect(const char *name) { if (name == NULL) return HTS_FALSE; return strfield(name, "connect:") ? HTS_TRUE : HTS_FALSE; } // default proxy port for a -P argument, keyed on the scheme static int proxy_default_port(const char *arg) { return hts_proxy_is_socks(arg) ? 1080 : 8080; } // port "a" of -P argument "arg": digits fitting TCP's 1..65535, else the scheme // default. Not sscanf("%d"): past INT_MAX it wraps to a garbage port (#602) static int parse_proxy_port(const char *a, const char *arg) { int port; if (!hts_parse_url_port(a, &port)) return proxy_default_port(arg); return port; } void hts_parse_proxy(const char *arg, char *name, size_t name_size, int *port) { const char *authority = strstr(arg, "://"); const char *a; size_t namelen; if (name_size == 0) return; // scan back to the port ':' (or userinfo '@'), never past the authority (a // scheme's own colon is not a port separator) nor into an IPv6 literal (']' // stops it); inspect a[-1] from one-past-end so no pointer underflows authority = (authority != NULL) ? authority + 3 : arg; a = arg + strlen(arg); while (a > authority && a[-1] != ':' && a[-1] != '@' && a[-1] != ']') a--; if (a > authority && a[-1] == ':') { *port = parse_proxy_port(a, arg); namelen = (size_t) (a - 1 - arg); } else { *port = proxy_default_port(arg); namelen = strlen(arg); } if (namelen >= name_size) // arg is user-controlled: truncate, don't overflow namelen = name_size - 1; memcpy(name, arg, namelen); name[namelen] = '\0'; } // codage base 64 a vers b void code64(unsigned char *a, int size_a, unsigned char *b, int crlf) { int i1 = 0, i2 = 0, i3 = 0, i4 = 0; int loop = 0; unsigned long int store; int n; const char _hts_base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; while(size_a-- > 0) { // 24 bits n = 1; store = *a++; if (size_a-- > 0) { n = 2; store <<= 8; store |= *a++; } if (size_a-- > 0) { n = 3; store <<= 8; store |= *a++; } if (n == 3) { i4 = store & 63; i3 = (store >> 6) & 63; i2 = (store >> 12) & 63; i1 = (store >> 18) & 63; } else if (n == 2) { store <<= 2; i3 = store & 63; i2 = (store >> 6) & 63; i1 = (store >> 12) & 63; } else { store <<= 4; i2 = store & 63; i1 = (store >> 6) & 63; } *b++ = _hts_base64[i1]; *b++ = _hts_base64[i2]; if (n >= 2) *b++ = _hts_base64[i3]; else *b++ = '='; if (n >= 3) *b++ = _hts_base64[i4]; else *b++ = '='; if (crlf && ((loop += 3) % 60) == 0) { *b++ = '\r'; *b++ = '\n'; } } *b++ = '\0'; } // return the hex character value, or -1 on error. static HTS_INLINE int ehexh(const char c) { if (c >= '0' && c <= '9') return c - '0'; else if (c >= 'a' && c <= 'f') return (c - 'a' + 10); else if (c >= 'A' && c <= 'F') return (c - 'A' + 10); else return -1; } // return the two-hex character value, or -1 on error. static HTS_INLINE int ehex(const char *s) { const int c1 = ehexh(s[0]); if (c1 >= 0) { const int c2 = ehexh(s[1]); if (c2 >= 0) { return 16*c1 + c2; } } return -1; } void unescape_amp(char *s) { if (hts_unescapeEntities(s, s, strlen(s) + 1) != 0) { assertf(! "error escaping html entities"); } } // remplacer %20 par ' ', etc.. // buffer MAX 1Ko HTSEXT_API char *unescape_http(char *const catbuff, const size_t size, const char *const s) { size_t i, j; RUNTIME_TIME_CHECK_SIZE(size); for(i = 0, j = 0; s[i] != '\0' && j + 1 < size ; i++) { int h; if (s[i] == '%' && (h = ehex(&s[i + 1])) >= 0) { catbuff[j++] = (char) h; i += 2; } else catbuff[j++] = s[i]; } catbuff[j++] = '\0'; return catbuff; } // unescape in URL/URI ONLY what has to be escaped, to form a standard URL/URI // DOES NOT DECODE %25 (part of CHAR_DELIM) // no_high & 1: decode high chars // no_high & 2: decode space HTSEXT_API char *unescape_http_unharm(char *const catbuff, const size_t size, const char *s, const hts_boolean no_high) { size_t i, j; RUNTIME_TIME_CHECK_SIZE(size); for(i = 0, j = 0; s[i] != '\0' && j + 1 < size ; i++) { if (s[i] == '%') { const int nchar = ehex(&s[i + 1]); const int test = ( CHAR_RESERVED(nchar) && nchar != '+' ) /* %2B => + (not in query!) */ || CHAR_DELIM(nchar) || CHAR_UNWISE(nchar) || CHAR_LOW(nchar) /* CHAR_SPECIAL */ || ( CHAR_XXAVOID(nchar) && ( nchar != ' ' || ( no_high & 2) == 0 ) ) || ( ( no_high & 1 ) && CHAR_HIG(nchar) ) ; if (!test && nchar >= 0) { /* can safely unescape */ catbuff[j++] = (char) nchar; i += 2; } else { catbuff[j++] = '%'; } } else { catbuff[j++] = s[i]; } } catbuff[j++] = '\0'; return catbuff; } // remplacer " par %xx etc.. // buffer MAX 1Ko HTSEXT_API size_t escape_spc_url(const char *const src, char *const dest, const size_t size) { return x_escape_http(src, dest, size, 2); } // smith / john -> smith%20%2f%20john HTSEXT_API size_t escape_in_url(const char *const src, char *const dest, const size_t size) { return x_escape_http(src, dest, size, 1); } // smith / john -> smith%20/%20john HTSEXT_API size_t escape_uri(const char *const src, char *const dest, const size_t size) { return x_escape_http(src, dest, size, 3); } HTSEXT_API size_t escape_uri_utf(const char *const src, char *const dest, const size_t size) { return x_escape_http(src, dest, size, 30); } HTSEXT_API size_t escape_check_url(const char *const src, char *const dest, const size_t size) { return x_escape_http(src, dest, size, 0); } // same as escape_check_url, but returns char* HTSEXT_API char *escape_check_url_addr(const char *const src, char *const dest, const size_t size) { escape_check_url(src, dest, size); return dest; } // Same as above, but appending to "dest" #undef DECLARE_APPEND_ESCAPE_VERSION #define DECLARE_APPEND_ESCAPE_VERSION(NAME) \ HTSEXT_API size_t append_ ##NAME(const char *const src, char *const dest, const size_t size) { \ const size_t len = strnlen(dest, size); \ assertf(len < size); \ return NAME(src, dest + len, size - len); \ } DECLARE_APPEND_ESCAPE_VERSION(escape_in_url) DECLARE_APPEND_ESCAPE_VERSION(escape_spc_url) DECLARE_APPEND_ESCAPE_VERSION(escape_uri_utf) DECLARE_APPEND_ESCAPE_VERSION(escape_check_url) DECLARE_APPEND_ESCAPE_VERSION(escape_uri) #undef DECLARE_APPEND_ESCAPE_VERSION // In-place escaping: copy dest aside, then escape that copy back into dest. typedef size_t (*escape_fn_t)(const char *src, char *dest, size_t size); static size_t inplace_escape(char *const dest, const size_t size, escape_fn_t escape) { char buffer[256]; const size_t len = strnlen(dest, size); const int in_buffer = len + 1 < sizeof(buffer); char *src = in_buffer ? buffer : malloct(len + 1); size_t ret; assertf(src != NULL); assertf(len < size); memcpy(src, dest, len + 1); ret = escape(src, dest, size); if (!in_buffer) { freet(src); } return ret; } // Thin exported wrappers binding inplace_escape() to each escaper (ABI). #undef DECLARE_INPLACE_ESCAPE_VERSION #define DECLARE_INPLACE_ESCAPE_VERSION(NAME) \ HTSEXT_API size_t inplace_##NAME(char *const dest, const size_t size) { \ return inplace_escape(dest, size, NAME); \ } DECLARE_INPLACE_ESCAPE_VERSION(escape_in_url) DECLARE_INPLACE_ESCAPE_VERSION(escape_spc_url) DECLARE_INPLACE_ESCAPE_VERSION(escape_uri_utf) DECLARE_INPLACE_ESCAPE_VERSION(escape_check_url) DECLARE_INPLACE_ESCAPE_VERSION(escape_uri) #undef DECLARE_INPLACE_ESCAPE_VERSION HTSEXT_API size_t make_content_id(const char *const adr, const char *const fil, char *const dest, const size_t size) { char *a; size_t esc_size = escape_in_url(adr, dest, size); esc_size += escape_in_url(fil, dest + esc_size, size - esc_size); RUNTIME_TIME_CHECK_SIZE(size); for(a = dest ; (a = strchr(a, '%')) != NULL ; a++) { *a = 'X'; } return esc_size; } // strip all control characters HTSEXT_API void escape_remove_control(char *const s) { size_t i, j; for(i = 0, j = 0 ; s[i] != '\0' ; i++) { const unsigned char c = (unsigned char) s[i]; if (c >= 32) { if (i != j) { assertf(j < i); s[j] = s[i]; } j++; } } } #undef ADD_CHAR #define ADD_CHAR(C) do { \ assertf(j < size); \ if (j + 1 == size) { \ dest[j] = '\0'; \ return size; \ } \ dest[j++] = (C); \ } while(0) /* Returns the number of characters written (not taking in account the terminating \0), or 'size' upon overflow. */ HTSEXT_API size_t x_escape_http(const char *const s, char *const dest, const size_t size, const int mode) { static const char hex[] = "0123456789abcdef"; size_t i, j; RUNTIME_TIME_CHECK_SIZE(size); // Out-of-bound. // Previous character is supposed to be the terminating \0. if (size == 0) { return 0; } for(i = 0, j = 0 ; s[i] != '\0' ; i++) { const unsigned char c = (unsigned char) s[i]; int test = 0; if (mode == 0) test = c == '"' || c == ' ' || CHAR_SPECIAL(c); else if (mode == 1) test = CHAR_RESERVED(c) || CHAR_DELIM(c) || CHAR_UNWISE(c) || CHAR_SPECIAL(c) || CHAR_XXAVOID(c) || CHAR_MARK(c); else if (mode == 2) test = c == ' '; // n'escaper que espace else if (mode == 3) // échapper que ce qui est nécessaire test = CHAR_SPECIAL(c) || CHAR_XXAVOID(c); else if (mode == 30) // échapper que ce qui est nécessaire test = (c != '/' && CHAR_RESERVED(c)) || CHAR_DELIM(c) || CHAR_UNWISE(c) || CHAR_SPECIAL(c) || CHAR_XXAVOID(c); if (!test) { ADD_CHAR(c); } else { ADD_CHAR('%'); ADD_CHAR(hex[c / 16]); ADD_CHAR(hex[c % 16]); } } assertf(j < size); dest[j] = '\0'; return j; } HTSEXT_API size_t escape_for_html_print(const char *const s, char *const dest, const size_t size) { size_t i, j; RUNTIME_TIME_CHECK_SIZE(size); for(i = 0, j = 0 ; s[i] != '\0' ; i++) { const unsigned char c = (unsigned char) s[i]; if (c == '&') { ADD_CHAR('&'); ADD_CHAR('a'); ADD_CHAR('m'); ADD_CHAR('p'); ADD_CHAR(';'); } else { ADD_CHAR(c); } } assertf(j < size); dest[j] = '\0'; return j; } HTSEXT_API size_t escape_for_html_print_full(const char *const s, char *const dest, const size_t size) { static const char hex[] = "0123456789abcdef"; size_t i, j; RUNTIME_TIME_CHECK_SIZE(size); for(i = 0, j = 0 ; s[i] != '\0' ; i++) { const unsigned char c = (unsigned char) s[i]; if (c == '&') { ADD_CHAR('&'); ADD_CHAR('a'); ADD_CHAR('m'); ADD_CHAR('p'); ADD_CHAR(';'); } else if (CHAR_HIG(c)) { ADD_CHAR('&'); ADD_CHAR('#'); ADD_CHAR('x'); ADD_CHAR(hex[c / 16]); ADD_CHAR(hex[c % 16]); ADD_CHAR(';'); } else { ADD_CHAR(c); } } assertf(j < size); dest[j] = '\0'; return j; } #undef ADD_CHAR // lower-case conversion into caller buffer (capacity catbuffsize) char *convtolower(char *catbuff, size_t catbuffsize, const char *a) { strlcpybuff(catbuff, a, catbuffsize); hts_lowcase(catbuff); // lower case return catbuff; } // conversion en minuscules void hts_lowcase(char *s) { size_t i; for(i = 0; s[i] != '\0'; i++) if ((s[i] >= 'A') && (s[i] <= 'Z')) s[i] += ('a' - 'A'); } // remplacer un caractère d'une chaîne dans une autre void hts_replace(char *s, char from, char to) { char *a; while((a = strchr(s, from)) != NULL) { *a = to; } } // guess a local file's mime type (e.g. fil="toto.gif" -> s="image/gif") // returns 1 if a type was written to s, 0 otherwise hts_boolean guess_httptype_sized(httrackp *opt, char *s, size_t ssize, const char *fil) { return get_httptype_sized(opt, s, ssize, fil, 1); } // deprecated variant; kept for ABI compatibility. Bounds to the implicit // contract the old callers relied on (a contenttype-sized buffer). void guess_httptype(httrackp * opt, char *s, const char *fil) { (void) get_httptype_sized(opt, s, HTS_MIMETYPE_SIZE, fil, 1); } // first match in a NUL-terminated {mime,ext} table. key selects the lookup // column (0=mime, 1=ext); returns the other column, or NULL if no row matches // (a "*" partner means the row carries no value). static const char *hts_mime_lookup(const char *(*table)[2], int key, const char *needle) { int j; for (j = 0; strnotempty(table[j][1]); j++) { if (strfield2(table[j][key], needle) && table[j][!key][0] != '*') return table[j][!key]; } return NULL; } // write the mime type for fil into s (capacity ssize) // flag: 1 to always return a type (the "application/..." / octet-stream // fallback) returns 1 if a type was written to s, 0 otherwise HTSEXT_API hts_boolean get_httptype_sized(httrackp *opt, char *s, size_t ssize, const char *fil, hts_boolean flag) { // userdef overrides get_httptype (a rule with an empty value, e.g. "--assume // cgi=", matches but writes nothing: report it as "no type" like the old // code, whose callers tested strnotempty(s)) if (get_userhttptype(opt, s, fil)) { return s[0] != '\0'; } // regular tests if (ishtml(opt, fil) == 1) { strlcpybuff(s, "text/html", ssize); return 1; } else { /* Check html -> text/html */ const char *a = fil + strlen(fil) - 1; /* a < fil when fil is empty: bound before dereferencing */ while ((a > fil) && (*a != '.') && (*a != '/')) a--; if (a >= fil && *a == '.' && strlen(a) < 32) { const char *mime; a++; mime = hts_mime_lookup(hts_mime, 1, a); if (mime == NULL) mime = hts_mime_lookup(hts_mime_modern, 1, a); if (mime != NULL) { strlcpybuff(s, mime, ssize); return 1; } if (flag) { snprintf(s, ssize, "application/%s", a); return 1; } } else { if (flag) { strlcpybuff(s, "application/octet-stream", ssize); return 1; } } } return 0; } // deprecated variant; kept for ABI compatibility. Bounds to the implicit // contract the old callers relied on (a contenttype-sized buffer). HTSEXT_API void get_httptype(httrackp *opt, char *s, const char *fil, int flag) { (void) get_httptype_sized(opt, s, HTS_MIMETYPE_SIZE, fil, flag); } // get type of fil (php) // s: buffer (text/html) or NULL // return: 1 if known by user int get_userhttptype(httrackp * opt, char *s, const char *fil) { if (s != NULL) { if (s) s[0] = '\0'; if (fil == NULL || *fil == '\0') return 0; #if 1 if (StringLength(opt->mimedefs) > 0) { /* Check --assume foooo/foo/bar.cgi=text/html, then foo/bar.cgi=text/html, then bar.cgi=text/html */ /* also: --assume baz,bar,foooo/foo/bar.cgi=text/html */ /* start from path beginning */ do { const char *next; const char *mimedefs = StringBuff(opt->mimedefs); /* loop through mime definitions : \nfoo=bar\nzoo=baz\n.. */ while(*mimedefs != '\0') { const char *segment = fil + 1; if (*mimedefs == '\n') { mimedefs++; } /* compare current segment with user's definition */ do { int i; /* check current item */ for(i = 0; mimedefs[i] != '\0' /* end of all defs */ && mimedefs[i] != ' ' /* next item in left list */ && mimedefs[i] != '=' /* end of left list */ && mimedefs[i] != '\n' /* end of this def (?) */ && mimedefs[i] == segment[i] /* same item */ ; i++) ; /* success */ if ((mimedefs[i] == '=' || mimedefs[i] == ' ') && segment[i] == '\0') { int i2; while(mimedefs[i] != 0 && mimedefs[i] != '\n' && mimedefs[i] != '=') i++; if (mimedefs[i] == '=') { i++; for(i2 = 0; mimedefs[i + i2] != '\n' && mimedefs[i + i2] != '\0'; i2++) { s[i2] = mimedefs[i + i2]; } s[i2] = '\0'; return 1; /* SUCCESS! */ } } /* next item in list */ for(mimedefs += i; *mimedefs != '\0' && *mimedefs != '\n' && *mimedefs != '=' && *mimedefs != ' '; mimedefs++) ; if (*mimedefs == ' ') { mimedefs++; } } while(*mimedefs != '\0' && *mimedefs != '\n' && *mimedefs != '='); /* next user-def */ for(; *mimedefs != '\0' && *mimedefs != '\n'; mimedefs++) ; } /* shorten segment */ next = strchr(fil + 1, '/'); if (next == NULL) { /* ext tests */ next = strchr(fil + 1, '.'); } fil = next; } while(fil != NULL); } #else if (*buffer) { char BIGSTK search[1024]; char *detect; sprintf(search, "\n%s=", ext); // php=text/html detect = strstr(*buffer, search); if (!detect) { sprintf(search, "\n%s\n", ext); // php\ncgi=text/html detect = strstr(*buffer, search); } if (detect) { detect = strchr(detect, '='); if (detect) { detect++; if (s) { char *a; a = strchr(detect, '\n'); if (a) { strncatbuff(s, detect, (int) (a - detect)); } } return 1; } } } #endif } return 0; } // give the file extension for a mime type (e.g. "image/gif" -> "gif") // returns 1 if an extension was found (and written to s), 0 otherwise int give_mimext(char *s, size_t ssize, const char *st) { int ok = 0; const char *ext; st = hts_effective_mime(st); /* no declared type: derive an html ext */ s[0] = '\0'; ext = hts_mime_lookup(hts_mime, 0, st); if (ext == NULL) ext = hts_mime_lookup(hts_mime_modern, 0, st); if (ext != NULL) { strlcpybuff(s, ext, ssize); ok = 1; } // wrap "x" mimetypes, such as: // application/x-mp3 // or // application/mp3 if (!ok) { int p; const char *a = NULL; if ((p = strfield(st, "application/x-"))) a = st + p; else if ((p = strfield(st, "application/"))) a = st + p; if (a) { if ((int) strlen(a) >= 1) { if ((int) strlen(a) <= 4) { strlcpybuff(s, a, ssize); ok = 1; } } } } return ok; } // extension connue?.. // 0 : non // 1 : oui // 2 : html HTSEXT_API int is_knowntype(httrackp * opt, const char *fil) { char catbuff[CATBUFF_SIZE]; const char *ext; int j = 0; if (!fil) return 0; ext = get_ext(catbuff, sizeof(catbuff), fil); while(strnotempty(hts_mime[j][1])) { if (strfield2(hts_mime[j][1], ext)) { if (is_html_mime_type(hts_mime[j][0])) return 2; else return 1; } j++; } // Known by user? return (is_userknowntype(opt, fil)); } // known type?.. // 0 : no // 1 : yes // 2 : html // setdefs : set mime buffer: // file=(char*) "asp=text/html\nphp=text/html\n" HTSEXT_API int is_userknowntype(httrackp * opt, const char *fil) { char BIGSTK mime[1024]; if (!fil) return 0; if (!strnotempty(fil)) return 0; mime[0] = '\0'; get_userhttptype(opt, mime, fil); if (!strnotempty(mime)) return 0; else if (is_html_mime_type(mime)) return 2; else return 1; } // page dynamique? // is_dyntype(get_ext("foo.asp")) HTSEXT_API hts_boolean is_dyntype(const char *fil) { int j = 0; if (!fil) return 0; if (!strnotempty(fil)) return 0; while(strnotempty(hts_ext_dynamic[j])) { if (strfield2(hts_ext_dynamic[j], fil)) { return 1; } j++; } return 0; } // types critiques qui ne doivent pas être changés car renvoyés par des serveurs qui ne // connaissent pas le type hts_boolean may_unknown(httrackp *opt, const char *st) { int j = 0; // types média if (may_be_hypertext_mime(opt, st, "")) { return 1; } while(strnotempty(hts_mime_keep[j])) { if (strfield2(hts_mime_keep[j], st)) { // trouvé return 1; } j++; } return 0; } /* returns 1 if the mime/filename seems to be bogus because of badly recognized multiple extension ; such as "application/x-wais-source" for "httrack-3.42-1.el5.src.rpm" reported by Hippy Dave 08/2008 (3.43) */ int may_bogus_multiple(httrackp * opt, const char *mime, const char *filename) { int j; for(j = 0; strnotempty(hts_mime_bogus_multiple[j]); j++) { if (strfield2(hts_mime_bogus_multiple[j], mime)) { /* found mime type in suspicious list */ char ext[64]; if (give_mimext(ext, sizeof(ext), mime)) { /* we have an extension for that */ const size_t ext_size = strlen(ext); const char *file = strrchr(filename, '/'); /* fetch terminal filename */ if (file != NULL) { int i; for(i = 0; file[i] != 0; i++) { if (i > 0 && file[i - 1] == '.' && strncasecmp(&file[i], ext, ext_size) == 0 && (file[i + ext_size] == 0 || file[i + ext_size] == '.' || file[i + ext_size] == '?')) { return 1; /* is ambiguous */ } } } } return 0; } } return 0; } /* filename extension should not be changed because potentially bogus ; replaces may_unknown() (3.43) */ int may_unknown2(httrackp * opt, const char *mime, const char *filename) { int ret = may_unknown(opt, mime); if (ret == 0) { ret = may_bogus_multiple(opt, mime, filename); } return ret; } // -- Utils fichiers // pretty print for i/o void fprintfio(FILE * fp, const char *buff, const char *prefix) { char nl = 1; while(*buff) { switch (*buff) { case 13: break; case 10: fprintf(fp, "\r\n"); nl = 1; break; default: if (nl) fprintf(fp, "%s", prefix); nl = 0; fputc(*buff, fp); } buff++; } } /* Le fichier existe-t-il? (ou est-il accessible?) */ /* Note: NOT utf-8 */ /* Note: preserve errno */ int fexist(const char *s) { char catbuff[CATBUFF_SIZE]; const int err = errno; struct stat st; memset(&st, 0, sizeof(st)); if (stat(fconv(catbuff, sizeof(catbuff), s), &st) == 0) { if (S_ISREG(st.st_mode)) { return 1; } else { return 0; } } errno = err; return 0; } /* Le fichier existe-t-il? (ou est-il accessible?) */ /* Note: utf-8 */ /* Note: preserve errno */ int fexist_utf8(const char *s) { char catbuff[CATBUFF_SIZE]; const int err = errno; STRUCT_STAT st; memset(&st, 0, sizeof(st)); if (STAT(fconv(catbuff, sizeof(catbuff), s), &st) == 0) { if (S_ISREG(st.st_mode)) { return 1; } else { return 0; } } errno = err; return 0; } /* File size, -1 if absent */ /* Note: NOT utf-8 */ LLint fsize(const char *s) { STRUCT_STAT st; if (!strnotempty(s)) // empty name: error return -1; /* _stat64, not stat(): the latter is 32-bit on MSVC */ #ifdef _WIN32 if (_stat64(s, &st) == 0 && S_ISREG(st.st_mode)) { #else if (stat(s, &st) == 0 && S_ISREG(st.st_mode)) { #endif return st.st_size; } else { return -1; } } /* File size, -1 if absent */ /* Note: utf-8 */ LLint fsize_utf8(const char *s) { STRUCT_STAT st; if (!strnotempty(s)) // empty name: error return -1; if (STAT(s, &st) == 0 && S_ISREG(st.st_mode)) { return st.st_size; } else { return -1; } } /* fseeko/ftello, never fseek/ftell: ftell returns long, which cannot carry an offset past 2GB on a 32-bit platform and fails with EOVERFLOW there. */ LLint fpsize(FILE *fp) { LLint oldpos, size; if (!fp) return -1; oldpos = ftello(fp); fseeko(fp, 0, SEEK_END); size = ftello(fp); fseeko(fp, oldpos, SEEK_SET); return size; } /* root dir, with ending / */ typedef struct { char path[1024 + 4]; int init; } hts_rootdir_strc; HTSEXT_API const char *hts_rootdir(char *file) { static hts_rootdir_strc strc = { "", 0 }; if (file) { if (!strc.init) { strc.path[0] = '\0'; strc.init = 1; if (strnotempty(file)) { const size_t file_len = strlen(file); char *a; assertf(file_len < sizeof(strc.path)); strcpybuff(strc.path, file); while((a = strrchr(strc.path, '\\'))) *a = '/'; if ((a = strrchr(strc.path, '/'))) { *(a + 1) = '\0'; } else strc.path[0] = '\0'; } if (!strnotempty(strc.path)) { if (getcwd(strc.path, sizeof(strc.path)) == NULL) strc.path[0] = '\0'; else strcatbuff(strc.path, "/"); } } return NULL; } else if (strc.init) return strc.path; else return ""; } HTSEXT_API hts_stat_struct HTS_STAT; // // return number of downloadable bytes, depending on rate limiter // see engine_stats() routine, too // this routine works quite well for big files and regular ones, but apparently the rate limiter has // some problems with very small files (rate too high) LLint check_downloadable_bytes(int rate) { if (rate > 0) { TStamp time_now; TStamp elapsed_useconds; LLint bytes_transferred_during_period; LLint left; // get the older timer int id_timer = (HTS_STAT.istat_idlasttimer + 1) % 2; time_now = mtime_local(); elapsed_useconds = time_now - HTS_STAT.istat_timestart[id_timer]; bytes_transferred_during_period = (HTS_STAT.HTS_TOTAL_RECV - HTS_STAT.istat_bytes[id_timer]); left = ((rate * elapsed_useconds) / 1000) - bytes_transferred_during_period; if (left <= 0) left = 0; return left; } else return TAILLE_BUFFER; } // Lecture dans buff de size octets au maximum en utilisant la socket r (structure htsblk) // returns: // >0 : data received // == 0 : not yet data // <0: error or no data: READ_ERROR, READ_EOF or READ_TIMEOUT int hts_read(htsblk * r, char *buff, int size) { int retour; if (r->is_file) { #if HTS_WIDE_DEBUG DEBUG_W("read(%p, %d, %d)\n" _(void *)buff _(int) size _(int) r->fp); #endif if (r->fp) { retour = (int) fread(buff, 1, size, r->fp); if (retour == 0) // can happen with directories (!) retour = READ_ERROR; } else retour = READ_ERROR; } else { #if HTS_WIDE_DEBUG DEBUG_W("recv(%d, %p, %d)\n" _(int) r->soc _(void *)buff _(int) size); if (r->soc == INVALID_SOCKET) printf("!!WIDE_DEBUG ERROR, soc==INVALID hts_read\n"); #endif #if HTS_USEOPENSSL if (r->ssl) { retour = SSL_read(r->ssl_con, buff, size); if (retour <= 0) { int err_code = SSL_get_error(r->ssl_con, retour); if ((err_code == SSL_ERROR_WANT_READ) || (err_code == SSL_ERROR_WANT_WRITE) ) { retour = 0; /* no data yet (ssl cache) */ } else if (err_code == SSL_ERROR_ZERO_RETURN) { retour = READ_EOF; /* completed */ } else { retour = READ_ERROR; /* eof or error */ } } } else { #endif retour = recv(r->soc, buff, size, 0); if (retour == 0) { retour = READ_EOF; } else if (retour < 0) { retour = READ_ERROR; } } if (retour > 0) // compter flux entrant HTS_STAT.HTS_TOTAL_RECV += retour; #if HTS_USEOPENSSL } #endif #if HTS_WIDE_DEBUG DEBUG_W("recv/read done (%d bytes)\n" _(int) retour); #endif return retour; } // -- Gestion cache DNS -- // 'RX98 // Free a DNS cache record (coucal value handler). static void hts_cache_value_free(coucal_opaque arg, coucal_value value) { void *record = value.ptr; (void) arg; freet(record); } // opt's DNS cache hashtable, created on first use. Records (t_dnscache*) are // owned by the table and freed by hts_cache_value_free on coucal_delete. coucal hts_cache(httrackp *opt) { assertf(opt != NULL); if (opt->state.dns_cache == NULL) { coucal cache = coucal_new(0); coucal_set_name(cache, "dns_cache"); coucal_value_set_value_handler(cache, hts_cache_value_free, NULL); opt->state.dns_cache = cache; } assertf(opt->state.dns_cache != NULL); return opt->state.dns_cache; } // MUST BE LOCKED (coucal is not internally serialized vs FTP/web threads) // Look up iadr in the DNS cache, filling out[0..min(count,max)-1]. // Returns: -1 not yet tested; 0 negative-cached (not in DNS); >0 address count. static int hts_ghbn_all(coucal cache, const char *const iadr, SOCaddr *const out, const int max) { void *ptr; assertf(out != NULL); assertf(iadr != NULL); if (*iadr == '\0') { return -1; } if (coucal_read_pvoid(cache, iadr, &ptr)) { // ok trouvé const t_dnscache *const record = (const t_dnscache *) ptr; int i; assertf(record->host_count <= HTS_MAXADDRNUM); for (i = 0; i < record->host_count && i < max; i++) { assertf(record->host_length[i] <= sizeof(record->host_addr[i])); SOCaddr_copyaddr2(out[i], record->host_addr[i], record->host_length[i]); } return record->host_count; } return -1; } #if HTS_INET6 != 0 /* Active resolver backend; defaults to the libc resolver. The self-test reroutes it to script DNS answers in-process (see hts_dns_set_resolver_backend). */ static const hts_resolver_backend hts_resolver_libc = {getaddrinfo, freeaddrinfo}; static const hts_resolver_backend *hts_resolver = &hts_resolver_libc; void hts_dns_set_resolver_backend(const hts_resolver_backend *backend) { hts_resolver = (backend != NULL) ? backend : &hts_resolver_libc; } /* Debug/test hook: HTTRACK_DEBUG_RESOLVE="host:ip[,ip...]" pins the resolution of `host` to the listed addresses (curl --resolve style), so the connect fallback can be exercised deterministically (a dead address first, a live one next). Any other host resolves normally. Below: an addrinfo backend that owns its chain (its own freeaddrinfo), so a synthesized and a delegated result free the same way. */ /* Deep-copy a libc addrinfo chain into our own allocations. */ static struct addrinfo *resolver_dup_chain(const struct addrinfo *src) { struct addrinfo *head = NULL, *tail = NULL; for (; src != NULL; src = src->ai_next) { struct addrinfo *const ai = calloct(1, sizeof(*ai)); ai->ai_family = src->ai_family; ai->ai_socktype = src->ai_socktype; ai->ai_protocol = src->ai_protocol; ai->ai_addrlen = src->ai_addrlen; ai->ai_addr = malloct(src->ai_addrlen); memcpy(ai->ai_addr, src->ai_addr, src->ai_addrlen); if (head == NULL) head = ai; else tail->ai_next = ai; tail = ai; } return head; } /* Build one addrinfo node from an IPv4/IPv6 literal, or NULL if it does not parse or is filtered out by want_family (AF_INET/AF_INET6/PF_UNSPEC). */ static struct addrinfo *resolver_make_ai(const char *ip, int want_family) { struct addrinfo *ai; if (strchr(ip, ':') != NULL) { // IPv6 literal struct sockaddr_in6 sa6; if (want_family != PF_UNSPEC && want_family != AF_INET6) return NULL; memset(&sa6, 0, sizeof(sa6)); if (inet_pton(AF_INET6, ip, &sa6.sin6_addr) != 1) return NULL; sa6.sin6_family = AF_INET6; ai = calloct(1, sizeof(*ai)); ai->ai_family = AF_INET6; ai->ai_addrlen = sizeof(sa6); ai->ai_addr = malloct(sizeof(sa6)); memcpy(ai->ai_addr, &sa6, sizeof(sa6)); } else { // IPv4 literal struct sockaddr_in sa; if (want_family != PF_UNSPEC && want_family != AF_INET) return NULL; memset(&sa, 0, sizeof(sa)); if (inet_pton(AF_INET, ip, &sa.sin_addr) != 1) return NULL; sa.sin_family = AF_INET; ai = calloct(1, sizeof(*ai)); ai->ai_family = AF_INET; ai->ai_addrlen = sizeof(sa); ai->ai_addr = malloct(sizeof(sa)); memcpy(ai->ai_addr, &sa, sizeof(sa)); } return ai; } static void HTS_RESOLVER_CALL override_freeaddrinfo(struct addrinfo *res) { while (res != NULL) { struct addrinfo *const next = res->ai_next; freet(res->ai_addr); freet(res); res = next; } } static int HTS_RESOLVER_CALL override_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { const char *const spec = getenv("HTTRACK_DEBUG_RESOLVE"); const int want = (hints != NULL) ? hints->ai_family : PF_UNSPEC; const char *colon; *res = NULL; if (spec != NULL && node != NULL && (colon = strchr(spec, ':')) != NULL && (size_t) (colon - spec) == strlen(node) && strncmp(spec, node, colon - spec) == 0) { struct addrinfo *head = NULL, *tail = NULL; char buf[256]; char *p; buf[0] = '\0'; strncatbuff(buf, colon + 1, sizeof(buf) - 1); for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) { struct addrinfo *const ai = resolver_make_ai(p, want); if (ai != NULL) { if (head == NULL) head = ai; else tail->ai_next = ai; tail = ai; } } if (head == NULL) return EAI_NONAME; *res = head; return 0; } /* not overridden: delegate to libc, copying into our owned format */ { struct addrinfo *sys = NULL; int gerr = getaddrinfo(node, service, hints, &sys); if (gerr != 0) return gerr; *res = resolver_dup_chain(sys); freeaddrinfo(sys); return 0; } } static const hts_resolver_backend hts_resolver_override = { override_getaddrinfo, override_freeaddrinfo}; /* Install the env override once, unless a backend was already set (self-test). */ static void hts_resolver_check_env(void) { static int checked = 0; if (!checked) { checked = 1; if (hts_resolver == &hts_resolver_libc && getenv("HTTRACK_DEBUG_RESOLVE") != NULL) { hts_resolver = &hts_resolver_override; } } } #endif // Resolve hostname into up to max addresses (resolver/RFC 6724 order), no // cache. Returns the count copied into out[0..count-1]; 0 = does not resolve. static int hts_dns_resolve_nocache_list_(const char *const hostname, SOCaddr *const out, const int max, const char **error) { int count = 0; #if HTS_INET6==0 /* IPv4 resolver */ struct hostent *const hp = gethostbyname(hostname); if (hp != NULL) { char **h; for (h = hp->h_addr_list; count < max && h != NULL && *h != NULL; h++) { SOCaddr_clear(out[count]); SOCaddr_copyaddr2(out[count], *h, hp->h_length); if (SOCaddr_is_valid(out[count])) count++; } } #else /* IPv6 resolver */ struct addrinfo *res = NULL, *cur; struct addrinfo hints; int gerr; hts_resolver_check_env(); memset(&hints, 0, sizeof(hints)); if (IPV6_resolver == 1) // V4 only (for bogus V6 entries) hints.ai_family = PF_INET; else if (IPV6_resolver == 2) // V6 only (for testing V6 only) hints.ai_family = PF_INET6; else // V4 + V6 hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; if ((gerr = hts_resolver->getaddrinfo(hostname, NULL, &hints, &res)) == 0) { for (cur = res; cur != NULL && count < max; cur = cur->ai_next) { if (cur->ai_addr != NULL && cur->ai_addrlen != 0) { SOCaddr_clear(out[count]); SOCaddr_copyaddr2(out[count], cur->ai_addr, cur->ai_addrlen); if (SOCaddr_is_valid(out[count])) count++; } } } else if (error != NULL) { *error = gai_strerror(gerr); } if (res) { hts_resolver->freeaddrinfo(res); } #endif return count; } // Strip [] around a literal IPv6 ([3ffe:b80:1234:1::1]) the resolver won't // take, then resolve into a list. Returns the count. static int hts_dns_resolve_nocache_list(const char *const hostname, SOCaddr *const out, const int max, const char **error) { if (!strnotempty(hostname) || max <= 0) { return 0; } if ((hostname[0] == '[') && (hostname[strlen(hostname) - 1] == ']')) { size_t size = strlen(hostname); char *copy = malloct(size + 1); int count; assertf(copy != NULL); copy[0] = '\0'; strncat(copy, hostname + 1, size - 2); count = hts_dns_resolve_nocache_list_(copy, out, max, error); freet(copy); return count; } else { return hts_dns_resolve_nocache_list_(hostname, out, max, error); } } HTSEXT_API SOCaddr *hts_dns_resolve_nocache2(const char *const hostname, SOCaddr *const addr, const char **error) { SOCaddr_clear(*addr); if (hts_dns_resolve_nocache_list(hostname, addr, 1, error) > 0) { return SOCaddr_is_valid(*addr) ? addr : NULL; } return NULL; } HTSEXT_API SOCaddr* hts_dns_resolve_nocache(const char *const hostname, SOCaddr *const addr) { return hts_dns_resolve_nocache2(hostname, addr, NULL); } HTSEXT_API int check_hostname_dns(const char *const hostname) { SOCaddr buffer; return hts_dns_resolve_nocache(hostname, &buffer) != NULL; } /* A resolve in flight. Refcounted: a timed-out resolve is abandoned, not cancelled, so the last of caller/worker to leave frees the job. */ typedef struct dns_resolve_job { htsmutex lock; int refcount; hts_boolean done; char *hostname; SOCaddr addr[HTS_MAXADDRNUM]; int count; const char *error; } dns_resolve_job; /* Copy the first min(count, max) addresses of src into dest. */ static void dns_copy_addrs(SOCaddr *dest, SOCaddr *src, int count, int max) { int i; for (i = 0; i < count && i < max; i++) SOCaddr_copy_SOCaddr(dest[i], src[i]); } static void dns_job_release(dns_resolve_job *job) { hts_boolean last; hts_mutexlock(&job->lock); last = (--job->refcount == 0) ? HTS_TRUE : HTS_FALSE; hts_mutexrelease(&job->lock); if (last) { hts_mutexfree(&job->lock); freet(job->hostname); freet(job); } } /* Outlives a timed-out resolve, so it writes only the job: never opt (freed before the thread wait at exit) nor the DNS cache. */ static void dns_resolve_thread(void *arg) { dns_resolve_job *const job = (dns_resolve_job *) arg; SOCaddr resolved[HTS_MAXADDRNUM]; const char *error = NULL; const int count = hts_dns_resolve_nocache_list(job->hostname, resolved, HTS_MAXADDRNUM, &error); hts_mutexlock(&job->lock); dns_copy_addrs(job->addr, resolved, count, HTS_MAXADDRNUM); job->count = count; job->error = error; job->done = HTS_TRUE; /* published last: gates the caller's read of addr[] */ hts_mutexrelease(&job->lock); dns_job_release(job); } /* Resolve hostname on a worker thread, giving up after timeout seconds. Returns the address count, or -1 on timeout -- distinct from 0 ("does not resolve"), which is a real answer and gets negative-cached. */ static int hts_dns_resolve_nocache_list_bounded(const char *hostname, SOCaddr *const out, const int max, const int timeout, const char **error) { dns_resolve_job *job; TStamp deadline; int count = -1; int poll_ms = 1; if (timeout <= 0) /* no bound asked for (--timeout 0) */ return hts_dns_resolve_nocache_list(hostname, out, max, error); job = calloct(1, sizeof(*job)); assertf(job != NULL); hts_mutexinit(&job->lock); job->hostname = strdupt(hostname); job->refcount = 2; /* this caller + the worker */ if (hts_newthread(dns_resolve_thread, job) != 0) { job->refcount = 1; /* no worker: fall back to resolving inline */ dns_job_release(job); return hts_dns_resolve_nocache_list(hostname, out, max, error); } deadline = mtime_local() + (TStamp) timeout * 1000; for (;;) { hts_boolean done; hts_mutexlock(&job->lock); done = job->done; if (done) { count = job->count; dns_copy_addrs(out, job->addr, count, max); if (error != NULL) *error = job->error; } hts_mutexrelease(&job->lock); if (done || mtime_local() >= deadline) break; Sleep(poll_ms); if (poll_ms < 50) /* short first polls keep a fast resolve fast */ poll_ms *= 2; } dns_job_release(job); return count; } int hts_dns_resolve_all(httrackp *opt, const char *iadr, SOCaddr *out, int max, const char **error) { char BIGSTK host[HTS_URLMAXSIZE * 2]; SOCaddr resolved[HTS_MAXADDRNUM]; coucal cache; int count, i; assertf(opt != NULL); assertf(out != NULL); if (!strnotempty(iadr) || max <= 0) { return 0; } /* cache key and resolver input: identification and any ":port" stripped */ strcpybuff(host, jump_identification_const(iadr)); { char *a; if ((a = jump_toport(host))) *a = '\0'; } hts_mutexlock(&opt->state.lock); cache = hts_cache(opt); #if HTS_INET6 != 0 hts_resolver_check_env(); /* settle the backend before a worker reads it */ #endif count = hts_ghbn_all(cache, host, out, max); hts_mutexrelease(&opt->state.lock); if (count >= 0) { // cache hit (0 == negative-cached) return count; } #if DEBUGDNS printf("resolving (not cached) %s\n", host); #endif /* Resolve with no lock held: getaddrinfo can block for a long time, and state.lock also gates the stop request (#606). */ count = hts_dns_resolve_nocache_list_bounded(host, resolved, HTS_MAXADDRNUM, opt->timeout, error); #if HTS_WIDE_DEBUG DEBUG_W("gethostbyname done\n"); #endif if (count < 0) { /* timed out: no answer to cache, and none to report */ if (error != NULL) *error = "host name resolution timed out"; return 0; } hts_mutexlock(&opt->state.lock); { /* store the full list (coucal owns the record and dups the host key; a concurrent resolve of the same host replaces, and frees, this one) */ t_dnscache *const record = malloct(sizeof(t_dnscache)); if (record != NULL) { memset(record, 0, sizeof(*record)); record->host_count = count; for (i = 0; i < count; i++) { record->host_length[i] = SOCaddr_size(resolved[i]); assertf(record->host_length[i] <= sizeof(record->host_addr[i])); memcpy(record->host_addr[i], &SOCaddr_sockaddr(resolved[i]), record->host_length[i]); } coucal_add_pvoid(cache, host, record); } } hts_mutexrelease(&opt->state.lock); /* copy result to caller (cache store may have failed; result still valid) */ dns_copy_addrs(out, resolved, count, max); return count; } SOCaddr *hts_dns_resolve2(httrackp *opt, const char *_iadr, SOCaddr *const addr, const char **error) { SOCaddr_clear(*addr); if (hts_dns_resolve_all(opt, _iadr, addr, 1, error) > 0) { return SOCaddr_is_valid(*addr) ? addr : NULL; } return NULL; } SOCaddr* hts_dns_resolve(httrackp * opt, const char *_iadr, SOCaddr *const addr) { return hts_dns_resolve2(opt, _iadr, addr, NULL); } // --- Tracage des mallocs() --- #ifdef HTS_TRACE_MALLOC #define htsLocker(A, N) do {} while(0) static mlink trmalloc = { NULL, 0, 0, NULL }; static int trmalloc_id = 0; static htsmutex *mallocMutex = NULL; static void hts_meminit(void) {} void *hts_malloc(size_t len) { void *adr; hts_meminit(); htsLocker(mallocMutex, 1); assertf(len > 0); adr = hts_xmalloc(len, 0); htsLocker(mallocMutex, 0); return adr; } void *hts_calloc(size_t len, size_t len2) { void *adr; hts_meminit(); assertf(len > 0); assertf(len2 > 0); htsLocker(mallocMutex, 1); adr = hts_xmalloc(len, len2); htsLocker(mallocMutex, 0); memset(adr, 0, len * len2); return adr; } void *hts_strdup(char *str) { size_t size = str ? strlen(str) : 0; char *adr = (char *) hts_malloc(size + 1); assertf(adr != NULL); strcpy(adr, str ? str : ""); return adr; } void *hts_xmalloc(size_t len, size_t len2) { mlink *lnk = (mlink *) calloc(1, sizeof(mlink)); assertf(lnk != NULL); assertf(len > 0); assertf(len2 >= 0); if (lnk) { void *r = NULL; int size, bsize = sizeof(t_htsboundary); if (len2) size = len * len2; else size = len; size += ((bsize - (size % bsize)) % bsize); /* check alignement */ r = malloc(size + bsize * 2); assertf(r != NULL); if (r) { *((t_htsboundary *) ((char *) r)) = *((t_htsboundary *) ((char *) r + size + bsize)) = htsboundary; ((char *) r) += bsize; /* boundary */ lnk->adr = r; lnk->len = size; lnk->id = trmalloc_id++; lnk->next = trmalloc.next; trmalloc.next = lnk; return r; } else { free(lnk); } } return NULL; } void hts_free(void *adr) { mlink *lnk = &trmalloc; int bsize = sizeof(t_htsboundary); assertf(adr != NULL); if (!adr) { return; } htsLocker(mallocMutex, 1); while(lnk->next != NULL) { if (lnk->next->adr == adr) { mlink *blk_free = lnk->next; assertf(blk_free->id != -1); assertf(*((t_htsboundary *) ((char *) adr - bsize)) == htsboundary); assertf(*((t_htsboundary *) ((char *) adr + blk_free->len)) == htsboundary); lnk->next = lnk->next->next; free((void *) blk_free); free((char *) adr - bsize); htsLocker(mallocMutex, 0); return; } lnk = lnk->next; assertf(lnk->next != NULL); } free(adr); htsLocker(mallocMutex, 0); } void *hts_realloc(void *adr, size_t len) { int bsize = sizeof(t_htsboundary); len += ((bsize - (len % bsize)) % bsize); /* check alignement */ if (adr != NULL) { mlink *lnk = &trmalloc; htsLocker(mallocMutex, 1); while(lnk->next != NULL) { if (lnk->next->adr == adr) { { mlink *blk_free = lnk->next; assertf(blk_free->id != -1); assertf(*((t_htsboundary *) ((char *) adr - bsize)) == htsboundary); assertf(*((t_htsboundary *) ((char *) adr + blk_free->len)) == htsboundary); } adr = realloc((char *) adr - bsize, len + bsize * 2); assertf(adr != NULL); lnk->next->adr = (char *) adr + bsize; lnk->next->len = len; *((t_htsboundary *) ((char *) adr)) = *((t_htsboundary *) ((char *) adr + len + bsize)) = htsboundary; htsLocker(mallocMutex, 0); return (char *) adr + bsize; } lnk = lnk->next; assertf(lnk->next != NULL); } htsLocker(mallocMutex, 0); } return hts_malloc(len); } mlink *hts_find(char *adr) { char *stkframe = (char *) &stkframe; mlink *lnk = &trmalloc; int bsize = sizeof(t_htsboundary); assertf(adr != NULL); if (!adr) { return NULL; } htsLocker(mallocMutex, 1); while(lnk->next != NULL) { if (adr >= lnk->next->adr && adr <= lnk->next->adr + lnk->next->len) { /* found */ htsLocker(mallocMutex, 0); return lnk->next; } lnk = lnk->next; } htsLocker(mallocMutex, 0); { int depl = (int) (adr - stkframe); if (depl < 0) depl = -depl; return NULL; } } // check the malloct() and calloct() trace stack void hts_freeall(void) { int bsize = sizeof(t_htsboundary); while(trmalloc.next) { #if MEMDEBUG printf("* block %d\t not released: at %d\t (%d\t bytes)\n", trmalloc.next->id, trmalloc.next->adr, trmalloc.next->len); #endif if (trmalloc.next->id != -1) { free((char *) trmalloc.next->adr - bsize); } } } #endif // -- divers // // cut path and project name // patch also initial path void cut_path(char *fullpath, char *path, size_t path_size, char *pname, size_t pname_size) { path[0] = pname[0] = '\0'; if (strnotempty(fullpath)) { if ((fullpath[strlen(fullpath) - 1] == '/') || (fullpath[strlen(fullpath) - 1] == '\\')) fullpath[strlen(fullpath) - 1] = '\0'; if (strlen(fullpath) > 1) { char *a; while((a = strchr(fullpath, '\\'))) *a = '/'; // remplacer par / a = fullpath + strlen(fullpath) - 2; while((*a != '/') && (a > fullpath)) a--; if (*a == '/') a++; strlcpybuff(pname, a, pname_size); strlncatbuff(path, fullpath, path_size, (size_t) (a - fullpath)); } } } // -- Gestion protocole ftp -- #ifdef _WIN32 int ftp_available(void) { return 1; } #else int ftp_available(void) { return 1; // ok! } #endif static void hts_debug_log_print(const char *format, ...); static int hts_dgb_init = 0; static FILE *hts_dgb_init_fp = NULL; HTSEXT_API void hts_debug(int level) { hts_dgb_init = level; if (hts_dgb_init > 0) { hts_debug_log_print("hts_debug() called"); } } static FILE *hts_dgb_(void) { if (hts_dgb_init_fp == NULL) { if ((hts_dgb_init & 0x80) == 0) { hts_dgb_init_fp = stderr; } else { hts_dgb_init_fp = FOPEN("hts-debug.txt", "wb"); if (hts_dgb_init_fp != NULL) { fprintf(hts_dgb_init_fp, "* Creating file\r\n"); } } } return hts_dgb_init_fp; } static void hts_debug_log_print(const char *format, ...) { if (hts_dgb_init > 0) { const int error = errno; FILE *const fp = hts_dgb_(); va_list args; assertf(format != NULL); va_start(args, format); (void) vfprintf(fp, format, args); va_end(args); fputs("\n", fp); fflush(fp); errno = error; } } HTSEXT_API const char* hts_version(void) { return HTTRACK_VERSIONID; } static int ssl_vulnerable(const char *version) { #ifdef _WIN32 static const char *const match = "OpenSSL 1.0.1"; const size_t match_len = strlen(match); if (version != NULL && strncmp(version, match, match_len) == 0) { // CVE-2014-0160 // "OpenSSL 1.0.1g 7 Apr 2014" const char minor = version[match_len]; return minor == ' ' || ( minor >= 'a' && minor <= 'f' ); } #endif return 0; } /* user abort callback */ htsErrorCallback htsCallbackErr = NULL; HTSEXT_API void hts_set_error_callback(htsErrorCallback handler) { htsCallbackErr = handler; } HTSEXT_API htsErrorCallback hts_get_error_callback(void) { return htsCallbackErr; } static void default_coucal_asserthandler(void *arg, const char* exp, const char* file, int line) { abortf_(exp, file, line); } static int get_loglevel_from_coucal(coucal_loglevel level) { switch(level) { case coucal_log_critical: return LOG_PANIC; break; case coucal_log_warning: return LOG_WARNING; break; case coucal_log_info: return LOG_INFO; break; case coucal_log_debug: return LOG_DEBUG; break; case coucal_log_trace: return LOG_TRACE; break; default: return LOG_ERROR; break; } } /* log to default console */ static void default_coucal_loghandler(void *arg, coucal_loglevel level, const char* format, va_list args) { /* informational chatter (hashtable stats on delete, etc.) only when debugging; keep warnings and critical errors always visible. */ if (level > coucal_log_warning && hts_dgb_init <= 0) { return; } if (level <= coucal_log_warning) { fprintf(stderr, "** warning: "); } vfprintf(stderr, format, args); fprintf(stderr, "\n"); } /* log to project log */ static void htsopt_coucal_loghandler(void *arg, coucal_loglevel level, const char* format, va_list args) { httrackp *const opt = (httrackp*) arg; if (opt != NULL && opt->log != NULL) { hts_log_vprint(opt, get_loglevel_from_coucal(level), format, args); } else { default_coucal_loghandler(NULL, level, format, args); } } /* attach hashtable logger to project log */ void hts_set_hash_handler(coucal hashtable, httrackp *opt) { /* Init hashtable default assertion handler. */ coucal_set_assert_handler(hashtable, htsopt_coucal_loghandler, default_coucal_asserthandler, opt); } static int hts_init_ok = 0; HTSEXT_API int hts_init(void) { const char *dbg_env; /* */ if (hts_init_ok) return 1; hts_init_ok = 1; /* enable debugging ? */ dbg_env = getenv("HTS_LOG"); if (dbg_env != NULL && *dbg_env != 0) { int level = 0; if (sscanf(dbg_env, "%d", &level) == 1) { hts_debug(level); } } hts_debug_log_print("entering hts_init()"); /* debug */ /* Init hashtable default assertion handler. */ coucal_set_global_assert_handler(default_coucal_loghandler, default_coucal_asserthandler); /* Init threads (lazy init) */ htsthread_init(); /* Ensure external modules are loaded */ hts_debug_log_print("calling htspe_init()"); /* debug */ htspe_init(); /* module load (lazy) */ /* MD5 Auto-test */ { char digest[32 + 2]; const char *atest = "MD5 Checksum Autotest"; digest[0] = '\0'; domd5mem(atest, strlen(atest), digest, 1); /* a42ec44369da07ace5ec1d660ba4a69a */ if (strcmp(digest, "a42ec44369da07ace5ec1d660ba4a69a") != 0) { int fatal_broken_md5 = 0; assertf(fatal_broken_md5); } } hts_debug_log_print("initializing SSL"); /* debug */ #if HTS_USEOPENSSL /* Initialize the OpensSSL library */ if (!openssl_ctx) { const char *version; const SSL_METHOD *method; /* OpenSSL >= 1.1.0 / LibreSSL >= 2.7.0 auto-init and provide the generic methods. The legacy init and SSLv23/SSLeay calls (deprecated since 1.1.0, likely gone in 4.0) are kept only for older OpenSSL. */ #if OPENSSL_VERSION_NUMBER < 0x10100000L \ || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL) SSL_load_error_strings(); SSL_library_init(); version = SSLeay_version(SSLEAY_VERSION); method = SSLv23_client_method(); #else version = OpenSSL_version(OPENSSL_VERSION); method = TLS_client_method(); #endif // Check CVE-2014-0160. if (ssl_vulnerable(version)) { fprintf(stderr, "OpenSSL version == '%s'\n", version); abortLog("unable to initialize TLS: OpenSSL version seems vulnerable to heartbleed bug (CVE-2014-0160)"); assertf("OpenSSL version seems vulnerable to heartbleed bug (CVE-2014-0160)" == NULL); } openssl_ctx = SSL_CTX_new(method); if (!openssl_ctx) { fprintf(stderr, "fatal: unable to initialize TLS: SSL_CTX_new()\n"); abortLog("unable to initialize TLS: SSL_CTX_new()"); assertf("unable to initialize TLS" == NULL); } /* Pin a TLS floor (no SSLv3/TLS1.0/1.1); no cert verify, by design. */ #if OPENSSL_VERSION_NUMBER >= 0x10100000L SSL_CTX_set_min_proto_version(openssl_ctx, TLS1_2_VERSION); #else SSL_CTX_set_options(openssl_ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1); #endif } #endif hts_debug_log_print("ending hts_init()"); /* debug */ return 1; } /* will not free thread env. */ HTSEXT_API int hts_uninit(void) { /* hts_init() is a lazy initializer, with limited a allocation (one or two mutexes) ; we won't free anything here as the .h semantic was never being very clear */ return 1; } HTSEXT_API int hts_uninit_module(void) { if (!hts_init_ok) return 1; htsthread_uninit(); htspe_uninit(); hts_init_ok = 0; return 1; } // legacy. do not use HTSEXT_API hts_boolean hts_log(httrackp *opt, const char *prefix, const char *msg) { if (opt->log != NULL) { fspc(opt, opt->log, prefix); fprintf(opt->log, "%s" LF, msg); return 0; } return 1; /* Error */ } static void (*hts_log_print_callback)(httrackp * opt, int type, const char *format, va_list args) = NULL; HTSEXT_API void hts_set_log_vprint_callback(void (*callback)(httrackp * opt, int type, const char *format, va_list args)) { hts_log_print_callback = callback; } HTSEXT_API void hts_log_vprint(httrackp * opt, int type, const char *format, va_list args) { assertf(format != NULL); if (hts_log_print_callback != NULL) { va_list args_copy; va_copy(args_copy, args); hts_log_print_callback(opt, type, format, args); va_end(args_copy); } if (opt != NULL && opt->log != NULL) { const int save_errno = errno; const char *s_type = "unknown"; const int level = type & 0xff; // Check log level if (opt->debug < level) { return; } switch (level) { case LOG_TRACE: s_type = "trace"; break; case LOG_DEBUG: s_type = "debug"; break; case LOG_INFO: s_type = "info"; break; case LOG_NOTICE: case LOG_WARNING: s_type = "warning"; break; case LOG_ERROR: s_type = "error"; break; case LOG_PANIC: s_type = "panic"; break; } fspc(opt, opt->log, s_type); (void) vfprintf(opt->log, format, args); if ((type & LOG_ERRNO) != 0) { fprintf(opt->log, ": %s", strerror(save_errno)); } fputs(LF, opt->log); if (opt->flush) { fflush(opt->log); } errno = save_errno; } } HTSEXT_API void hts_log_print(httrackp * opt, int type, const char *format, ...) { va_list args; assertf(format != NULL); va_start(args, format); hts_log_vprint(opt, type, format, args); va_end(args); } HTSEXT_API void set_wrappers(httrackp * opt) { // LEGACY } HTSEXT_API int plug_wrapper(httrackp * opt, const char *moduleName, const char *argv) { void *handle = openFunctionLib(moduleName); if (handle != NULL) { t_hts_plug plug = (t_hts_plug) getFunctionPtr(handle, "hts_plug"); t_hts_unplug unplug = (t_hts_unplug) getFunctionPtr(handle, "hts_unplug"); if (plug != NULL) { int ret = plug(opt, argv); if (hts_dgb_init > 0 && opt->log != NULL) { hts_debug_log_print("plugged module '%s' (return code=%d)", moduleName, ret); } if (ret == 1) { /* Success! */ opt->libHandles.handles = (htslibhandle *) realloct(opt->libHandles.handles, (opt->libHandles.count + 1) * sizeof(htslibhandle)); opt->libHandles.handles[opt->libHandles.count].handle = handle; opt->libHandles.handles[opt->libHandles.count].moduleName = strdupt(moduleName); opt->libHandles.count++; return 1; } else { hts_debug_log_print ("* note: error while running entry point 'hts_plug' in %s", moduleName); if (unplug) unplug(opt); } } else { int last_errno = errno; hts_debug_log_print("* note: can't find entry point 'hts_plug' in %s: %s", moduleName, strerror(last_errno)); } closeFunctionLib(handle); return 0; } else { int last_errno = errno; hts_debug_log_print("* note: can't load %s: %s", moduleName, strerror(last_errno)); } return -1; } static void unplug_wrappers(httrackp * opt) { if (opt->libHandles.handles != NULL) { int i; for(i = 0; i < opt->libHandles.count; i++) { if (opt->libHandles.handles[i].handle != NULL) { /* hts_unplug(), the dll exit point (finalizer) */ t_hts_unplug unplug = (t_hts_unplug) getFunctionPtr(opt->libHandles.handles[i].handle, "hts_unplug"); if (unplug != NULL) unplug(opt); closeFunctionLib(opt->libHandles.handles[i].handle); opt->libHandles.handles[i].handle = NULL; } if (opt->libHandles.handles[i].moduleName != NULL) { freet(opt->libHandles.handles[i].moduleName); opt->libHandles.handles[i].moduleName = NULL; } } freet(opt->libHandles.handles); opt->libHandles.handles = NULL; opt->libHandles.count = 0; } } int multipleStringMatch(const char *s, const char *match) { int ret = 0; String name = STRING_EMPTY; if (match == NULL || s == NULL || *s == 0) return 0; for(; *match != 0; match++) { StringClear(name); for(; *match != 0 && *match != '\n'; match++) { StringAddchar(name, *match); } if (StringLength(name) > 0 && strstr(s, StringBuff(name)) != NULL) { ret = 1; break; } } StringFree(name); return ret; } HTSEXT_API httrackp *hts_create_opt(void) { static const char *defaultModules[] = {"httrack-plugin", NULL}; httrackp *opt = malloc(sizeof(httrackp)); /* default options */ memset(opt, 0, sizeof(httrackp)); opt->size_httrackp = sizeof(httrackp); /* mutexes */ hts_mutexinit(&opt->state.lock); /* custom wrappers */ opt->libHandles.count = 0; /* default settings */ opt->wizard = HTS_WIZARD_AUTO; // wizard automatique opt->quiet = HTS_FALSE; // opt->travel = HTS_TRAVEL_SAME_ADDRESS; // même adresse opt->depth = 9999; // mirror total par défaut opt->extdepth = 0; // mais pas à l'extérieur opt->seeker = HTS_SEEKER_DOWN; // down opt->urlmode = HTS_URLMODE_RELATIVE; // relatif par défaut opt->no_type_change = HTS_FALSE; opt->debug = LOG_NOTICE; // small log opt->getmode = HTS_GETMODE_HTML | HTS_GETMODE_NONHTML; opt->maxsite = -1; // taille max site (aucune) opt->maxfile_nonhtml = -1; // taille max fichier non html opt->maxfile_html = -1; // idem pour html opt->maxsoc = 4; // nbre socket max opt->fragment = -1; // pas de fragmentation opt->nearlink = HTS_FALSE; opt->makeindex = HTS_TRUE; opt->kindex = HTS_FALSE; opt->delete_old = HTS_TRUE; opt->background_on_suspend = HTS_TRUE; opt->makestat = HTS_FALSE; opt->maketrack = HTS_FALSE; opt->timeout = 120; // timeout par défaut (2 minutes) opt->cache = HTS_CACHE_PRIORITY; // cache prioritaire opt->shell = HTS_FALSE; opt->proxy.active = 0; // pas de proxy opt->user_agent_send = HTS_TRUE; StringCopy(opt->user_agent, HTS_DEFAULT_USER_AGENT); StringCopy(opt->referer, ""); StringCopy(opt->from, ""); opt->savename_83 = HTS_SAVENAME_83_LONG; // long names by default opt->savename_type = 0; // avec structure originale opt->savename_delayed = HTS_SAVENAME_DELAYED_HARD; // always delay the type check (default) opt->delayed_cached = HTS_TRUE; opt->mimehtml = HTS_FALSE; opt->parsejava = HTSPARSE_DEFAULT; // parser classes opt->hostcontrol = 0; // PAS de control host pour timeout et traffic jammer opt->retry = 2; // 2 retry par défaut opt->errpage = HTS_TRUE; // d'erreur (404 etc.) opt->check_type = HTS_TRUE; // considéré comme html opt->all_in_cache = HTS_FALSE; opt->robots = HTS_ROBOTS_ALWAYS; // traiter les robots.txt opt->external = HTS_FALSE; opt->passprivacy = HTS_FALSE; opt->includequery = HTS_TRUE; opt->mirror_first_page = HTS_FALSE; opt->accept_cookie = HTS_TRUE; opt->cookie = NULL; opt->http10 = HTS_FALSE; opt->nokeepalive = HTS_FALSE; opt->nocompression = HTS_FALSE; opt->tolerant = HTS_FALSE; opt->parseall = HTS_TRUE; opt->parsedebug = HTS_FALSE; opt->norecatch = HTS_FALSE; opt->verbosedisplay = HTS_VERBOSE_NONE; // no text animation opt->sizehack = HTS_FALSE; opt->urlhack = HTS_TRUE; opt->no_www_dedup = HTS_FALSE; opt->no_slash_dedup = HTS_FALSE; opt->no_query_dedup = HTS_FALSE; StringCopy(opt->footer, HTS_DEFAULT_FOOTER); StringCopy(opt->strip_query, ""); StringCopy(opt->cookies_file, ""); StringCopy(opt->warc_file, ""); opt->warc_max_size = 0; /* no rotation unless --warc-max-size sets it */ StringCopy(opt->why_url, ""); opt->pause_min_ms = 0; opt->pause_max_ms = 0; opt->ftp_proxy = HTS_TRUE; opt->convert_utf8 = HTS_TRUE; StringCopy(opt->filelist, ""); StringCopy(opt->lang_iso, "en, *"); StringCopy(opt->accept, "text/html,image/png,image/jpeg,image/pjpeg,image/x-xbitmap,image/svg+xml,image/gif;q=0.9,*/*;q=0.1"); StringCopy(opt->headers, ""); StringCopy(opt->mimedefs, "\n"); // aucun filtre mime (\n IMPORTANT) StringClear(opt->mod_blacklist); // opt->log = stdout; opt->errlog = stderr; opt->flush = HTS_TRUE; opt->keyboard = HTS_FALSE; // StringCopy(opt->path_html, ""); StringCopy(opt->path_html_utf8, ""); StringCopy(opt->path_log, ""); StringCopy(opt->path_bin, ""); // opt->maxlink = 100000; // 100,000 liens max par défaut opt->maxfilter = 200; // 200 filtres max par défaut opt->maxcache = 1048576 * 32; // a peu près 32Mo en cache max -- OPTION NON // PARAMETRABLE POUR L'INSTANT -- opt->maxtime = -1; // temps max en secondes opt->maxrate = 100000; // taux maxi opt->maxconn = 5.0; // nombre connexions/s opt->waittime = -1; // wait until.. hh*3600+mm*60+ss // opt->exec = ""; opt->is_update = HTS_FALSE; opt->dir_topindex = HTS_FALSE; // opt->bypass_limits = HTS_FALSE; opt->state.stop = 0; // stopper opt->state.exit_xh = 0; // abort // opt->state.is_ended = 0; /* Alocated buffers */ opt->callbacks_fun = (t_hts_htmlcheck_callbacks *) malloct(sizeof(t_hts_htmlcheck_callbacks)); memset(opt->callbacks_fun, 0, sizeof(t_hts_htmlcheck_callbacks)); /* Preload callbacks : java and flash parser, and the automatic user-defined callback */ { int i; for(i = 0; defaultModules[i] != NULL; i++) { int ret = plug_wrapper(opt, defaultModules[i], defaultModules[i]); if (ret == 0) { /* Module aborted initialization */ /* Ignored. */ } } } return opt; } HTSEXT_API size_t hts_sizeof_opt(void) { return sizeof(httrackp); } HTSEXT_API void hts_free_opt(httrackp * opt) { if (opt != NULL) { /* Alocated callbacks */ if (opt->callbacks_fun != NULL) { int i; t_hts_htmlcheck_callbacks_item *items = (t_hts_htmlcheck_callbacks_item *) opt->callbacks_fun; const int size = (int) sizeof(t_hts_htmlcheck_callbacks) / sizeof(t_hts_htmlcheck_callbacks_item); assertf(sizeof(t_hts_htmlcheck_callbacks_item) * size == sizeof(t_hts_htmlcheck_callbacks)); /* Free all linked lists */ for(i = 0; i < size; i++) { t_hts_callbackarg *carg, *next_carg; for(carg = items[i].carg; carg != NULL && (next_carg = carg->prev.carg, carg != NULL); carg = next_carg) { hts_free(carg); } } freet(opt->callbacks_fun); opt->callbacks_fun = NULL; } /* Close library handles */ unplug_wrappers(opt); /* Cache */ if (opt->state.dns_cache != NULL) { coucal root; hts_mutexlock(&opt->state.lock); root = opt->state.dns_cache; opt->state.dns_cache = NULL; hts_mutexrelease(&opt->state.lock); coucal_delete(&root); // frees records via hts_cache_value_free } /* Cancel chain */ if (opt->state.cancel != NULL) { htsoptstatecancel *cancel; for(cancel = opt->state.cancel; cancel != NULL;) { htsoptstatecancel *next = cancel->next; if (cancel->url != NULL) { freet(cancel->url); } freet(cancel); cancel = next; } opt->state.cancel = NULL; } /* Free strings */ StringFree(opt->proxy.name); StringFree(opt->proxy.bindhost); StringFree(opt->savename_userdef); StringFree(opt->user_agent); StringFree(opt->referer); StringFree(opt->from); StringFree(opt->lang_iso); StringFree(opt->accept); StringFree(opt->headers); StringFree(opt->sys_com); StringFree(opt->mimedefs); StringFree(opt->filelist); StringFree(opt->urllist); StringFree(opt->footer); StringFree(opt->mod_blacklist); StringFree(opt->strip_query); StringFree(opt->cookies_file); StringFree(opt->why_url); StringFree(opt->warc_file); StringFree(opt->path_html); StringFree(opt->path_html_utf8); StringFree(opt->path_log); StringFree(opt->path_bin); /* mutexes */ hts_mutexfree(&opt->state.lock); /* Free structure */ free(opt); } } // TEMPORARY - PUT THIS STRUCTURE INSIDE httrackp ! const hts_stat_struct* hts_get_stats(httrackp * opt) { if (opt == NULL) { return NULL; } HTS_STAT.stat_nsocket = 0; HTS_STAT.stat_errors = fspc(opt, NULL, "error"); HTS_STAT.stat_warnings = fspc(opt, NULL, "warning"); HTS_STAT.stat_infos = fspc(opt, NULL, "info"); HTS_STAT.nbk = 0; HTS_STAT.nb = 0; return &HTS_STAT; } // defaut wrappers static void __cdecl htsdefault_init(t_hts_callbackarg *carg) {} static void __cdecl htsdefault_uninit(t_hts_callbackarg *carg) {} static int __cdecl htsdefault_start(t_hts_callbackarg * carg, httrackp * opt) { return 1; } static int __cdecl htsdefault_chopt(t_hts_callbackarg * carg, httrackp * opt) { return 1; } static int __cdecl htsdefault_end(t_hts_callbackarg * carg, httrackp * opt) { return 1; } static int __cdecl htsdefault_preprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_adresse, const char *url_fichier) { return 1; } static int __cdecl htsdefault_postprocesshtml(t_hts_callbackarg * carg, httrackp * opt, char **html, int *len, const char *url_adresse, const char *url_fichier) { return 1; } static int __cdecl htsdefault_checkhtml(t_hts_callbackarg * carg, httrackp * opt, char *html, int len, const char *url_adresse, const char *url_fichier) { return 1; } static int __cdecl htsdefault_loop(t_hts_callbackarg * carg, httrackp * opt, lien_back * back, int back_max, int back_index, int lien_n, int lien_tot, int stat_time, hts_stat_struct * stats) { // appelé à chaque boucle de HTTrack return 1; } static const char *__cdecl htsdefault_query(t_hts_callbackarg * carg, httrackp * opt, const char *question) { return ""; } static const char *__cdecl htsdefault_query2(t_hts_callbackarg * carg, httrackp * opt, const char *question) { return ""; } static const char *__cdecl htsdefault_query3(t_hts_callbackarg * carg, httrackp * opt, const char *question) { return ""; } static int __cdecl htsdefault_check(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, int status) { return -1; } static int __cdecl htsdefault_check_mime(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *fil, const char *mime, int status) { return -1; } static void __cdecl htsdefault_pause(t_hts_callbackarg * carg, httrackp * opt, const char *lockfile) { while(fexist(lockfile)) { Sleep(1000); } } static void __cdecl htsdefault_filesave(t_hts_callbackarg * carg, httrackp * opt, const char *file) { } static void __cdecl htsdefault_filesave2(t_hts_callbackarg * carg, httrackp * opt, const char *adr, const char *file, const char *sav, int is_new, int is_modified, int not_updated) { } static int __cdecl htsdefault_linkdetected(t_hts_callbackarg * carg, httrackp * opt, char *link) { return 1; } static int __cdecl htsdefault_linkdetected2(t_hts_callbackarg * carg, httrackp * opt, char *link, const char *start_tag) { return 1; } static int __cdecl htsdefault_xfrstatus(t_hts_callbackarg * carg, httrackp * opt, lien_back * back) { return 1; } static int __cdecl htsdefault_savename(t_hts_callbackarg * carg, httrackp * opt, const char *adr_complete, const char *fil_complete, const char *referer_adr, const char *referer_fil, char *save) { return 1; } static int __cdecl htsdefault_sendhead(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * outgoing) { return 1; } static int __cdecl htsdefault_receivehead(t_hts_callbackarg * carg, httrackp * opt, char *buff, const char *adr, const char *fil, const char *referer_adr, const char *referer_fil, htsblk * incoming) { return 1; } static int __cdecl htsdefault_detect(t_hts_callbackarg * carg, httrackp * opt, htsmoduleStruct * str) { return 0; } static int __cdecl htsdefault_parse(t_hts_callbackarg * carg, httrackp * opt, htsmoduleStruct * str) { return 0; } /* Default internal dummy callbacks */ const t_hts_htmlcheck_callbacks default_callbacks = { {htsdefault_init, NULL}, {htsdefault_uninit, NULL}, {htsdefault_start, NULL}, {htsdefault_end, NULL}, {htsdefault_chopt, NULL}, {htsdefault_preprocesshtml, NULL}, {htsdefault_postprocesshtml, NULL}, {htsdefault_checkhtml, NULL}, {htsdefault_query, NULL}, {htsdefault_query2, NULL}, {htsdefault_query3, NULL}, {htsdefault_loop, NULL}, {htsdefault_check, NULL}, {htsdefault_check_mime, NULL}, {htsdefault_pause, NULL}, {htsdefault_filesave, NULL}, {htsdefault_filesave2, NULL}, {htsdefault_linkdetected, NULL}, {htsdefault_linkdetected2, NULL}, {htsdefault_xfrstatus, NULL}, {htsdefault_savename, NULL}, {htsdefault_sendhead, NULL}, {htsdefault_receivehead, NULL}, {htsdefault_detect, NULL}, {htsdefault_parse, NULL} }; #define CALLBACK_OP(CB, NAME, OPERATION, S, FUN) do { \ if (strcmp(NAME, S) == 0) { \ OPERATION(t_hts_htmlcheck_ ##FUN, (CB)->FUN.fun); \ } \ } while(0) #define DISPATCH_CALLBACK(CB, NAME, OPERATION) do { \ CALLBACK_OP(CB, NAME, OPERATION, "init", init); \ CALLBACK_OP(CB, NAME, OPERATION, "free", uninit); \ CALLBACK_OP(CB, NAME, OPERATION, "start", start); \ CALLBACK_OP(CB, NAME, OPERATION, "end", end); \ CALLBACK_OP(CB, NAME, OPERATION, "change-options", chopt); \ CALLBACK_OP(CB, NAME, OPERATION, "preprocess-html", preprocess); \ CALLBACK_OP(CB, NAME, OPERATION, "postprocess-html", postprocess); \ CALLBACK_OP(CB, NAME, OPERATION, "check-html", check_html); \ CALLBACK_OP(CB, NAME, OPERATION, "query", query); \ CALLBACK_OP(CB, NAME, OPERATION, "query2", query2); \ CALLBACK_OP(CB, NAME, OPERATION, "query3", query3); \ CALLBACK_OP(CB, NAME, OPERATION, "loop", loop); \ CALLBACK_OP(CB, NAME, OPERATION, "check-link", check_link); \ CALLBACK_OP(CB, NAME, OPERATION, "check-mime", check_mime); \ CALLBACK_OP(CB, NAME, OPERATION, "pause", pause); \ CALLBACK_OP(CB, NAME, OPERATION, "save-file", filesave); \ CALLBACK_OP(CB, NAME, OPERATION, "save-file2", filesave2); \ CALLBACK_OP(CB, NAME, OPERATION, "link-detected", linkdetected); \ CALLBACK_OP(CB, NAME, OPERATION, "link-detected2", linkdetected2); \ CALLBACK_OP(CB, NAME, OPERATION, "transfer-status", xfrstatus); \ CALLBACK_OP(CB, NAME, OPERATION, "save-name", savename); \ CALLBACK_OP(CB, NAME, OPERATION, "send-header", sendhead); \ CALLBACK_OP(CB, NAME, OPERATION, "receive-header", receivehead); \ } while(0) int hts_set_callback(t_hts_htmlcheck_callbacks * callbacks, const char *name, void *function) { int error = 1; #define CALLBACK_OPERATION(TYPE, FUNCTION) do { \ FUNCTION = (TYPE) function; \ error = 0; \ } while(0) DISPATCH_CALLBACK(callbacks, name, CALLBACK_OPERATION); #undef CALLBACK_OPERATION return error; } void *hts_get_callback(t_hts_htmlcheck_callbacks * callbacks, const char *name) { #define CALLBACK_OPERATION(TYPE, FUNCTION) do { \ return (void*) FUNCTION; \ } while(0) DISPATCH_CALLBACK(callbacks, name, CALLBACK_OPERATION); #undef CALLBACK_OPERATION return NULL; } // end defaut wrappers /* libc stubs */ HTSEXT_API char *hts_strdup(const char *str) { return strdup(str); } HTSEXT_API void *hts_malloc(size_t size) { return malloc(size); } HTSEXT_API void *hts_realloc(void *const data, const size_t size) { return realloc(data, size); } HTSEXT_API void hts_free(void *data) { free(data); } /* Dummy functions */ HTSEXT_API int hts_resetvar(void) { return 0; } #ifdef _WIN32 typedef struct dirent dirent; DIR *opendir(const char *name) { WIN32_FILE_ATTRIBUTE_DATA st; DIR *dir; size_t len; int i; LPWSTR wname; if (name == NULL || *name == '\0') { errno = ENOENT; return NULL; } // Wide \\?\ path: no MAX_PATH cap, no CP_ACP mis-decode (#133,#630). wname = hts_pathToUCS2(name); if (wname == NULL || !GetFileAttributesExW(wname, GetFileExInfoStandard, &st) || (st.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { freet(wname); errno = ENOENT; return NULL; } freet(wname); dir = calloc(sizeof(DIR), 1); if (dir == NULL) { errno = ENOMEM; return NULL; } len = strlen(name); dir->h = INVALID_HANDLE_VALUE; dir->name = malloc(len + 2 + 1); strcpy(dir->name, name); for(i = 0; dir->name[i] != '\0'; i++) { if (dir->name[i] == '/') { dir->name[i] = '\\'; } } strcat(dir->name, "\\*"); return dir; } struct dirent *readdir(DIR * dir) { WIN32_FIND_DATAW find; if (dir->h == INVALID_HANDLE_VALUE) { // \\?\-prefix so a long/non-ASCII directory enumerates instead of ENOENT. LPWSTR wname = hts_pathToUCS2(dir->name); dir->h = wname != NULL ? FindFirstFileW(wname, &find) : INVALID_HANDLE_VALUE; freet(wname); } else { if (!FindNextFileW(dir->h, &find)) { FindClose(dir->h); dir->h = INVALID_HANDLE_VALUE; } } if (dir->h != INVALID_HANDLE_VALUE) { char *u = hts_convertUCS2StringToUTF8(find.cFileName, -1); dir->entry.d_name[0] = 0; if (u != NULL) { strncat(dir->entry.d_name, u, HTS_DIRENT_SIZE - 1); freet(u); } return &dir->entry; } errno = ENOENT; return NULL; } int closedir(DIR * dir) { if (dir != NULL) { if (dir->h != INVALID_HANDLE_VALUE) { CloseHandle(dir->h); } if (dir->name != NULL) { free(dir->name); } free(dir); return 0; } errno = EBADF; return -1; } // UTF-8 aware FILE API static void copyWchar(LPWSTR dest, const char *src) { int i; for(i = 0; src[i]; i++) { dest[i] = src[i]; } dest[i] = '\0'; } /* UTF-8 path -> UCS-2 for the _w* file APIs. At/above HTS_WIN_LONGPATH_MIN, \\?\-prefix it via GetFullPathNameW to clear MAX_PATH (#133); else unchanged. Any prefixing failure falls back to the plain converted path. */ #define HTS_WIN_LONGPATH_MIN 240 /* stay clear of MAX_PATH (260) */ LPWSTR hts_pathToUCS2(const char *path) { LPWSTR wpath = hts_convertUTF8StringToUCS2(path, (int) strlen(path), NULL); if (wpath == NULL) { return NULL; } const size_t len = wcslen(wpath); // Already "\\?\" or "\\.\": don't re-prefix. const int verbatim = len >= 4 && wpath[0] == L'\\' && wpath[1] == L'\\' && (wpath[2] == L'?' || wpath[2] == L'.') && wpath[3] == L'\\'; if (len < HTS_WIN_LONGPATH_MIN || verbatim) { return wpath; } const DWORD need = GetFullPathNameW(wpath, 0, NULL, NULL); /* incl NUL */ LPWSTR full = need != 0 ? malloct((size_t) need * sizeof(WCHAR)) : NULL; if (full == NULL) { return wpath; /* fall back to the plain path */ } const DWORD written = GetFullPathNameW(wpath, need, full, NULL); if (written == 0 || written >= need || full[0] == L'\0') { freet(full); return wpath; } const int isUNC = full[0] == L'\\' && full[1] == L'\\'; // UNC "\\srv\share" -> "\\?\UNC\srv\share": the prefix subsumes the "\\". const WCHAR *const pfx = isUNC ? L"\\\\?\\UNC\\" : L"\\\\?\\"; const WCHAR *const body = isUNC ? full + 2 : full; const size_t pfxLen = wcslen(pfx), bodyLen = wcslen(body); LPWSTR out = malloct((pfxLen + bodyLen + 1) * sizeof(WCHAR)); if (out == NULL) { freet(full); return wpath; } memcpybuff(out, pfx, pfxLen * sizeof(WCHAR)); memcpybuff(out + pfxLen, body, (bodyLen + 1) * sizeof(WCHAR)); freet(full); freet(wpath); return out; } FILE *hts_fopen_utf8(const char *path, const char *mode) { WCHAR wmode[32]; LPWSTR wpath = hts_pathToUCS2(path); assertf(strlen(mode) < sizeof(wmode) / sizeof(WCHAR)); copyWchar(wmode, mode); if (wpath != NULL) { FILE *const fp = _wfopen(wpath, wmode); free(wpath); return fp; } else { // Fallback on conversion error. return fopen(path, mode); } } int hts_stat_utf8(const char *path, STRUCT_STAT * buf) { LPWSTR wpath = hts_pathToUCS2(path); if (wpath != NULL) { const int result = _wstat64(wpath, buf); free(wpath); return result; } else { // Fallback on conversion error. return _stat64(path, buf); } } int hts_unlink_utf8(const char *path) { LPWSTR wpath = hts_pathToUCS2(path); if (wpath != NULL) { const int result = _wunlink(wpath); free(wpath); return result; } else { // Fallback on conversion error. return _unlink(path); } } int hts_rename_utf8(const char *oldpath, const char *newpath) { LPWSTR woldpath = hts_pathToUCS2(oldpath); LPWSTR wnewpath = hts_pathToUCS2(newpath); if (woldpath != NULL && wnewpath != NULL) { const int result = _wrename(woldpath, wnewpath); free(woldpath); free(wnewpath); return result; } else { if (woldpath != NULL) free(woldpath); if (wnewpath != NULL) free(wnewpath); // Fallback on conversion error. return rename(oldpath, newpath); } } int hts_rmdir_utf8(const char *path) { LPWSTR wpath = hts_pathToUCS2(path); if (wpath != NULL) { const int result = _wrmdir(wpath); free(wpath); return result; } else { // Fallback on conversion error. return _rmdir(path); } } int hts_mkdir_utf8(const char *path) { LPWSTR wpath = hts_pathToUCS2(path); if (wpath != NULL) { const int result = _wmkdir(wpath); free(wpath); return result; } else { // Fallback on conversion error. return _mkdir(path); } } HTSEXT_API int hts_utime_utf8(const char *path, const STRUCT_UTIMBUF * times) { STRUCT_UTIMBUF mtimes = *times; LPWSTR wpath = hts_pathToUCS2(path); if (wpath != NULL) { const int result = _wutime(wpath, &mtimes); free(wpath); return result; } else { // Fallback on conversion error. return _utime(path, &mtimes); } } #endif // Fin httrack-3.49.14/src/htshelp.c0000644000175000017500000007125115230602340011420 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* command-line help system */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htshelp.h" /* specific definitions */ #include "htsbase.h" #include "htscoremain.h" #include "htscatchurl.h" #include "htslib.h" #include "htsalias.h" #include "htsmodules.h" #ifdef _WIN32 #else #ifdef HAVE_UNISTD_H #include #endif #endif /* END specific definitions */ #define waitkey if (more) { char s[4]; printf("\nMORE.. q to quit\n"); linput(stdin,s,4); if (strcmp(s,"q")==0) quit=1; else printf("Page %d\n\n",++m); } void infomsg(const char *msg) { int l = 0; int m = 0; int more = 0; int quit = 0; int done = 0; // if (msg == NULL) quit = 0; if (msg) { if (!quit) { if (strlen(msg) == 1) { if (msg[0] == '1') { more = 1; return; } } /* afficher alias? */ if (((int) strlen(msg)) > 4) { if (msg[0] == ' ') { if (msg[2] != ' ') { if ((msg[3] == ' ') || (msg[4] == ' ')) { char cmd[32] = "-"; int p; sscanf(msg, "%30s", cmd + strlen(cmd)); /* try the flag as-is, then strip a trailing N as the numeric-arg placeholder (cN -> c); this order keeps -%N from becoming -% */ p = optreal_find(cmd); if (p < 0 && (int) strlen(cmd) > 2 && cmd[strlen(cmd) - 1] == 'N') { cmd[strlen(cmd) - 1] = '\0'; p = optreal_find(cmd); } if (p >= 0) { /* fings type of parameter: number,param,param concatenated,single cmd */ if (strcmp(opttype_value(p), "param") == 0) printf("%s (--%s[=N])\n", msg, optalias_value(p)); else if (strcmp(opttype_value(p), "param1") == 0) printf("%s (--%s )\n", msg, optalias_value(p)); else if (strcmp(opttype_value(p), "param0") == 0) printf("%s (--%s)\n", msg, optalias_value(p)); else printf("%s (--%s)\n", msg, optalias_value(p)); done = 1; } } } } } /* sinon */ if (!done) printf("%s\n", msg); l++; if (l > 20) { l = 0; waitkey; } } } } typedef struct help_wizard_buffers { char urls[HTS_URLMAXSIZE * 2]; char mainpath[256]; char projname[256]; char stropt[2048]; // options char stropt2[2048]; // options longues char strwild[2048]; // wildcards char cmd[4096]; char str[256]; char *argv[256]; } help_wizard_buffers; void help_wizard(httrackp * opt) { help_wizard_buffers *buffers = malloct(sizeof(help_wizard_buffers)); #undef urls #undef mainpath #undef projname #undef stropt #undef stropt2 #undef strwild #undef cmd #undef str #undef argv #define urls (buffers->urls) #define mainpath (buffers->mainpath) #define projname (buffers->projname) #define stropt (buffers->stropt) #define stropt2 (buffers->stropt2) #define strwild (buffers->strwild) #define cmd (buffers->cmd) #define str (buffers->str) #define argv (buffers->argv) // char *a; // if (urls == NULL || mainpath == NULL || projname == NULL || stropt == NULL || stropt2 == NULL || strwild == NULL || cmd == NULL || str == NULL || argv == NULL) { fprintf(stderr, "* memory exhausted in %s, line %d\n", __FILE__, __LINE__); return; } urls[0] = mainpath[0] = projname[0] = stropt[0] = stropt2[0] = strwild[0] = cmd[0] = str[0] = '\0'; // strcpybuff(stropt, "-"); mainpath[0] = projname[0] = stropt2[0] = strwild[0] = '\0'; // printf("\n"); printf("Welcome to HTTrack Website Copier (Offline Browser) " HTTRACK_VERSION "%s\n", hts_get_version_info(opt)); printf("Copyright (C) 1998-%s Xavier Roche and other contributors\n", &__DATE__[7]); #ifdef _WIN32 printf("Note: You are running the commandline version,\n"); printf("run 'WinHTTrack.exe' to get the GUI version.\n"); #endif #ifdef HTTRACK_AFF_WARNING printf("NOTE: " HTTRACK_AFF_WARNING "\n"); #endif #ifdef HTS_PLATFORM_NAME #if USE_BEGINTHREAD printf("[compiled: " HTS_PLATFORM_NAME " - MT]\n"); #else printf("[compiled: " HTS_PLATFORM_NAME "]\n"); #endif #endif printf("To see the option list, enter a blank line or try httrack --help\n"); // // Project name while(strnotempty(projname) == 0) { printf("\n"); printf("Enter project name :"); fflush(stdout); linput(stdin, projname, 250); if (strnotempty(projname) == 0) help("httrack", 1); } // // Path if (strnotempty(hts_gethome())) printf("\nBase path (return=%s/websites/) :", hts_gethome()); else printf("\nBase path (return=current directory) :"); linput(stdin, str, 250); if (!strnotempty(str)) { strcatbuff(str, hts_gethome()); strcatbuff(str, "/websites/"); } if (strnotempty(str)) if ((str[strlen(str) - 1] != '/') && (str[strlen(str) - 1] != '\\')) strcatbuff(str, "/"); strcatbuff(stropt2, "-O \""); strcatbuff(stropt2, str); strcatbuff(stropt2, projname); strcatbuff(stropt2, "\" "); // printf("\n"); printf("Enter URLs (separated by commas or blank spaces) :"); fflush(stdout); linput(stdin, urls, 250); if (strnotempty(urls)) { while((a = strchr(urls, ','))) *a = ' '; while((a = strchr(urls, '\t'))) *a = ' '; // Action printf("\nAction:\n"); switch (help_query ("Mirror Web Site(s)|Mirror Web Site(s) with Wizard|Just Get Files Indicated|Mirror ALL links in URLs (Multiple Mirror)|Test Links In URLs (Bookmark Test)|Update/Continue a Mirror", 1)) { case 1: break; case 2: strcatbuff(stropt, "W"); break; case 3: strcatbuff(stropt2, "--get "); break; case 4: strcatbuff(stropt2, "--mirrorlinks "); break; case 5: strcatbuff(stropt2, "--testlinks "); break; case 6: strcatbuff(stropt2, "--update "); break; case 0: return; break; } // Proxy printf("\nProxy (return=none) :"); linput(stdin, str, 250); if (strnotempty(str)) { while((a = strchr(str, ' '))) *a = ':'; // port if (!strchr(jump_identification_const(str), ':')) { char str2[256]; printf("\nProxy port (return=8080) :"); linput(stdin, str2, 250); strcatbuff(str, ":"); if (strnotempty(str2) == 0) strcatbuff(str, "8080"); else strcatbuff(str, str2); } strcatbuff(stropt2, "-P "); strcatbuff(stropt2, str); strcatbuff(stropt2, " "); } // Display strcatbuff(stropt2, " -%v "); // Wildcards printf ("\nYou can define wildcards, like: -*.gif +www.*.com/*.zip -*img_*.zip\n"); printf("Wildcards (return=none) :"); linput(stdin, strwild, 250); // Options do { printf ("\nYou can define additional options, such as recurse level (-r), separated by blank spaces\n"); printf("To see the option list, type help\n"); printf("Additional options (return=none) :"); linput(stdin, str, 250); if (strfield2(str, "help")) { help("httrack", 2); } else if (strnotempty(str)) { strcatbuff(stropt2, str); strcatbuff(stropt2, " "); } } while(strfield2(str, "help")); { int argc = 1; int g = 0; int i = 0; // printf("\n"); if (strlen(stropt) == 1) stropt[0] = '\0'; // aucune snprintf(cmd, sizeof(cmd), "%s %s %s %s", urls, stropt, stropt2, strwild); printf("---> Wizard command line: httrack %s\n\n", cmd); printf("Ready to launch the mirror? (Y/n) :"); fflush(stdout); linput(stdin, str, 250); if (strnotempty(str)) { if (!((str[0] == 'y') || (str[0] == 'Y'))) return; } printf("\n"); // couper en morceaux argv[0] = strdup("winhttrack"); argv[1] = cmd; argc++; while(cmd[i]) { if (cmd[i] == '\"') g = !g; if (cmd[i] == ' ') { if (!g) { cmd[i] = '\0'; argv[argc++] = cmd + i + 1; } } i++; } hts_main(argc, argv); } } /* Free buffers */ free(buffers); #undef urls #undef mainpath #undef projname #undef stropt #undef stropt2 #undef strwild #undef cmd #undef str #undef argv } int help_query(const char *list, int def) { char s[256]; const char *a; int opt; int n = 1; a = list; while(strnotempty(a)) { const char *b = strchr(a, '|'); if (b) { char str[256]; str[0] = '\0'; // strncatbuff(str, a, (int) (b - a)); if (n == def) printf("(enter)\t%d\t%s\n", n++, str); else printf("\t%d\t%s\n", n++, str); a = b + 1; } else a = list + strlen(list); } printf("\t0\tQuit"); do { printf("\n: "); fflush(stdout); linput(stdin, s, 250); } while((strnotempty(s) != 0) && (sscanf(s, "%d", &opt) != 1)); if (strnotempty(s)) return opt; else return def; } // Capture d'URL void help_catchurl(const char *dest_path) { char BIGSTK adr_prox[HTS_URLMAXSIZE * 2]; int port_prox; T_SOC soc = catch_url_init_std(&port_prox, adr_prox); if (soc != INVALID_SOCKET) { char BIGSTK url[HTS_URLMAXSIZE * 2]; char method[32]; char BIGSTK data[CATCH_URL_DATA_SIZE]; url[0] = method[0] = data[0] = '\0'; // printf ("Okay, temporary proxy installed.\nSet your browser's preferences to:\n\n"); printf("\tProxy's address: \t%s\n\tProxy's port: \t%d\n", adr_prox, port_prox); // if (catch_url(soc, url, method, data)) { char BIGSTK dest[HTS_URLMAXSIZE * 2]; int i = 0; do { snprintf(dest, sizeof(dest), "%s%s%d", dest_path, "hts-post", i); i++; } while (fexist_utf8(dest)); { FILE *fp = FOPEN(dest, "wb"); if (fp) { fwrite(data, strlen(data), 1, fp); fclose(fp); } } // former URL! { char BIGSTK finalurl[HTS_URLMAXSIZE * 2]; inplace_escape_check_url(dest, sizeof(dest)); snprintf(finalurl, sizeof(finalurl), "%s" POSTTOK "file:%s", url, dest); printf("\nThe URL is: \"%s\"\n", finalurl); printf("You can capture it through: httrack \"%s\"\n", finalurl); } } else printf("Unable to analyse the URL\n"); #ifdef _WIN32 closesocket(soc); #else close(soc); #endif } else printf("Unable to create a temporary proxy (no remaining port)\n"); } // mini-aide (h: help) // y void help(const char *app, int more) { char info[2048]; infomsg(""); if (more) infomsg("1"); if (more != 2) { snprintf(info, sizeof(info), "HTTrack version " HTTRACK_VERSION "%s", hts_is_available()); infomsg(info); #ifdef HTTRACK_AFF_WARNING infomsg("NOTE: " HTTRACK_AFF_WARNING); #endif snprintf(info, sizeof(info), "\tusage: %s [-option] [+] [-] [+] [-]", app); infomsg(info); infomsg("\twith options listed below: (* is the default value)"); infomsg(""); } infomsg("General options:"); infomsg (" O path for mirror/logfiles+cache (-O path_mirror[,path_cache_and_logfiles])"); infomsg(""); infomsg("Action options:"); infomsg(" w *mirror web sites"); infomsg(" W mirror web sites, semi-automatic (asks questions)"); infomsg(" g just get files (saved in the current directory)"); infomsg(" i continue an interrupted mirror using the cache"); infomsg (" Y mirror ALL links located in the first level pages (mirror links)"); infomsg(""); infomsg("Proxy options:"); infomsg(" P proxy use (-P [socks5://|connect://][user:pass@]proxy:port)"); infomsg(" %f *use proxy for ftp (f0 don't use)"); infomsg(" %b use this local hostname to make/send requests (-%b hostname)"); infomsg(""); infomsg("Limits options:"); infomsg(" rN set the mirror depth to N (* r9999)"); infomsg(" %eN set the external links depth to N (* %e0)"); infomsg(" mN maximum file length for a non-html file"); infomsg(" mN,N2 maximum file length for non html (N) and html (N2)"); infomsg(" MN maximum overall size that can be uploaded/scanned"); infomsg(" EN maximum mirror time in seconds (60=1 minute, 3600=1 hour)"); infomsg(" AN maximum transfer rate in bytes/seconds (1000=1KB/s max)"); infomsg(" %cN maximum number of connections/seconds (*%c5)"); infomsg(" %G random pause of MIN[:MAX] seconds between files (e.g. %G5:10)"); infomsg (" GN pause transfer if N bytes reached, and wait until lock file is deleted"); infomsg(""); infomsg("Flow control:"); infomsg(" cN number of multiple connections (*c4)"); infomsg(" TN timeout, number of seconds after a non-responding link is" " shutdown; also bounds host name resolution"); infomsg (" RN number of retries, in case of timeout or non-fatal errors (*R1)"); infomsg (" JN traffic jam control, minimum transfert rate (bytes/seconds) tolerated for a link"); infomsg (" HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow"); infomsg(""); infomsg("Links options:"); infomsg (" %P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use)"); infomsg (" n get non-html files 'near' an html file (ex: an image located outside)"); infomsg(" t test all URLs (even forbidden ones)"); infomsg (" %L add all URL located in this text file (one URL per line)"); infomsg (" %S add all scan rules located in this text file (one scan rule per line)"); infomsg(""); infomsg("Build options:"); infomsg(" NN structure type (0 *original structure, 1+: see below)"); infomsg(" or user defined structure (-N \"%h%p/%n%q.%t\")"); infomsg (" %N delayed type check, don't make any link test but wait for files download to start instead (experimental) (%N0 don't use, %N1 use for unknown extensions, * %N2 always use)"); infomsg (" %D cached delayed type check, don't wait for remote type during updates, to speedup them (%D0 wait, * %D1 don't wait)"); infomsg(" %M generate a RFC MIME-encapsulated full-archive (.mht)"); infomsg(" %t keep the original file extension, don't rewrite it from the " "MIME type (%t0 rewrite)"); infomsg (" LN long names (L1 *long names / L0 8-3 conversion / L2 ISO9660 compatible)"); infomsg (" KN keep original links (e.g. http://www.adr/link) (K0 *relative link, K absolute links, K4 original links, K3 absolute URI links, K5 transparent proxy link)"); infomsg(" x replace external html links by error pages"); infomsg (" %x do not include any password for external password protected websites (%x0 include)"); infomsg (" %q *include query string for local files (useless, for information purpose only) (%q0 don't include)"); infomsg(" %g strip query keys for dedup ([host/pattern=]key1,key2,...)"); infomsg (" o *generate output html file in case of error (404..) (o0 don't generate)"); infomsg(" X *purge old files after update (X0 keep delete)"); infomsg(" %p preserve html files 'as is' (identical to '-K4 -%F \"\"')"); infomsg(" %T links conversion to UTF-8"); infomsg(""); infomsg("Spider options:"); infomsg(" bN accept cookies in cookies.txt (0=do not accept,* 1=accept)"); infomsg(" %K load extra cookies from a Netscape cookies.txt"); infomsg(" %Y explain which filter rule accepts or rejects a URL, then exit"); infomsg (" u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)"); infomsg(" j *parse scripts (j0 don't parse, bitmask: |1 parse default, |4 " "don't parse .js |8 don't be aggressive)"); infomsg (" sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules))"); infomsg (" %h force HTTP/1.0 requests (reduce update features, only for old servers or proxies)"); infomsg (" %k use keep-alive if possible, greately reducing latency for small files and test requests (%k0 don't use)"); infomsg(" %z do not request compressed content (%z0 request)"); infomsg (" %B tolerant requests (accept bogus responses on some servers, but not standard!)"); infomsg (" %s update hacks: various hacks to limit re-transfers when updating (identical size, bogus response..)"); infomsg (" %u url hacks: various hacks to limit duplicate URLs (strip //, www.foo.com==foo.com..)"); infomsg(" opt out of one url-hack part: --keep-www-prefix " "(www.foo.com<>foo.com), --keep-double-slashes (//), " "--keep-query-order (?b&a)"); infomsg (" %A assume that a type (cgi,asp..) is always linked with a mime type (-%A php3,cgi=text/html;dat,bin=application/x-zip)"); infomsg(" shortcut: '--assume standard' is equivalent to -%A " HTS_ASSUME_STANDARD); infomsg (" can also be used to force a specific file type: --assume foo.cgi=text/html"); infomsg (" @iN internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only)"); infomsg(" %w disable a specific external mime module (-%w httrack-plugin)"); infomsg(""); infomsg("Browser ID:"); infomsg (" F user-agent field sent in HTTP headers (-F \"user-agent name\")"); infomsg(" %R default referer field sent in HTTP headers"); infomsg(" %E from email address sent in HTTP headers"); infomsg( " %F footer string in Html code (-%F \"Mirrored from {url} on " "{date}\"; fields {addr} {path} {url} {date} {lastmodified} {version} " "{mime} {charset} {status} {size}, or legacy %s)"); infomsg(" %l preferred language (-%l \"fr, en, jp, *\""); infomsg(" %a accepted formats (-%a \"text/html,image/png;q=0.9,*/*;q=0.1\""); infomsg(" %X additional HTTP header line (-%X \"X-Magic: 42\""); infomsg(""); infomsg("Log, index, cache"); infomsg (" C create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)"); infomsg(" k store all files in cache (not useful if files on disk)"); infomsg(" %r write an ISO-28500 WARC/1.1 archive; --warc-file NAME sets the " "output name, --warc-max-size N rotates segments past N bytes, " "--warc-cdx also writes a sorted CDXJ index, --wacz packages it all " "as a WACZ file"); infomsg(" %n do not re-download locally erased files"); infomsg (" %v display on screen filenames downloaded (in realtime) - * %v1 short version - %v2 full animation"); infomsg(" Q no log - quiet mode"); infomsg(" q no questions - quiet mode"); infomsg(" z log - extra infos"); infomsg(" Z log - debug"); infomsg(" v log on screen"); infomsg(" f *log in files"); infomsg(" f2 one single log file"); infomsg(" I *make an index (I0 don't make)"); infomsg(" %i make a top index for a project folder (* %i0 don't make)"); infomsg(" %I make an searchable index for this mirror (* %I0 don't make)"); infomsg(""); infomsg("Expert options:"); infomsg(" pN priority mode: (* p3)"); infomsg(" p0 just scan, don't save anything (for checking links)"); infomsg(" p1 save only html files"); infomsg(" p2 save only non html files"); infomsg(" *p3 save all files"); infomsg(" p7 get html files before, then treat other files"); infomsg(" S stay on the same directory"); infomsg(" D *can only go down into subdirs"); infomsg(" U can only go to upper directories"); infomsg(" B can both go up&down into the directory structure"); infomsg(" a *stay on the same address"); infomsg(" d stay on the same principal domain"); infomsg(" l stay on the same TLD (eg: .com)"); infomsg(" e go everywhere on the web"); infomsg(" %H debug HTTP headers in logfile"); infomsg(""); infomsg("Guru options: (do NOT use if possible)"); infomsg(" #test list engine self-tests (run one with -#test=NAME [args])"); infomsg(" #C cache list (-#C '*.com/spider*.gif'"); infomsg(" #R cache repair (damaged cache)"); infomsg(" #d debug parser"); infomsg(" #E extract new.zip cache meta-data in meta.zip"); infomsg(" #f always flush log files"); infomsg(" #FN maximum number of filters"); infomsg(" #h version info"); infomsg(" #K scan stdin (debug)"); infomsg(" #L maximum number of links (-#L1000000)"); infomsg(" #p display ugly progress information"); infomsg(" #P catch URL"); infomsg(" #T generate transfer ops. log every minutes"); infomsg(" #u wait time"); infomsg(" #Z generate transfer rate statistics every minutes"); infomsg(""); infomsg ("Dangerous options: (do NOT use unless you exactly know what you are doing)"); infomsg (" %! bypass built-in security limits aimed to avoid bandwidth abuses (bandwidth, simultaneous connections)"); infomsg(" IMPORTANT NOTE: DANGEROUS OPTION, ONLY SUITABLE FOR EXPERTS"); infomsg(" USE IT WITH EXTREME CARE"); infomsg(""); infomsg("Command-line specific options:"); infomsg (" V execute system command after each files ($0 is the filename: -V \"rm \\$0\")"); infomsg(" %W use an external library function as a wrapper (-%W " "myfoo.so[,myparameters])"); infomsg(" y go to background when suspended (y0 don't)"); infomsg(""); infomsg("Details: Option N"); infomsg(" N0 Site-structure (default)"); infomsg(" N1 HTML in web/, images/other files in web/images/"); infomsg(" N2 HTML in web/HTML, images/other in web/images"); infomsg(" N3 HTML in web/, images/other in web/"); infomsg (" N4 HTML in web/, images/other in web/xxx, where xxx is the file extension (all gif will be placed onto web/gif, for example)"); infomsg(" N5 Images/other in web/xxx and HTML in web/HTML"); infomsg(" N99 All files in web/, with random names (gadget !)"); infomsg(" N100 Site-structure, without www.domain.xxx/"); infomsg (" N101 Identical to N1 except that \"web\" is replaced by the site's name"); infomsg (" N102 Identical to N2 except that \"web\" is replaced by the site's name"); infomsg (" N103 Identical to N3 except that \"web\" is replaced by the site's name"); infomsg (" N104 Identical to N4 except that \"web\" is replaced by the site's name"); infomsg (" N105 Identical to N5 except that \"web\" is replaced by the site's name"); infomsg (" N199 Identical to N99 except that \"web\" is replaced by the site's name"); infomsg(" N1001 Identical to N1 except that there is no \"web\" directory"); infomsg(" N1002 Identical to N2 except that there is no \"web\" directory"); infomsg (" N1003 Identical to N3 except that there is no \"web\" directory (option set for g option)"); infomsg(" N1004 Identical to N4 except that there is no \"web\" directory"); infomsg(" N1005 Identical to N5 except that there is no \"web\" directory"); infomsg(" N1099 Identical to N99 except that there is no \"web\" directory"); infomsg("Details: User-defined option N"); infomsg(" '%n' Name of file without file type (ex: image)"); infomsg(" '%N' Name of file, including file type (ex: image.gif)"); infomsg(" '%t' File type (ex: gif)"); infomsg(" '%p' Path [without ending /] (ex: /someimages)"); infomsg(" '%h' Host name (ex: www.example.com)"); infomsg(" '%M' URL MD5 (128 bits, 32 ascii bytes)"); infomsg(" '%Q' query string MD5 (128 bits, 32 ascii bytes)"); infomsg(" '%k' full query string"); infomsg(" '%r' protocol name (ex: http)"); infomsg(" '%q' small query string MD5 (16 bits, 4 ascii bytes)"); infomsg(" '%s?' Short name version (ex: %sN)"); infomsg(" '%[param]' param variable in query string"); infomsg (" '%[param:before:after:empty:notfound]' advanced variable extraction"); infomsg("Details: User-defined option N and advanced variable extraction"); infomsg(" %[param:before:after:empty:notfound]"); infomsg(" param : parameter name"); infomsg(" before : string to prepend if the parameter was found"); infomsg(" after : string to append if the parameter was found"); infomsg (" notfound : string replacement if the parameter could not be found"); infomsg(" empty : string replacement if the parameter was empty"); infomsg (" all fields, except the first one (the parameter name), can be empty"); infomsg(""); infomsg("Details: Option K"); infomsg(" K0 foo.cgi?q=45 -> foo4B54.html?q=45 (relative URI, default)"); infomsg (" K -> http://www.foobar.com/folder/foo.cgi?q=45 (absolute URL)"); infomsg(" K3 -> /folder/foo.cgi?q=45 (absolute URI)"); infomsg(" K4 -> foo.cgi?q=45 (original URL)"); infomsg (" K5 -> http://www.foobar.com/folder/foo4B54.html?q=45 (transparent proxy URL)"); infomsg(""); infomsg("Shortcuts:"); infomsg("--mirror *make a mirror of site(s) (default)"); infomsg ("--get get the files indicated, do not seek other URLs (-qg)"); infomsg("--list add all URL located in this text file (-%L)"); infomsg("--mirrorlinks mirror all links in 1st level pages (-Y)"); infomsg("--testlinks test links in pages (-r1p0C0I0t)"); infomsg ("--spider spider site(s), to test links: reports Errors & Warnings (-p0C0I0t)"); infomsg("--testsite identical to --spider"); infomsg ("--skeleton make a mirror, but gets only html files (-p1)"); infomsg("--update update a mirror, without confirmation (-iC2)"); infomsg ("--continue continue a mirror, without confirmation (-iC1)"); infomsg(""); infomsg ("--catchurl create a temporary proxy to capture an URL or a form post URL"); infomsg("--clean erase cache & log files"); infomsg(""); infomsg("--http10 force http/1.0 requests (-%h)"); infomsg(""); infomsg("Details: Option %W: External callbacks prototypes"); infomsg("see htsdefines.h"); infomsg(""); infomsg("example: httrack www.example.com/bob/"); infomsg("means: mirror site www.example.com/bob/ and only this site"); infomsg(""); infomsg ("example: httrack www.example.com/bob/ www.anothertest.com/mike/ +*.com/*.jpg -mime:application/*"); infomsg ("means: mirror the two sites together (with shared links) and accept any .jpg files on .com sites"); infomsg(""); infomsg("example: httrack www.example.com/bob/bobby.html +* -r6"); infomsg ("means get all files starting from bobby.html, with 6 link-depth, and possibility of going everywhere on the web"); infomsg(""); infomsg ("example: httrack www.example.com/bob/bobby.html --spider -P proxy.myhost.com:8080"); infomsg("runs the spider on www.example.com/bob/bobby.html using a proxy"); infomsg(""); infomsg("example: httrack --update"); infomsg("updates a mirror in the current folder"); infomsg(""); infomsg("example: httrack"); infomsg("will bring you to the interactive mode"); infomsg(""); infomsg("example: httrack --continue"); infomsg("continues a mirror in the current folder"); infomsg(""); snprintf(info, sizeof(info), "HTTrack version " HTTRACK_VERSION "%s", hts_is_available()); infomsg(info); snprintf(info, sizeof(info), "Copyright (C) 1998-%s Xavier Roche and other contributors", &__DATE__[7]); infomsg(info); #ifdef HTS_PLATFORM_NAME infomsg("[compiled: " HTS_PLATFORM_NAME "]"); #endif infomsg(NULL); } httrack-3.49.14/src/htshash.c0000644000175000017500000003302115230602340011404 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* hash table system (fast index) */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE #include "htsopt.h" #include "htshash.h" /* specific definitions */ #include "htsbase.h" #include "htsglobal.h" #include "htsmd5.h" #include "htscore.h" #include "coucal.h" /* END specific definitions */ /* Specific macros */ #ifndef malloct #define malloct malloc #define freet free #define calloct calloc #define strcpybuff strcpy #endif // GESTION DES TABLES DE HACHAGE // Méthode à 2 clés (adr+fil), 2e cle facultative // hash[no_enregistrement][pos]->hash est un index dans le tableau général liens // type: numero enregistrement - 0 est case insensitive (sav) 1 (adr+fil) 2 (former_adr+former_fil) // recherche dans la table selon nom1,nom2 et le no d'enregistrement /* Key free handler (NOOP) ; addresses are kept */ static void key_freehandler(void *arg, coucal_key value) { } /* Key strdup (pointer copy) */ static coucal_key key_duphandler(void *arg, coucal_key_const name) { union { coucal_key_const roname; coucal_key name; } u; u.roname = name; return u.name; } /* Key sav hashes are using case-insensitive version */ static coucal_hashkeys key_sav_hashes(void *arg, coucal_key_const key) { hash_struct *const hash = (hash_struct*) arg; convtolower(hash->catbuff, sizeof(hash->catbuff), (const char *) key); return coucal_hash_string(hash->catbuff); } /* Key sav comparison is case-insensitive */ static int key_sav_equals(void *arg, coucal_key_const a_, coucal_key_const b_) { const char *const a = (const char*) a_; const char *const b = (const char*) b_; return strcasecmp(a, b) == 0; } static const char* key_sav_debug_print(void *arg, coucal_key_const a) { return (const char*) a; } static const char* value_sav_debug_print(void *arg, coucal_value_const a) { return (char*) a.ptr; } /* Pseudo-key (lien_url structure) hash function */ static coucal_hashkeys key_adrfil_hashes_generic(void *arg, coucal_key_const value, const int former) { hash_struct *const hash = (hash_struct*) arg; const lien_url*const lien = (const lien_url*) value; const char *const adr = !former ? lien->adr : lien->former_adr; const char *const fil = !former ? lien->fil : lien->former_fil; const char *const adr_norm = adr != NULL ? (hash->norm_host ? jump_normalized_const(adr) : jump_identification_const(adr)) : NULL; // copy address assertf(adr_norm != NULL); strcpy(hash->normfil, adr_norm); // copy link assertf(fil != NULL); { /* resolve the per-URL strip keys; strip applies even when urlhack is off */ char BIGSTK keybuf[HTS_URLMAXSIZE]; const char *const keys = hts_query_strip_keys(hash->strip_query, adr, fil, keybuf, sizeof(keybuf)); if (hash->norm_slash || hash->norm_query || keys != NULL) { fil_normalized_filtered_ex(fil, &hash->normfil[strlen(hash->normfil)], keys, hash->norm_slash, hash->norm_query); } else { strcpy(&hash->normfil[strlen(hash->normfil)], fil); } } // hash return coucal_hash_string(hash->normfil); } /* Pseudo-key (lien_url structure) comparison function */ static int key_adrfil_equals_generic(void *arg, coucal_key_const a_, coucal_key_const b_, const int former) { hash_struct *const hash = (hash_struct *) arg; const lien_url*const a = (const lien_url*) a_; const lien_url*const b = (const lien_url*) b_; const char *const a_adr = !former ? a->adr : a->former_adr; const char *const b_adr = !former ? b->adr : b->former_adr; const char *const a_fil = !former ? a->fil : a->former_fil; const char *const b_fil = !former ? b->fil : b->former_fil; const char *ja; const char *jb; // safety assertf(a_adr != NULL); assertf(b_adr != NULL); assertf(a_fil != NULL); assertf(b_fil != NULL); // skip scheme and authentication to the domain (possibly without www.) ja = hash->norm_host ? jump_normalized_const(a_adr) : jump_identification_const(a_adr); jb = hash->norm_host ? jump_normalized_const(b_adr) : jump_identification_const(b_adr); assertf(ja != NULL); assertf(jb != NULL); if (strcasecmp(ja, jb) != 0) { return 0; } // now compare pathes { char BIGSTK ka[HTS_URLMAXSIZE], kb[HTS_URLMAXSIZE]; const char *const keysa = hts_query_strip_keys(hash->strip_query, a_adr, a_fil, ka, sizeof(ka)); const char *const keysb = hts_query_strip_keys(hash->strip_query, b_adr, b_fil, kb, sizeof(kb)); if (hash->norm_slash || hash->norm_query || keysa != NULL || keysb != NULL) { fil_normalized_filtered_ex(a_fil, hash->normfil, keysa, hash->norm_slash, hash->norm_query); fil_normalized_filtered_ex(b_fil, hash->normfil2, keysb, hash->norm_slash, hash->norm_query); return strcmp(hash->normfil, hash->normfil2) == 0; } else { return strcmp(a_fil, b_fil) == 0; } } } static const char* key_adrfil_debug_print_(void *arg, coucal_key_const a_, const int former) { hash_struct *const hash = (hash_struct*) arg; const lien_url*const a = (const lien_url*) a_; const char *const a_adr = !former ? a->adr : a->former_adr; const char *const a_fil = !former ? a->fil : a->former_fil; snprintf(hash->normfil, sizeof(hash->normfil), "%s%s", a_adr, a_fil); return hash->normfil; } static const char* key_adrfil_debug_print(void *arg, coucal_key_const a_) { return key_adrfil_debug_print_(arg, a_, 0); } static const char* key_former_adrfil_debug_print(void *arg, coucal_key_const a_) { return key_adrfil_debug_print_(arg, a_, 1); } static const char* value_adrfil_debug_print(void *arg, coucal_value_const value) { hash_struct *const hash = (hash_struct*) arg; snprintf(hash->normfil2, sizeof(hash->normfil2), "%d", (int) value.intg); return hash->normfil2; } /* "adr"/"fil" lien_url structure members hashing function */ static coucal_hashkeys key_adrfil_hashes(void *arg, coucal_key_const value_) { return key_adrfil_hashes_generic(arg, value_, 0); } /* "adr"/"fil" lien_url structure members comparison function */ static int key_adrfil_equals(void *arg, coucal_key_const a, coucal_key_const b) { return key_adrfil_equals_generic(arg, a, b, 0); } /* "former_adr"/"former_fil" lien_url structure members hashing function */ static coucal_hashkeys key_former_adrfil_hashes(void *arg, coucal_key_const value_) { return key_adrfil_hashes_generic(arg, value_, 1); } /* "former_adr"/"former_fil" lien_url structure members comparison function */ static int key_former_adrfil_equals(void *arg, coucal_key_const a, coucal_key_const b) { return key_adrfil_equals_generic(arg, a, b, 1); } void hash_init(httrackp *opt, hash_struct *hash, hts_boolean normalized) { hash->sav = coucal_new(0); hash->adrfil = coucal_new(0); hash->former_adrfil = coucal_new(0); /* urlhack is the umbrella; per-feature negatives opt out of each part */ hash->norm_host = normalized && !opt->no_www_dedup; hash->norm_slash = normalized && !opt->no_slash_dedup; hash->norm_query = normalized && !opt->no_query_dedup; /* snapshot the query-strip list (not owned; valid for the hash lifetime) */ hash->strip_query = StringNotEmpty(opt->strip_query) ? StringBuff(opt->strip_query) : NULL; hts_set_hash_handler(hash->sav, opt); hts_set_hash_handler(hash->adrfil, opt); hts_set_hash_handler(hash->former_adrfil, opt); coucal_set_name(hash->sav, "hash->sav"); coucal_set_name(hash->adrfil, "hash->adrfil"); coucal_set_name(hash->former_adrfil, "hash->former_adrfil"); /* Case-insensitive comparison ; keys are direct char* filenames */ coucal_value_set_key_handler(hash->sav, key_duphandler, key_freehandler, key_sav_hashes, key_sav_equals, hash); /* URL-style comparison ; keys are lien_url structure pointers casted to char* */ coucal_value_set_key_handler(hash->adrfil, key_duphandler, key_freehandler, key_adrfil_hashes, key_adrfil_equals, hash); coucal_value_set_key_handler(hash->former_adrfil, key_duphandler, key_freehandler, key_former_adrfil_hashes, key_former_adrfil_equals, hash); /* pretty-printing */ coucal_set_print_handler(hash->sav, key_sav_debug_print, value_sav_debug_print, NULL); coucal_set_print_handler(hash->adrfil, key_adrfil_debug_print, value_adrfil_debug_print, hash); coucal_set_print_handler(hash->former_adrfil, key_former_adrfil_debug_print, value_adrfil_debug_print, hash); } void hash_free(hash_struct *hash) { if (hash != NULL) { coucal_delete(&hash->sav); coucal_delete(&hash->adrfil); coucal_delete(&hash->former_adrfil); } } /* Test helper: do the two URLs dedupe to the same key under opt's urlhack flags? Exercises the live hash compare (norm_host/slash/query resolution). */ hts_boolean hash_url_equals(httrackp *opt, const char *adra, const char *fila, const char *adrb, const char *filb) { hash_struct hash; lien_url la, lb; hts_boolean eq; memset(&la, 0, sizeof(la)); memset(&lb, 0, sizeof(lb)); la.adr = key_duphandler(NULL, adra); la.fil = key_duphandler(NULL, fila); lb.adr = key_duphandler(NULL, adrb); lb.fil = key_duphandler(NULL, filb); hash_init(opt, &hash, opt->urlhack); eq = key_adrfil_equals(&hash, &la, &lb); hash_free(&hash); return eq; } // retour: position ou -1 si non trouvé int hash_read(const hash_struct * hash, const char *nom1, const char *nom2, hash_struct_type type) { intptr_t intvalue; lien_url lien; /* read */ switch(type) { case HASH_STRUCT_FILENAME: if (coucal_read(hash->sav, nom1, &intvalue)) { return (int) intvalue; } else { return -1; } break; case HASH_STRUCT_ADR_PATH: memset(&lien, 0, sizeof(lien)); lien.adr = key_duphandler(NULL, nom1); lien.fil = key_duphandler(NULL, nom2); if (coucal_read(hash->adrfil, (char*) &lien, &intvalue)) { return (int) intvalue; } else { return -1; } break; case HASH_STRUCT_ORIGINAL_ADR_PATH: memset(&lien, 0, sizeof(lien)); lien.former_adr = key_duphandler(NULL, nom1); lien.former_fil = key_duphandler(NULL, nom2); if (coucal_read(hash->former_adrfil, (char*) &lien, &intvalue)) { return (int) intvalue; } else { return -1; } break; default: assertf(! "unexpected case"); return -1; break; } } // enregistrement lien lpos dans les 3 tables hash1..3 void hash_write(hash_struct * hash, size_t lpos) { /* first entry: destination filename (lowercased) */ coucal_write(hash->sav, (*hash->liens)[lpos]->sav, lpos); /* second entry: URL address and path */ coucal_write(hash->adrfil, (*hash->liens)[lpos], lpos); /* third entry: URL address and path before redirect */ if ((*hash->liens)[lpos]->former_adr) { // former_adr existe? coucal_write(hash->former_adrfil, (*hash->liens)[lpos], lpos); } } httrack-3.49.14/src/htsftp.c0000644000175000017500000007457415230602340011274 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: basic FTP protocol manager */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE // Gestion protocole ftp // Version .05 (01/2000) #include "htsftp.h" #include "htscore.h" #include "htsthread.h" #ifdef _WIN32 #else //inet_ntoa #include #endif #ifdef _WIN32 #ifndef __cplusplus // DOS #include /* _beginthread, _endthread */ #endif #endif // ftp mode passif #define FTP_PASV 1 #define FTP_DEBUG 0 #if USE_BEGINTHREAD void back_launch_ftp(void *pP) { FTPDownloadStruct *pStruct = (FTPDownloadStruct *) pP; if (pStruct == NULL) return; if (pStruct == NULL) { #if FTP_DEBUG printf("[ftp error: no args]\n"); #endif return; } /* Initialize */ hts_init(); // lancer ftp #if FTP_DEBUG printf("[Launching main ftp routine]\n"); #endif run_launch_ftp(pStruct); // prêt pStruct->pBack->status = STATUS_FTP_READY; /* Delete structure */ free(pP); /* Uninitialize */ hts_uninit(); return; } // lancer en back void launch_ftp(FTPDownloadStruct * params) { // DOS #if FTP_DEBUG printf("[Launching main ftp thread]\n"); #endif hts_newthread(back_launch_ftp, (void *) params); } #else #error No more supported #endif // pour l'arrêt du ftp #ifdef _WIN32 #define _T_SOC_close(soc) do { closesocket(soc); soc=INVALID_SOCKET; } while(0) #else #define _T_SOC_close(soc) do { close(soc); soc=INVALID_SOCKET; } while(0) #endif #define _HALT_FTP { \ if ( soc_ctl != INVALID_SOCKET ) _T_SOC_close(soc_ctl); \ if ( soc_servdat != INVALID_SOCKET ) _T_SOC_close(soc_servdat); \ if ( soc_dat != INVALID_SOCKET ) _T_SOC_close(soc_dat); \ } #define _CHECK_HALT_FTP \ if (stop_ftp(back)) { \ _HALT_FTP \ return 0; \ } /* Bounded split of a hostile-URL "user[:pass]@" prefix (see htsftp.h). */ void ftp_split_userpass(const char *src, const char *end, char *user, size_t user_size, char *pass, size_t pass_size) { size_t n = 0; assertf(user_size > 0 && pass_size > 0); /* the size-1 math underflows on 0 */ while (src[n] != '\0' && src[n] != ':') { if (n < user_size - 1) user[n] = src[n]; n++; } user[n < user_size ? n : user_size - 1] = '\0'; pass[0] = '\0'; if (src[n] == ':') { // password follows the colon const size_t base = n + 1; size_t k = 0; while (&src[base + k + 1] < end && src[base + k] != '\0') { if (k < pass_size - 1) pass[k] = src[base + k]; k++; } pass[k < pass_size ? k : pass_size - 1] = '\0'; } } // la véritable fonction une fois lancées les routines thread/fork int run_launch_ftp(FTPDownloadStruct * pStruct) { lien_back *back = pStruct->pBack; httrackp *opt = pStruct->pOpt; char user[256] = "anonymous"; char pass[256] = "user@"; char line_retr[2048]; int port = 21; #if FTP_PASV int port_pasv = 0; #endif char BIGSTK adr_ip[1024]; char *adr, *real_adr; const char *ftp_filename = ""; int timeout = 300; // timeout int timeout_onfly = 8; // attente réponse supplémentaire int transfer_list = 0; // directory int rest_understood = 0; // rest command understood // T_SOC soc_ctl = INVALID_SOCKET; T_SOC soc_servdat = INVALID_SOCKET; T_SOC soc_dat = INVALID_SOCKET; SOCaddr server_data; // line_retr[0] = adr_ip[0] = '\0'; timeout = 300; // effacer strcpybuff(back->r.msg, ""); back->r.statuscode = 0; back->r.size = 0; // récupérer user et pass si présents, et sauter user:id@ dans adr real_adr = strchr(back->url_adr, ':'); if (real_adr) real_adr++; else real_adr = back->url_adr; while(*real_adr == '/') real_adr++; // sauter / if ((adr = jump_identification(real_adr)) != real_adr) { // user ftp_split_userpass(real_adr, adr, user, sizeof(user), pass, sizeof(pass)); } // Calculer RETR { char *a; a = back->url_fil; if (a != NULL && *a != '\0') { ftp_filename = a; if (strnotempty(a)) { char catbuff[CATBUFF_SIZE]; char *ua = unescape_http(catbuff, sizeof(catbuff), a); int len_a = (int) strlen(ua); if (len_a > 0 && ua[len_a - 1] == '/') { /* obviously a directory listing */ transfer_list = 1; snprintf(line_retr, sizeof(line_retr), "LIST -A %s", ua); } else if ((strchr(ua, ' ')) || (strchr(ua, '\"')) || (strchr(ua, '\'')) ) { snprintf(line_retr, sizeof(line_retr), "RETR \"%s\"", ua); } else { /* Regular one */ snprintf(line_retr, sizeof(line_retr), "RETR %s", ua); } } else { transfer_list = 1; snprintf(line_retr, sizeof(line_retr), "LIST -A"); } } else { strcpybuff(back->r.msg, "Unexpected PORT error"); back->r.statuscode = STATUSCODE_INVALID; } } #if FTP_DEBUG printf("Connecting to %s...\n", adr); #endif // connexion { SOCaddr server; char *a; char _adr[256]; const char *error = "unknown error"; _adr[0] = '\0'; //T_SOC soc_ctl; // effacer structure memset(&server, 0, sizeof(server)); // port a = strchr(adr, ':'); // port if (a) { // folding a nonsense port into 1..65535 fetches one the link never named; // an empty "host:" just means the default (#614) if (a[1] != '\0' && !hts_parse_url_port(a + 1, &port)) { snprintf(back->r.msg, sizeof(back->r.msg), "Invalid port: %s", a + 1); back->r.statuscode = STATUSCODE_INVALID; // permanent, unlike a DNS miss _HALT_FTP return 0; } strncatbuff(_adr, adr, (int) (a - adr)); } else strcpybuff(_adr, adr); // récupérer adresse résolue strcpybuff(back->info, "host name"); if (hts_dns_resolve2(opt, _adr, &server, &error) == NULL) { snprintf(back->r.msg, sizeof(back->r.msg), "Unable to get server's address: %s", error); back->r.statuscode = STATUSCODE_NON_FATAL; _HALT_FTP return 0; } _CHECK_HALT_FTP; // copie adresse pour cnx data SOCaddr_copy_SOCaddr(server_data, server); // créer ("attachement") une socket (point d'accès) internet,en flot soc_ctl = (T_SOC) socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0); if (soc_ctl == INVALID_SOCKET) { strcpybuff(back->r.msg, "Unable to create a socket"); back->r.statuscode = STATUSCODE_INVALID; _HALT_FTP return 0; } SOCaddr_initport(server, port); // connexion (bloquante, on est en thread) strcpybuff(back->info, "connect"); if (connect(soc_ctl, &SOCaddr_sockaddr(server), SOCaddr_size(server)) != 0) { strcpybuff(back->r.msg, "Unable to connect to the server"); back->r.statuscode = STATUSCODE_INVALID; _HALT_FTP return 0; #ifdef _WIN32 } #else } #endif _CHECK_HALT_FTP; { char BIGSTK line[1024]; // envoi du login // --USER-- get_ftp_line(soc_ctl, line, sizeof(line), timeout); // en tête _CHECK_HALT_FTP; if (line[0] == '2') { // ok, connecté strcpybuff(back->info, "login: user"); snprintf(line, sizeof(line), "USER %s", user); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if ((line[0] == '3') || (line[0] == '2')) { // --PASS-- if (line[0] == '3') { strcpybuff(back->info, "login: pass"); snprintf(line, sizeof(line), "PASS %s", pass); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; } if (line[0] == '2') { // ok send_line(soc_ctl, "TYPE I"); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if (line[0] == '2') { // ok } else { strcpybuff(back->r.msg, "TYPE I error"); back->r.statuscode = STATUSCODE_INVALID; } } else { snprintf(back->r.msg, sizeof(back->r.msg), "Bad password: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } } else { snprintf(back->r.msg, sizeof(back->r.msg), "Bad user name: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } } else { snprintf(back->r.msg, sizeof(back->r.msg), "Connection refused: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } // ok, si on est prêts on écoute sur un port et on demande la sauce if (back->r.statuscode != -1) { // // Pré-REST // #if FTP_PASV if (SOCaddr_getproto(server) == '1') { strcpybuff(back->info, "pasv"); snprintf(line, sizeof(line), "PASV"); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); } else { /* ipv6 */ line[0] = '\0'; } _CHECK_HALT_FTP; if (line[0] == '2') { char *a, *b, *c; a = strchr(line, '('); // exemple: 227 Entering Passive Mode (123,45,67,89,177,27) if (a) { // -- analyse de l'adresse IP et du port -- a++; b = strchr(a, ','); if (b) b = strchr(b + 1, ','); if (b) b = strchr(b + 1, ','); if (b) b = strchr(b + 1, ','); c = a; while((c = strchr(c, ','))) *c = '.'; // remplacer , par . if (b) *b = '\0'; // strcpybuff(adr_ip, a); // copier adresse ip // if (b) { a = b + 1; // début du port b = strchr(a, '.'); if (b) { int n1, n2; // *b = '\0'; b++; c = strchr(b, ')'); if (c) { *c = '\0'; if ((sscanf(a, "%d", &n1) == 1) && (sscanf(b, "%d", &n2) == 1) && (strlen(adr_ip) <= 16)) { port_pasv = n2 + (n1 << 8); } } else { deletesoc(soc_dat); soc_dat = INVALID_SOCKET; } // sinon on est prêts } } // -- fin analyse de l'adresse IP et du port -- } else { snprintf(back->r.msg, sizeof(back->r.msg), "PASV incorrect: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } else { /* * try epsv (ipv6) * */ strcpybuff(back->info, "pasv"); snprintf(line, sizeof(line), "EPSV"); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if (line[0] == '2') { /* got it */ char *a; a = strchr(line, '('); // exemple: 229 Entering Extended Passive Mode (|||6446|) if ((a != NULL) && (*a == '(') && (*(a + 1)) && (*(a + 1) == *(a + 2)) && (*(a + 1) == *(a + 3)) && (isdigit(*(a + 4))) && (*(a + 5)) ) { unsigned int n1 = 0; if (sscanf(a + 4, "%d", &n1) == 1) { if ((n1 < 65535) && (n1 > 0)) { port_pasv = n1; } } } else { snprintf(back->r.msg, sizeof(back->r.msg), "EPSV incorrect: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } } else { snprintf(back->r.msg, sizeof(back->r.msg), "PASV/EPSV error: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } #else // rien à faire avant #endif #if FTP_PASV if (port_pasv) { #endif // SIZE if (back->r.statuscode != -1) { if (!transfer_list) { char catbuff[CATBUFF_SIZE]; char *ua = unescape_http(catbuff, sizeof(catbuff), ftp_filename); if ((strchr(ua, ' ')) || (strchr(ua, '\"')) || (strchr(ua, '\'')) ) { snprintf(line, sizeof(line), "SIZE \"%s\"", ua); } else { snprintf(line, sizeof(line), "SIZE %s", ua); } // SIZE? strcpybuff(back->info, "size"); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if (line[0] == '2') { // SIZE compris, ALORS tester REST (sinon pas tester: cf probleme des txt.gz decompresses a la volee) char *szstr = strchr(line, ' '); if (szstr) { LLint size = 0; szstr++; if (sscanf(szstr, LLintP, &size) == 1) { back->r.totalsize = size; } } // REST? if (fexist(back->url_sav) && (transfer_list == 0)) { strcpybuff(back->info, "rest"); snprintf(line, sizeof(line), "REST " LLintP, (LLint) fsize(back->url_sav)); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if ((line[0] == '3') || (line[0] == '2')) { // ok rest_understood = 1; } // sinon tant pis } } // sinon tant pis } } #if FTP_PASV } #endif // // Post-REST // #if FTP_PASV // Ok, se connecter if (port_pasv) { SOCaddr server; int server_size = sizeof(server); const char *error = "unknown error"; // effacer structure memset(&server, 0, sizeof(server)); // infos strcpybuff(back->info, "resolv"); // résoudre if (adr_ip[0]) { hts_dns_resolve2(opt, adr_ip, &server, &error); } else { SOCaddr_copy_SOCaddr(server, server_data); } // infos strcpybuff(back->info, "cnxdata"); #if FTP_DEBUG printf("Data: Connecting to %s:%d...\n", adr_ip, port_pasv); #endif if (server_size > 0) { // socket soc_dat = (T_SOC) socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0); if (soc_dat != INVALID_SOCKET) { // structure: connexion au domaine internet, port 80 (ou autre) SOCaddr_initport(server, port_pasv); if (connect(soc_dat, &SOCaddr_sockaddr(server), SOCaddr_size(server)) == 0) { strcpybuff(back->info, "retr"); strcpybuff(line, line_retr); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if (line[0] == '1') { // OK } else { deletesoc(soc_dat); soc_dat = INVALID_SOCKET; // snprintf(back->r.msg, sizeof(back->r.msg), "RETR command error: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } else { #if FTP_DEBUG printf("Data: unable to connect\n"); #endif deletesoc(soc_dat); soc_dat = INVALID_SOCKET; // strcpybuff(back->r.msg, "Unable to connect"); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } else { strcpybuff(back->r.msg, "Unable to create a socket"); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } else { snprintf(back->r.msg, sizeof(back->r.msg), "Unable to resolve IP %s: %s", adr_ip, error); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts } else { snprintf(back->r.msg, sizeof(back->r.msg), "PASV incorrect: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } // sinon on est prêts #else //T_SOC soc_servdat; strcpybuff(back->info, "listening"); if ((soc_servdat = get_datasocket(line, sizeof(line))) != INVALID_SOCKET) { _CHECK_HALT_FTP; send_line(soc_ctl, line); // envoi du RETR get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if (line[0] == '2') { // ok strcpybuff(back->info, "retr"); strcpybuff(line, line_retr); send_line(soc_ctl, line); get_ftp_line(soc_ctl, line, sizeof(line), timeout); _CHECK_HALT_FTP; if (line[0] == '1') { //T_SOC soc_dat; if ((soc_dat = accept(soc_servdat, NULL, NULL)) == INVALID_SOCKET) { strcpybuff(back->r.msg, "Unable to accept connection"); back->r.statuscode = STATUSCODE_INVALID; } } else { snprintf(back->r.msg, sizeof(back->r.msg), "RETR command error: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } } else { snprintf(back->r.msg, sizeof(back->r.msg), "PORT command error: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } #ifdef _WIN32 closesocket(soc_servdat); #else close(soc_servdat); #endif } else { strcpybuff(back->r.msg, "Unable to listen to a port"); back->r.statuscode = STATUSCODE_INVALID; } #endif // // Ok, connexion initiée // if (soc_dat != INVALID_SOCKET) { if (rest_understood) { // REST envoyée et comprise file_notify(opt, back->url_adr, back->url_fil, back->url_sav, 0, 1, 0); back->r.fp = fileappend(&opt->state.strc, back->url_sav); } else { file_notify(opt, back->url_adr, back->url_fil, back->url_sav, 1, 1, 0); back->r.fp = filecreate(&opt->state.strc, back->url_sav); } strcpybuff(back->info, "receiving"); if (back->r.fp != NULL) { char BIGSTK buff[1024]; int len = 1; int read_len = 1024; while((len > 0) && (!stop_ftp(back))) { // attendre les données len = 1; // pas d'erreur pour le moment switch (wait_socket_receive(soc_dat, timeout)) { case -1: strcpybuff(back->r.msg, "FTP read error"); back->r.statuscode = STATUSCODE_INVALID; len = 0; // fin break; case 0: snprintf(back->r.msg, sizeof(back->r.msg), "Time out (%d)", timeout); back->r.statuscode = STATUSCODE_INVALID; len = 0; // fin break; } // réception if (len) { len = recv(soc_dat, buff, read_len, 0); if (len > 0) { back->r.size += len; HTS_STAT.HTS_TOTAL_RECV += len; if (back->r.fp) { if ((INTsys) fwrite(buff, 1, (INTsys) len, back->r.fp) != len) { /* int fcheck; if ((fcheck=check_fatal_io_errno())) { opt->state.exit_xh=-1; } */ strcpybuff(back->r.msg, "Write error"); back->r.statuscode = STATUSCODE_INVALID; len = 0; // error } } else { strcpybuff(back->r.msg, "Unexpected write error"); back->r.statuscode = STATUSCODE_INVALID; } } else { // Erreur ou terminé back->r.statuscode = 0; if (back->r.totalsize > 0 && back->r.size != back->r.totalsize) { back->r.statuscode = STATUSCODE_INVALID; strcpybuff(back->r.msg, "FTP file incomplete"); } } read_len = 1024; } } if (back->r.fp) { fclose(back->r.fp); back->r.fp = NULL; } } else { strcpybuff(back->r.msg, "Unable to write file"); back->r.statuscode = STATUSCODE_INVALID; } #ifdef _WIN32 closesocket(soc_dat); #else close(soc_dat); #endif // 226 Transfer complete? if (back->r.statuscode != -1) { if (wait_socket_receive(soc_ctl, timeout_onfly) > 0) { // récupérer 226 transfer complete get_ftp_line(soc_ctl, line, sizeof(line), timeout); if (line[0] == '2') { // OK strcpybuff(back->r.msg, "OK"); back->r.statuscode = HTTP_OK; } else { snprintf(back->r.msg, sizeof(back->r.msg), "RETR incorrect: %s", linejmp(line)); back->r.statuscode = STATUSCODE_INVALID; } } else { strcpybuff(back->r.msg, "FTP read error"); back->r.statuscode = STATUSCODE_INVALID; } } } } } _CHECK_HALT_FTP; strcpybuff(back->info, "quit"); send_line(soc_ctl, "QUIT"); // bye bye get_ftp_line(soc_ctl, NULL, 0, timeout); #ifdef _WIN32 closesocket(soc_ctl); #else close(soc_ctl); #endif } if (back->r.statuscode != -1) { back->r.statuscode = HTTP_OK; strcpybuff(back->r.msg, "OK"); } return 0; } // ouverture d'un port T_SOC get_datasocket(char *to_send, size_t to_send_size) { T_SOC soc = INVALID_SOCKET; char h_loc[256 + 2]; to_send[0] = '\0'; if (gethostname(h_loc, 256) == 0) { // host name SOCaddr server; if (hts_dns_resolve_nocache(h_loc, &server) != NULL) { // notre host if ((soc = (T_SOC) socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0)) != INVALID_SOCKET) { if (bind(soc, &SOCaddr_sockaddr(server), SOCaddr_size(server)) == 0) { SOCaddr server2; SOClen len = SOCaddr_capacity(server2); if (getsockname(soc, &SOCaddr_sockaddr(server2), &len) == 0) { // *port=ntohs(server.sin_port); // récupérer port if (listen(soc, 1) >= 0) { #if HTS_INET6==0 unsigned short int a, n1, n2; // calculer port a = SOCaddr_sinport(server2); n1 = (a & 0xff); n2 = ((a >> 8) & 0xff); { char dots[256 + 2]; char dot[256 + 2]; char *a; SOCaddr_inetntoa(dot, 256, server2); // dots[0] = '\0'; strncatbuff(dots, dot, 128); while((a = strchr(dots, '.'))) *a = ','; // virgules! while((a = strchr(dots, ':'))) *a = ','; // virgules! snprintf(to_send, to_send_size, "PORT %s,%d,%d", dots, n1, n2); } #else /* EPRT |1|132.235.1.2|6275| EPRT |2|1080::8:800:200C:417A|5282| */ { char dot[256 + 2]; SOCaddr_inetntoa(dot, 256, server2); snprintf(to_send, to_send_size, "EPRT |%c|%s|%d|", SOCaddr_getproto(server2), dot, SOCaddr_sinport(server2)); } #endif } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } } } return soc; } #if FTP_DEBUG FILE *dd = NULL; #endif // routines de réception/émission // 0 = ERROR int send_line(T_SOC soc, const char *data) { char BIGSTK line[1024]; if (_DEBUG_HEAD) { if (ioinfo) { fprintf(ioinfo, "---> %s\x0d\x0a", data); fflush(ioinfo); } } #if FTP_DEBUG if (dd == NULL) dd = fopen("toto.txt", "w"); fprintf(dd, "---> %s\x0d\x0a", data); fflush(dd); printf("---> %s", data); fflush(stdout); #endif snprintf(line, sizeof(line), "%s\x0d\x0a", data); if (check_socket_connect(soc) != 1) { #if FTP_DEBUG printf("!SOC WRITE ERROR\n"); #endif return 0; // erreur, plus connecté! } #if FTP_DEBUG { int r = (send(soc, line, strlen(line), 0) == (int) strlen(line)); printf("%s\x0d\x0a", data); fflush(stdout); return r; } #else return (send(soc, line, (int) strlen(line), 0) == (int) strlen(line)); #endif } int get_ftp_line(T_SOC soc, char *ptrline, size_t line_size, int timeout) { char BIGSTK data[1024]; int i, ok, multiline; #if FTP_DEBUG if (dd == NULL) dd = fopen("toto.txt", "w"); #endif data[0] = '\0'; i = ok = multiline = 0; data[3] = '\0'; do { char b; // vérifier données switch (wait_socket_receive(soc, timeout)) { case -1: // erreur de lecture if (ptrline) snprintf(ptrline, line_size, "500 *read error"); return 0; break; case 0: if (ptrline) snprintf(ptrline, line_size, "500 *read timeout (%d)", timeout); return 0; break; } switch (recv(soc, &b, 1, 0)) { case 1: HTS_STAT.HTS_TOTAL_RECV += 1; // compter flux entrant if ((b != 10) && (b != 13) && (i < (int) sizeof(data) - 1)) data[i++] = b; // truncate hostile over-long reply lines break; default: if (ptrline) snprintf(ptrline, line_size, "500 *read error"); return 0; // error break; } if (((b == 13) || (b == 10)) && (i > 0)) { // CR/LF if ((data[3] == '-') || ((multiline) && (!isdigit((unsigned char) data[0]))) ) { data[3] = '\0'; i = 0; multiline = 1; } else ok = 1; // sortir } } while(!ok); data[i++] = '\0'; if (_DEBUG_HEAD) { if (ioinfo) { fprintf(ioinfo, "<--- %s\x0d\x0a", data); fflush(ioinfo); } } #if FTP_DEBUG fprintf(dd, "<--- %s\n", data); fflush(dd); printf("<--- %s\n", data); #endif if (ptrline) snprintf(ptrline, line_size, "%s", data); return (strnotempty(data)); } // sauter NNN char *linejmp(char *line) { if (strlen(line) > 4) return line + 4; else return line; } // test socket: // 0 : no data // 1 : data detected // -1: error int check_socket(T_SOC soc) { fd_set fds, fds_e; // poll structures struct timeval tv; // structure for select FD_ZERO(&fds); FD_ZERO(&fds_e); // socket read FD_SET(soc, &fds); // socket error FD_SET(soc, &fds_e); tv.tv_sec = 0; tv.tv_usec = 0; // poll! select((int) soc + 1, &fds, NULL, &fds_e, &tv); if (FD_ISSET(soc, &fds_e)) { // error detected return -1; } else if (FD_ISSET(soc, &fds)) { return 1; } return 0; } // check if connected int check_socket_connect(T_SOC soc) { fd_set fds, fds_e; // poll structures struct timeval tv; // structure for select FD_ZERO(&fds); FD_ZERO(&fds_e); // socket write FD_SET(soc, &fds); // socket error FD_SET(soc, &fds_e); tv.tv_sec = 0; tv.tv_usec = 0; // poll! select((int) soc + 1, NULL, &fds, &fds_e, &tv); if (FD_ISSET(soc, &fds_e)) { // error detected return -1; } else if (FD_ISSET(soc, &fds)) { return 1; } return 0; } // attendre des données int wait_socket_receive(T_SOC soc, int timeout) { // attendre les données TStamp ltime = time_local(); int r; #if FTP_DEBUG printf("\x0dWaiting for data "); fflush(stdout); #endif while((!(r = check_socket(soc))) && (((int) ((TStamp) (time_local() - ltime))) < timeout)) { Sleep(100); #if FTP_DEBUG printf("."); fflush(stdout); #endif } #if FTP_DEBUG printf("\x0dreturn: %d\x0d", r); fflush(stdout); #endif return r; } // cancel reçu? int stop_ftp(lien_back * back) { if (back->stop_ftp) { strcpybuff(back->r.msg, "Cancelled by User"); back->r.statuscode = STATUSCODE_INVALID; return 1; } return 0; } httrack-3.49.14/src/htsfilters.c0000644000175000017500000004310015230602340012130 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: httrack.c subroutines: */ /* filters ("regexp") */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE // *.gif match all gif files // *[file]/*[file].exe match all exe files with one folder structure // *[A-Z,a-z,0-9,/,?] match letters, nums, / and ? // *[A-Z,a-z,0-9,/,?] // *[>10,<100].gif match all gif files larger than 10KB and smaller than 100KB // *[file,>10,<100].gif FORBIDDEN: you must not mix size test and pattern test #include "htsfilters.h" /* specific definitions */ #include "htsbase.h" #include "htslib.h" #include #include /* END specific definitions */ // à partir d'un tableau de {"+*.toto","-*.zip","+*.tata"} définit si nom est autorisé // optionnel: taille à contrôller (ou numéro, etc) en pointeur // (en de détection de *size, la taille limite est écrite par dessus *size) // exemple: +-*.gif*[<5] == supprimer GIF si <5KB int fa_strjoker(int type, char **filters, int nfil, const char *nom, LLint * size, int *size_flag, int *depth) { int verdict = 0; // on sait pas int i; LLint sizelimit = 0; if (size) sizelimit = *size; for(i = 0; i < nfil; i++) { LLint sz; int filteroffs = 1; if (strncmp(filters[i] + filteroffs, "mime:", 5) == 0) { if (type == 0) // regular filters continue; filteroffs += 5; // +mime:text/html } else { // mime filters if (type != 0) continue; } if (size) sz = *size; /* size unknown (scan time): no size pointer => size tests stay neutral */ if (strjoker(nom, filters[i] + filteroffs, size ? &sz : NULL, size_flag)) { if (size) if (sz != *size) sizelimit = sz; if (filters[i][0] == '+') verdict = 1; // autorisé else verdict = -1; // interdit if (depth) *depth = i; } } if (size) *size = sizelimit; return verdict; } int fa_strjoker_dual(int type, char **filters, int nfil, const char *nom1, const char *nom2, LLint *size, int *size_flag, int *depth) { int depth1 = 0, depth2 = 0; int flag1 = 0, flag2 = 0; LLint sz1 = 0, sz2 = 0; int jok1, jok2, use1; if (size) { sz1 = *size; sz2 = *size; } jok1 = fa_strjoker(type, filters, nfil, nom1, size ? &sz1 : NULL, size_flag ? &flag1 : NULL, &depth1); jok2 = fa_strjoker(type, filters, nfil, nom2, size ? &sz2 : NULL, size_flag ? &flag2 : NULL, &depth2); use1 = jok2 == 0 || (jok1 != 0 && depth1 >= depth2); if (size) *size = use1 ? sz1 : sz2; if (size_flag) *size_flag = use1 ? flag1 : flag2; if (depth) *depth = use1 ? depth1 : depth2; return use1 ? jok1 : jok2; } /* Real filters/URLs fit HTS_URLMAXSIZE*2; past it a hostile pattern recurses O(len) deep or runs O(n^2*stars). Cap length, recursion depth and steps (work): the length cap alone still allows ~2000 frames, ~900KB of stack, which overflows the 1MB a Windows thread gets (#574). */ #define STRJOKER_MAXLEN (HTS_URLMAXSIZE * 2) #define STRJOKER_MAXDEPTH 256u #define STRJOKER_MAXSTEPS 2000000u /* Failure memo for the recursive matcher: one bit per (chaine, joker) offset pair keeps star-heavy patterns polynomial instead of exponential (#501). */ typedef struct strjoker_memo { const char *chaine0, *joker0; /* offsets are relative to these bases */ size_t stride; /* strlen(joker0) + 1 */ unsigned char *failed; /* failed-pair bitmap; NULL: no memo */ size_t *nsteps; /* shared work counter; NULL: unbounded (oracle) */ size_t maxdepth; /* deepest recursion reached */ hts_boolean cut; /* a branch hit the depth cap: its failures are not final */ } strjoker_memo; static const char *strjoker_impl(strjoker_memo *memo, const char *chaine, const char *joker, LLint *size, int *size_flag, size_t depth); /* A pair that failed once fails forever (*size is only written on the success path), so record NULL results and cut the re-exploration. */ static const char *strjoker_rec(strjoker_memo *memo, const char *chaine, const char *joker, LLint *size, int *size_flag, size_t depth) { size_t bit = 0; const char *adr; if (depth > memo->maxdepth) memo->maxdepth = depth; /* Charge the budget before the depth cap: cut disables the memo, so uncounted deep calls would let the sub-cap search explode (OSS-Fuzz 535114376). */ if (memo->nsteps != NULL && ++*memo->nsteps > STRJOKER_MAXSTEPS) return NULL; /* work budget spent: fail the match safely */ if (depth >= STRJOKER_MAXDEPTH) { memo->cut = HTS_TRUE; return NULL; /* nesting beyond any real filter: fail the branch safely */ } if (memo->failed) { bit = (size_t) (chaine - memo->chaine0) * memo->stride + (size_t) (joker - memo->joker0); if (memo->failed[bit >> 3] & (unsigned char) (1u << (bit & 7))) return NULL; } adr = strjoker_impl(memo, chaine, joker, size, size_flag, depth + 1); /* a cut branch may fail here yet match when reached at a shallower depth */ if (adr == NULL && memo->failed && !memo->cut) memo->failed[bit >> 3] |= (unsigned char) (1u << (bit & 7)); return adr; } /* Match chaine against joker with a shared work budget *nsteps (a strjokerfind sweep passes one counter, bounding the whole scan). */ static const char *strjoker_bounded(const char *chaine, const char *joker, LLint *size, int *size_flag, size_t *nsteps, size_t *maxdepth) { strjoker_memo memo = {chaine, joker, 0, NULL, nsteps, 0, HTS_FALSE}; unsigned char stackbits[2048]; hts_boolean onheap = HTS_FALSE; const char *adr; if (maxdepth != NULL) *maxdepth = 0; if (chaine != NULL && joker != NULL) { const size_t l1 = strlen(chaine), l2 = strlen(joker); if (l1 > STRJOKER_MAXLEN || l2 > STRJOKER_MAXLEN) return NULL; /* beyond any real filter/URL: bound depth+work */ memo.stride = l2 + 1; if (l1 + 1 <= (SIZE_MAX - 7) / memo.stride) { // overflow-safe bitmap size const size_t bytes = ((l1 + 1) * memo.stride + 7) / 8; if (bytes <= sizeof(stackbits)) { memset(stackbits, 0, bytes); memo.failed = stackbits; } else { memo.failed = (unsigned char *) calloct(bytes, 1); onheap = memo.failed != NULL ? HTS_TRUE : HTS_FALSE; } } } adr = strjoker_rec(&memo, chaine, joker, size, size_flag, 0); if (onheap) freet(memo.failed); if (maxdepth != NULL) *maxdepth = memo.maxdepth; return adr; } // wildcard comparator: match chaine against joker (pattern), case-insensitive // returns the address of the first matched letter past any leading joker // (ie. *[..]toto.. returns the address of toto within chaine), NULL on mismatch HTS_INLINE const char *strjoker(const char *chaine, const char *joker, LLint *size, int *size_flag) { size_t nsteps = 0; return strjoker_bounded(chaine, joker, size, size_flag, &nsteps, NULL); } /* Test-only oracle: the same matcher without the failure memo. */ const char *strjoker_nomemo(const char *chaine, const char *joker, LLint *size, int *size_flag) { strjoker_memo memo = {chaine, joker, 0, NULL, NULL, 0, HTS_FALSE}; return strjoker_rec(&memo, chaine, joker, size, size_flag, 0); } /* Test-only: strjoker() reporting the work and depth spent and their caps, so a self-test can prove both bound a hostile pattern. */ const char *strjoker_bounds(const char *chaine, const char *joker, size_t *nsteps_out, size_t *maxsteps_out, size_t *depth_out, size_t *maxdepth_out) { size_t nsteps = 0, depth = 0; const char *r = strjoker_bounded(chaine, joker, NULL, NULL, &nsteps, &depth); if (nsteps_out != NULL) *nsteps_out = nsteps; if (maxsteps_out != NULL) *maxsteps_out = STRJOKER_MAXSTEPS; if (depth_out != NULL) *depth_out = depth; if (maxdepth_out != NULL) *maxdepth_out = STRJOKER_MAXDEPTH; return r; } static const char *strjoker_impl(strjoker_memo *memo, const char *chaine, const char *joker, LLint *size, int *size_flag, size_t depth) { if (strnotempty(joker) == 0) { // fin de chaine joker if (strnotempty(chaine) == 0) // fin aussi pour la chaine: ok return chaine; else if (chaine[0] == '?') return chaine; // --?-- pour les index.html?Choix=2 else return NULL; // non trouvé } // on va progresser en suivant les 'mots' contenus dans le joker // un mot peut être un * ou bien toute autre séquence de lettres if (strcmp(joker, "*") == 0) { // ok, rien après return chaine; } // 1er cas: jokers * ou jokers multiples *[..] if (joker[0] == '*') { // comparer joker+reste (*toto/..) int jmp; // nombre de caractères pour le prochain mot dans joker int cut = 0; // interdire tout caractère superflu char pass[256]; char LEFT = '[', RIGHT = ']'; int unique = 0; switch (joker[1]) { case '[': LEFT = '['; RIGHT = ']'; unique = 0; break; case '(': LEFT = '('; RIGHT = ')'; unique = 1; break; } if ((joker[1] == LEFT) && (joker[2] != LEFT)) { // multijoker (tm) int i; for(i = 0; i < 256; i++) pass[i] = 0; // noms réservés if ((strfield(joker + 2, "file")) || (strfield(joker + 2, "name"))) { for(i = 0; i < 256; i++) pass[i] = 1; pass[(int) '?'] = 0; //pass[(int) ';'] = 0; pass[(int) '/'] = 0; i = 2; { int len = (int) strlen(joker); while((joker[i] != RIGHT) && (joker[i]) && (i < len)) i++; } } else if (strfield(joker + 2, "path")) { for(i = 0; i < 256; i++) pass[i] = 1; pass[(int) '?'] = 0; //pass[(int) ';'] = 0; i = 2; { int len = (int) strlen(joker); while((joker[i] != RIGHT) && (joker[i]) && (i < len)) i++; } } else if (strfield(joker + 2, "param")) { if (chaine[0] == '?') { // il y a un paramètre juste là for(i = 0; i < 256; i++) pass[i] = 1; } // sinon synonyme de 'rien' i = 2; { int len = (int) strlen(joker); while((joker[i] != RIGHT) && (joker[i]) && (i < len)) i++; } } else { // décode les directives comme *[A-Z,âêîôû,0-9] i = 2; if (joker[i] == RIGHT) { // *[] signifie "plus rien après" cut = 1; // caractère supplémentaire interdit } else { int len = (int) strlen(joker); while((joker[i] != RIGHT) && (joker[i]) && (i < len)) { // '\' escapes the next char as a literal member, e.g. *[\[\]] if (joker[i] == '\\' && joker[i + 1] != '\0') { i++; pass[(int) (unsigned char) joker[i]] = 1; i++; } else if ((joker[i] == '<') || (joker[i] == '>')) { // *[<10] int lsize = 0; int lverdict; i++; if (sscanf(joker + i, "%d", &lsize) == 1) { if (size) { if (*size >= 0) { if (size_flag) *size_flag = 1; /* a joué */ if (joker[i - 1] == '<') lverdict = (*size < lsize); else lverdict = (*size > lsize); if (!lverdict) { return NULL; // ne correspond pas } else { *size = lsize; return chaine; // ok } } else return NULL; // ne correspond pas } else return NULL; // ne correspond pas (test impossible) // jump while(isdigit((unsigned char) joker[i])) i++; } } else if (joker[i + 1] == '-' && joker[i + 2] != '\0') { // range *[A-Z]; the '\0' guard rejects a truncated *[a- (else // i+=3 overshoots the NUL) if ((int) (unsigned char) joker[i + 2] > (int) (unsigned char) joker[i]) { int j; for(j = (int) (unsigned char) joker[i]; j <= (int) (unsigned char) joker[i + 2]; j++) pass[j] = 1; } i += 3; } else { // 1 car, ex: *[ ] pass[(int) (unsigned char) joker[i]] = 1; i++; } if ((joker[i] == ',') || (joker[i] == ';')) i++; } } } // à sauter dans joker jmp = i; if (joker[i]) jmp++; // } else { // tout autoriser // int i; for(i = 0; i < 256; i++) pass[i] = 1; // tout autoriser jmp = 1; } { int i, max; const char *adr; // la chaine doit se terminer exactement if (cut) { if (strnotempty(chaine)) return NULL; // perdu else return chaine; // ok } // comparaison en boucle, c'est ca qui consomme huhu.. // le tableau pass[256] indique les caractères ASCII autorisés // tester sans le joker (pas ()+ mais ()*) if (!unique) { if ((adr = strjoker_rec(memo, chaine, joker + jmp, size, size_flag, depth))) { return adr; } } // tester i = 0; if (!unique) max = (int) strlen(chaine); else /* *(a) only match a (not aaaaa) */ max = strnotempty(chaine) ? 1 : 0; /* empty chaine: no char to eat */ while(i < (int) max) { if (pass[(int) (unsigned char) chaine[i]]) { // caractère autorisé if ((adr = strjoker_rec(memo, chaine + i + 1, joker + jmp, size, size_flag, depth))) { return adr; } i++; } else i = max + 2; // sortir } // tester chaîne vide if (i != max + 2) // avant c'est ok if ((adr = strjoker_rec(memo, chaine + max, joker + jmp, size, size_flag, depth))) return adr; return NULL; // perdu } } else { // comparer mot+reste (toto*..) if (strnotempty(chaine)) { int jmp = 0, ok = 1; // comparer début de joker et début de chaine while((joker[jmp] != '*') && (joker[jmp]) && (ok)) { // CI : remplacer streql par une comparaison != if (!streql(chaine[jmp], joker[jmp])) { ok = 0; // quitter } jmp++; } // comparaison ok? if (ok) { // continuer la comparaison. if (strjoker_rec(memo, chaine + jmp, joker + jmp, size, size_flag, depth)) return chaine; // retourner 1e lettre } } // strlen(a) return NULL; } // * ou mot return NULL; } // recherche multiple // exemple: find dans un texte de strcpybuff(*[A-Z,a-z],"*[0-9]"); va rechercher la première occurence // d'un strcpy sur une variable ayant un nom en lettres et copiant une chaine de chiffres // ATTENTION!! Eviter les jokers en début, où gare au temps machine! const char *strjokerfind(const char *chaine, const char *joker) { size_t nsteps = 0; /* one budget for the whole scan */ const char *adr; if (chaine != NULL && strlen(chaine) > STRJOKER_MAXLEN) return NULL; while(*chaine) { if ((adr = strjoker_bounded(chaine, joker, NULL, NULL, &nsteps, NULL))) { // ok trouvé return adr; } if (nsteps > STRJOKER_MAXSTEPS) // scan budget spent: no match return NULL; chaine++; } return NULL; } httrack-3.49.14/src/htscatchurl.c0000644000175000017500000001664315230602340012301 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 1998 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: URL catch .h */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Internal engine bytecode */ #define HTS_INTERNAL_BYTECODE // Fichier intercepteur d'URL .c /* specific definitions */ /* specific definitions */ #include "htsbase.h" #include "htsnet.h" #include "htslib.h" #include "htscore.h" #include #ifdef _WIN32 #else #include #endif /* END specific definitions */ /* définitions globales */ #include "htsglobal.h" /* htslib */ /*#include "htslib.h"*/ /* catch url */ #include "htscatchurl.h" // URL Link catcher // 0- Init the URL catcher with standard port // catch_url_init(&port,&return_host); HTSEXT_API T_SOC catch_url_init_std(int *port_prox, char *adr_prox) { T_SOC soc; int try_to_listen_to[] = {8080, 3128, 80, 81, 82, 8081, 3129, 0, -1}; int i = 0; do { soc = catch_url_init(&try_to_listen_to[i], adr_prox); *port_prox = try_to_listen_to[i]; i++; } while((soc == INVALID_SOCKET) && (try_to_listen_to[i] >= 0)); return soc; } // 1- Init the URL catcher // catch_url_init(&port,&return_host); HTSEXT_API T_SOC catch_url_init(int *port, /* 128 bytes */ char *adr) { T_SOC soc = INVALID_SOCKET; char h_loc[256]; if (gethostname(h_loc, sizeof(h_loc)) == 0) { // host name SOCaddr server; if (hts_dns_resolve_nocache(h_loc, &server) != NULL) { // notre host if ((soc = (T_SOC) socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0)) != INVALID_SOCKET) { SOCaddr_initport(server, *port); if (bind(soc, &SOCaddr_sockaddr(server), SOCaddr_size(server)) == 0) { SOCaddr server2; SOClen len = SOCaddr_capacity(server2); if (getsockname(soc, &SOCaddr_sockaddr(server2), &len) == 0) { *port = ntohs(SOCaddr_sinport(server)); // récupérer port if (listen(soc, 1) >= 0) { SOCaddr_inetntoa(adr, 128, server2); } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } else { #ifdef _WIN32 closesocket(soc); #else close(soc); #endif soc = INVALID_SOCKET; } } } } return soc; } // 2 - Wait for URL // catch_url // returns 0 if error // url: buffer where URL must be stored - or ip:port in case of failure // data: 32Kb HTSEXT_API hts_boolean catch_url(T_SOC soc, char *url, char *method, char *data) { int retour = 0; // connexion (accept) if (soc != INVALID_SOCKET) { T_SOC soc2; while((soc2 = (T_SOC) accept(soc, NULL, NULL)) == INVALID_SOCKET) ; /* #ifdef _WIN32 closesocket(soc); #else close(soc); #endif */ soc = soc2; /* INFOS */ { SOCaddr server2; SOClen len = SOCaddr_capacity(server2); if (getpeername(soc, &SOCaddr_sockaddr(server2), &len) == 0) { char dot[256 + 2]; SOCaddr_inetntoa(dot, sizeof(dot), server2); sprintf(url, "%s:%d", dot, ntohs(SOCaddr_sinport(server2))); } } /* INFOS */ // réception if (soc != INVALID_SOCKET) { char line[1000]; char protocol[256]; line[0] = protocol[0] = '\0'; // socinput(soc, line, 1000); if (strnotempty(line)) { /* widths bound the caller buffers: method[32], url[HTS_URLMAXSIZE*2], protocol[256] */ if (sscanf(line, "%31s %2047s %255s", method, url, protocol) == 3) { lien_adrfil af; // méthode en majuscule size_t i; int r = 0; af.adr[0] = af.fil[0] = '\0'; // for(i = 0; method[i] != '\0'; i++) { if ((method[i] >= 'a') && (method[i] <= 'z')) method[i] -= ('a' - 'A'); } // adresse du lien if (ident_url_absolute(url, &af) >= 0) { // Traitement des en-têtes char BIGSTK loc[HTS_URLMAXSIZE * 2]; htsblk blkretour; hts_init_htsblk(&blkretour); blkretour.location = loc; // si non nul, contiendra l'adresse véritable en cas de moved xx // Lire en têtes restants sprintf(data, "%s %s %s\r\n", method, af.fil, protocol); while(strnotempty(line)) { socinput(soc, line, 1000); treathead(NULL, NULL, NULL, &blkretour, line); // traiter strlcatbuff(data, line, CATCH_URL_DATA_SIZE); strlcatbuff(data, "\r\n", CATCH_URL_DATA_SIZE); } // CR/LF final de l'en tête inutile car déja placé via la ligne vide // juste au dessus if (blkretour.totalsize > 0) { int len = (int) min(blkretour.totalsize, 32000); int pos = (int) strlen(data); // Copier le reste (post éventuel) while((len > 0) && ((r = recv(soc, (char *) data + pos, len, 0)) > 0)) { pos += r; len -= r; data[pos] = '\0'; // terminer par NULL } } // Envoyer page sprintf(line, CATCH_RESPONSE); send(soc, line, (int) strlen(line), 0); // OK! retour = 1; } } } // sinon erreur } } if (soc != INVALID_SOCKET) { #ifdef _WIN32 closesocket(soc); /* WSACleanup(); */ #else close(soc); #endif } return retour; } // Lecture de ligne sur socket void socinput(T_SOC soc, char *s, int max) { int c; int j = 0; do { unsigned char b; if (recv(soc, (char *) &b, 1, 0) == 1) { c = b; switch (c) { case 13: break; // sauter CR case 10: c = -1; break; case 9: case 12: break; // sauter ces caractères default: s[j++] = (char) c; break; } } else c = EOF; } while((c != -1) && (c != EOF) && (j < (max - 1))); s[j++] = '\0'; } httrack-3.49.14/src/htsselftest.c0000644000175000017500000052027215230602340012323 /* ------------------------------------------------------------ */ /* HTTrack Website Copier, Offline Browser for Windows and Unix Copyright (C) 2026 Xavier Roche and other contributors SPDX-License-Identifier: GPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Ethical use: we kindly ask that you NOT use this software to harvest email addresses or to collect any other private information about people. Doing so would dishonor our work and waste the many hours we have spent on it. Please visit our Website: http://www.httrack.com */ /* ------------------------------------------------------------ */ /* File: htsselftest.c subroutines: */ /* named dispatch for the hidden engine self-tests */ /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ /* Each test was historically a single-letter `-#` arm in htscoremain.c; they now live behind one registry reached as `httrack -#test=NAME [args]` (and `-#test` lists them). A handler runs over the positional args (argv[0..argc-1]), prints one result line, and returns the process exit code. */ #define HTS_INTERNAL_BYTECODE #include "htsselftest.h" #include "htsglobal.h" #include "htscore.h" #include "htsdefines.h" #include "htslib.h" #include "htsalias.h" #include "htsparse.h" #include "htscache.h" #include "htscache_selftest.h" #include "htsdns_selftest.h" #include "htscharset.h" #include "htsencoding.h" #include "htsftp.h" #include "htsmd5.h" #include "htssniff.h" #include "htscodec.h" #include "htsproxy.h" #include "htswarc.h" #if HTS_USEZLIB #include "htszlib.h" #endif #if HTS_USEZSTD #include #endif #if HTS_USEOPENSSL #include #endif #include "coucal/coucal.h" #include #include #include #include #include #include #ifndef _WIN32 #include #include #else #include /* _get_osfhandle, for the sparse-file hint */ #include /* FSCTL_SET_SPARSE */ #endif /* very minimalistic internal tests */ static void basic_selftests(void) { // BUG 756328 const char *const source = "/intent/" "tweet?url=https%3A%2F%2Fwww.httrack.com%2Fvacatures%2F1562519%" "2Fmedewerker-data-services&text=Medewerker+Data+Services&via=httrackcom"; char buffer[1024]; fil_normalized(source, buffer); // MD5 selftests md5selftest(); // cookie_get field extraction (tab-separated, 0-based) { char cbuf[8192]; assertf(strcmp(cookie_get(cbuf, "a\tb\tc", 0), "a") == 0); assertf(strcmp(cookie_get(cbuf, "a\tb\tc", 1), "b") == 0); assertf(strcmp(cookie_get(cbuf, "a\tb\tc", 2), "c") == 0); // multi-char fields catch length/boundary bugs that 1-char fields hide assertf(strcmp(cookie_get(cbuf, "host\tx\t/path/to", 0), "host") == 0); assertf(strcmp(cookie_get(cbuf, "host\tx\t/path/to", 2), "/path/to") == 0); assertf(strcmp(cookie_get(cbuf, "a\t\tc", 1), "") == 0); // empty field assertf(strcmp(cookie_get(cbuf, "a\tb\tc", 9), "") == 0); // beyond last } // back_infostr() status-line formatting (no sockets: pure formatting over // in-memory slots). Stresses a few thousand entries across every status-code // arm. Regression for a clobber bug where the size/totalsize trailer was // written straight into the destination, wiping the URL it had just built. { static const struct { int code; const char *tag; } cases[] = { {200, "READY "}, {-1, "ERROR "}, {-2, "TIMEOUT "}, {-3, "TOOSLOW "}, {400, "BADREQUEST "}, {403, "FORBIDDEN "}, {404, "NOT FOUND "}, {500, "SERVERROR "}, {999, "ERROR(999)"}, }; const int ncases = (int) (sizeof(cases) / sizeof(cases[0])); const int n = 2000; lien_back *slots = calloct(n, sizeof(lien_back)); char line[HTS_URLMAXSIZE * 4 + 1024]; char expect[HTS_URLMAXSIZE * 4 + 1024]; struct_back sb; int idx; sb.lnk = slots; sb.count = n; sb.ready = NULL; sb.ready_size_bytes = 0; for (idx = 0; idx < n; idx++) { lien_back *const slot = &slots[idx]; slot->r.location = slot->location_buffer; slot->status = STATUS_READY; slot->r.statuscode = cases[idx % ncases].code; slot->r.size = idx; slot->r.totalsize = idx + 1; snprintf(slot->url_adr, sizeof(slot->url_adr), "http://h%d.example", idx); snprintf(slot->url_fil, sizeof(slot->url_fil), "/p/%d.html", idx); } for (idx = 0; idx < n; idx++) { line[0] = '\0'; back_infostr(&sb, idx, 3, line, sizeof(line)); // Exact match (not substring): pins tag/URL/trailer order and rejects a // partial clobber, duplication, or truncation that a presence check would // let through. The expected format is stated here independently. snprintf(expect, sizeof(expect), "%s\"http://h%d.example/p/%d.html\" " LLintP " " LLintP " ", cases[idx % ncases].tag, idx, idx, (LLint) idx, (LLint) (idx + 1)); assertf(strcmp(line, expect) == 0); } // Near-maximal URL, driven through back_info() (which owns the status // buffer internally and prints to a FILE*). url_adr + url_fil together // overrun the old HTS_URLMAXSIZE*2+1024 buffer, so the bounded appends // would abort unless that buffer is sized to hold both fields. Regression // for that sizing -- exercising back_infostr() directly would miss it, // since the caller's buffer is what matters. { lien_back *const slot = &slots[0]; const size_t adrlen = sizeof(slot->url_adr) - 8; const size_t fillen = sizeof(slot->url_fil) - 8; FILE *const fp = tmpfile(); size_t got; assertf(fp != NULL); slot->status = STATUS_READY; slot->r.statuscode = 200; slot->r.size = 1; slot->r.totalsize = 2; memset(slot->url_adr, 'a', adrlen); slot->url_adr[adrlen] = '\0'; slot->url_fil[0] = '/'; memset(slot->url_fil + 1, 'b', fillen - 1); slot->url_fil[fillen] = '\0'; back_info(&sb, 0, 3, fp); rewind(fp); got = fread(line, 1, sizeof(line) - 1, fp); line[got] = '\0'; fclose(fp); snprintf(expect, sizeof(expect), "READY \"%s%s\" " LLintP " " LLintP " " LF, slot->url_adr, slot->url_fil, (LLint) 1, (LLint) 2); assertf(strcmp(line, expect) == 0); } freet(slots); } // next_token(): in-place token scanner. Strips surrounding quotes, unescapes // \" and \\ when flag is set, and returns the token terminator (the space, or // NULL at end of string). The unquote/unescape rewrites the string in place // by shifting left, so the result is always shorter -- regression for that // compaction. { char tok[64]; // plain token: unchanged, returns a pointer AT the separating space (exact // position, not just any space -- a strchr-style impl would land elsewhere // once quotes shift the content) strcpybuff(tok, "abc def"); { char *const end = next_token(tok, 0); assertf(end == tok + 3 && *end == ' ' && strcmp(tok, "abc def") == 0); } // surrounding quotes stripped, returns the (post-shift) trailing space strcpybuff(tok, "\"ab\" cd"); { char *const end = next_token(tok, 1); assertf(end == tok + 2 && *end == ' ' && strcmp(tok, "ab cd") == 0); } // a space inside quotes does not end the token; end of string returns NULL strcpybuff(tok, "\"a b\"c"); { char *const end = next_token(tok, 1); assertf(end == NULL && strcmp(tok, "a bc") == 0); } // \" and \\ are unescaped to literal " and \ in place strcpybuff(tok, "\"a\\\"b\\\\c\""); { char *const end = next_token(tok, 1); assertf(end == NULL && strcmp(tok, "a\"b\\c") == 0); } // unterminated quote: the opening quote is dropped, the rest survives, and // the scan runs to the NUL (returns NULL) strcpybuff(tok, "\"ab"); { char *const end = next_token(tok, 1); assertf(end == NULL && strcmp(tok, "ab") == 0); } // trailing lone backslash in a quote: *(p+1) is the NUL, not an escape, so // the backslash is kept intact (and there is no over-read past the NUL) strcpybuff(tok, "\"a\\"); { char *const end = next_token(tok, 1); assertf(end == NULL && strcmp(tok, "a\\") == 0); } } // fil_normalized(): canonicalizes a URL path. Query arguments are sorted // alphabetically (by the text after each '?'/'&') and the query is rebuilt // through a bounded builder; outside the query, "//" collapses to "/". // Regression for that builder. { char norm[256]; assertf(strcmp(fil_normalized("/p?b=2&a=1&c=3", norm), "/p?a=1&b=2&c=3") == 0); assertf(strcmp(fil_normalized("/a//b", norm), "/a/b") == 0); // "//" is collapsed only before the query; inside the query it is kept assertf(strcmp(fil_normalized("/a//b?x=c//d", norm), "/a/b?x=c//d") == 0); } // give_mimext(): mime type -> file extension, bounded into the caller buffer. // Returns 1 when an extension was written, 0 otherwise. { char ext[16]; assertf(give_mimext(ext, sizeof(ext), "image/gif") == 1); assertf(strcmp(ext, "gif") == 0); assertf(give_mimext(ext, sizeof(ext), "text/html") == 1); assertf(strcmp(ext, "html") == 0); assertf(give_mimext(ext, sizeof(ext), "no/such-mime-type") == 0); assertf(ext[0] == '\0'); // modern web formats -> extension. Avoid MIME types the // application/<=4-char-subtype fallback could fabricate without a row. assertf(give_mimext(ext, sizeof(ext), "image/webp") == 1); assertf(strcmp(ext, "webp") == 0); assertf(give_mimext(ext, sizeof(ext), "application/manifest+json") == 1); assertf(strcmp(ext, "webmanifest") == 0); assertf(give_mimext(ext, sizeof(ext), "font/woff2") == 1); assertf(strcmp(ext, "woff2") == 0); } // convtolower(): lower-cases into the caller buffer (bounded by its size). { char low[64]; assertf(strcmp(convtolower(low, sizeof(low), "ABC/Def.HTML"), "abc/def.html") == 0); } // cut_path(): splits a path into directory (with trailing '/') and basename, // each bounded by its buffer size. { char path[256]; char pname[256]; { char full[] = "/dir/sub/file.html"; cut_path(full, path, sizeof(path), pname, sizeof(pname)); assertf(strcmp(path, "/dir/sub/") == 0); assertf(strcmp(pname, "file.html") == 0); } { // a trailing slash is trimmed before the split char full[] = "/dir/sub/"; cut_path(full, path, sizeof(path), pname, sizeof(pname)); assertf(strcmp(path, "/dir/") == 0); assertf(strcmp(pname, "sub") == 0); } { // a path of length <= 1 yields empty results char full[] = "/"; cut_path(full, path, sizeof(path), pname, sizeof(pname)); assertf(path[0] == '\0' && pname[0] == '\0'); } } // get_httptype_sized(): a long MIME type (Office OOXML reaches 73 chars) is // written whole into a contenttype-sized buffer; returns 1 on a match, 0 when // flag==0 and nothing matched. Regression for the old contenttype[64] // overflow. { httrackp *opt = hts_create_opt(); htsblk r; // write into the real struct field, not a stand-in assertf(opt != NULL); // a long MIME (Office OOXML reaches 73 chars) must fit htsblk.contenttype // whole: a [64] field would make this bounded copy abort. assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "deck.pptx", 0) == 1); assertf(strcmp(r.contenttype, "application/vnd.openxmlformats-officedocument." "presentationml.presentation") == 0); assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "x.gif", 0) == 1); assertf(strcmp(r.contenttype, "image/gif") == 0); // modern extensions map back to their MIME type assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "x.webp", 0) == 1); assertf(strcmp(r.contenttype, "image/webp") == 0); assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "app.wasm", 0) == 1); assertf(strcmp(r.contenttype, "application/wasm") == 0); assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "mod.mjs", 0) == 1); assertf(strcmp(r.contenttype, "text/javascript") == 0); // no extension and flag==0: nothing written, returns 0 assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "noextfile", 0) == 0); assertf(r.contenttype[0] == '\0'); // no extension and flag==1: octet-stream fallback, returns 1 assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "noextfile", 1) == 1); assertf(strcmp(r.contenttype, "application/octet-stream") == 0); // empty fil: no extension to scan; must not over-read before the string. // flag==0 -> 0 (nothing written), flag==1 -> octet-stream. assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "", 0) == 0); assertf(r.contenttype[0] == '\0'); assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "", 1) == 1); assertf(strcmp(r.contenttype, "application/octet-stream") == 0); // a user --assume rule with an empty value matches but writes nothing: // get_userhttptype returns 1 with the buffer empty, so get_httptype_sized // must still report 0 (callers test the return like the old // strnotempty(s)). StringCopy(opt->mimedefs, "\ncgi=\n"); assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "/x.cgi", 0) == 0); assertf(r.contenttype[0] == '\0'); StringCopy(opt->mimedefs, "\ncgi=text/html\n"); assertf(get_httptype_sized(opt, r.contenttype, sizeof(r.contenttype), "/x.cgi", 0) == 1); assertf(strcmp(r.contenttype, "text/html") == 0); hts_free_opt(opt); } // adr_normalized_sized(): bounded host normalization (passthrough when // already normal). { char n[HTS_URLMAXSIZE]; assertf(strcmp(adr_normalized_sized("example.com", n, sizeof(n)), "example.com") == 0); } // standard_name(): builds "." into a bounded buffer. The md5 // is appended (4 chars) only when the URL has a query string (see url_md5), // so test both; pin the structure (name + ext, lengths), not the md5 chars. { char b[HTS_URLMAXSIZE * 2]; const char *nom = "index.html"; // name part const char *dot = nom + 5; // points at ".html" size_t len; // no query -> no md5: "index" + ".html" standard_name(b, sizeof(b), dot, nom, "http://example.com/index.html", 0); assertf(strcmp(b, "index.html") == 0); // query -> 4 md5 chars between name and ext: "index" + md5(4) + ".html" standard_name(b, sizeof(b), dot, nom, "http://example.com/index.html?v=1", 0); len = strlen(b); assertf(len == 5 + 4 + 5); assertf(strncmp(b, "index", 5) == 0); assertf(strcmp(b + len - 5, ".html") == 0); // short names: name kept (<=8), the extension is clamped to 3 -> ".htm" standard_name(b, sizeof(b), dot, nom, "http://example.com/index.html?v=1", 1); len = strlen(b); assertf(len == 5 + 4 + 4); assertf(strcmp(b + len - 4, ".htm") == 0); // short names with a >8-char name: the name is clamped to 8 ("indexpag") { const char *lnom = "indexpage.html"; const char *ldot = lnom + 9; // points at ".html" standard_name(b, sizeof(b), ldot, lnom, "http://example.com/indexpage.html?v=1", 1); len = strlen(b); assertf(len == 8 + 4 + 4); assertf(strncmp(b, "indexpag", 8) == 0); assertf(strcmp(b + len - 4, ".htm") == 0); } } // longfile_to_83(): single-name 8-3 (mode 1) / ISO9660 (mode 2) conversion; // uppercases, clamps the name (8 / 31) and the extension (3). It rewrites // 'save' in place, so pass a mutable array. { char n83[256]; { char save[] = "longfilename.html"; longfile_to_83(1, n83, sizeof(n83), save); // 8-3: name->8, ext->3 assertf(strcmp(n83, "LONGFILE.HTM") == 0); } { char save[] = "longfilename.html"; longfile_to_83(2, n83, sizeof(n83), save); // ISO9660: name->31, ext->3 assertf(strcmp(n83, "LONGFILENAME.HTM") == 0); } { // sanitization: leading '.'->'_', interior dots char save[] = ".a b.c.d e"; // collapse to '_', spaces/specials -> '_' // (only the last dot stays as the separator) longfile_to_83(1, n83, sizeof(n83), save); assertf(strcmp(n83, "_A_B_C.D_E") == 0); } } // long_to_83(): per-segment 8-3 conversion of a whole path. { char n83[HTS_URLMAXSIZE * 2]; char save[] = "dir/longfilename.html"; long_to_83(1, n83, sizeof(n83), save); assertf(strcmp(n83, "DIR/LONGFILE.HTM") == 0); } // lienrelatif(): relative path from the directory of curr_fil to link. { char s[HTS_URLMAXSIZE * 2]; // same directory -> just the basename assertf(lienrelatif(s, sizeof(s), "dir/page.html", "dir/index.html") == 0); assertf(strcmp(s, "page.html") == 0); // link one level up -> a "../" prefix assertf(lienrelatif(s, sizeof(s), "a.html", "dir/index.html") == 0); assertf(strcmp(s, "../a.html") == 0); } } /* Self-tests for the htssafe.h bounded string ops. Returns 0 if every bounded operation behaved correctly, 1 otherwise. The abort-on-overflow guarantee is checked separately by the "overflow" sub-mode (it aborts the process by design). */ static int string_safety_selftests(void) { char buf[8]; /* strcpybuff into a sized array: exact copy */ strcpybuff(buf, "abc"); if (strcmp(buf, "abc") != 0) return 1; /* strcatbuff append within capacity */ strcatbuff(buf, "de"); if (strcmp(buf, "abcde") != 0) return 1; /* strncatbuff appends at most N source chars */ strcpybuff(buf, "ab"); strncatbuff(buf, "cdef", 2); if (strcmp(buf, "abcd") != 0) return 1; /* strlcpybuff: explicit-capacity copy into a pointer destination, the form the migration moves toward */ { char storage[8]; char *const p = storage; strlcpybuff(p, "hello", sizeof(storage)); if (strcmp(p, "hello") != 0) return 1; } /* strcpybuff into a pointer destination: routes through the unchecked strcpybuff_ptr_ fallback (the path the overflow warning flags). The warning is intentional here; we only verify the fallback still copies correctly. */ #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wattribute-warning" #endif { char storage[8]; char *const p = storage; strcpybuff(p, "ptr"); if (strcmp(p, "ptr") != 0) return 1; } #if defined(__GNUC__) #pragma GCC diagnostic pop #endif /* htsbuff: bounded builder over a fixed array (append, truncating append, reset, and length tracking) */ { char dst[8]; htsbuff b = htsbuff_array(dst); htsbuff_cat(&b, "ab"); htsbuff_cat(&b, "cd"); if (strcmp(htsbuff_str(&b), "abcd") != 0 || b.len != 4) return 1; htsbuff_catn(&b, "efghij", 2); /* append at most 2 */ if (strcmp(htsbuff_str(&b), "abcdef") != 0) return 1; htsbuff_cpy(&b, "xyz"); /* reset */ if (strcmp(htsbuff_str(&b), "xyz") != 0 || b.len != 3) return 1; htsbuff_catc(&b, '!'); /* single character */ if (strcmp(htsbuff_str(&b), "xyz!") != 0 || b.len != 4) return 1; } /* boundary: filling to exactly cap-1 must succeed (one more aborts, which the overflow-buff mode checks) */ { char d2[4]; htsbuff c = htsbuff_array(d2); htsbuff_cat(&c, "abc"); if (strcmp(htsbuff_str(&c), "abc") != 0 || c.len != 3) return 1; } /* StringCatN/StringSetLength must eval SIZE once: (n_eval++, V) leaves n_eval == 2 on a double-eval macro. */ { String s = STRING_EMPTY; int n_eval = 0; StringCat(s, "hello"); StringCatN(s, "world", (n_eval++, 3)); /* strlen>SIZE so the clamp runs */ if (n_eval != 1 || strcmp(StringBuff(s), "hellowor") != 0) { StringFree(s); return 1; } n_eval = 0; StringSetLength(s, (n_eval++, 5)); if (n_eval != 1 || StringLength(s) != 5) { StringFree(s); return 1; } StringFree(s); } /* StringSubRW still reads/writes after dropping its duplicate definition. */ { String s = STRING_EMPTY; StringCat(s, "abc"); StringSubRW(s, 1) = 'X'; if (StringSub(s, 1) != 'X' || strcmp(StringBuff(s), "aXc") != 0) { StringFree(s); return 1; } StringFree(s); } return 0; } /* ------------------------------------------------------------ */ /* The individual self-tests. Each runs over argv[0..argc-1] and returns the */ /* process exit code (0 == success); a result line goes to stdout. */ /* ------------------------------------------------------------ */ static int st_filter(httrackp *opt, int argc, char **argv) { char *str, *pat; int matched; (void) opt; if (argc < 1) { fprintf(stderr, "filter: needs a filter pattern and a string\n"); return 1; } /* exact-size heap copies so a sanitizer traps an over-read; a missing subject means "" (not reachable as a CLI arg) */ str = strdupt(argc >= 2 ? argv[1] : ""); pat = strdupt(argv[0]); matched = strjoker(str, pat, NULL, NULL) != NULL; printf("%s does %s %s\n", str, matched ? "match" : "NOT match", argv[0]); freet(str); freet(pat); return 0; } /* Size-aware filter verdict via fa_strjoker: a negative means the size is still unknown (scan time), so a size rule like -*.jpg*[<10] must stay neutral. */ static int st_filtersize(httrackp *opt, int argc, char **argv) { LLint sz; int size_flag = 0, verdict, known; (void) opt; if (argc < 3) { fprintf(stderr, "filtersize: needs [filter...]\n"); return 1; } known = (argv[0][0] != '-'); /* "-1"/"-" => size unknown */ sz = -1; if (known) sscanf(argv[0], LLintP, &sz); verdict = fa_strjoker(0, &argv[2], argc - 2, argv[1], known ? &sz : NULL, known ? &size_flag : NULL, NULL); printf("verdict=%s size_flag=%d\n", verdict > 0 ? "allowed" : verdict < 0 ? "forbidden" : "unknown", size_flag); return 0; } /* Mime-type filter verdict via fa_strjoker(type=1): only mime: rules apply. */ static int st_filtermime(httrackp *opt, int argc, char **argv) { int verdict; (void) opt; if (argc < 2) { fprintf(stderr, "filtermime: needs [filter...]\n"); return 1; } verdict = fa_strjoker(1, &argv[1], argc - 1, argv[0], NULL, NULL, NULL); printf("verdict=%s\n", verdict > 0 ? "allowed" : verdict < 0 ? "forbidden" : "unknown"); return 0; } /* SplitMix64: deterministic, platform-independent case generator. */ static uint64_t st_mix64(uint64_t *state) { uint64_t z = (*state += UINT64_C(0x9E3779B97F4A7C15)); z = (z ^ (z >> 30)) * UINT64_C(0xBF58476D1CE4B5B9); z = (z ^ (z >> 27)) * UINT64_C(0x94D049BB133111EB); return z ^ (z >> 31); } /* Differential test: memoized strjoker vs the no-memo oracle on seeded random pattern/subject/size cases must agree on result, *size and *size_flag. */ static int st_filtermemo(httrackp *opt, int argc, char **argv) { static const char *const pieces[] = { "a", "b", "A", "c", ".", "/", "?", "*", "*[a]", "*[ab]", "*[a-c]", "*[A-Z]", "*[<5]", "*[>5]", "*(a)", "*(a,b)", "*[file]", "*[path]", "*[name]", "*[param]", "*[]", "*[\\a]", "*[a-"}; static const char subject_chars[] = "abAc./?"; uint64_t rng = UINT64_C(0x501); int iters = 20000, matched = 0, unmatched = 0; int it; (void) opt; if (argc >= 1) sscanf(argv[0], "%d", &iters); for (it = 0; it < iters; it++) { char pat[64], str[16]; size_t pl = 0; const int npieces = (int) (st_mix64(&rng) % 5); const int slen = (int) (st_mix64(&rng) % 13); const int szsel = (int) (st_mix64(&rng) % 4); /* none/unknown/3/20 */ LLint sz1, sz2, off1, off2; int i, flag1 = 0, flag2 = 0; char *hpat, *hstr; const char *adr; for (i = 0; i < npieces; i++) { const char *p = pieces[st_mix64(&rng) % (sizeof(pieces) / sizeof(pieces[0]))]; const size_t len = strlen(p); if (len >= sizeof(pat) - pl) break; memcpy(pat + pl, p, len); pl += len; } pat[pl] = '\0'; for (i = 0; i < slen; i++) str[i] = subject_chars[st_mix64(&rng) % (sizeof(subject_chars) - 1)]; str[slen] = '\0'; sz1 = sz2 = (szsel <= 1) ? -1 : (szsel == 2) ? 3 : 20; /* exact-size heap copies per run so a sanitizer traps any over-read */ hpat = strdupt(pat); hstr = strdupt(str); adr = strjoker(hstr, hpat, szsel ? &sz1 : NULL, szsel ? &flag1 : NULL); off1 = adr != NULL ? (LLint) (adr - hstr) : -1; freet(hpat); freet(hstr); hpat = strdupt(pat); hstr = strdupt(str); adr = strjoker_nomemo(hstr, hpat, szsel ? &sz2 : NULL, szsel ? &flag2 : NULL); off2 = adr != NULL ? (LLint) (adr - hstr) : -1; freet(hpat); freet(hstr); if (off1 != off2 || sz1 != sz2 || flag1 != flag2) { printf("filtermemo MISMATCH pat=[%s] str=[%s] szsel=%d: " "off %d/%d size %d/%d flag %d/%d\n", pat, str, szsel, (int) off1, (int) off2, (int) sz1, (int) sz2, flag1, flag2); return 1; } if (off1 >= 0) matched++; else unmatched++; } /* both polarities must actually occur or the test proves nothing */ assertf(matched > 0 && unmatched > 0); printf("filtermemo: %d cases OK\n", iters); return 0; } /* Merged two-form filter verdict via fa_strjoker_dual (see htsfilters.h). */ static int st_filterdual(httrackp *opt, int argc, char **argv) { int depth = -1, verdict; (void) opt; if (argc < 3) { fprintf(stderr, "filterdual: needs [filter...]\n"); return 1; } verdict = fa_strjoker_dual(0, &argv[2], argc - 2, argv[0], argv[1], NULL, NULL, &depth); printf("verdict=%s rule=%d\n", verdict > 0 ? "allowed" : verdict < 0 ? "forbidden" : "unknown", depth); return 0; } /* Length/work caps stop a hostile pattern stack-overflowing or hanging the process (OSS-Fuzz 5060751291908096 / 5745936014573568). */ static int st_filterbounds(httrackp *opt, int argc, char **argv) { const size_t big = 100000; /* well past the length cap */ const size_t stars = 1023; /* pattern len 2047, under the length cap */ const size_t subjlen = 2048; char *subj = malloct(big + 1); char *pat = malloct(2 * stars + 2); size_t steps = 0, maxsteps = 0, depth = 0, maxdepth = 0, i; (void) opt; (void) argc; (void) argv; memset(subj, 'a', big); subj[big] = '\0'; /* '*' matches anything, but an over-length subject trips the length cap */ assertf(strjoker(subj, "*", NULL, NULL) == NULL); assertf(strjokerfind(subj, "*") == NULL); /* Star-heavy dead-end at the length cap: unbounded it runs ~1.26e9 memo-steps (~6s). */ for (i = 0; i < stars; i++) { pat[2 * i] = '*'; pat[2 * i + 1] = 'a'; } pat[2 * stars] = 'b'; /* never matches an all-'a' subject */ pat[2 * stars + 1] = '\0'; subj[subjlen] = '\0'; /* Budget must fire and hold: steps > cap (deleting the budget zeroes the counter that is the enforcement), steps < 10*cap (unbudgeted ~1.26e9). */ assertf(strjoker_bounds(subj, pat, &steps, &maxsteps, &depth, &maxdepth) == NULL); assertf(steps > maxsteps && steps < 10 * maxsteps); /* Depth caps the stack: uncapped this recurses 2046 frames, ~900KB (#574). */ assertf(depth == maxdepth); assertf(strjokerfind(subj, pat) == NULL); /* Pin the cap from below: 32 segments must still match, so a cap set so low it would break real multi-segment filters (which use far fewer) fails. */ for (i = 0; i < 32; i++) { pat[2 * i] = '*'; pat[2 * i + 1] = 'a'; } pat[64] = '\0'; memset(subj, 'a', 32); subj[32] = '\0'; assertf(strjoker(subj, pat, NULL, NULL) != NULL); /* Same pin for the class-branch shape users actually write (*[..]), against a long subject: it must match with room to spare under the work cap. */ { const char *seg = "*[A-Z,a-z,0-9]"; const size_t seglen = strlen(seg), nseg = 16; for (i = 0; i < (int) nseg; i++) memcpy(pat + i * seglen, seg, seglen); pat[nseg * seglen] = '\0'; memset(subj, 'a', 512); subj[512] = '\0'; assertf(strjoker_bounds(subj, pat, &steps, &maxsteps, NULL, NULL) != NULL); assertf(steps < maxsteps); } freet(pat); freet(subj); printf("filterbounds: OK\n"); return 0; } static int st_simplify(httrackp *opt, int argc, char **argv) { (void) opt; if (argc < 1) { fprintf(stderr, "simplify: needs a path\n"); return 1; } fil_simplifie(argv[0]); printf("simplified=%s\n", argv[0]); return 0; } static int st_expandhome(httrackp *opt, int argc, char **argv) { String path = STRING_EMPTY; (void) opt; if (argc < 1) { fprintf(stderr, "expandhome: needs a path\n"); return 1; } StringCopy(path, argv[0]); expand_home(&path); printf("expanded=%s\n", StringBuff(path)); StringFree(path); return 0; } static int st_mime(httrackp *opt, int argc, char **argv) { char mime[256]; if (argc < 1) { fprintf(stderr, "mime: needs a filename\n"); return 1; } if (get_httptype_sized(opt, mime, sizeof(mime), argv[0], 0)) { char ext[256]; printf("%s is '%s'\n", argv[0], mime); if (give_mimext(ext, sizeof(ext), mime)) printf("and its local type is '.%s'\n", ext); } else { printf("%s is of an unknown MIME type\n", argv[0]); } return 0; } static size_t st_decode_body(const char *arg, char *buf, size_t size); static int st_charset(httrackp *opt, int argc, char **argv) { char buf[512]; size_t len; char *s; (void) opt; if (argc < 2) { fprintf(stderr, "charset: needs a charset and a string\n"); return 1; } len = st_decode_body(argv[1], buf, sizeof(buf)); s = hts_convertStringToUTF8(buf, len, argv[0]); if (s != NULL) { printf("%s\n", s); freet(s); } else { fprintf(stderr, "invalid string for charset %s\n", argv[0]); } return 0; } static int st_metacharset(httrackp *opt, int argc, char **argv) { char *s; (void) opt; if (argc < 1) { fprintf(stderr, "metacharset: needs an html string\n"); return 1; } s = hts_getCharsetFromMeta(argv[0], strlen(argv[0])); printf("%s\n", s != NULL ? s : "(none)"); freet(s); return 0; } static int st_isutf8(httrackp *opt, int argc, char **argv) { char buf[512]; size_t len; (void) opt; if (argc < 1) { fprintf(stderr, "isutf8: needs a string\n"); return 1; } len = st_decode_body(argv[0], buf, sizeof(buf)); printf("%d\n", hts_isStringUTF8(buf, len) ? 1 : 0); return 0; } static int st_idna_encode(httrackp *opt, int argc, char **argv) { char buf[512]; size_t len; char *s; (void) opt; if (argc < 1) { fprintf(stderr, "idna-encode: needs a hostname\n"); return 1; } len = st_decode_body(argv[0], buf, sizeof(buf)); s = hts_convertStringUTF8ToIDNA(buf, len); if (s != NULL) { printf("%s\n", s); freet(s); } else { fprintf(stderr, "invalid string '%s'\n", argv[0]); } return 0; } static int st_idna_decode(httrackp *opt, int argc, char **argv) { char *s; (void) opt; if (argc < 1) { fprintf(stderr, "idna-decode: needs a hostname\n"); return 1; } s = hts_convertStringIDNAToUTF8(argv[0], strlen(argv[0])); if (s != NULL) { printf("%s\n", s); freet(s); } else { fprintf(stderr, "invalid string '%s'\n", argv[0]); } return 0; } static int st_entities(httrackp *opt, int argc, char **argv) { char *s; const char *enc; (void) opt; if (argc < 1) { fprintf(stderr, "entities: needs a string\n"); return 1; } s = strdupt(argv[0]); enc = argc >= 2 ? argv[1] : "UTF-8"; if (s != NULL && hts_unescapeEntitiesWithCharset(s, s, strlen(s) + 1, enc) == 0) { printf("%s\n", s); freet(s); } else { fprintf(stderr, "invalid string '%s'\n", argv[0]); } return 0; } // -#test=footerfmt