about summary refs log tree commit diff stats
path: root/WWW/Library/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'WWW/Library/Implementation')
-rw-r--r--WWW/Library/Implementation/HTFile.c93
-rw-r--r--WWW/Library/Implementation/HTFile.h24
-rw-r--r--WWW/Library/Implementation/HTFormat.c22
-rw-r--r--WWW/Library/Implementation/HTMIME.c168
-rw-r--r--WWW/Library/Implementation/HTTCP.c32
-rw-r--r--WWW/Library/Implementation/HTUtils.h18
-rw-r--r--WWW/Library/Implementation/SGML.c4
7 files changed, 271 insertions, 90 deletions
diff --git a/WWW/Library/Implementation/HTFile.c b/WWW/Library/Implementation/HTFile.c
index bfd79410..2ab38a3c 100644
--- a/WWW/Library/Implementation/HTFile.c
+++ b/WWW/Library/Implementation/HTFile.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTFile.c,v 1.105 2008/09/18 21:34:25 tom Exp $
+ * $LynxId: HTFile.c,v 1.110 2008/12/07 18:49:34 tom Exp $
  *
  *			File Access				HTFile.c
  *			===========
@@ -1247,6 +1247,62 @@ CompressFileType HTCompressFileType(const char *filename,
 }
 
 /*
+ *  Determine expected file-suffix from the compression method.
+ */
+const char *HTCompressTypeToSuffix(CompressFileType method)
+{
+    const char *result = "";
+
+    switch (method) {
+    default:
+    case cftNone:
+	result = "";
+	break;
+    case cftGzip:
+	result = ".gz";
+	break;
+    case cftCompress:
+	result = ".Z";
+	break;
+    case cftBzip2:
+	result = ".bz2";
+	break;
+    case cftDeflate:
+	result = ".zz";
+	break;
+    }
+    return result;
+}
+
+/*
+ *  Determine compression encoding from the compression method.
+ */
+const char *HTCompressTypeToEncoding(CompressFileType method)
+{
+    const char *result = NULL;
+
+    switch (method) {
+    default:
+    case cftNone:
+	result = NULL;
+	break;
+    case cftGzip:
+	result = "gzip";
+	break;
+    case cftCompress:
+	result = "compress";
+	break;
+    case cftBzip2:
+	result = "bzip2";
+	break;
+    case cftDeflate:
+	result = "deflate";
+	break;
+    }
+    return result;
+}
+
+/*
  * Check if the token from "Content-Encoding" corresponds to a compression
  * type.  RFC 2068 (and cut/paste into RFC 2616) lists these:
  *	gzip
@@ -1276,6 +1332,41 @@ CompressFileType HTEncodingToCompressType(const char *coding)
     return result;
 }
 
+CompressFileType HTContentTypeToCompressType(const char *ct)
+{
+    CompressFileType method = cftNone;
+
+    if (!strncasecomp(ct, "application/gzip", 16) ||
+	!strncasecomp(ct, "application/x-gzip", 18)) {
+	method = cftGzip;
+    } else if (!strncasecomp(ct, "application/compress", 20) ||
+	       !strncasecomp(ct, "application/x-compress", 22)) {
+	method = cftCompress;
+    } else if (!strncasecomp(ct, "application/bzip2", 17) ||
+	       !strncasecomp(ct, "application/x-bzip2", 19)) {
+	method = cftBzip2;
+    }
+    return method;
+}
+
+/*
+ * Check the anchor's content_type and content_encoding elements for a gzip or
+ * Unix compressed file -FM, TD
+ */
+CompressFileType HTContentToCompressType(HTParentAnchor *anchor)
+{
+    CompressFileType method = cftNone;
+    const char *ct = HTAnchor_content_type(anchor);
+    const char *ce = HTAnchor_content_encoding(anchor);
+
+    if (ce == NULL && ct != 0) {
+	method = HTContentTypeToCompressType(ct);
+    } else if (ce != 0) {
+	method = HTEncodingToCompressType(ce);
+    }
+    return method;
+}
+
 /*	Determine write access to a file.
  *	---------------------------------
  *
diff --git a/WWW/Library/Implementation/HTFile.h b/WWW/Library/Implementation/HTFile.h
index 38f407f2..b7a514d6 100644
--- a/WWW/Library/Implementation/HTFile.h
+++ b/WWW/Library/Implementation/HTFile.h
@@ -1,4 +1,6 @@
-/*							File access in libwww
+/*
+ * $LynxId: HTFile.h,v 1.31 2008/12/07 18:49:53 tom Exp $
+ *							File access in libwww
  *				FILE ACCESS
  *
  *  These are routines for local file access used by WWW browsers and servers.
@@ -221,15 +223,25 @@ extern "C" {
 					       int *rootlen);
 
 /*
- *  Determine compression type from the content-type.
+ *  Determine compression type from the content-encoding.
  */
-    extern CompressFileType HTContentToCompressType(const char *encoding);
-
+    extern CompressFileType HTEncodingToCompressType(const char *encoding);
 /*
  *  Determine compression type from the content-encoding.
  */
-    extern CompressFileType HTEncodingToCompressType(const char *encoding);
-
+    extern CompressFileType HTContentTypeToCompressType(const char *ct);
+/*
+ *  Determine compression type from the content-type and/or content-encoding.
+ */
+    extern CompressFileType HTContentToCompressType(HTParentAnchor *anchor);
+/*
+ *  Determine compression encoding from the compression method.
+ */
+    extern const char *HTCompressTypeToEncoding(CompressFileType method);
+/*
+ *  Determine expected file-suffix from the compression method.
+ */
+    extern const char *HTCompressTypeToSuffix(CompressFileType method);
 /*
  *  Determine write access to a file.
  *
diff --git a/WWW/Library/Implementation/HTFormat.c b/WWW/Library/Implementation/HTFormat.c
index 5818e8a6..0aaead00 100644
--- a/WWW/Library/Implementation/HTFormat.c
+++ b/WWW/Library/Implementation/HTFormat.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTFormat.c,v 1.63 2008/09/10 23:22:59 tom Exp $
+ * $LynxId: HTFormat.c,v 1.64 2008/12/07 15:53:54 tom Exp $
  *
  *		Manage different file formats			HTFormat.c
  *		=============================
@@ -396,8 +396,9 @@ static HTPresentation *HTFindPresentation(HTFormat rep_in,
 	    if (pres->rep_out == rep_out) {
 		if (failsMailcap(pres, anchor))
 		    continue;
-		CTRACE((tfp, "FindPresentation: found exact match: %s\n",
-			HTAtom_name(pres->rep)));
+		CTRACE((tfp, "FindPresentation: found exact match: %s -> %s\n",
+			HTAtom_name(pres->rep),
+			HTAtom_name(pres->rep_out)));
 		return pres;
 
 	    } else if (!fill_in) {
@@ -412,8 +413,9 @@ static HTPresentation *HTFindPresentation(HTFormat rep_in,
 			strong_wildcard_match = pres;
 		    /* otherwise use the first one */
 		    CTRACE((tfp,
-			    "StreamStack: found strong wildcard match: %s\n",
-			    HTAtom_name(pres->rep)));
+			    "StreamStack: found strong wildcard match: %s -> %s\n",
+			    HTAtom_name(pres->rep),
+			    HTAtom_name(pres->rep_out)));
 		}
 	    }
 
@@ -429,8 +431,9 @@ static HTPresentation *HTFindPresentation(HTFormat rep_in,
 		    strong_subtype_wildcard_match = pres;
 		/* otherwise use the first one */
 		CTRACE((tfp,
-			"StreamStack: found strong subtype wildcard match: %s\n",
-			HTAtom_name(pres->rep)));
+			"StreamStack: found strong subtype wildcard match: %s -> %s\n",
+			HTAtom_name(pres->rep),
+			HTAtom_name(pres->rep_out)));
 	    }
 	}
 
@@ -515,8 +518,9 @@ HTStream *HTStreamStack(HTFormat rep_in,
 	if (match == &temp) {
 	    CTRACE((tfp, "StreamStack: Using %s\n", HTAtom_name(temp.rep_out)));
 	} else {
-	    CTRACE((tfp, "StreamStack: found exact match: %s\n",
-		    HTAtom_name(match->rep)));
+	    CTRACE((tfp, "StreamStack: found exact match: %s -> %s\n",
+		    HTAtom_name(match->rep),
+		    HTAtom_name(match->rep_out)));
 	}
 	result = (*match->converter) (match, anchor, sink);
     } else {
diff --git a/WWW/Library/Implementation/HTMIME.c b/WWW/Library/Implementation/HTMIME.c
index df5115b6..6f3fb58b 100644
--- a/WWW/Library/Implementation/HTMIME.c
+++ b/WWW/Library/Implementation/HTMIME.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTMIME.c,v 1.64 2008/09/17 00:04:44 tom Exp $
+ * $LynxId: HTMIME.c,v 1.66 2008/12/07 20:23:52 tom Exp $
  *
  *			MIME Message Parse			HTMIME.c
  *			==================
@@ -215,8 +215,66 @@ static void dequote(char *url)
     }
 }
 
+/*
+ * Strip off any compression-suffix from the address and check if the result
+ * looks like one of the presentable suffixes.  If so, return the corresponding
+ * MIME type.
+ */
+static const char *UncompressedContentType(HTStream *me, CompressFileType method)
+{
+    const char *result = 0;
+    char *address = me->anchor->address;
+    const char *expected = HTCompressTypeToSuffix(method);
+    const char *actual = strrchr(address, '.');
+
+    /*
+     * We have to ensure the suffix is consistent, to use HTFileFormat().
+     */
+    if (actual != 0 && !strcasecomp(actual, expected)) {
+	HTFormat format;
+	HTAtom *pencoding = 0;
+	const char *description = 0;
+
+	format = HTFileFormat(address, &pencoding, &description);
+	result = HTAtom_name(format);
+    }
+
+    return result;
+}
+
 static int pumpData(HTStream *me)
 {
+    CompressFileType method;
+    const char *new_encoding;
+    const char *new_content;
+
+    CTRACE((tfp, "Begin pumpData\n"));
+    /*
+     * If the content-type says it is compressed, and there is no
+     * content-encoding, check further and see if the address (omitting the
+     * suffix for a compressed type) looks like a type we can present.  If so,
+     * rearrange things so we'll present the StreamStack code with the
+     * presentable type, already marked as compressed.
+     */
+    CTRACE((tfp, "...address{%s}\n", me->anchor->address));
+    method = HTContentTypeToCompressType(me->anchor->content_type_params);
+    if ((method != cftNone)
+	&& isEmpty(me->anchor->content_encoding)
+	&& (new_content = UncompressedContentType(me, method)) != 0) {
+
+	new_encoding = HTCompressTypeToEncoding(method);
+	CTRACE((tfp, "reinterpreting as content-type:%s, encoding:%s\n",
+		new_content, new_encoding));
+
+	StrAllocCopy(me->anchor->content_encoding, new_encoding);
+	FREE(me->compression_encoding);
+	StrAllocCopy(me->compression_encoding, new_encoding);
+
+	strcpy(me->value, new_content);
+	StrAllocCopy(me->anchor->content_type_params, me->value);
+	me->format = HTAtom_for(me->value);
+    }
+
     if (strchr(HTAtom_name(me->format), ';') != NULL) {
 	char *cp = NULL, *cp1, *cp2, *cp3 = NULL, *cp4;
 
@@ -451,68 +509,72 @@ static int pumpData(HTStream *me)
 	    }
 	}
     }
+    CTRACE((tfp, "...pumpData finished reading header\n"));
     if (me->head_only) {
 	/* We are done! - kw */
 	me->state = MIME_IGNORE;
-	return HT_OK;
-    }
-
-    if (me->no_streamstack) {
-	me->target = me->sink;
     } else {
-	if (!me->compression_encoding) {
-	    CTRACE((tfp,
-		    "HTMIME: MIME Content-Type is '%s', converting to '%s'\n",
-		    HTAtom_name(me->format), HTAtom_name(me->targetRep)));
+
+	if (me->no_streamstack) {
+	    me->target = me->sink;
 	} else {
+	    if (!me->compression_encoding) {
+		CTRACE((tfp,
+			"HTMIME: MIME Content-Type is '%s', converting to '%s'\n",
+			HTAtom_name(me->format), HTAtom_name(me->targetRep)));
+	    } else {
+		/*
+		 * Change the format to that for "www/compressed" and set up a
+		 * stream to deal with it.  - FM
+		 */
+		CTRACE((tfp, "HTMIME: MIME Content-Type is '%s',\n",
+			HTAtom_name(me->format)));
+		me->format = HTAtom_for("www/compressed");
+		CTRACE((tfp, "        Treating as '%s'.  Converting to '%s'\n",
+			HTAtom_name(me->format), HTAtom_name(me->targetRep)));
+		FREE(me->compression_encoding);
+	    }
+	    me->target = HTStreamStack(me->format, me->targetRep,
+				       me->sink, me->anchor);
+	    if (!me->target) {
+		CTRACE((tfp, "HTMIME: Can't translate! ** \n"));
+		me->target = me->sink;	/* Cheat */
+	    }
+	}
+	if (me->target) {
+	    me->targetClass = *me->target->isa;
 	    /*
-	     * Change the format to that for "www/compressed" and set up a
-	     * stream to deal with it.  - FM
+	     * Pump rest of data right through, according to the transfer encoding.
 	     */
-	    CTRACE((tfp, "HTMIME: MIME Content-Type is '%s',\n", HTAtom_name(me->format)));
-	    me->format = HTAtom_for("www/compressed");
-	    CTRACE((tfp, "        Treating as '%s'.  Converting to '%s'\n",
-		    HTAtom_name(me->format), HTAtom_name(me->targetRep)));
-	    FREE(me->compression_encoding);
-	}
-	me->target = HTStreamStack(me->format, me->targetRep,
-				   me->sink, me->anchor);
-	if (!me->target) {
-	    CTRACE((tfp, "HTMIME: Can't translate! ** \n"));
-	    me->target = me->sink;	/* Cheat */
+	    me->state = (me->chunked_encoding
+			 ? MIME_CHUNKED
+			 : MIME_TRANSPARENT);
+	} else {
+	    me->state = MIME_IGNORE;	/* What else to do? */
 	}
-    }
-    if (me->target) {
-	me->targetClass = *me->target->isa;
-	/*
-	 * Pump rest of data right through, according to the transfer encoding.
-	 */
-	me->state = (me->chunked_encoding
-		     ? MIME_CHUNKED
-		     : MIME_TRANSPARENT);
-    } else {
-	me->state = MIME_IGNORE;	/* What else to do? */
-    }
-    if (me->refresh_url != NULL && !content_is_compressed(me)) {
-	char *url = NULL;
-	char *num = NULL;
-	char *txt = NULL;
-	const char *base = "";	/* FIXME: refresh_url may be relative to doc */
-
-	LYParseRefreshURL(me->refresh_url, &num, &url);
-	if (url != NULL && me->format == WWW_HTML) {
-	    CTRACE((tfp, "Formatting refresh-url as first line of result\n"));
-	    HTSprintf0(&txt, gettext("Refresh: "));
-	    HTSprintf(&txt, gettext("%s seconds "), num);
-	    dequote(url);
-	    HTSprintf(&txt, "<a href=\"%s%s\">%s</a><br>", base, url, url);
-	    CTRACE((tfp, "URL %s%s\n", base, url));
-	    (me->isa->put_string) (me, txt);
-	    free(txt);
+	if (me->refresh_url != NULL && !content_is_compressed(me)) {
+	    char *url = NULL;
+	    char *num = NULL;
+	    char *txt = NULL;
+	    const char *base = "";	/* FIXME: refresh_url may be relative to doc */
+
+	    LYParseRefreshURL(me->refresh_url, &num, &url);
+	    if (url != NULL && me->format == WWW_HTML) {
+		CTRACE((tfp,
+			"Formatting refresh-url as first line of result\n"));
+		HTSprintf0(&txt, gettext("Refresh: "));
+		HTSprintf(&txt, gettext("%s seconds "), num);
+		dequote(url);
+		HTSprintf(&txt, "<a href=\"%s%s\">%s</a><br>", base, url, url);
+		CTRACE((tfp, "URL %s%s\n", base, url));
+		(me->isa->put_string) (me, txt);
+		free(txt);
+	    }
+	    FREE(num);
+	    FREE(url);
 	}
-	FREE(num);
-	FREE(url);
     }
+    CTRACE((tfp, "...end of pumpData\n"));
     return HT_OK;
 }
 
diff --git a/WWW/Library/Implementation/HTTCP.c b/WWW/Library/Implementation/HTTCP.c
index ee7c52b5..033815f1 100644
--- a/WWW/Library/Implementation/HTTCP.c
+++ b/WWW/Library/Implementation/HTTCP.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTTCP.c,v 1.97 2008/09/20 14:32:29 tom Exp $
+ * $LynxId: HTTCP.c,v 1.98 2008/12/07 21:10:36 tom Exp $
  *
  *			Generic Communication Code		HTTCP.c
  *			==========================
@@ -1548,6 +1548,17 @@ static BOOL HTWasInterrupted(int *status)
     return result;
 }
 
+#define TRIES_PER_SECOND 10
+
+/*
+ * Set the select-timeout to 0.1 seconds.
+ */
+static void set_timeout(struct timeval *timeoutp)
+{
+    timeoutp->tv_sec = 0;
+    timeoutp->tv_usec = 100000;
+}
+
 #ifndef MULTINET		/* SOCKET_ERRNO != errno ? */
 #if !defined(UCX) || !defined(VAXC)	/* errno not modifiable ? */
 #define SOCKET_DEBUG_TRACE	/* show errno status after some system calls */
@@ -1748,7 +1759,7 @@ int HTDoConnect(const char *url,
 		/*
 		 * Protect against an infinite loop.
 		 */
-		if ((tries++ / 10) >= connect_timeout) {
+		if ((tries++ / TRIES_PER_SECOND) >= connect_timeout) {
 		    HTAlert(gettext("Connection failed (too many retries)."));
 #ifdef INET6
 		    FREE(line);
@@ -1757,13 +1768,7 @@ int HTDoConnect(const char *url,
 #endif /* INET6 */
 		    return HT_NO_DATA;
 		}
-#ifdef _WINDOWS_NSL
-		select_timeout.tv_sec = connect_timeout;
-		select_timeout.tv_usec = 0;
-#else
-		select_timeout.tv_sec = 0;
-		select_timeout.tv_usec = 100000;
-#endif /* _WINDOWS_NSL */
+		set_timeout(&select_timeout);
 		FD_ZERO(&writefds);
 		FD_SET((unsigned) *s, &writefds);
 #ifdef SOCKS
@@ -2007,14 +2012,14 @@ int HTDoRead(int fildes,
 	/*
 	 * Protect against an infinite loop.
 	 */
-	if (tries++ >= 180000) {
-	    HTAlert(gettext("Socket read failed for 180,000 tries."));
+	if ((tries++ / TRIES_PER_SECOND) >= reading_timeout) {
+	    HTAlert(gettext("Socket read failed (too many tries)."));
 	    SET_EINTR;
 	    result = HT_INTERRUPTED;
 	    break;
 	}
 #ifdef USE_READPROGRESS
-	if (tries - otries > 10) {
+	if (tries - otries > TRIES_PER_SECOND) {
 	    time_t t = time((time_t *) 0);
 
 	    otries = tries;
@@ -2030,8 +2035,7 @@ int HTDoRead(int fildes,
 	 * Allow for this possibility.  - JED
 	 */
 	do {
-	    select_timeout.tv_sec = 0;
-	    select_timeout.tv_usec = 100000;
+	    set_timeout(&select_timeout);
 	    FD_ZERO(&readfds);
 	    FD_SET((unsigned) fildes, &readfds);
 #ifdef SOCKS
diff --git a/WWW/Library/Implementation/HTUtils.h b/WWW/Library/Implementation/HTUtils.h
index cdc3442d..0bc6a66d 100644
--- a/WWW/Library/Implementation/HTUtils.h
+++ b/WWW/Library/Implementation/HTUtils.h
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTUtils.h,v 1.87 2008/09/17 16:31:34 tom Exp $
+ * $LynxId: HTUtils.h,v 1.89 2008/09/24 00:20:35 tom Exp $
  *
  * Utility macros for the W3 code library
  * MACROS FOR GENERAL USE
@@ -550,15 +550,19 @@ extern int WWW_TraceMask;
 #define PRI_off_t	PRId64
 #define SCN_off_t	SCNd64
 #define CAST_off_t(n)	(int64_t)(n)
-#elif defined(PRId32)
+#elif (SIZEOF_OFF_T == 4) && defined(PRId32)
 #define PRI_off_t	PRId32
 #define SCN_off_t	SCNd32
+#if (SIZEOF_LONG == 4)
+#define CAST_off_t(n)	(long)(n)
+#else
 #define CAST_off_t(n)	(int32_t)(n)
 #endif
 #endif
+#endif
 
 #ifndef PRI_off_t
-#if (SIZEOF_OFF_T == 8)
+#if (SIZEOF_OFF_T > SIZEOF_LONG)
 #define PRI_off_t	"lld"
 #define SCN_off_t	"lld"
 #define CAST_off_t(n)	(long long)(n)
@@ -577,15 +581,19 @@ extern int WWW_TraceMask;
 #define PRI_time_t	PRId64
 #define SCN_time_t	SCNd64
 #define CAST_time_t(n)	(int64_t)(n)
-#elif defined(PRId32)
+#elif (SIZEOF_TIME_T == 4) && defined(PRId32)
 #define PRI_time_t	PRId32
 #define SCN_time_t	SCNd32
+#if (SIZEOF_LONG == 4)
+#define CAST_time_t(n)	(long)(n)
+#else
 #define CAST_time_t(n)	(int32_t)(n)
 #endif
 #endif
+#endif
 
 #ifndef PRI_time_t
-#if (SIZEOF_TIME_T == 8)
+#if (SIZEOF_TIME_T > SIZEOF_LONG)
 #define PRI_time_t	"lld"
 #define SCN_time_t	"lld"
 #define CAST_time_t(n)	(long long)(n)
diff --git a/WWW/Library/Implementation/SGML.c b/WWW/Library/Implementation/SGML.c
index fe8f9ecd..73e762c3 100644
--- a/WWW/Library/Implementation/SGML.c
+++ b/WWW/Library/Implementation/SGML.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: SGML.c,v 1.117 2008/09/21 18:34:39 tom Exp $
+ * $LynxId: SGML.c,v 1.118 2008/09/22 23:21:46 tom Exp $
  *
  *			General SGML Parser code		SGML.c
  *			========================
@@ -1564,7 +1564,7 @@ static void discard_empty(HTStream *context)
 }
 
 #ifdef USE_PRETTYSRC
-static BOOL end_if_prettysrc(HTStream *context, HTChunk *string, int end_ch)
+static BOOL end_if_prettysrc(HTStream *context, HTChunk *string, char end_ch)
 {
     BOOL result = psrc_view;
 
id=f13576b5d273ef9175e938b15f55bb1ead22fb1d'>^
c504ca56 ^

d3a9db3a ^
c504ca56 ^
52daf072 ^

d3a9db3a ^
c504ca56 ^
52daf072 ^


d3a9db3a ^
52daf072 ^



c504ca56 ^
52daf072 ^



91624dba ^
d3a9db3a ^
c504ca56 ^

d3a9db3a ^
c504ca56 ^
52daf072 ^
d3a9db3a ^

52daf072 ^
d3a9db3a ^
52daf072 ^
d3a9db3a ^
52daf072 ^
d3a9db3a ^





52daf072 ^
c504ca56 ^
52daf072 ^

d3a9db3a ^
c504ca56 ^
52daf072 ^


d3a9db3a ^
52daf072 ^

c504ca56 ^
52daf072 ^



91624dba ^
d3a9db3a ^
52daf072 ^




d3a9db3a ^
52daf072 ^
c504ca56 ^
d3a9db3a ^
52daf072 ^
91624dba ^
c504ca56 ^
52daf072 ^
d3a9db3a ^
c504ca56 ^
d3a9db3a ^
c504ca56 ^
d3a9db3a ^

52daf072 ^





d3a9db3a ^
91624dba ^
52daf072 ^
d3a9db3a ^
52daf072 ^

91624dba ^
d3a9db3a ^
52daf072 ^



91624dba ^
d3a9db3a ^
c504ca56 ^
52daf072 ^





d3a9db3a ^
52daf072 ^





91624dba ^
d3a9db3a ^
c504ca56 ^
52daf072 ^





d3a9db3a ^
52daf072 ^





91624dba ^
c504ca56 ^
52daf072 ^








d3a9db3a ^
52daf072 ^




d3a9db3a ^
52daf072 ^

91624dba ^
c504ca56 ^
52daf072 ^






d3a9db3a ^
52daf072 ^




d3a9db3a ^
52daf072 ^

91624dba ^
d3a9db3a ^
c504ca56 ^
52daf072 ^






d3a9db3a ^
52daf072 ^



91624dba ^
c504ca56 ^
52daf072 ^





d3a9db3a ^
52daf072 ^

91624dba ^
52daf072 ^





d3a9db3a ^
52daf072 ^

91624dba ^
52daf072 ^
d3a9db3a ^
52daf072 ^
c504ca56 ^
d3a9db3a ^
c504ca56 ^
52daf072 ^


608a7fa8 ^



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370